<?php
/**
* Created by PhpStorm.
* User: boris
* Date: 05.01.2020
* Time: 15:28
*
* Helper containing basic constants and methods for ROUTE
*/
namespace App\Application;
class MTRouteHelper
{
private static $countries = [
"НИДЕРЛАНДЫ" => "АМСТЕРДАМ",
"АНДОРРА" => "АНДОРРА-ЛА-ВЕЛЬЯ",
"ГРЕЦИЯ" => "АФИНЫ",
"СЕРБИЯ" => "БЕЛГРАД",
"ГЕРМАНИЯ" => "БЕРЛИН",
"ШВЕЙЦАРИЯ" => "БЕРН",
"СЛОВАКИЯ" => "БРАТИСЛАВА",
"БЕЛЬГИЯ" => "БРЮССЕЛЬ",
"ВЕНГРИЯ" => "БУДАПЕШТ",
"РУМЫНИЯ" => "БУХАРЕСТ",
"ЛИХТЕНШТЕЙН" => "ВАДУЦ",
"МАЛЬТА" => "ВАЛЛЕТТА",
"ПОЛЬША" => "ВАРШАВА",
"ВАТИКАН" => "ВАТИКАН",
"АВСТРИЯ" => "ВЕНА",
"ЛИТВА" => "ВИЛЬНЮС",
"ИРЛАНДИЯ" => "ДУБЛИН",
"ХОРВАТИЯ" => "ЗАГРЕБ",
"УКРАИНА" => "КИЕВ",
"МОЛДАВИЯ" => "КИШИНЁВ",
"МОЛДОВА" => "КИШИНЁВ",
"ДАНИЯ" => "КОПЕНГАГЕН",
"ПОРТУГАЛИЯ" => "ЛИССАБОН",
"ВЕЛИКОБРИТАНИЯ" => "ЛОНДОН",
"АНГЛИЯ" => "ЛОНДОН",
"БРИТАНИЯ" => "ЛОНДОН",
"СЛОВЕНИЯ" => "ЛЮБЛЯНА",
"ЛЮКСЕМБУРГ" => "ЛЮКСЕМБУРГ",
"ИСПАНИЯ" => "МАДРИД",
"БЕЛОРУССИЯ" => "МИНСК",
"БЕЛАРУСЬ" => "МИНСК",
"МОНАКО" => "МОНАКО",
"РОССИЯ" => "МОСКВА",
"НОРВЕГИЯ" => "ОСЛО",
"ФРАНЦИЯ" => "ПАРИЖ",
"ЧЕРНОГОРИЯ" => "ПОДГОРИЦА",
"ЧЕХИЯ" => "ПРАГА",
"ИСЛАНДИЯ" => "РЕЙКЬЯВИК",
"ЛАТВИЯ" => "РИГА",
"ИТАЛИЯ" => "РИМ",
"САН-МАРИНО" => "САН-МАРИНО",
"БОСНИЯ И ГЕРЦЕГОВИНА" => "САРАЕВО",
"СЕВЕРНАЯ МАКЕДОНИЯ" => "СКОПЬЕ",
"БОЛГАРИЯ" => "СОФИЯ",
"ШВЕЦИЯ" => "СТОКГОЛЬМ",
"ЭСТОНИЯ" => "ТАЛЛИН",
"АЛБАНИЯ" => "ТИРАНА",
"ФИНЛЯНДИЯ" => "ХЕЛЬСИНКИ",
"ДОНЕЦКАЯ НАРОДНАЯ РЕСПУБЛИКА" => "ДОНЕЦК",
"ДНР" => "ДОНЕЦК",
"ЛУГАНСКАЯ НАРОДНАЯ РЕСПУБЛИКА" => "ЛУГАНСК",
"ЛНР" => "ЛУГАНСК",
"РЕСПУБЛИКА КОСОВО" => "ПРИШТИНА",
"КОСОВО" => "ПРИШТИНА",
"ПРИДНЕСТРОВСКАЯ МОЛДАВСКАЯ РЕСПУБЛИКА" => "ТИРАСПОЛЬ",
"ОАЭ" => "АБУ-ДАБИ",
"ИОРДАНИЯ" => "АММАН",
"ТУРЦИЯ" => "АНКАРА",
"ТУРКМЕНИЯ" => "АШХАБАД",
"ИРАК" => "БАГДАД",
"АЗЕРБАЙДЖАН" => "БАКУ",
"ТАИЛАНД" => "БАНГКОК",
"БРУНЕЙ" => "БАНДАР-СЕРИ-БЕГАВАН",
"ЛИВАН" => "БЕЙРУТ",
"КИРГИЗИЯ" => "БИШКЕК",
"ЛАОС" => "ВЬЕНТЬЯН",
"БАНГЛАДЕШ" => "ДАККА",
"СИРИЯ" => "ДАМАСК",
"ИНДИЯ" => "ДЕЛИ (НЬЮ-ДЕЛИ)",
"ИНДОНЕЗИЯ" => "ДЖАКАРТА",
"ВОСТОЧНЫЙ ТИМОР" => "ДИЛИ",
"КАТАР" => "ДОХА",
"ТАДЖИКИСТАН" => "ДУШАНБЕ",
"АРМЕНИЯ" => "ЕРЕВАН",
"ИЗРАИЛЬ" => "ИЕРУСАЛИМ",
"ПАКИСТАН" => "ИСЛАМАБАД",
"АФГАНИСТАН" => "КАБУЛ",
"НЕПАЛ" => "КАТМАНДУ",
"МАЛАЙЗИЯ" => "КУАЛА-ЛУМПУР",
"МАЛЬДИВЫ" => "МАЛЕ",
"БАХРЕЙН" => "МАНАМА",
"ФИЛИППИНЫ" => "МАНИЛА",
"ОМАН" => "МАСКАТ",
"МЬЯНМА" => "НЕЙПЬИДО",
"КИПР" => "НИКОСИЯ",
"КАЗАХСТАН" => "НУР-СУЛТАН (АСТАНА)",
"КИТАЙ" => "ПЕКИН",
"КНР" => "ПЕКИН",
"КАМБОДЖА" => "ПНОМПЕНЬ",
"КНДР" => "ПХЕНЬЯН",
"ЙЕМЕН" => "САНА",
"РЕСПУБЛИКА КОРЕЯ" => "СЕУЛ",
"КОРЕЯ" => "СЕУЛ",
"СИНГАПУР" => "СИНГАПУР",
"УЗБЕКИСТАН" => "ТАШКЕНТ",
"ГРУЗИЯ" => "ТБИЛИСИ",
"ИРАН" => "ТЕГЕРАН",
"ЯПОНИЯ" => "ТОКИО",
"БУТАН" => "ТХИМПХУ",
"МОНГОЛИЯ" => "УЛАН-БАТОР",
"ВЬЕТНАМ" => "ХАНОЙ",
"ШРИ-ЛАНКА" => "ШРИ-ДЖАЯВАРДЕНЕПУРА-КОТТЕ",
"КУВЕЙТ" => "ЭЛЬ-КУВЕЙТ",
"САУДОВСКАЯ АРАВИЯ" => "ЭР-РИЯД",
"АЗАД КАШМИР" => "МУЗАФФАРАБАД",
"СЕВЕРНЫЙ КИПР" => "НИКОСИЯ",
"ГОСУДАРСТВО ПАЛЕСТИНА" => "РАМАЛЛА",
"ПАЛЕСТИНА" => "РАМАЛЛА",
"НКР" => "СТЕПАНАКЕРТ",
"РЕСПУБЛИКА АБХАЗИЯ" => "СУХУМ",
"АБХАЗИЯ" => "СУХУМ",
"ЮЖНАЯ ОСЕТИЯ" => "ЦХИНВАЛ",
];
private static $mt_default_params = [
"engine_volume" => 600,
"speed_rm" => 120,
"speed_rp" => 90,
"speed_rs" => 60,
"speed_ru" => 50,
"divide_route" => false,
"divide_by" => "points",
"divide_value" => "",
"fuel_consumption" => 6,
"fuel_tank_volume" => 18,
"date_start" => "",
];
public static function checkCapital($place)
{
if(is_array($place)){
$test = mb_strtoupper($place["name"]);
} else {
$test = mb_strtoupper($place);
}
if(isset(self::$countries[$test]))
$place["name"] .= " (" . self::$countries[$test] . ")";
return $place;
}
public static function getDefaultParam($param_name)
{
if(isset( self::$mt_default_params[ $param_name ] )) return self::$mt_default_params[ $param_name ];
return false;
}
public static function getDefaultParams()
{
return self::$mt_default_params;
}
public static function getDatesArray($date, $days)
{
$dates = [];
if(preg_match("#\d{4}-\d{2}-\d{2}#", $date)){
$date_start = new \DateTime($date);
$dates[1] = $date_start->format("d.m.Y");
} else {
$date_start = \DateTime::createFromFormat("d.m.Y", $date);
$dates[1] = $date_start->format("d.m.Y");
}
if($days > 1) {
for ($i = 1; $i < $days; $i++) {
$interval = "P" . $i . "D";
$dates[$i + 1] = (clone($date_start))->add(new \DateInterval($interval))->format("d.m.Y");;
}
}
return $dates;
}
public static function getDnaX($speed){
$min = 40;
$max = 200;
//$center = ($max - $min) / 2 + $min;
if($speed < $min || $speed > $max) die();
$res = ($speed - $min) / ($max - $min);
/*if($speed < $center){
$res = -(($speed-$min) / ($min - $center) + 1);
} elseif($speed > $center){
$res = (($speed-$min) / ($max - $center)) - 1;
} else { // == center
$res = 0;
}*/
return $res;
}
public static function getDnaY($x){
if($x == 0) return 0;
elseif(abs($x) <= 0.5) return $x;
else return sqrt(1 - $x*$x);
}
public function decodePolyline($str)
{
$index = 0;
$lat = 0;
$lng = 0;
$coordinates = [];
$shift = 0;
$result = 0;
$byte_var = null;
$latitude_change;
$longitude_change;
$factor = 100000;
$i = 0;
while ($index < strlen($str)) {
$byte_var = null;
$shift = 0;
$result = 0;
do {
$byte_var = self::uniord(substr($str, $index++, 1)) - 63;
$result |= ($byte_var & 0x1f) << $shift;
$shift += 5;
} while ($byte_var >= 0x20);
$latitude_change = (($result & 1) ? ~($result >> 1) : ($result >> 1));
$shift = $result = 0;
do {
$byte_var = self::uniord(substr($str, $index++, 1)) - 63;
$result |= ($byte_var & 0x1f) << $shift;
$shift += 5;
} while ($byte_var >= 0x20);
$longitude_change = (($result & 1) ? ~($result >> 1) : ($result >> 1));
$lat += $latitude_change;
$lng += $longitude_change;
$coordinates[$i++] = [$lat / $factor, $lng / $factor];
}
return $coordinates;
}
private static function uniord($ch) {
// todo: {} deprecated in php8!
$n = ord($ch{0});
if ($n < 128) {
return $n; // no conversion required
}
if ($n < 192 || $n > 253) {
return false; // bad first byte || out of range
}
$arr = array(1 => 192, // byte position => range from
2 => 224,
3 => 240,
4 => 248,
5 => 252,
);
foreach ($arr as $key => $val) {
if ($n >= $val) { // add byte to the 'char' array
$char[] = ord($ch{$key}) - 128;
$range = $val;
} else {
break; // save some e-trees
}
}
$retval = ($n - $range) * pow(64, sizeof($char));
foreach ($char as $key => $val) {
$pow = sizeof($char) - ($key + 1); // invert key
$retval += $val * pow(64, $pow); // dark magic
}
return $retval;
}
}