src/Application/MTRouteHelper.php line 255

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by PhpStorm.
  4.  * User: boris
  5.  * Date: 05.01.2020
  6.  * Time: 15:28
  7.  *
  8.  * Helper containing basic constants and methods for ROUTE
  9.  */
  10. namespace App\Application;
  11. class MTRouteHelper
  12. {
  13.     private static $countries = [
  14.         "НИДЕРЛАНДЫ" => "АМСТЕРДАМ",
  15.         "АНДОРРА" => "АНДОРРА-ЛА-ВЕЛЬЯ",
  16.         "ГРЕЦИЯ" => "АФИНЫ",
  17.         "СЕРБИЯ" => "БЕЛГРАД",
  18.         "ГЕРМАНИЯ" => "БЕРЛИН",
  19.         "ШВЕЙЦАРИЯ" => "БЕРН",
  20.         "СЛОВАКИЯ" => "БРАТИСЛАВА",
  21.         "БЕЛЬГИЯ" => "БРЮССЕЛЬ",
  22.         "ВЕНГРИЯ" => "БУДАПЕШТ",
  23.         "РУМЫНИЯ" => "БУХАРЕСТ",
  24.         "ЛИХТЕНШТЕЙН" => "ВАДУЦ",
  25.         "МАЛЬТА" => "ВАЛЛЕТТА",
  26.         "ПОЛЬША" => "ВАРШАВА",
  27.         "ВАТИКАН" => "ВАТИКАН",
  28.         "АВСТРИЯ" => "ВЕНА",
  29.         "ЛИТВА" => "ВИЛЬНЮС",
  30.         "ИРЛАНДИЯ" => "ДУБЛИН",
  31.         "ХОРВАТИЯ" => "ЗАГРЕБ",
  32.         "УКРАИНА" => "КИЕВ",
  33.         "МОЛДАВИЯ" => "КИШИНЁВ",
  34.         "МОЛДОВА" => "КИШИНЁВ",
  35.         "ДАНИЯ" => "КОПЕНГАГЕН",
  36.         "ПОРТУГАЛИЯ" => "ЛИССАБОН",
  37.         "ВЕЛИКОБРИТАНИЯ" => "ЛОНДОН",
  38.         "АНГЛИЯ" => "ЛОНДОН",
  39.         "БРИТАНИЯ" => "ЛОНДОН",
  40.         "СЛОВЕНИЯ" => "ЛЮБЛЯНА",
  41.         "ЛЮКСЕМБУРГ" => "ЛЮКСЕМБУРГ",
  42.         "ИСПАНИЯ" => "МАДРИД",
  43.         "БЕЛОРУССИЯ" => "МИНСК",
  44.         "БЕЛАРУСЬ" => "МИНСК",
  45.         "МОНАКО" => "МОНАКО",
  46.         "РОССИЯ" => "МОСКВА",
  47.         "НОРВЕГИЯ" => "ОСЛО",
  48.         "ФРАНЦИЯ" => "ПАРИЖ",
  49.         "ЧЕРНОГОРИЯ" => "ПОДГОРИЦА",
  50.         "ЧЕХИЯ" => "ПРАГА",
  51.         "ИСЛАНДИЯ" => "РЕЙКЬЯВИК",
  52.         "ЛАТВИЯ" => "РИГА",
  53.         "ИТАЛИЯ" => "РИМ",
  54.         "САН-МАРИНО" => "САН-МАРИНО",
  55.         "БОСНИЯ И ГЕРЦЕГОВИНА" => "САРАЕВО",
  56.         "СЕВЕРНАЯ МАКЕДОНИЯ" => "СКОПЬЕ",
  57.         "БОЛГАРИЯ" => "СОФИЯ",
  58.         "ШВЕЦИЯ" => "СТОКГОЛЬМ",
  59.         "ЭСТОНИЯ" => "ТАЛЛИН",
  60.         "АЛБАНИЯ" => "ТИРАНА",
  61.         "ФИНЛЯНДИЯ" => "ХЕЛЬСИНКИ",
  62.         "ДОНЕЦКАЯ НАРОДНАЯ РЕСПУБЛИКА" => "ДОНЕЦК",
  63.         "ДНР" => "ДОНЕЦК",
  64.         "ЛУГАНСКАЯ НАРОДНАЯ РЕСПУБЛИКА" => "ЛУГАНСК",
  65.         "ЛНР" => "ЛУГАНСК",
  66.         "РЕСПУБЛИКА КОСОВО" => "ПРИШТИНА",
  67.         "КОСОВО" => "ПРИШТИНА",
  68.         "ПРИДНЕСТРОВСКАЯ МОЛДАВСКАЯ РЕСПУБЛИКА" => "ТИРАСПОЛЬ",
  69.         "ОАЭ" => "АБУ-ДАБИ",
  70.         "ИОРДАНИЯ" => "АММАН",
  71.         "ТУРЦИЯ" => "АНКАРА",
  72.         "ТУРКМЕНИЯ" => "АШХАБАД",
  73.         "ИРАК" => "БАГДАД",
  74.         "АЗЕРБАЙДЖАН" => "БАКУ",
  75.         "ТАИЛАНД" => "БАНГКОК",
  76.         "БРУНЕЙ" => "БАНДАР-СЕРИ-БЕГАВАН",
  77.         "ЛИВАН" => "БЕЙРУТ",
  78.         "КИРГИЗИЯ" => "БИШКЕК",
  79.         "ЛАОС" => "ВЬЕНТЬЯН",
  80.         "БАНГЛАДЕШ" => "ДАККА",
  81.         "СИРИЯ" => "ДАМАСК",
  82.         "ИНДИЯ" => "ДЕЛИ (НЬЮ-ДЕЛИ)",
  83.         "ИНДОНЕЗИЯ" => "ДЖАКАРТА",
  84.         "ВОСТОЧНЫЙ ТИМОР" => "ДИЛИ",
  85.         "КАТАР" => "ДОХА",
  86.         "ТАДЖИКИСТАН" => "ДУШАНБЕ",
  87.         "АРМЕНИЯ" => "ЕРЕВАН",
  88.         "ИЗРАИЛЬ" => "ИЕРУСАЛИМ",
  89.         "ПАКИСТАН" => "ИСЛАМАБАД",
  90.         "АФГАНИСТАН" => "КАБУЛ",
  91.         "НЕПАЛ" => "КАТМАНДУ",
  92.         "МАЛАЙЗИЯ" => "КУАЛА-ЛУМПУР",
  93.         "МАЛЬДИВЫ" => "МАЛЕ",
  94.         "БАХРЕЙН" => "МАНАМА",
  95.         "ФИЛИППИНЫ" => "МАНИЛА",
  96.         "ОМАН" => "МАСКАТ",
  97.         "МЬЯНМА" => "НЕЙПЬИДО",
  98.         "КИПР" => "НИКОСИЯ",
  99.         "КАЗАХСТАН" => "НУР-СУЛТАН (АСТАНА)",
  100.         "КИТАЙ" => "ПЕКИН",
  101.         "КНР" => "ПЕКИН",
  102.         "КАМБОДЖА" => "ПНОМПЕНЬ",
  103.         "КНДР" => "ПХЕНЬЯН",
  104.         "ЙЕМЕН" => "САНА",
  105.         "РЕСПУБЛИКА КОРЕЯ" => "СЕУЛ",
  106.         "КОРЕЯ" => "СЕУЛ",
  107.         "СИНГАПУР" => "СИНГАПУР",
  108.         "УЗБЕКИСТАН" => "ТАШКЕНТ",
  109.         "ГРУЗИЯ" => "ТБИЛИСИ",
  110.         "ИРАН" => "ТЕГЕРАН",
  111.         "ЯПОНИЯ" => "ТОКИО",
  112.         "БУТАН" => "ТХИМПХУ",
  113.         "МОНГОЛИЯ" => "УЛАН-БАТОР",
  114.         "ВЬЕТНАМ" => "ХАНОЙ",
  115.         "ШРИ-ЛАНКА" => "ШРИ-ДЖАЯВАРДЕНЕПУРА-КОТТЕ",
  116.         "КУВЕЙТ" => "ЭЛЬ-КУВЕЙТ",
  117.         "САУДОВСКАЯ АРАВИЯ" => "ЭР-РИЯД",
  118.         "АЗАД КАШМИР" => "МУЗАФФАРАБАД",
  119.         "СЕВЕРНЫЙ КИПР" => "НИКОСИЯ",
  120.         "ГОСУДАРСТВО ПАЛЕСТИНА" => "РАМАЛЛА",
  121.         "ПАЛЕСТИНА" => "РАМАЛЛА",
  122.         "НКР" => "СТЕПАНАКЕРТ",
  123.         "РЕСПУБЛИКА АБХАЗИЯ" => "СУХУМ",
  124.         "АБХАЗИЯ" => "СУХУМ",
  125.         "ЮЖНАЯ ОСЕТИЯ" => "ЦХИНВАЛ",
  126.     ];
  127.     private static $mt_default_params = [
  128.         "engine_volume" => 600,
  129.         "speed_rm" => 120,
  130.         "speed_rp" => 90,
  131.         "speed_rs" => 60,
  132.         "speed_ru" => 50,
  133.         "divide_route" => false,
  134.         "divide_by" => "points",
  135.         "divide_value" => "",
  136.         "fuel_consumption" => 6,
  137.         "fuel_tank_volume" => 18,
  138.         "date_start" => "",
  139.     ];
  140.     public static function checkCapital($place)
  141.     {
  142.         if(is_array($place)){
  143.             $test mb_strtoupper($place["name"]);
  144.         } else {
  145.             $test mb_strtoupper($place);
  146.         }
  147.         if(isset(self::$countries[$test]))
  148.             $place["name"] .= " (" self::$countries[$test] . ")";
  149.         return $place;
  150.     }
  151.     public static function getDefaultParam($param_name)
  152.     {
  153.         if(isset( self::$mt_default_params$param_name ] )) return self::$mt_default_params$param_name ];
  154.         return false;
  155.     }
  156.     public static function getDefaultParams()
  157.     {
  158.         return self::$mt_default_params;
  159.     }
  160.     public static function getDatesArray($date$days)
  161.     {
  162.         $dates = [];
  163.         if(preg_match("#\d{4}-\d{2}-\d{2}#"$date)){
  164.             $date_start = new \DateTime($date);
  165.             $dates[1] = $date_start->format("d.m.Y");
  166.         } else {
  167.             $date_start = \DateTime::createFromFormat("d.m.Y"$date);
  168.             $dates[1] = $date_start->format("d.m.Y");
  169.         }
  170.         if($days 1) {
  171.             for ($i 1$i $days$i++) {
  172.                 $interval "P" $i "D";
  173.                 $dates[$i 1] = (clone($date_start))->add(new \DateInterval($interval))->format("d.m.Y");;
  174.             }
  175.         }
  176.         return $dates;
  177.     }
  178.     public static function getDnaX($speed){
  179.         $min 40;
  180.         $max 200;
  181.         //$center = ($max - $min) / 2 + $min;
  182.         if($speed $min || $speed $max) die();
  183.         $res = ($speed $min) / ($max $min);
  184.         /*if($speed < $center){
  185.             $res = -(($speed-$min) / ($min - $center) + 1);
  186.         } elseif($speed > $center){
  187.             $res = (($speed-$min) / ($max - $center)) - 1;
  188.         } else { // == center
  189.             $res = 0;
  190.         }*/
  191.         return $res;
  192.     }
  193.     public static function getDnaY($x){
  194.         if($x == 0) return 0;
  195.         elseif(abs($x) <= 0.5) return $x;
  196.         else return sqrt($x*$x);
  197.     }
  198.     public function decodePolyline($str)
  199.     {
  200.         $index 0;
  201.         $lat 0;
  202.         $lng 0;
  203.         $coordinates = [];
  204.         $shift 0;
  205.         $result 0;
  206.         $byte_var null;
  207.         $latitude_change;
  208.         $longitude_change;
  209.         $factor 100000;
  210.         $i 0;
  211.         while ($index strlen($str)) {
  212.             $byte_var null;
  213.             $shift 0;
  214.             $result 0;
  215.             do {
  216.                 $byte_var self::uniord(substr($str$index++, 1)) - 63;
  217.                 $result |= ($byte_var 0x1f) << $shift;
  218.                 $shift += 5;
  219.             } while ($byte_var >= 0x20);
  220.             $latitude_change = (($result 1) ? ~($result >> 1) : ($result >> 1));
  221.             $shift $result 0;
  222.             do {
  223.                 $byte_var self::uniord(substr($str$index++, 1)) - 63;
  224.                 $result |= ($byte_var 0x1f) << $shift;
  225.                 $shift += 5;
  226.             } while ($byte_var >= 0x20);
  227.             $longitude_change = (($result 1) ? ~($result >> 1) : ($result >> 1));
  228.             $lat += $latitude_change;
  229.             $lng += $longitude_change;
  230.             $coordinates[$i++] = [$lat $factor$lng $factor];
  231.         }
  232.         return $coordinates;
  233.     }
  234.     private static function uniord($ch) {
  235.         // todo: {} deprecated in php8!
  236.         $n ord($ch{0});
  237.         if ($n 128) {
  238.             return $n// no conversion required
  239.         }
  240.         if ($n 192 || $n 253) {
  241.             return false// bad first byte || out of range
  242.         }
  243.         $arr = array(=> 192// byte position => range from
  244.             => 224,
  245.             => 240,
  246.             => 248,
  247.             => 252,
  248.         );
  249.         foreach ($arr as $key => $val) {
  250.             if ($n >= $val) { // add byte to the 'char' array
  251.                 $char[] = ord($ch{$key}) - 128;
  252.                 $range  $val;
  253.             } else {
  254.                 break; // save some e-trees
  255.             }
  256.         }
  257.         $retval = ($n $range) * pow(64sizeof($char));
  258.         foreach ($char as $key => $val) {
  259.             $pow sizeof($char) - ($key 1); // invert key
  260.             $retval += $val pow(64$pow);   // dark magic
  261.         }
  262.         return $retval;
  263.     }
  264. }