]> Raphaël G. Git Repositories - packbundle/blobdiff - Util/MapUtil.php
Add getEastern member function
[packbundle] / Util / MapUtil.php
index 5de2967fbdcf5ed3e6d296ddf1492d8712e35203..b7d2232eca9774b39e12c525ea0b9a457db9266a 100644 (file)
@@ -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,39 +197,57 @@ 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 [
                        'caption' => $caption,
-                       'link' => $this->router->generate('rapsys_pack_map', ['hash' => $link, 'updated' => $updated, 'latitude' => $latitude, 'longitude' => $longitude, 'zoom' => $zoom + 1, 'width' => $width * 2, 'height' => $height * 2]),
-                       'src' => $this->router->generate('rapsys_pack_map', ['hash' => $src, 'updated' => $updated, 'latitude' => $latitude, 'longitude' => $longitude, 'zoom' => $zoom, 'width' => $width, 'height' => $height]),
+                       'link' => $this->router->generate('rapsyspack_map', ['hash' => $link, 'updated' => $updated, 'latitude' => $latitude, 'longitude' => $longitude, 'zoom' => $zoom + 1, 'width' => $width * 2, 'height' => $height * 2]),
+                       'src' => $this->router->generate('rapsyspack_map', ['hash' => $src, 'updated' => $updated, 'latitude' => $latitude, 'longitude' => $longitude, 'zoom' => $zoom, 'width' => $width, 'height' => $height]),
                        'width' => $width,
                        'height' => $height
                ];
        }
 
        /**
-        * 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,23 +255,23 @@ 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 [
                        'caption' => $caption,
-                       'link' => $this->router->generate('rapsys_pack_multimap', ['hash' => $link, 'updated' => $updated, 'latitude' => $latitude, 'longitude' => $longitude, 'coordinates' => $coordinate, 'zoom' => $zoom + 1, 'width' => $width * 2, 'height' => $height * 2]),
-                       'src' => $this->router->generate('rapsys_pack_multimap', ['hash' => $src, 'updated' => $updated, 'latitude' => $latitude, 'longitude' => $longitude, 'coordinates' => $coordinate, 'zoom' => $zoom, 'width' => $width, 'height' => $height]),
+                       'link' => $this->router->generate('rapsyspack_multimap', ['hash' => $link, 'updated' => $updated, 'latitude' => $latitude, 'longitude' => $longitude, 'coordinates' => $coordinate, 'zoom' => $zoom + 1, 'width' => $width * 2, 'height' => $height * 2]),
+                       'src' => $this->router->generate('rapsyspack_multimap', ['hash' => $src, 'updated' => $updated, 'latitude' => $latitude, 'longitude' => $longitude, 'coordinates' => $coordinate, 'zoom' => $zoom, 'width' => $width, 'height' => $height]),
                        'width' => $width,
                        'height' => $height
                ];
        }
 
        /**
-        * 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');