X-Git-Url: https://git.rapsys.eu/.gitweb.cgi/packbundle/blobdiff_plain/b31612d28cf2a5617667dd9dae62379c90dbaf1c..ef9ee86cb52ee5b4e1ab70c26fd977fa2eb80586:/Util/MapUtil.php?ds=inline

diff --git a/Util/MapUtil.php b/Util/MapUtil.php
index 5de2967..407a649 100644
--- a/Util/MapUtil.php
+++ b/Util/MapUtil.php
@@ -14,7 +14,7 @@ namespace Rapsys\PackBundle\Util;
 use Symfony\Component\Routing\RouterInterface;
 
 /**
- * Helps manage map
+ * Manages map
  */
 class MapUtil {
 	/**
@@ -55,14 +55,19 @@ class MapUtil {
 	const highStroke = '#3333c3';
 
 	/**
-	 * The high stroke size
+	 * The high stroke width
 	 */
 	const highStrokeWidth = 4;
 
 	/**
-	 * The map length
+	 * The map width
 	 */
-	const length = 640;
+	const width = 640;
+
+	/**
+	 * The map height
+	 */
+	const height = 640;
 	
 	/**
 	 * The osm tile server
@@ -82,7 +87,7 @@ class MapUtil {
 	const stroke = '#00c3f9';
 
 	/**
-	 * The stroke size
+	 * The stroke width
 	 */
 	const strokeWidth = 2;
 
@@ -104,111 +109,86 @@ class MapUtil {
 	const zoom = 17;
 
 	/**
-	 * The RouterInterface instance
-	 */
-	protected RouterInterface $router;
-
-	/**
-	 * The SluggerUtil instance
-	 */
-	protected SluggerUtil $slugger;
-
-	/**
-	 * The fill color
+	 * Creates a new map util
+	 *
+	 * @param RouterInterface $router The RouterInterface instance
+	 * @param SluggerUtil $slugger The SluggerUtil instance
 	 */
-	public string $fill;
+	function __construct(protected RouterInterface $router, protected SluggerUtil $slugger, protected string $fill = self::fill, protected int $fontSize = self::fontSize, protected string $highFill = self::highFill, protected int $highFontSize = self::highFontSize, protected int $highRadius = self::highRadius, protected string $highStroke = self::highStroke, protected int $highStrokeWidth = self::highStrokeWidth, protected int $radius = self::radius, protected string $stroke = self::stroke, protected int $strokeWidth = self::strokeWidth) {
+	}
 
 	/**
-	 * The font size
+	 * Get fill color
 	 */
-	public int $fontSize;
+	function getFill() {
+		return $this->fill;
+	}
 
 	/**
-	 * The high fill color
+	 * Get font size
 	 */
-	public string $highFill;
+	function getFontSize() {
+		return $this->fontSize;
+	}
 
 	/**
-	 * The font size
+	 * Get high fill color
 	 */
-	public int $highFontSize;
+	function getHighFill() {
+		return $this->highFill;
+	}
 
 	/**
-	 * The radius size
+	 * Get high font size
 	 */
-	public int $highRadius;
+	function getHighFontSize() {
+		return $this->highFontSize;
+	}
 
 	/**
-	 * The high stroke color
+	 * Get high radius size
 	 */
-	public string $highStroke;
+	function getHighRadius() {
+		return $this->highRadius;
+	}
 
 	/**
-	 * The stroke size
+	 * Get high stroke color
 	 */
-	public int $highStrokeWidth;
+	function getHighStroke() {
+		return $this->highStroke;
+	}
 
 	/**
-	 * The stroke color
+	 * Get high stroke width
 	 */
-	public string $stroke;
+	function getHighStrokeWidth() {
+		return $this->highStrokeWidth;
+	}
 
 	/**
-	 * The stroke size
+	 * Get radius size
 	 */
-	public int $strokeWidth;
+	function getRadius() {
+		return $this->radius;
+	}
 
 	/**
-	 * The radius size
+	 * Get stroke color
 	 */
-	public int $radius;
+	function getStroke() {
+		return $this->stroke;
+	}
 
 	/**
-	 * Creates a new map util
-	 *
-	 * @param RouterInterface $router The RouterInterface instance
-	 * @param SluggerUtil $slugger The SluggerUtil instance
+	 * Get stroke width
 	 */
-	function __construct(RouterInterface $router, SluggerUtil $slugger, string $fill = self::fill, int $fontSize = self::fontSize, string $highFill = self::highFill, int $highFontSize = self::highFontSize, int $highRadius = self::highRadius, string $highStroke = self::highStroke, int $highStrokeWidth = self::highStrokeWidth, int $radius = self::radius, string $stroke = self::stroke, int $strokeWidth = self::strokeWidth) {
-		//Set router
-		$this->router = $router;
-
-		//Set slugger
-		$this->slugger = $slugger;
-
-		//Set fill
-		$this->fill = $fill;
-
-		//Set font size
-		$this->fontSize = $fontSize;
-
-		//Set highFill
-		$this->highFill = $highFill;
-
-		//Set high font size
-		$this->highFontSize = $highFontSize;
-
-		//Set high radius size
-		$this->highRadius = $highRadius;
-
-		//Set highStroke
-		$this->highStroke = $highStroke;
-
-		//Set high stroke size
-		$this->highStrokeWidth = $highStrokeWidth;
-
-		//Set radius size
-		$this->radius = $radius;
-
-		//Set stroke
-		$this->stroke = $stroke;
-
-		//Set stroke size
-		$this->strokeWidth = $strokeWidth;
+	function getStrokeWidth() {
+		return $this->strokeWidth;
 	}
 
 	/**
-	 * Return map url
+	 * Get map data
 	 *
 	 * @param string $caption The caption
 	 * @param int $updated The updated timestamp
@@ -217,14 +197,14 @@ class MapUtil {
 	 * @param int $zoom The zoom
 	 * @param int $width The width
 	 * @param int $height The height
-	 * @return int The zoom
+	 * @return array The map data
 	 */
-	public function mapUrl(string $caption, int $updated, float $latitude, float $longitude, int $zoom = self::zoom, int $width = self::length, int $height = self::length): array {
+	public function getMap(string $caption, int $updated, float $latitude, float $longitude, int $zoom = self::zoom, int $width = self::width, int $height = self::height): array {
 		//Set link hash
-		$link = $this->slugger->serialize([$updated, $latitude, $longitude, $zoom + 1, $width * 2, $height * 2]);
+		$link = $this->slugger->hash([$updated, $latitude, $longitude, $zoom + 1, $width * 2, $height * 2]);
 
 		//Set src hash
-		$src = $this->slugger->serialize([$updated, $latitude, $longitude, $zoom, $width, $height]);
+		$src = $this->slugger->hash([$updated, $latitude, $longitude, $zoom, $width, $height]);
 
 		//Return array
 		return [
@@ -237,19 +217,37 @@ class MapUtil {
 	}
 
 	/**
-	 * Return multi map url
+	 * Get multi map data
 	 *
 	 * @param string $caption The caption
 	 * @param int $updated The updated timestamp
-	 * @param float $latitude The latitude
-	 * @param float $longitude The longitude
 	 * @param array $coordinates The coordinates array
-	 * @param int $zoom The zoom
 	 * @param int $width The width
 	 * @param int $height The height
-	 * @return int The zoom
+	 * @return array The multi map data
 	 */
-	public function multiMapUrl(string $caption, int $updated, float $latitude, float $longitude, $coordinates = [], int $zoom = self::zoom, int $width = self::length, int $height = self::length): array {
+	public function getMultiMap(string $caption, int $updated, array $coordinates, int $width = self::width, int $height = self::height): array {
+		//Without coordinates
+		if (empty($coordinates)) {
+			//Return empty array
+			return [];
+		}
+
+		//Set latitudes
+		$latitudes = array_map(function ($v) { return $v['latitude']; }, $coordinates);
+
+		//Set longitudes
+		$longitudes = array_map(function ($v) { return $v['longitude']; }, $coordinates);
+
+		//Set latitude
+		$latitude = round((min($latitudes)+max($latitudes))/2, 6);
+
+		//Set longitude
+		$longitude = round((min($longitudes)+max($longitudes))/2, 6);
+
+		//Set zoom
+		$zoom = $this->getMultiZoom($latitude, $longitude, $coordinates, $width, $height);
+
 		//Set coordinate
 		$coordinate = implode('-', array_map(function ($v) { return $v['latitude'].','.$v['longitude']; }, $coordinates));
 
@@ -257,10 +255,10 @@ class MapUtil {
 		$hash = $this->slugger->hash($coordinate);
 
 		//Set link hash
-		$link = $this->slugger->serialize([$updated, $latitude, $longitude, $hash, $zoom + 1, $width * 2, $height * 2]);
+		$link = $this->slugger->hash([$updated, $latitude, $longitude, $hash, $zoom + 1, $width * 2, $height * 2]);
 
 		//Set src hash
-		$src = $this->slugger->serialize([$updated, $latitude, $longitude, $hash, $zoom, $width, $height]);
+		$src = $this->slugger->hash([$updated, $latitude, $longitude, $hash, $zoom, $width, $height]);
 
 		//Return array
 		return [
@@ -273,7 +271,7 @@ class MapUtil {
 	}
 
 	/**
-	 * Return multi map zoom
+	 * Get multi zoom
 	 *
 	 * Compute a zoom to have all coordinates on multi map
 	 * Multi map visible only from -($width / 2) until ($width / 2) and from -($height / 2) until ($height / 2)
@@ -283,12 +281,12 @@ class MapUtil {
 	 * @param float $latitude The latitude
 	 * @param float $longitude The longitude
 	 * @param array $coordinates The coordinates array
-	 * @param int $zoom The zoom
 	 * @param int $width The width
 	 * @param int $height The height
+	 * @param int $zoom The zoom
 	 * @return int The zoom
 	 */
-	public function multiMapZoom(float $latitude, float $longitude, array $coordinates = [], int $zoom = self::zoom, int $width = self::length, int $height = self::length): int {
+	public function getMultiZoom(float $latitude, float $longitude, array $coordinates, int $width, int $height, int $zoom = self::zoom): int {
 		//Iterate on each zoom
 		for ($i = $zoom; $i >= 1; $i--) {
 			//Get tile xy
@@ -393,13 +391,14 @@ class MapUtil {
 	 */
 	public static function latitudeToSexagesimal(float $latitude): string {
 		//Set degree
-		$degree = $latitude % 60;
+		//TODO: see if round or intval is better suited to fix the Deprecated: Implicit conversion from float to int loses precision
+		$degree = round($latitude) % 60;
 
 		//Set minute
-		$minute = ($latitude - $degree) * 60 % 60;
+		$minute = round(($latitude - $degree) * 60) % 60;
 
 		//Set second
-		$second = ($latitude - $degree - $minute / 60) * 3600 % 3600;
+		$second = round(($latitude - $degree - $minute / 60) * 3600) % 3600;
 
 		//Return sexagesimal longitude
 		return $degree.'°'.$minute.'\''.$second.'"'.($latitude >= 0 ? 'N' : 'S');
@@ -414,13 +413,14 @@ class MapUtil {
 	 */
 	public static function longitudeToSexagesimal(float $longitude): string {
 		//Set degree
-		$degree = $longitude % 60;
+		//TODO: see if round or intval is better suited to fix the Deprecated: Implicit conversion from float to int loses precision
+		$degree = round($longitude) % 60;
 
 		//Set minute
-		$minute = ($longitude - $degree) * 60 % 60;
+		$minute = round(($longitude - $degree) * 60) % 60;
 
 		//Set second
-		$second = ($longitude - $degree - $minute / 60) * 3600 % 3600;
+		$second = round(($longitude - $degree - $minute / 60) * 3600) % 3600;
 
 		//Return sexagesimal longitude
 		return $degree.'°'.$minute.'\''.$second.'"'.($longitude >= 0 ? 'E' : 'W');