"Albania",
"AT" => "Austria",
"BE" => "Belgium",
"BG" => "Bulgaria",
"CH" => "Switzerland",
"CZ" => "Czech Republic",
"DE" => "Germany",
"DK" => "Denmark",
"ES" => "Spain",
"FI" => "Finland",
"FR" => "France",
"GB" => "United Kingdom",
"GR" => "Greece",
"HR" => "Croatia",
"HU" => "Hungary",
"IE" => "Ireland",
"IS" => "Iceland",
"IT" => "Italy",
"LI" => "Liechtenstein",
"LT" => "Lithuania",
"LU" => "Luxembourg",
"LV" => "Latvia",
"MC" => "Monaco",
"MK" => "Macedonia",
"NL" => "Netherlands",
"NO" => "Norway",
"PL" => "Poland",
"PT" => "Portugal",
"RO" => "Romania",
"SE" => "Sweden",
"SI" => "Slovenia",
"SK" => "Slovakia",
"UA" => "Ukraine");
}
function get_db_geo() {
static $db_geo = NULL;
if (is_null($db_geo)) {
global $dblogin, $dbpassword;
writeLog_xServer(basename($_SERVER['PHP_SELF']) . ": connecting to intern...");
//$db_geo = getDbConnectionSpecial("172.16.0.110:3711", "address_geo", $dblogin, $dbpassword);
$db_geo = getDbConnectionSpecial("172.16.0.111:3711", "address_geo", $dblogin, $dbpassword);
$res = $db_geo->query('SET NAMES latin1');
if (DB::isError($res)) reportDie ("$PHP_SELF: 'SET NAMES latin1' : " . $res->getMessage());
}
return $db_geo;
}
$db_plan = 0;
//$allCoords = array();
//$coords = XSfindAddress("D", "25469", "Halstenbek", "Friedrichshulder Weg", "81");
//echo $coords[0][1] . ", " . $coords[0][2] . "
\n";
//$allCoords[] = array($coords[0][1], $coords[0][2], 8*3600, 14*3600);
//$coords = XSfindAddress("D", "22848", "Norderstedt", "Ochsenzoller Straޥ", "31");
//echo $coords[0][1] . ", " . $coords[0][2] . "
\n";
//$coords = XSfindAddress("D", "25469", "Halstenbek", "Friedrichshulder Weg", "118");
//echo $coords[0][1] . ", " . $coords[0][2] . "
\n";
//$allCoords[] = array($coords[0][1], $coords[0][2], 12.5*3600, 19*3600);
//$coords = XSfindAddress("D", "21502", "Geesthacht", "Gerhart-Hauptmann-Weg", "14");
//echo $coords[0][1] . ", " . $coords[0][2] . "
\n";
//$allCoords[] = array($coords[0][1], $coords[0][2], 8*3600, 14*3600);
//$coords = XSfindAddress("D", "25421", "Pinneberg", "Oeltingsallee", "1b");
//echo $coords[0][1] . ", " . $coords[0][2] . "
\n";
//$allCoords[] = array($coords[0][1], $coords[0][2], 13*3600, 19*3600);
//$coords = XSfindAddress("D", "22041", "Hamburg", "Holzm�traޥ", "41");
//echo $coords[0][1] . ", " . $coords[0][2] . "
\n";
//$allCoords[] = array($coords[0][1], $coords[0][2], 8*3600, 14*3600);
//$coords = XSfindAddress("D", "22525", "Hamburg", "Ottensener Straޥ", "8");
//echo $coords[0][1] . ", " . $coords[0][2] . "
\n";
//$allCoords[] = array($coords[0][1], $coords[0][2], 13*3600, 19*3600);
//print_r(XSplanTimewindowTour($allCoords));
//XSplanTour(array(
// array(843650, 4901137),
// array(842164, 4901883),
// array(843914, 4900754),
// array(841020, 4900941),
// array(841050, 4900578))
//);
//XSplanTourJob(16539796);
//XSplanTourJob(16539797, array(12.374671, 51.325363));
//XSplanTourJob(16539798);
//XSplanTourJob(16539799);
//XSplanTourJob(16539800);
function XSfindAddress($ad_country, $ad_zipcode, $ad_city, $ad_street, $tr_hsno) {
global $phpVersion;
$db_geo = get_db_geo();
// $XS_HOST = 'localhost';
/*
$XS_HOST = '172.16.0.154';
$XS_PORT = 50020;
$XS_SERVICE = '/xlocate/ws/XLocate';
*/
if (($ad_street == "3" && $ad_zipcode == "70180" && $ad_city == "Stuttgart") ||
($ad_street == "46/1" && $ad_zipcode == "71069" && $ad_city == "Sindelfingen") ||
($ad_street == "Hutt" && $ad_zipcode == "70597" && $ad_city == "Stuttgart" && $tr_hsno == "Kommunikat"))
return array(0, 0.0, 0.0);
$ad_country_clause = "ad.ad_country = '$ad_country'";
if ($ad_country == "DE" || $ad_country == "D")
$ad_country_clause = "(ad.ad_country = 'DE' OR ad.ad_country = 'D')";
$sqlquery = "SELECT adg.ad_id, adg_gps_long, adg_gps_lat, adg_modify FROM address_geo.address AS ad, address_geo.address_geo AS adg WHERE " .
"$ad_country_clause AND ad.ad_zipcode = '$ad_zipcode' AND ad.ad_city = '" . str_replace('\'', '\\\'', $ad_city) . "' AND ad.ad_street = '" . str_replace('\'', '\\\'', $ad_street) . "' " .
"AND ad.ad_id = adg.ad_id AND adg.adg_hsno = '$tr_hsno'";
// "AND ad.ad_id = adg.ad_id AND adg.adg_hsno = '$tr_hsno' AND adg.adg_accuracy > 5";
//writeLog_xServer("XSfindAddress: " . $sqlquery);
$res = $db_geo->query($sqlquery);
if (DB::isError($res)) reportDie ("$PHP_SELF: '$sqlquery' : " . $res->getMessage());
$is_valid = false;
$update_ad_id = 0;
if ($row = ($phpVersion >= "8.0" ? $res->fetch_assoc() : $res->fetchRow())):
$is_valid = check_expired($row["adg_modify"]);
if (!$is_valid)
$update_ad_id = $row["ad_id"];
endif;
//writeLog_xServer("XSfindAddress: \$update_ad_id = " . $update_ad_id);
if ($is_valid):
$ret_code = 0;
if ($row["adg_gps_long"] != 0 && $row["adg_gps_lat"] != 0):
$ret_code = 100;
endif;
writeLog_xServer("XSfindAddress: [$ad_country $ad_zipcode " . utf8_encode($ad_city) . " " . utf8_encode($ad_street) . " " . utf8_encode($tr_hsno) . "] found in address_geo: " . $row["adg_gps_long"] . ", " . $row["adg_gps_lat"] . ", " . $row["adg_modify"]);
$retA[] = array($ret_code, $row["adg_gps_long"], $row["adg_gps_lat"]);
else:
// Warte 0,75 Zehntel-Sekunden um "620 - too man queries" zu vermeiden
usleep(75000);
$row = check_address_google(($ad_country == "D" ? "DE" : $ad_country), $ad_zipcode, $ad_city, $ad_street, $tr_hsno, $update_ad_id);
$retA[] = array(($row[0] >= 6 ? 100 : 0), $row[2], $row[1]);
endif;
$res->free();
/*
if ($ad_country == "DE")
$ad_country = "D";
$out =
'' . "\n" .
'' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
'' . "\n" .
"\n";
$res = xmlRequest($XS_HOST, $XS_PORT, $XS_SERVICE, $out);
$vals = $res[0];
$index = $res[1];
$log_txt = "********************************************************************************\n" . $out;
$retA = array();
if (array_key_exists('SOAP:FAULT', $index)):
echo $vals[$index['FAULTCODE'][0]]['value'] . " : " . $vals[$index['FAULTSTRING'][0]]['value'] . "\n";
writeLog_xServer($log_txt);
die();
else:
$log_txt .= "ERRORCODE=" . $vals[$index['RESULT'][0]]['attributes']['ERRORCODE'] . "\n";
$i = 0;
for ($i = 0, $j = 0; $i < count($index['NS6:POINT']); $i++, $j += 2):
$log_txt .= "\n";
foreach ($vals[$index['NS2:RESULTADDRESS'][$j]]['attributes'] AS $attr => $val) {
$log_txt .= "$attr: " . $val . "\n";
}
$score = $vals[$index['NS2:RESULTADDRESS'][$j]]['attributes']['TOTALSCORE'];
$X = round($vals[$index['NS6:POINT'][$i]]['attributes']['X']) / 100000;
$Y = round($vals[$index['NS6:POINT'][$i]]['attributes']['Y']) / 100000;
$log_txt .= "Y, X = " . $X . ", " . $Y . "\n";
$retA[] = array($score, $X, $Y);
if ($score == 100 && count($retA) == 1):
$ad_id = "";
$sqlquery = "SELECT ad_id FROM address WHERE ad_street = '$ad_street' AND ad_zipcode = '$ad_zipcode' AND ad_city = '$ad_city' AND ad_country = '$ad_country'";
$res = mysql_query($sqlquery, $mysql_db_geo) or die (mysql_error($mysql_db_geo));
if ($row = mysql_fetch_array($res, MYSQL_ASSOC)):
$ad_id = $row["ad_id"];
endif;
mysql_free_result($res);
if ($ad_id == ""):
$sqlquery = "INSERT INTO address (ad_street, ad_zipcode, ad_city, ad_country) VALUES ('$ad_street', '$ad_zipcode', '$ad_city', '$ad_country')";
mysql_query($sqlquery, $mysql_db_geo) or die (mysql_error($mysql_db_geo));
$ad_id = mysql_insert_id($mysql_db_geo);
endif;
$sqlquery = "INSERT INTO address_geo (ad_id, adg_hsno, adg_gps_long, adg_gps_lat, adg_accuracy) VALUES ('$ad_id', '$tr_hsno', '" . $X . "', '" . $Y . "', 8)";
mysql_query($sqlquery, $mysql_db_geo) or die (mysql_error($mysql_db_geo));
endif;
endfor;
// echo "Index array\n";
// print_r($index);
// echo "\nVals array\n";
// print_r($vals);
endif;
writeLog_xServer($log_txt);
*/
return $retA;
}
function XScheckAddress($ad_country, $ad_zipcode, $ad_city, $ad_street, $tr_hsno)
{
$coords = XSfindAddress($ad_country, $ad_zipcode, $ad_city, $ad_street, $tr_hsno);
if ($coords[0][0] != 100)
return false;
return true;
}
//function XSplanTourSubOSM($stopCoordinates, $lastStop = 0){
//
// $outStops = '';
// foreach ($stopCoordinates as $idx => $pair) {
// $outStops .= "&p" . $idx . "=" . ($pair[1] / 100000) . "," . ($pair[0] / 100000);
// }
// $request = "http://52.27.164.117:8080/mautkm/tsp.jsp?end=" . $lastStop . $outStops;
// writeLog_xTsp($request);
//// echo $request; die();
// $xml_answer = file_get_contents($request);
//// $xml_answer = "51.37982612.39320451.35440112.40757551.35239412.40964951.3532312.41407351.34599712.41842151.34472312.40760751.34164812.40455251.34303712.40150251.34672912.39970451.34512312.39596551.34561512.3931451.3326312.397851.33158912.39750551.32885712.4039251.33397712.40753251.33681512.40691451.33377812.4100351.3335812.4162951.3335812.4162951.32217412.41506151.32130112.4141551.31409112.41985451.31324412.42069951.29338112.4357951.32402412.47398851.35129212.46063151.35377112.4608451.35634612.45783551.39257812.4570851.38230912.44906251.35596112.4302651.37837612.40958151.38463212.406139http://52.27.164.117:8181/?point=51.379826,12.393204&point=51.354401,12.407575&point=51.352394,12.409649&point=51.35323,12.414073&point=51.345997,12.418421&point=51.344723,12.407607&point=51.341648,12.404552&point=51.343037,12.401502&point=51.346729,12.399704&point=51.345123,12.395965&point=51.345615,12.39314&point=51.33263,12.3978&point=51.331589,12.397505&point=51.328857,12.40392&point=51.333977,12.407532&point=51.336815,12.406914&point=51.333778,12.41003&point=51.33358,12.41629&point=51.33358,12.41629&point=51.322174,12.415061&point=51.321301,12.41415&point=51.314091,12.419854&point=51.313244,12.420699&point=51.293381,12.43579&point=51.324024,12.473988&point=51.351292,12.460631&point=51.353771,12.46084&point=51.356346,12.457835&point=51.392578,12.45708&point=51.382309,12.449062&point=51.355961,12.43026&point=51.378376,12.409581&point=51.384632,12.406139&locale=de-DE&vehicle=car&weighting=fastest&elevation=true&layer=OpenStreetMap.de";
// writeLog_xTsp($xml_answer);
//
// $p = xml_parser_create();
// xml_parse_into_struct($p, $xml_answer, $vals, $index);
// xml_parser_free($p);
//
// $retA = array();
// $cnt = 1;
// for ($i = 0; $i < count($index['LATITUD']); $i++) {
//// $log_txt .= "\n";
// foreach ($stopCoordinates as $idx => $pair) {
// if ($vals[$index['LATITUD'][$i]]['value'] == (string)($pair[1] / 100000) && $vals[$index['LONGITUD'][$i]]['value'] == (string)($pair[0] / 100000)) {
// if (!in_array(($idx + 1), $retA)) {
// $retA[] = $idx + 1;
// writeLog_xTsp($cnt++ . ": " . ($idx + 1) . " (" . $vals[$index['LONGITUD'][$i]]['value'] . ", " . $vals[$index['LATITUD'][$i]]['value'] . ", " . $pair[2] . ")");
// break;
// }
// }
// }
// }
////echo json_encode($retA);
// return $retA;
//}
function XSplanTourRequest($stopCoordinates) {
$outStops = '';
foreach ($stopCoordinates as $idx => $pair)
$outStops .= ($outStops != "" ? "|" : "") . $pair[0] . "," . $pair[1];
$request = "https://ext01.sb-test.assecutor.de/service/xTsp.php?stops=" . $outStops;
writeLog_xTsp($request);
$json_answer = file_get_contents($request);
writeLog_xTsp($json_answer);
$json_answerA = json_decode($json_answer, true);
$opt_stops = explode(",", $json_answerA["opt_stops"]);
foreach ($opt_stops as $idx)
$retA[] = $idx;
return $retA;
}
function XSplanTourORTools($stopCoordinates, $lastStop = 0){
$stopCoordinatesDistinct = array();
for ($i = 0; $i < count($stopCoordinates); $i++) {
$stopCoordinatesDistinct[(round($stopCoordinates[$i][1] * 1000000) / 1000000) . "," . (round($stopCoordinates[$i][0] * 1000000) / 1000000)][] = $i;
}
$outStops = '';
$outStopsArr = array();
$i = 0;
// foreach ($stopCoordinates as $idx => $pair) {
foreach ($stopCoordinatesDistinct as $pair => $indexes) {
// $outStops .= ($outStops != "" ? "|" : "") . ($pair[1] / 100000) . "," . ($pair[0] / 100000);
$outStops .= ($outStops != "" ? "|" : "") . $pair;
$outStopsArr[$i++] = $pair;
}
$distances = get_distances_from_db($outStops, $outStops);
$distance_matrix_str = "";
for ($i = 0; $i < count($distances); $i++) {
$distance_matrix_str .= ($distance_matrix_str != "" ? " " : "") . $distances[$i][4];
}
writeLog_xTsp('python3 ../locating/tsp.py ' . $distance_matrix_str);
$output=null;
$retval=null;
exec('python3 ../locating/tsp.py ' . $distance_matrix_str, $output, $retval);
writeLog_xTsp($output[0]);
$resultArr = explode(",", $output[0]);
$gogleMapsLink = "";
$cnt = 0;
for ($i = 0; $i < count($resultArr); $i++) {
// $retA[] = $resultArr[$i] + 1;
// writeLog_xTsp(($i + 1) . ": " . ($resultArr[$i] + 1) . " (" . ($stopCoordinates[$resultArr[$i]][0] / 100000) . ", " . ($stopCoordinates[$resultArr[$i]][1] / 100000) . ")");
foreach ($stopCoordinatesDistinct[$outStopsArr[$resultArr[$i]]] as $idx) {
$retA[] = $idx + 1;
writeLog_xTsp((++$cnt) . ": " . ($idx + 1) . " (" . $outStopsArr[$resultArr[$i]] . ")");
}
$gogleMapsLink .= "/" . $outStopsArr[$i];
}
writeLog_xTsp("https://www.google.de/maps/dir" . $gogleMapsLink);
return $retA;
}
function XSplanTourStb978440($stopCoordinates){
$zipcode_order = array(
// Tour 0 Reihenfolge ohne Umland
array("13593","14089","13595","13581","13591","13583","13589","13587","13585","13597","14050","14052","14053","14055","14057","14059","13599","13629","13627","13351","10553","10551",
"10555", "10557","10559","13353","13347","13355","13357","13359","13409","13407","13349","13405","13507","13403","13509","13437","13439","13435","13469","13467","13465","13503","13505"),
// Tour 0 Reihenfolge mit Umland (zusätzlich 14612, 16727)
// - diese muss an zweiter Stelle stehen, damit die vorhergehende Reihenfolge als gültig erkannt wird, wenn die zusätzlichen PLZs 14612 16727 _nicht_ vorhanden sind
array("13593","14089","13595","13597","13599","13587","13585","13589","13583","13581","13591","14612","16727","13505","13503","13465","13467","13469","13435","13439","13437","13509","13507",
"13405","13403","13407","13409","13359","13357","13355","13347","13353","13349","13351","10553","10555","10557","10559","10551","13627","13629","14050","14059","14057","14055","14052","14053")
);
$stopCoordinatesSorted = array();
for ($i = 0; $i < count($zipcode_order); $i++) {
if (count($stopCoordinatesSorted) == 0) {
for ($j = 0; $j < count($stopCoordinates); $j++) {
$key = array_search($stopCoordinates[$j][2], $zipcode_order[$i]);
if ($key !== false) {
$stopCoordinatesSorted[$j] = $key * 1000 + $j; // "* 1000 + $j" damit doppelte PLZs eindeutige Rangfolgennummern bekommen
} else {
$stopCoordinatesSorted = array();
break;
}
}
}
}
writeLog_xTsp("\$stopCoordinates = " . json_encode($stopCoordinates));
//writeLog_xTsp("\$stopCoordinatesSorted = " . json_encode($stopCoordinatesSorted));
asort($stopCoordinatesSorted);
//writeLog_xTsp("\$stopCoordinatesSorted = " . json_encode($stopCoordinatesSorted));
$stopCoordinatesSorted = array_keys($stopCoordinatesSorted);
//writeLog_xTsp("\$stopCoordinatesSorted = " . json_encode($stopCoordinatesSorted));
for ($i = 0; $i < count($stopCoordinatesSorted); $i++)
$stopCoordinatesSorted[$i]++;
writeLog_xTsp("\$stopCoordinatesSorted = " . json_encode($stopCoordinatesSorted));
return ($stopCoordinatesSorted);
}
function XScheckAddresses($jb_id_plan) {
global $db_plan, $phpVersion;
$sqlquery = "SELECT " . /*tr_comp,*/ "address.ad_id, ad_street, ad_city FROM job, tour, address WHERE job.jb_id = " . $jb_id_plan . " AND job.jb_id = tour.jb_id AND tour.ad_id = address.ad_id";
$res1 = $db_plan->query($sqlquery);
if (DB::isError($res1)) reportDie ("$PHP_SELF: '$sqlquery' : " . $res1->getMessage());
while ($row1 = ($phpVersion >= "8.0" ? $res1->fetch_assoc() : $res1->fetchRow())):
// $tr_comp_new = XScheckString($row1["tr_comp"]);
//echo $row1["tr_comp"] . "\n";
//echo $tr_comp_new . "\n";
$ad_street_new = XScheckString($row1["ad_street"]);
//echo $row1["ad_street"] . "\n";
//echo $ad_street_new . "\n";
$ad_city_new = XScheckString($row1["ad_city"]);
//echo $row1["ad_city"] . "\n";
//echo $ad_city_new . "\n\n";
if ($ad_street_new != $row1["ad_street"] || $ad_city_new != $row1["ad_city"]):
writeLog_xTsp("UPDATE address SET ad_street = '" . $ad_street_new . "', ad_city = '" . $ad_city_new . "' WHERE ad_id = " . $row1["ad_id"]);
exec_query_db_plan("UPDATE address SET ad_street = '" . $ad_street_new . "', ad_city = '" . $ad_city_new . "' WHERE ad_id = " . $row1["ad_id"]);
endif;
endwhile;
$res1->free();
}
function XScheckString($the_string) {
// check for broken umlauts (DOS Ascii -> ANSI) causing google not to find the correct address
//echo ord(chr(0x8E)) . " " . ord(chr(0x99)) . " " . ord(chr(0x9A)) . " " . ord(chr(0x84)) . " " . ord(chr(0x94)) . " " . ord(chr(0x81)) . " " . ord(chr(0xE1)) . "\n";
//for ($i = 0; $i < strlen($the_string); $i++)
// echo ord($the_string[$i]) . " ";
//echo "\n";
return(
str_replace(chr(0x8E) /*'Ž'*/, chr(196), //chr(ord("Ä")),
str_replace(chr(0x99) /*'™'*/, chr(214), //chr(ord("Ö")),
str_replace(chr(0x9A) /*'š'*/, chr(220), //chr(ord("Ü")),
str_replace(chr(0x84) /*'„'*/, chr(228), //chr(ord("ä")),
str_replace(chr(0x94) /*'”'*/, chr(246), //chr(ord("ö")),
str_replace(chr(0x81) /*' '*/, chr(252), //chr(ord("ü")),
str_replace(chr(0xE1) /*'á'*/, chr(223), //chr(ord("ß")),
str_replace(chr(0xDF) /*'á'*/, chr(223), //chr(ord("ß")),
preg_replace("/([\xC2\xC3])([\x80-\xBF])/e", "chr(ord('\\1')<<6&0xC0|ord('\\2')&0x3F)", $the_string)
))))))))
);
}
function XSplanTourJob($jb_id_plan, $end_coordinates = array(), $start_coordinates = array())
{
global $db_plan, $dbhost, $dblogin, $dbpassword, $phpVersion;
writeLog_xTsp("\nXSplanTourJob(" . $jb_id_plan . ", " . json_encode($end_coordinates) . ", " . json_encode($start_coordinates) . ")");
$db_plan = getDbConnectionSpecial($dbhost, "phoenix", $dblogin, $dbpassword);
$res = $db_plan->query('SET NAMES latin1');
if (DB::isError($res)) reportDie ("$PHP_SELF: 'SET NAMES latin1' : " . $res->getMessage());
// Sonderlocke für Carsystem Farberlin GmbH (STB978440)
$optimizationPossible = true;
$stb978440 = false;
$sqlquery = "SELECT cs_eid FROM customer, costcenter, job WHERE customer.cs_id = costcenter.cs_id AND costcenter.csc_id = job.csc_id_payer AND jb_id = " . $jb_id_plan;
$res = $db_plan->query($sqlquery);
if (DB::isError($res)) reportDie ("$PHP_SELF: '$sqlquery' : " . $res->getMessage());
if ($row = ($phpVersion >= "8.0" ? $res->fetch_assoc() : $res->fetchRow())):
if ($row["cs_eid"] == "STB978440"):
XScheckAddresses($jb_id_plan);
$stb978440 = true;
endif;
endif;
$res->free();
$stopCoordinates = array();
$sqlquery = "SELECT ad_country, ad_zipcode, ad_city, ad_street, tr_hsno FROM tour As tr, address AS ad WHERE jb_id = $jb_id_plan AND tr.ad_id = ad.ad_id AND tr_ware_from_to IN (0,1) ORDER BY tr_sort";
$res = $db_plan->query($sqlquery);
if (DB::isError($res)) reportDie ("$PHP_SELF: '$sqlquery' : " . $res->getMessage());
$i = 0;
while ($row = ($phpVersion >= "8.0" ? $res->fetch_assoc() : $res->fetchRow())):
// if ($row["tr_ware_from_to"] == 1):
$coords = XSfindAddress("D", str_replace('\'', '\\\'', $row["ad_zipcode"]), str_replace('\'', '\\\'', $row["ad_city"]), str_replace('\'', '\\\'', $row["ad_street"]), str_replace('\'', '\\\'', $row["tr_hsno"]));
writeLog_xTsp("[" . str_replace('\'', '\\\'', $row["ad_zipcode"]) . " " . str_replace('\'', '\\\'', $row["ad_city"]) . " " . str_replace('\'', '\\\'', $row["ad_street"]) . " " . str_replace('\'', '\\\'', $row["tr_hsno"]) . "] [" . $coords[0][0] . ", " . $coords[0][1] . ", " . $coords[0][2] . "]");
if ($coords[0][0] != 100):
// echo " kein exakter Match
\n"; flush();
// echo "Routenoptmierung nicht möglich!
\n";
writeLog_xTsp("no coordinates found, optimization not possible");
$optimizationPossible = false;
if (!$stb978440)
return false;
// die();
// else:
// echo " ok
\n"; flush();
endif;
// else:
// $sqlquery = "SELECT plzg_laenge, plzg_breite FROM phoenix_special.plz_geodb WHERE plzg_code = '" . $row["ad_zipcode"] . "'";
////writeLog_xTsp("[" . $sqlquery . "\n");
// $res1 = mysql_query($sqlquery, $mysql_db_plan) or die ($sqlquery . ": " . mysql_error($mysql_db_plan));
// if ($row1 = mysql_fetch_array($res1, MYSQL_ASSOC)):
// $coords = array(array(100, $row1["plzg_laenge"], $row1["plzg_breite"]));
// writeLog_xTsp("[" . $row["ad_zipcode"] . "] found in plz_geodb: " . $row1["plzg_laenge"] . ", " . $row1["plzg_breite"] . "\n");
// else:
// echo "Finde keine Koordinaten für PLZ '" . $row["ad_zipcode"] . "'
\n"; flush();
// echo "Routenoptmierung nicht möglich!
\n";
// die();
// endif;
// mysql_free_result($res1);
// endif;
$stopCoordinates[$i++] = array($coords[0][1] * 100000, $coords[0][2] * 100000, $row["ad_zipcode"] /*letzters eigentlich nur für STB978440*/);
// if (count($end_coordinates) == 0 && floor($coords[0][1] * 100000) == 1317846 && floor($coords[0][2] * 100000) == 5251742) // Sonderlocke für Carsystem Farberlin GmbH (STB978440)
// $end_coordinates = array(13.377, 52.516);
endwhile;
$res->free();
if (count($stopCoordinates) < 3)
return true;
//print_r($stopCoordinates);
//die();
$subtractor = 0;
if (count($end_coordinates) == 2):
$stopCoordinates[$i++] = array($end_coordinates[0] * 100000, $end_coordinates[1] * 100000);
$subtractor = 1;
endif;
if (count($start_coordinates) == 2):
$stopCoordinates[0] = array($start_coordinates[0] * 100000, $start_coordinates[1] * 100000);
endif;
//(nur PTV) $planTour = XSplanTourSub($stopCoordinates, $subtractor);
// Sonderlocke für Carsystem Farberlin GmbH (STB978440) ?
if (!$stb978440):
$planTour = XSplanTourORTools($stopCoordinates, $subtractor);
else:
$planTour = XSplanTourStb978440($stopCoordinates);
if (count($planTour) == 0 && $optimizationPossible)
$planTour = XSplanTourORTools($stopCoordinates, $subtractor);
endif;
if (count($planTour) - $subtractor > 0):
// bestehenden tr_sort mit 100 addieren
for ($i = 0; $i < count($planTour) - $subtractor; $i++) {
exec_query_db_plan("UPDATE tour SET tr_sort = " . (500 + $i + 1) . " WHERE jb_id = $jb_id_plan AND tr_sort = " . ($i+1));
exec_query_db_plan("UPDATE tourarticle SET tr_sort = " . (500 + $i + 1) . " WHERE jb_id = $jb_id_plan AND tr_sort = " . ($i+1));
}
// jetzt k�n die neuen tr_sort geschrieben werden
for ($i = 0; $i < count($planTour); $i++) {
exec_query_db_plan("UPDATE tour SET tr_sort = " . ($i + 1) . " WHERE jb_id = $jb_id_plan AND tr_sort = " . (500 + $planTour[$i]));
exec_query_db_plan("UPDATE tourarticle SET tr_sort = " . ($i + 1) . " WHERE jb_id = $jb_id_plan AND tr_sort = " . (500 + $planTour[$i]));
}
XSmk_jb_tourdata($jb_id_plan);
return true;
endif;
return false;
}
function XSmk_jb_tourdata($jb_id) {
global $db_plan, $phpVersion;
// global $mysql_db_plan, $dbhost, $dblogin, $dbpassword;
// $mysql_db_plan = mysql_connect($dbhost, $dblogin, $dbpassword) or die (mysql_error($mysql_db_plan));
// mysql_select_db("phoenix", $mysql_db_plan) or die (mysql_error($mysql_db_plan));
// mysql_query('SET NAMES latin1', $mysql_db_plan) or die ('SET NAMES latin1' . ": " . mysql_error($mysql_db_plan));
$jb_tourdata1 = "";
$jb_tourdata2 = "";
$jb_tourdata3 = "";
$sqlquery = "SELECT ad_zipcode, ad_city, ad_country FROM address, tour WHERE jb_id = " . $jb_id . " AND address.ad_id = tour.ad_id ORDER BY tr_sort";
$res = $db_plan->query($sqlquery);
if (DB::isError($res)) reportDie ("$PHP_SELF: '$sqlquery' : " . $res->getMessage());
while ($row = ($phpVersion >= "8.0" ? $res->fetch_assoc() : $res->fetchRow())):
$jb_tourdata1 .= ($jb_tourdata1 == "" ? "" : ";") . $row['ad_zipcode'];
$jb_tourdata2 .= ($jb_tourdata2 == "" ? "" : ";") . $row['ad_city'];
$jb_tourdata3 .= ($jb_tourdata3 == "" ? "" : ";") . $row['ad_country'];
endwhile;
$res->free();
exec_query_db_plan("UPDATE job SET jb_tourdata = '" . $jb_tourdata1 . "|" . $jb_tourdata2 . "|" . $jb_tourdata3 . "' WHERE jb_id = " . $jb_id);
}
function XSplanTourId($stopCoordinatesId, $lastStop = 0)
{
writeLog_xTsp("");
writeLog_xTsp("\$stopCoordinatesId = ". json_encode($stopCoordinatesId));
$stopCoordinates = array();
$stopCoordinatesRet = array();
for ($i = 0; $i < count($stopCoordinatesId) - $lastStop; $i++):
$stopCoordinates[$i] = array($stopCoordinatesId[$i][1], $stopCoordinatesId[$i][2]);
endfor;
$planTour = XSplanTourRequest($stopCoordinates);
if (count($planTour) - $lastStop > 0):
for ($i = 0; $i < count($planTour) - $lastStop; $i++):
$stopCoordinatesRet[$i] = $stopCoordinatesId[$planTour[$i] - 1];
endfor;
else:
$stopCoordinatesRet = $stopCoordinatesId;
endif;
writeLog_xTsp("\$stopCoordinatesRet = " . json_encode($stopCoordinatesRet));
return ($stopCoordinatesRet);
}
/*
function XSplanTourSub($stopCoordinates, $lastStop = 0)
{
// $XS_HOST = 'localhost';
$XS_HOST = '172.16.0.154';
$XS_PORT = 50050;
$XS_SERVICE = '/xsequence/ws/XSequence';
$outStops = '';
$subStops = '';
foreach ($stopCoordinates as $idx => $pair) {
$outStops .=
' ' . "\n" .
' ' . "\n" .
' ' . "\n";
$subStops .= ' ' . "\n";
}
// $planningParams->costDistanceKm = 10;
// $planningParams->costPeriodMinute = 50;
// $planningParams->maxProcessorPeriod = 5;
// $planningParams->distanceCalculation->dimaCoordFormat = 'GEODECIMAL';
$out =
'' . "\n" .
'' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
$outStops .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
$subStops .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
'' . "\n" .
"\n";
//echo $out;
$lock_text = "planTour is running";
while (file_get_contents("../log/xServer_planTour_lock.txt") == $lock_text):
writeLog_xServer("waiting for another running optimization to terminate...");
sleep(1);
endwhile;
$fileHandle = @fopen("../log/xServer_planTour_lock.txt", 'w'); @fwrite($fileHandle, $lock_text); @fclose($fileHandle);
$res = xmlRequest($XS_HOST, $XS_PORT, $XS_SERVICE, $out);
$fileHandle = @fopen("../log/xServer_planTour_lock.txt", 'w'); @fwrite($fileHandle, ""); @fclose($fileHandle);
$vals = $res[0];
$index = $res[1];
$log_txt = "********************************************************************************\n" . $out;
$retA = array();
if (array_key_exists('SOAP:FAULT', $index)) {
echo $vals[$index['FAULTCODE'][0]]['value'] . " : " . $vals[$index['FAULTSTRING'][0]]['value'] . "\n";
die();
} else {
$log_txt .= "RESULT=" . $vals[$index['NS2:RESULT'][0]]['attributes']['RESULT'] . "\n\n";
foreach ($vals[$index['NS17:TOUR'][0]]['attributes'] AS $attr => $val) {
$log_txt .= "$attr: $val\n";
}
foreach ($index['NS17:OUTPUTTOURPOINT'] AS $otp) {
$log_txt .= "\n";
$retA[] = $vals[$otp]['attributes']['STOPID'];
foreach ($vals[$otp]['attributes'] AS $attr => $val) {
$log_txt .= "$attr: $val\n";
}
}
// echo "Index array\n";
// print_r($index);
// echo "\nVals array\n";
// print_r($vals);
}
writeLog_xServer($log_txt);
return $retA;
}
function XSplanTour($stopCoordinates)
{
// $XS_HOST = 'localhost';
$XS_HOST = '172.16.0.154';
$XS_PORT = 50050;
$XS_SERVICE = '/xsequence/ws/XSequence';
$outStops = '';
foreach ($stopCoordinates as $idx => $pair) {
$outStops .=
' ' . "\n" .
' ' . "\n" .
' ' . "\n";
}
// $planningParams->costDistanceKm = 10;
// $planningParams->costPeriodMinute = 50;
// $planningParams->maxProcessorPeriod = 5;
// $planningParams->distanceCalculation->dimaCoordFormat = 'GEODECIMAL';
$out =
'' . "\n" .
'' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
$outStops .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
'' . "\n" .
"\n";
//echo $out;
$res = xmlRequest($XS_HOST, $XS_PORT, $XS_SERVICE, $out);
$vals = $res[0];
$index = $res[1];
$log_txt = "********************************************************************************\n" . $out;
$retA = array();
if (array_key_exists('SOAP:FAULT', $index)) {
echo $vals[$index['FAULTCODE'][0]]['value'] . " : " . $vals[$index['FAULTSTRING'][0]]['value'] . "\n";
die();
} else {
$log_txt .= "RESULT=" . $vals[$index['NS2:RESULT'][0]]['attributes']['RESULT'] . "\n\n";
foreach ($vals[$index['NS17:TOUR'][0]]['attributes'] AS $attr => $val) {
$log_txt .= "$attr: $val\n";
}
foreach ($index['NS17:OUTPUTTOURPOINT'] AS $otp) {
$log_txt .= "\n";
$retA[] = $vals[$otp]['attributes']['STOPID'];
foreach ($vals[$otp]['attributes'] AS $attr => $val) {
$log_txt .= "$attr: $val\n";
}
}
// echo "Index array\n";
// print_r($index);
// echo "\nVals array\n";
// print_r($vals);
}
writeLog_xServer($log_txt);
return $retA;
}
function XSplanTimewindowTour($stopCoordinates, $predPos = 0, $succPos = 0)
{
// $XS_HOST = 'localhost';
$XS_HOST = '172.16.0.154';
$XS_PORT = 50050;
$XS_SERVICE = '/xsequence/ws/XSequence';
// if $predPos == 0
if ($succPos == 0)
$succPos = count($stopCoordinates) + 1;
$outStops = '';
$subStops = '';
foreach ($stopCoordinates as $idx => $pairs) {
$outStops .=
' ' . "\n" .
// ' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n";
$subStops .= ' ' . "\n";
}
// $planningParams->costDistanceKm = 10;
// $planningParams->costPeriodMinute = 50;
// $planningParams->maxProcessorPeriod = 5;
// $planningParams->distanceCalculation->dimaCoordFormat = 'GEODECIMAL';
$out =
'' . "\n" .
'' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
$outStops .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
$subStops .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
' ' . "\n" .
'' . "\n" .
"\n";
//echo $out;
$res = xmlRequest($XS_HOST, $XS_PORT, $XS_SERVICE, $out);
$vals = $res[0];
$index = $res[1];
$log_txt = "********************************************************************************\n" . $out;
$retA = array();
if (array_key_exists('SOAP:FAULT', $index)) {
$log_txt .= $vals[$index['FAULTCODE'][0]]['value'] . " : " . $vals[$index['FAULTSTRING'][0]]['value'] . "\n";
// die();
} else {
$log_txt .= "RESULT=" . $vals[$index['NS2:RESULT'][0]]['attributes']['RESULT'] . "\n\n";
foreach ($vals[$index['NS17:TOUR'][0]]['attributes'] AS $attr => $val) {
$log_txt .= "$attr: $val\n";
}
for ($i = 0; $i < count($index['NS17:OUTPUTTOURPOINT']); $i += 2) {
$otp = $index['NS17:OUTPUTTOURPOINT'][$i];
$log_txt .= "\n";
$retA[] = $vals[$otp]['attributes']['STOPID'];
foreach ($vals[$otp]['attributes'] AS $attr => $val) {
$log_txt .= "$attr: $val\n";
}
}
// echo "Index array\n";
// print_r($index);
// echo "\nVals array\n";
// print_r($vals);
}
writeLog_xServer($log_txt);
return $retA;
}
function XSplanTourJobAmazon($jb_id_plan, $predPos = 0, $succPos = 0)
{
global $db, $phpVersion;
$stopCoordinates = array();
$sqlquery = "SELECT tr_comp, ad_country, ad_zipcode, ad_city, ad_street, tr_hsno FROM tour As tr, address AS ad WHERE jb_id = $jb_id_plan AND tr.ad_id = ad.ad_id ORDER BY tr_sort";
$res = $db->query($sqlquery);
if (DB::isError($res)) reportDie ("$PHP_SELF: '$sqlquery'" . $res->getMessage());
$i = 0;
while ($row = ($phpVersion >= "8.0" ? $res->fetch_assoc() : $res->fetchRow())):
$interval = array(8*3600, 19*3600);
if ($row["tr_comp"] == "STBX_TIMED")
$interval = array(8*3600, 12*3600);
$coords = XSfindAddress("D", $row["ad_zipcode"], $row["ad_city"], $row["ad_street"], $row["tr_hsno"]);
if ($coords[0][0] != 100) {
echo " kein exakter Match
\n"; flush();
echo "Routenoptmierung nicht möglich!
\n";
die();
}
$stopCoordinates[$i++] = array($coords[0][1] * 100000, $coords[0][2] * 100000, $interval[0], $interval[1]);
endwhile;
$res->free();
$stopIt = false;
do {
$planTour = XSplanTimewindowTour($stopCoordinates, $predPos, $succPos);
if (count($planTour) == 0):
for ($i = 1; $i < count($stopCoordinates); $i++):
$stopCoordinates[$i][2] -= 300;
$stopCoordinates[$i][3] += 300;
if ($stopCoordinates[$i][2] < 0 OR $stopCoordinates[$i][3] > 86400):
$stopIt = true;
break;
endif;
endfor;
endif;
} while (count($planTour) == 0 && !$stopIt);
if (count($planTour) > 0):
// bestehenden tr_sort mit 100 addieren
for ($i = 0; $i < count($planTour); $i++) {
updateStmt("tour", "jb_id", $jb_id_plan, array("tr_sort", 100 + $i + 1), "tr_sort = " . ($i+1));
}
// jetzt können die neuen tr_sort geschrieben werden
for ($i = 0; $i < count($planTour); $i++) {
updateStmt("tour", "jb_id", $jb_id_plan, array("tr_sort", $i + 1), "tr_sort = " . (100 + $planTour[$i]));
}
return true;
endif;
return false;
}
function xmlRequest($host, $port, $service, $xmlReq)
{
$fp = fsockopen($host, $port, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)
\n";
} else {
fputs ($fp, "POST $service HTTP/1.1\r\n");
fputs ($fp, "Host: localhost\r\n");
fputs ($fp, "Content-type: text/xml; charset=utf-8\r\n");
fputs ($fp, "Content-length: " . strlen($xmlReq) . "\r\n");
fputs ($fp, "Connection: close\r\n\r\n");
fputs ($fp, $xmlReq);
$line = "";
while (substr($line, 0, 14) != "", ">", $xml_str);
$xml_str = str_replace('"', """, $xml_str);
return $xml_str;
}
*/
function exec_query_db_plan($sqlquery) {
global $db_plan;
// echo $sqlquery . "\n";
$res = $db_plan->query($sqlquery);
if (DB::isError($res)) reportDie ("$PHP_SELF: '$sqlquery' : " . $res->getMessage());
}
function writeLog_xServer($log_text) {
global $ajaxReqKmPrice;
if (isset($ajaxReqKmPrice) && $ajaxReqKmPrice) {
writeLog_ajaxReqKmPrice($log_text);
return;
}
$today = getdate();
// echo $log_text . "\n";
$fileHandle = @fopen("../log/xServer_" . $today['year'] . sprintf("%02d", $today['mon']) . ".log", 'a');
if (!$fileHandle) {
$fileHandle = @fopen("../log/xServer_" . $today['year'] . sprintf("%02d", $today['mon']) . ".web.log", 'a');
}
fwrite($fileHandle, "[" . date("Y-m-d H:i:s") . "] " . $log_text . "\n");
@fclose($fileHandle);
return;
}
function writeLog_xTsp($log_text) {
$today = getdate();
// echo $log_text . "\n";
$fileHandle = @fopen("../log/xTsp_" . $today['year'] . sprintf("%02d", $today['mon']) . ".log", 'a');
@fwrite($fileHandle, "[" . date("Y-m-d H:i:s") . "] " . $log_text . "\n");
@fclose($fileHandle);
return;
}
function check_address_google($ad_country, $ad_zipcode, $ad_city, $ad_street, $tr_hsno, $update_ad_id) {
$db_geo = get_db_geo();
global $phpVersion;
//writeLog_xServer("check_address_google: \$update_ad_id = " . $update_ad_id);
// $error_codes = array(
// "200" => "G_GEO_SUCCESS", //Keine Fehler aufgetreten; die Adresse wurde erfolgreich analysiert. Der Geocode wurde zurückgegeben.
// "500" => "G_GEO_SERVER_ERROR", //Eine Geocodierungs- oder Routenanforderung konnte nicht erfolgreich verarbeitet werden, da der genaue Grund für den Fehler nicht bekannt ist.
// "601" => "G_GEO_MISSING_QUERY", //Für den HTTP Parameter q wurde eine leere Adresse angegeben.
// "602" => "G_GEO_UNKNOWN_ADDRESS", //Zu der angegebenen Adresse wurde keine geografische Entsprechung gefunden. Möglicherweise ist die Adresse relativ neu oder nicht richtig.
// "603" => "G_GEO_UNAVAILABLE_ADDRESS", //Der Geocode für die angegebene Adresse oder die Route für die angegebene Richtungsanfrage kann aus rechtlichen oder Vertragsgründen nicht zurückgegeben werden.
// "610" => "G_GEO_BAD_KEY", //Der angegebene Schlüssel ist entweder ungültig oder passt nicht zur Domain, für die er angegeben wurde.
// "620" => "G_GEO_TOO_MANY_QUERIES" //Der angegebene Schlüssel hat innerhalb des Zeitraums von 24 Stunden das Limit für Anforderungen überschritten oder zu viele Anforderungen in einem zu kurzen Zeitraum übermittelt. Wenn Sie zahlreiche Anforderungen gleichzeitig oder kurz hintereinander übermitteln, verwenden Sie in Ihrem Code einen Timer oder eine Pause, damit die Anforderungen nicht zu schnell übermittelt werden.
// );
// $accuracy = array(
// '0' => 'Genauigkeit unbekannt',
// '1' => 'Land',
// '2' => 'Region (Bundesland/Bundesstaat, Provinz, Präfektur usw. )',
// '3' => 'Kreis (Bezirk, Gemeinde usw. )',
// '4' => 'Ortschaft (Stadt, Dorf)',
// '5' => 'Postleitzahl (PLZ)',
// '6' => 'Straße',
// '7' => 'Kreuzung',
// '8' => 'Adresse',
// '9' => 'Grundstück (Name des Gebäude/Grundstücks, Einkaufszentrum usw.)'
// );
$cnt = 1;
$sqlquery = "SELECT adg_hsno FROM address_geo WHERE ad_id = 0 AND LEFT(adg_modify, 10) = '" . date("Y-m-d") . "'";
$res = $db_geo->query($sqlquery);
if (DB::isError($res)) reportDie ("$PHP_SELF: '$sqlquery' : " . $res->getMessage());
if($row = ($phpVersion >= "8.0" ? $res->fetch_assoc() : $res->fetchRow())):
$cnt = $row["adg_hsno"] + 1;
else:
$sqlquery = "INSERT INTO address_geo (ad_id, adg_hsno, adg_accuracy, adg_gps_long, adg_gps_lat) VALUES (0, 0, 0, 0.0, 0.0)";
$res1 = $db_geo->query($sqlquery);
if (DB::isError($res1)) reportDie ("$PHP_SELF: '$sqlquery' : " . $res->getMessage());
endif;
$res->free();
// $sqlquery = "SELECT COUNT(*) FROM address_geo WHERE adg_modify > '" . date("Y-m-d") . " 00:00:00'";
// $res = mysql_query($sqlquery, $mysql_db_geo) or die ($sqlquery . ": " . mysql_error($mysql_db_geo));
// $row = mysql_fetch_row($res);
// mysql_free_result($res);
// $cnt = $row[0];
$ret_val = 0;
if ($cnt <= 10000):
$maxTries = 30;
$retryCnt = $maxTries;
do {
// $lines = file ("http://maps.google.com/maps/geo?q=" . rawurlencode(utf8_encode($ad_street) . " " . $tr_hsno) . "," . rawurlencode($ad_zipcode . " " . utf8_encode($ad_city)) . "&output=csv");
// $result = explode(",", $lines[0]);
$lines = check_address_google_new($ad_country, $ad_zipcode, $ad_city, $ad_street, $tr_hsno);
$result = explode(",", $lines);
$result[2] = round($result[2], 6);
$result[3] = round($result[3], 6);
if ($result[0] == "200"):
$ad_id = "";
if ($update_ad_id > 0):
$ad_id = $update_ad_id;
else:
$sqlquery = "SELECT ad_id FROM address WHERE ad_street = '" . my_str_check($ad_street) . "' AND ad_zipcode = '" . my_str_check($ad_zipcode) . "' AND ad_city = '" . my_str_check($ad_city) . "' AND ad_country = '$ad_country'";
//echo $sqlquery . "\n
";die();
$res = $db_geo->query($sqlquery);
if (DB::isError($res)) reportDie ("$PHP_SELF: '$sqlquery' : " . $res->getMessage());
if ($row = ($phpVersion >= "8.0" ? $res->fetch_assoc() : $res->fetchRow())):
$ad_id = $row["ad_id"];
endif;
$res->free();
if ($ad_id == ""):
$sqlquery = "INSERT INTO address (ad_street, ad_zipcode, ad_city, ad_country) VALUES ('" . my_str_check($ad_street) . "', '" . my_str_check($ad_zipcode) . "', '" . my_str_check($ad_city) . "', '$ad_country')";
writeLog_xServer("check_address_google: [" . $sqlquery . "] ");
$res = $db_geo->query($sqlquery);
if (DB::isError($res)) reportDie ("$PHP_SELF: '$sqlquery' : " . $res->getMessage());
$ad_id = $db_geo->getOne("SELECT LAST_INSERT_ID()");
endif;
endif;
$ret_val = $result[1];
if ($update_ad_id > 0):
$sqlquery = "UPDATE address_geo SET adg_accuracy = " . $result[1] . ", adg_gps_long = " . $result[3] . ", adg_gps_lat = " . $result[2] . ", adg_modify = NOW() WHERE ad_id = " . $update_ad_id . " AND adg_hsno = '" . $tr_hsno . "'";
else:
$sqlquery = "INSERT INTO address_geo (ad_id, adg_hsno, adg_accuracy, adg_gps_long, adg_gps_lat) VALUES ('$ad_id', '$tr_hsno', " . $result[1] . ", '" . $result[3] . "', '" . $result[2] . "')";
endif;
writeLog_xServer("check_address_google: [" . $sqlquery . "] ");
$res = $db_geo->query($sqlquery);
if (DB::isError($res)): reportDie ("$PHP_SELF: '$sqlquery' : " . $res->getMessage()); endif;
elseif ($result[0] == "620" && $retryCnt > 1):
writeLog_xServer("check_address_google: ['" . $ad_country . "' '" . $ad_zipcode . "' '" . utf8_encode($ad_city) . "' '" . utf8_encode($ad_street) . "' '" . utf8_encode($tr_hsno) . "'] " .
"[doing " . ($maxTries - $retryCnt + 1) . ". retry]");
usleep(250000); // 0,25 sec schlafen
endif;
$sqlquery = "UPDATE address_geo SET adg_hsno = '$cnt' WHERE ad_id = 0 AND LEFT(adg_modify, 10) = '" . date("Y-m-d") . "'";
$res = $db_geo->query($sqlquery);
if (DB::isError($res)) reportDie ("$PHP_SELF: '$sqlquery' : " . $res->getMessage());
// writeLog_xServer("check_address_google: ['" . $ad_country . "' '" . $ad_zipcode . "' '" . utf8_encode($ad_city) . "' '" . utf8_encode($ad_street) . "' '" . utf8_encode($tr_hsno) . "'] " .
// "[" . $lines . "] [" . "http://maps.google.com/maps/geo?q=" . rawurlencode(utf8_encode($ad_street) . " " . $tr_hsno) . "," . rawurlencode($ad_zipcode . " " . utf8_encode($ad_city)) . "&output=csv" . "]");
} while ($result[0] == "620" && --$retryCnt > 0);
if ($result[0] == "620"):
writeLog_xServer("check_address_google: ['" . $ad_country . "' '" . $ad_zipcode . "' '" . utf8_encode($ad_city) . "' '" . utf8_encode($ad_street) . "' '" . utf8_encode($tr_hsno) . "'] " .
"[giving up after " . $maxTries . " tries]");
elseif ($retryCnt + 1 < $maxTries):
writeLog_xServer("check_address_google: ['" . $ad_country . "' '" . $ad_zipcode . "' '" . utf8_encode($ad_city) . "' '" . utf8_encode($ad_street) . "' '" . utf8_encode($tr_hsno) . "'] " .
"[needed " . ($maxTries - $retryCnt + 1) . " tries]");
endif;
else:
writeLog_xServer("check_address_google: ['" . $ad_country . "' '" . $ad_zipcode . "' '" . utf8_encode($ad_city) . "' '" . utf8_encode($ad_street) . "' '" . utf8_encode($tr_hsno) . "'] " .
"[Tageslimit erreicht]");
endif;
return (array($result[1], $result[2], $result[3]));
}
// Für BWV eingeführt, $full_adress = "" für Preisrechner
function check_coords_google($gps_lat, $gps_long, $update_ad_id, $full_adress = "") {
global $phpVersion;
$db_geo = get_db_geo();
$lines = check_address_google_new("", "", "", "", "", $gps_lat, $gps_long, $full_adress);
$result = explode(",", $lines);
if ($result[0] == "200"):
$ad_id = 0;
if ($update_ad_id > 0):
$ad_id = $update_ad_id;
else:
$sqlquery = "SELECT ad_id FROM address WHERE ad_street = '" . my_str_check($result[5]) . "' AND ad_zipcode = '" . my_str_check($result[3]) . "' AND ad_city = '" . my_str_check($result[4]) . "' AND ad_country = '" . $result[2] . "'";
$res = $db_geo->query($sqlquery);
if (DB::isError($res)) reportDie ("$PHP_SELF: '$sqlquery' : " . $res->getMessage());
if ($row = ($phpVersion >= "8.0" ? $res->fetch_assoc() : $res->fetchRow())):
$ad_id = $row["ad_id"];
endif;
$res->free();
if ($ad_id == 0):
$sqlquery = "INSERT INTO address (ad_street, ad_zipcode, ad_city, ad_country) VALUES ('" . my_str_check($result[5]) . "', '" . my_str_check($result[3]) . "', '" . my_str_check($result[4]) . "', '" . $result[2] . "')";
writeLog_xServer("check_coords_google: [" . $sqlquery . "] ");
$res = $db_geo->query($sqlquery);
if (DB::isError($res)) reportDie ("$PHP_SELF: '$sqlquery' : " . $res->getMessage());
$ad_id = $db_geo->getOne("SELECT LAST_INSERT_ID()");
endif;
endif;
if ($update_ad_id > 0):
$sqlquery = "UPDATE address_geo SET adg_accuracy = " . $result[1] . ", adg_hsno = '" . $result[6] . "', adg_modify = NOW() WHERE ad_id = " . $update_ad_id . " AND adg_gps_long = " . $gps_long . " AND adg_gps_lat = " . $gps_lat;
else:
$sqlquery = "INSERT INTO address_geo (ad_id, adg_hsno, adg_accuracy, adg_gps_long, adg_gps_lat) VALUES ($ad_id, '" . $result[6] . "', " . $result[1] . ", " . $gps_long . ", " . $gps_lat . ")";
endif;
writeLog_xServer("check_coords_google: [" . $sqlquery . "] ");
$res = $db_geo->query($sqlquery);
if (DB::isError($res)): reportDie ("$PHP_SELF: '$sqlquery' : " . $res->getMessage()); endif;
else:
writeLog_xServer("check_coords_google: [" . $gps_lat . ", " . $gps_long . "] failed");
endif;
return (array($result[0], $result[1], $result[2], $result[3], $result[4], $result[5], $result[6]));
}
// $gps_lat = 0, $gps_long = 0 für BWV eingeführt, $full_address = "" für Preisrechner
function check_address_google_new($ad_country, $ad_zipcode, $ad_city, $ad_street, $tr_hsno, $gps_lat = 0, $gps_long = 0, $full_address = "") {
$country_codes = get_country_codes();
writeLog_xServer("check_address_google_new: $ad_country, $ad_zipcode, $ad_city, $ad_street, $tr_hsno, $gps_lat, $gps_long, $full_address");
if ($gps_lat == 0 && $gps_long == 0 && $full_address == "") {
$ad_country_ori = $ad_country;
if (in_array($ad_country, array_keys($country_codes)))
$ad_country = rawurlencode(utf8_encode($country_codes[$ad_country]));
}
usleep(140000); // 0,14 sec schlafen wegen "status" => "OVER_QUERY_LIMIT"
if ($gps_lat == 0 && $gps_long == 0) {
if ($full_address == "") {
$request = "https://maps.googleapis.com/maps/api/geocode/json?address=" . rawurlencode(utf8_encode($ad_street) . " " . $tr_hsno) . "," . rawurlencode($ad_zipcode . " " . utf8_encode($ad_city)) . "," . $ad_country . "&sensor=false&key=" . get_api_key();
// $request = "https://maps.googleapis.com/maps/api/geocode/json?address=" . rawurlencode($ad_street . " " . $tr_hsno) . "," . rawurlencode($ad_zipcode . " " . $ad_city) . "," . $ad_country . "&sensor=false&key=" . get_api_key();
} else {
$request = "https://maps.googleapis.com/maps/api/geocode/json?address=" . rawurlencode(utf8_encode($full_address)) . "&sensor=false&key=" . get_api_key();
}
} else {
$request = "https://maps.googleapis.com/maps/api/geocode/json?latlng=" . $gps_lat . "," . $gps_long . "&result_type=country|administrative_area_level_1|administrative_area_level_2|locality|postal_code|route|intersection|street_address|premise|subpremise&key=" . get_api_key();
//https://maps.googleapis.com/maps/api/geocode/json?latlng=52.542843,12.979395&result_type=country|administrative_area_level_1|administrative_area_level_2|locality|postal_code|route|intersection|street_address|premise|subpremise&key=AIzaSyA9a06yPWYsH90pQA55KBz3JFf-MfVbYBg
//https://maps.googleapis.com/maps/api/geocode/json?latlng=53.9199,9.9386&result_type=country|administrative_area_level_1|administrative_area_level_2|locality|postal_code|route|intersection|street_address|premise|subpremise&key=AIzaSyA9a06yPWYsH90pQA55KBz3JFf-MfVbYBg
//https://maps.googleapis.com/maps/api/geocode/json?address=Demexallee 1,14641 Wustermark,DE&sensor=false&key=AIzaSyA9a06yPWYsH90pQA55KBz3JFf-MfVbYBg
}
if ($gps_lat == 0 && $gps_long == 0 && $full_address == "")
$request = strtr($request, array("%C3%A4" => "ae", "%C3%B6" => "oe", "%C3%BC" => "ue", "%C3%84" => "Ae", "%C3%96" => "Oe", "%C3%9C" => "Ue", "%C3%9F" => "ss"));
$json_answer = file_get_contents($request);
$json_answerA = json_decode($json_answer, true);
$ret_code = 602;
$adg_accuracy = 0;
$lat = 0;
$long = 0;
if ($json_answerA["status"] == "OK"):
$ret_code = 200;
if ($gps_lat == 0 && $gps_long == 0 && $full_address == "") {
$lat = round($json_answerA["results"][0]["geometry"]["location"]["lat"], 6);
$long = round($json_answerA["results"][0]["geometry"]["location"]["lng"], 6);
} else {
$street_number = "";
$route = "";
$locality = "";
$country = "";
$postal_code = "";
foreach($json_answerA["results"][0]["address_components"] as $address_component) {
switch ($address_component["types"][0]):
case "street_number":
$street_number = $address_component["short_name"]; break;
case "route":
$route = $address_component["short_name"]; break;
case "locality":
$locality = $address_component["short_name"]; break;
case "country":
$country = $address_component["short_name"]; break;
case "postal_code":
$postal_code = $address_component["short_name"]; break;
endswitch;
}
}
if (count($json_answerA["results"]) > 0 && count($json_answerA["results"][0]["types"]) > 0):
foreach ($json_answerA["results"][0]["types"] as $type) {
$type_accuracy = 0;
switch ($type):
case "country":
$type_accuracy = 1; break;
case "administrative_area_level_1":
$type_accuracy = 2; break;
case "administrative_area_level_2":
$type_accuracy = 3; break;
case "locality":
$type_accuracy = 4; break;
case "postal_code":
$type_accuracy = 5; break;
case "route":
$type_accuracy = 6; break;
case "intersection":
$type_accuracy = 7; break;
case "street_address":
$type_accuracy = 8; break;
case "establishment":
case "premise":
case "subpremise":
$type_accuracy = 9;
endswitch;
if ($type_accuracy > $adg_accuracy)
$adg_accuracy = $type_accuracy;
}
endif;
if ($adg_accuracy == 0 && $json_answerA["results"][0]["geometry"]["location_type"] == "ROOFTOP"):
$adg_accuracy = 8;
// elseif ($adg_accuracy == 0):
// $ret_code = 602;
endif;
elseif ($json_answerA["status"] == "OVER_QUERY_LIMIT"):
$ret_code = 620;
endif;
if ($gps_lat == 0 && $gps_long == 0 && $full_address == "") {
writeLog_xServer("check_address_google_new: ['" . $ad_country_ori . "' '" . $ad_zipcode . "' '" . $ad_city . "' '" . $ad_street . "' '" . $tr_hsno . "'] " .
"[" . "$ret_code, $adg_accuracy, $lat, $long" . "] [" . $request . "]\n" . $json_answer);
return "$ret_code,$adg_accuracy,$lat,$long";
} else {
writeLog_xServer("check_address_google_new: [" . $gps_lat . "," . $gps_long . "] " .
"[" . $ret_code . ", " . $adg_accuracy . ", " . utf8_decode($country) . ", " . utf8_decode($postal_code) . ", " . utf8_decode($locality) . ", " . utf8_decode($route) . ", " . utf8_decode($street_number) . "] [" . $request . "]\n" . $json_answer);
return $ret_code . "," . $adg_accuracy . "," . utf8_decode($country) . "," . utf8_decode($postal_code) . "," . utf8_decode($locality) . "," . utf8_decode($route) . "," . utf8_decode($street_number);
}
}
function get_distances_from_db($origins, $destinations) {
$db_geo = get_db_geo();
global $phpVersion;
$originsArr = explode("|", $origins);
$destinationsArr = explode("|", $destinations);
$retArr = array();
for ($i = 0; $i < count($originsArr); $i++):
$tmp_pair1 = explode(",", $originsArr[$i]);
for ($j = 0; $j < count($destinationsArr); $j++):
$tmp_pair2 = explode(",", $destinationsArr[$j]);
if ($tmp_pair1[1] != $tmp_pair2[1] || $tmp_pair1[0] != $tmp_pair2[0]):
$sqlquery = "SELECT di_distance, di_duration, di_status FROM address_geo.distance WHERE " .
"di_lat_start = " . $tmp_pair1[0] . " AND " .
"di_long_start = " . $tmp_pair1[1] . " AND " .
"di_lat_dest = " . $tmp_pair2[0] . " AND " .
"di_long_dest = " . $tmp_pair2[1];
writeLog_xServer("get_distances_from_db: [" . $sqlquery . "]");
$res = $db_geo->query($sqlquery);
if (DB::isError($res)) reportDie ("$PHP_SELF: '$sqlquery' : " . $res->getMessage());
if ($row = ($phpVersion >= "8.0" ? $res->fetch_assoc() : $res->fetchRow())):
$retArr[] = array($tmp_pair1[1], $tmp_pair1[0], $tmp_pair2[1], $tmp_pair2[0], $row["di_distance"], $row["di_duration"], $row["di_status"]);
else:
$tmpArr = get_distances_google($tmp_pair1[0] . "," . $tmp_pair1[1] . "|" . $tmp_pair2[0] . "," . $tmp_pair2[1], $tmp_pair1[0] . "," . $tmp_pair1[1] . "|" . $tmp_pair2[0] . "," . $tmp_pair2[1]);
$retArr[] = $tmpArr[1];
endif;
else:
$retArr[] = array($tmp_pair1[1], $tmp_pair1[0], $tmp_pair2[1], $tmp_pair2[0], 0, 0, 0);
endif;
endfor;
endfor;
return $retArr;
}
function get_distances_google($origins, $destinations) {
$db_geo = get_db_geo();
global $phpVersion;
$request = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=$origins&destinations=$destinations&mode=driving&language=de-DE&sensor=false&key=" . get_api_key();
$maxTries = 30;
$retryCnt = $maxTries;
do {
$json_answer = file_get_contents($request);
$json_answerA = json_decode($json_answer, true);
writeLog_xServer("get_distances_google: [" . $request . "]\n" . $json_answer, "");
$retArr = array();
if ($json_answerA["status"] == "OK"):
$tmp_origins = explode("|", $origins);
$tmp_destinations = explode("|", $destinations);
for ($i = 0; $i < count($json_answerA["origin_addresses"]); $i++):
$tmp_pair1 = explode(",", $tmp_origins[$i]);
for ($j = 0; $j < count($json_answerA["destination_addresses"]); $j++):
$tmp_pair2 = explode(",", $tmp_destinations[$j]);
$sqlquery = "SELECT di_id FROM address_geo.distance WHERE " .
"di_long_start = " . $tmp_pair1[1] . " AND " .
"di_lat_start = " . $tmp_pair1[0] . " AND " .
"di_long_dest = " . $tmp_pair2[1] . " AND " .
"di_lat_dest = " . $tmp_pair2[0];
$res = $db_geo->query($sqlquery);
if (DB::isError($res)) reportDie ("$PHP_SELF: '$sqlquery' : " . $res->getMessage());
if (!($row = ($phpVersion >= "8.0" ? $res->fetch_assoc() : $res->fetchRow()))):
if ($json_answerA["rows"][$i]["elements"][$j]["distance"]["value"] != 0):
$sqlquery =
"INSERT INTO address_geo.distance (di_long_start, di_lat_start, di_long_dest, di_lat_dest, di_distance, di_duration, di_status) VALUES(" .
$tmp_pair1[1] . ", " . $tmp_pair1[0] . ", " . $tmp_pair2[1] . ", " . $tmp_pair2[0] . ", " .
$json_answerA["rows"][$i]["elements"][$j]["distance"]["value"] . ", " .
$json_answerA["rows"][$i]["elements"][$j]["duration"]["value"] . ", '" .
$json_answerA["rows"][$i]["elements"][$j]["status"] . "')";
writeLog_xServer("get_distances_google: [" . $sqlquery . "]");
$res = $db_geo->query($sqlquery);
if (DB::isError($res)) reportDie ("$PHP_SELF: '$sqlquery' : " . $res->getMessage());
endif;
else:
$res->free();
endif;
$retArr[] = array(
$tmp_pair1[1], $tmp_pair1[0], $tmp_pair2[1], $tmp_pair2[0],
$json_answerA["rows"][$i]["elements"][$j]["distance"]["value"],
$json_answerA["rows"][$i]["elements"][$j]["duration"]["value"],
$json_answerA["rows"][$i]["elements"][$j]["status"]);
endfor;
endfor;
elseif ($retryCnt > 1):
writeLog_xServer("get_distances_google: ['" . $origins . "', '" . $destinations . "'] " .
"[doing " . ($maxTries - $retryCnt + 1) . ". retry]");
usleep(250000); // 0,25 sec schlafen
endif;
} while ($json_answerA["status"] != "OK" && --$retryCnt > 0);
if ($json_answerA["status"] != "OK"):
writeLog_xServer("get_distances_google: ['" . $origins . "', '" . $destinations . "'] " .
"[giving up after " . $maxTries . " tries]");
elseif ($retryCnt + 1 < $maxTries):
writeLog_xServer("get_distances_google: ['" . $origins . "', '" . $destinations . "'] " .
"[needed " . ($maxTries - $retryCnt + 1) . " tries]");
endif;
writeLog_xServer("get_distances_google: \$retArr = " . json_encode($retArr));
return $retArr;
}
function check_expired($modify_date, $force_date = '0000-00-00 00:00:00') {
if ($force_date == '0000-00-00 00:00:00')
return (time() < strtotime($modify_date) + getParameterValue("0", "GEOCACHE_LIFETIME", "0") * 24 * 3600);
writeLog_xServer("check_expired: \$force_date = '" . $force_date . "', \$modify_date = '" . $modify_date . "'");
return (strtotime($force_date) < strtotime($modify_date));
}
function get_coords($ad_country, $ad_zipcode, $ad_city, $ad_street, $tr_hsno, $zipcode_only = false) {
$db_geo = get_db_geo();
global $phpVersion;
$retArr = array(0, 0);
$ad_country_clause = "ad.ad_country = '" . $ad_country . "'";
if ($ad_country == "DE" || $ad_country == "D")
$ad_country_clause = "(ad.ad_country = 'DE' OR ad.ad_country = 'D')";
$sqlquery = "SELECT adg.ad_id, adg_gps_long, adg_gps_lat, adg_accuracy, adg_modify FROM address_geo.address AS ad, address_geo.address_geo AS adg WHERE " .
$ad_country_clause . " AND ad.ad_zipcode = '" . my_str_check($ad_zipcode) . "' AND ad.ad_city = '" . my_str_check($ad_city) . "' AND ad.ad_street = '" . my_str_check($ad_street) . "' " .
"AND ad.ad_id = adg.ad_id AND adg.adg_hsno = '" . $tr_hsno . "'";
writeLog_xServer("get_coords: [" . $sqlquery . "]");
$res = $db_geo->query($sqlquery);
if (DB::isError($res)) reportDie ("$PHP_SELF: '$sqlquery' : " . $res->getMessage());
$is_valid = false;
$update_ad_id = 0;
if ($row = ($phpVersion >= "8.0" ? $res->fetch_assoc() : $res->fetchRow())):
writeLog_xServer("get_coords: ['" . $ad_country . "' '" . $ad_zipcode . "' '" . $ad_city . "' '" . $ad_street . "' '" . $tr_hsno . "'] " .
"[" . $row["adg_accuracy"] . ", " . $row["adg_gps_lat"] . ", " . $row["adg_gps_long"] . ", " . $row["adg_modify"] . "]");
$is_valid = check_expired($row["adg_modify"]);
if (!$is_valid)
$update_ad_id = $row["ad_id"];
endif;
if ($is_valid) {
if ($row["adg_accuracy"] >= 6 || ($zipcode_only && $row["adg_accuracy"] == 5)) {
$retArr = array($row["adg_gps_lat"], $row["adg_gps_long"]);
}
} else {
// Warte 0,75 Zehntel-Sekunden um "620 - too man queries" zu vermeiden
usleep(75000);
$row_google = check_address_google(($ad_country == "D" ? "DE" : $ad_country), $ad_zipcode, $ad_city, $ad_street, $tr_hsno, $update_ad_id);
if ($row_google[0] >= 6) {
$retArr = array($row_google[1], $row_google[2]);
}
}
$res->free();
return($retArr);
}
function set_coords($ad_country, $ad_zipcode, $ad_city, $ad_street, $tr_hsno, $adg_gps_lat, $adg_gps_long, $adg_gps_accuracy) {
$db_geo = get_db_geo();
global $phpVersion;
$adg_gps_lat = round($adg_gps_lat, 6);
$adg_gps_lomg = round($adg_gps_long, 6);
$sqlquery = "SELECT adg.ad_id, adg_gps_long, adg_gps_lat, adg_accuracy, adg_modify FROM address_geo.address AS ad, address_geo.address_geo AS adg WHERE " .
"ad.ad_country = '" . $ad_country . "' AND ad.ad_zipcode = '" . my_str_check($ad_zipcode) . "' AND ad.ad_city = '" . my_str_check($ad_city) . "' AND ad.ad_street = '" . my_str_check($ad_street) . "' " .
"AND ad.ad_id = adg.ad_id AND adg.adg_hsno = '" . $tr_hsno . "'";
writeLog_xServer("set_coords: [" . $sqlquery . "]");
$res = $db_geo->query($sqlquery);
if (DB::isError($res)) reportDie ("$PHP_SELF: '$sqlquery' : " . $res->getMessage());
$update_ad_id = 0;
if ($row = ($phpVersion >= "8.0" ? $res->fetch_assoc() : $res->fetchRow())):
writeLog_xServer("set_coords: ['" . $ad_country . "' '" . $ad_zipcode . "' '" . $ad_city . "' '" . $ad_street . "' '" . $tr_hsno . "'] [" . $row["adg_accuracy"] . ", " . $row["adg_gps_lat"] . ", " . $row["adg_gps_long"] . ", " . $row["adg_modify"] . "]");
$update_ad_id = $row["ad_id"];
else:
$sqlquery = "SELECT ad_id FROM address WHERE ad_street = '" . my_str_check($ad_street) . "' AND ad_zipcode = '" . my_str_check($ad_zipcode) . "' AND ad_city = '" . my_str_check($ad_city) . "' AND ad_country = '" . $ad_country . "'";
$res1 = $db_geo->query($sqlquery);
if (DB::isError($res1)) reportDie ("$PHP_SELF: '$sqlquery' : " . $res1->getMessage());
if ($row1 = ($phpVersion >= "8.0" ? $res1->fetch_assoc() : $res1->fetchRow())):
$ad_id = $row1["ad_id"];
else:
$sqlquery = "INSERT INTO address (ad_street, ad_zipcode, ad_city, ad_country) VALUES ('" . my_str_check($ad_street) . "', '" . my_str_check($ad_zipcode) . "', '" . my_str_check($ad_city) . "', '$ad_country')";
writeLog_xServer("set_coords: [" . $sqlquery . "] ");
$res2 = $db_geo->query($sqlquery);
if (DB::isError($res2)) reportDie ("$PHP_SELF: '$sqlquery' : " . $res2->getMessage());
$ad_id = $db_geo->getOne("SELECT LAST_INSERT_ID()");
endif;
endif;
$res->free();
if ($update_ad_id > 0):
$sqlquery = "UPDATE address_geo SET adg_accuracy = " . $adg_gps_accuracy . ", adg_gps_lat = " . $adg_gps_lat . ", adg_gps_long = " . $adg_gps_long . ", adg_modify = NOW() WHERE ad_id = " . $update_ad_id . " AND adg_hsno = '" . $tr_hsno . "'";
else:
$sqlquery = "INSERT INTO address_geo (ad_id, adg_hsno, adg_accuracy, adg_gps_long, adg_gps_lat) VALUES ('$ad_id', '$tr_hsno', " . $adg_gps_accuracy . ", '" . $adg_gps_long . "', '" . $adg_gps_lat . "')";
endif;
writeLog_xServer("set_coords: [" . $sqlquery . "] ");
$res = $db_geo->query($sqlquery);
if (DB::isError($res)): reportDie ("$PHP_SELF: '$sqlquery' : " . $res->getMessage()); endif;
}
// Für BWV eingeführt, $full_address = "" für Preisrechner
function get_address($gps_lat, $gps_long, $full_address = "") {
$db_geo = get_db_geo();
global $phpVersion;
$retArr = array("", "", "", "", "");
$is_valid = false;
$update_ad_id = 0;
if ($full_address == "") {
$sqlquery = "SELECT ad.ad_id, ad.ad_country, ad.ad_zipcode, ad.ad_city, ad.ad_street, adg.adg_hsno, adg.adg_accuracy, adg.adg_modify FROM address_geo.address AS ad, address_geo.address_geo AS adg WHERE " .
"adg.adg_gps_long = " . $gps_long . " AND adg_gps_lat = " . $gps_lat . " AND ad.ad_id = adg.ad_id";
writeLog_xServer("get_address: [" . $sqlquery . "]");
$res = $db_geo->query($sqlquery);
if (DB::isError($res)) reportDie ("$PHP_SELF: '$sqlquery' : " . $res->getMessage());
if ($row = ($phpVersion >= "8.0" ? $res->fetch_assoc() : $res->fetchRow())):
writeLog_xServer("get_address: ['" . $row["ad_country"] . "' '" . $row["ad_zipcode"] . "' '" . $row["ad_city"] . "' '" . $row["ad_street"] . "' '" . $row["adg_hsno"] . "'] " .
"[" . $row["adg_accuracy"] . ", " . $gps_lat . ", " . $gps_long . ", " . $row["adg_modify"] . "]");
$is_valid = check_expired($row["adg_modify"]);
if (!$is_valid)
$update_ad_id = $row["ad_id"];
endif;
$res->free();
}
if ($is_valid) {
$retArr = array($row["adg_accuracy"], $row["ad_country"], $row["ad_zipcode"], $row["ad_city"], $row["ad_street"], $row["adg_hsno"]);
} else {
// Warte 0,75 Zehntel-Sekunden um "620 - too man queries" zu vermeiden
usleep(75000);
$row_google = check_coords_google($gps_lat, $gps_long, $update_ad_id, $full_address);
$retArr = array($row_google[1], $row_google[2], $row_google[3], $row_google[4], $row_google[5], $row_google[6]);
}
return($retArr);
}
// $duration_only = false für BWV eingeführt
function get_distance_google($origin, $destination, $force_date = '0000-00-00 00:00:00', $mode, $duration_only = false) {
$db_geo = get_db_geo();
global $phpVersion;
$is_valid = false;
$update_di_id = 0;
if ($mode == "km") {
$sqlquery = "SELECT di_id, di_distance, di_duration, di_status, di_modify FROM address_geo.distance WHERE " .
"di_lat_start = " . $origin[0] . " AND " .
"di_long_start = " . $origin[1] . " AND " .
"di_lat_dest = " . $destination[0] . " AND " .
"di_long_dest = " . $destination[1];
writeLog_xServer("get_distance_google: [" . $sqlquery . "]");
$res = $db_geo->query($sqlquery);
if (DB::isError($res)) reportDie ("$PHP_SELF: '$sqlquery' : " . $res->getMessage());
if ($row = ($phpVersion >= "8.0" ? $res->fetch_assoc() : $res->fetchRow())):
writeLog_xServer("get_distance_google: [(" . $origin[0] . ", " . $origin[1] . ") -> (" . $destination[0] . ", " . $destination[1] . ") " .
"[" . $row["di_distance"] . ", " . $row["di_duration"] . ", " . $row["di_status"] . ", " . $row["di_modify"] . "]");
$is_valid = check_expired($row["di_modify"], $force_date);
if (!$is_valid)
$update_di_id = $row["di_id"];
endif;
$res->free();
}
// writeLog_xServer("get_distance_google: \$is_valid = " . $is_valid . ", \$update_di_id = " . $update_di_id);
if ($is_valid):
$retVal = $row["di_distance"];
if ($duration_only):
$retVal = $row["di_duration"];
endif;
else:
$request = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=" . $origin[0] . "," . $origin[1] . "&destinations=" . $destination[0] . "," . $destination[1] . "&mode=driving" . ($mode == "traffic" ? "&departure_time=now" : "") . "&language=de-DE&sensor=false&key=" . get_api_key();
$retVal = 0;
$maxTries = 5;
$retryCnt = $maxTries;
do {
$json_answer = file_get_contents($request);
$json_answerA = json_decode($json_answer, true);
writeLog_xServer("get_distance_google: [" . $request . "]\n" . $json_answer, "");
if ($json_answerA["status"] == "OK"):
if ($json_answerA["rows"][0]["elements"][0]["distance"]["value"] != 0 && $mode == "km"):
$retVal = $json_answerA["rows"][0]["elements"][0]["distance"]["value"];
if ($duration_only):
$retVal = $json_answerA["rows"][0]["elements"][0]["duration"]["value"];
endif;
writeLog_xServer("get_distance_google: \$retArr = " . json_encode(array(
$origin[0], $origin[1], $destination[0], $destination[1],
$json_answerA["rows"][0]["elements"][0]["distance"]["value"],
$json_answerA["rows"][0]["elements"][0]["duration"]["value"],
$json_answerA["rows"][0]["elements"][0]["status"])
));
if ($update_di_id > 0):
$sqlquery =
"UPDATE address_geo.distance SET di_lat_start = " . $origin[0] . ", di_long_start = " . $origin[1] .
", di_lat_dest = " . $destination[0] . ", di_long_dest = " . $destination[1] .
", di_distance = " . $json_answerA["rows"][0]["elements"][0]["distance"]["value"] .
", di_duration = " . $json_answerA["rows"][0]["elements"][0]["duration"]["value"] .
", di_status = '" . $json_answerA["rows"][0]["elements"][0]["status"] . "'" .
", di_modify = NOW()" .
" WHERE di_id = " . $update_di_id;
else:
$sqlquery =
"INSERT INTO address_geo.distance (di_lat_start, di_long_start, di_lat_dest, di_long_dest, di_distance, di_duration, di_status) VALUES(" .
$origin[0] . ", " . $origin[1] . ", " . $destination[0] . ", " . $destination[1] . ", " .
$json_answerA["rows"][0]["elements"][0]["distance"]["value"] . ", " .
$json_answerA["rows"][0]["elements"][0]["duration"]["value"] . ", '" .
$json_answerA["rows"][0]["elements"][0]["status"] . "')";
endif;
writeLog_xServer("get_distance_google: [" . $sqlquery . "]");
$res = $db_geo->query($sqlquery);
if (DB::isError($res)): reportDie ("$PHP_SELF: '$sqlquery' : " . $res->getMessage()); endif;
elseif ($json_answerA["rows"][0]["elements"][0]["duration_in_traffic"]["value"] != 0 && $mode == "traffic"):
$retVal = $json_answerA["rows"][0]["elements"][0]["duration_in_traffic"]["value"];
writeLog_xServer("get_distance_google: \$retArr = " . json_encode(array(
$origin[0], $origin[1], $destination[0], $destination[1],
$json_answerA["rows"][0]["elements"][0]["distance"]["value"],
$json_answerA["rows"][0]["elements"][0]["duration"]["value"],
$json_answerA["rows"][0]["elements"][0]["duration_in_traffic"]["value"],
$json_answerA["rows"][0]["elements"][0]["status"])
));
endif;
elseif ($retryCnt > 1):
writeLog_xServer("get_distance_google: ['" . $origin[0] . ", " . $origin[1] . "', '" . $destination[0] . ", " . $destination[1] . "'] [\$mode = ". $mode . "]" .
"[doing " . ($maxTries - $retryCnt + 1) . ". retry]");
usleep(250000); // 0,25 sec schlafen
endif;
} while ($json_answerA["status"] != "OK" && --$retryCnt > 0);
if ($json_answerA["status"] != "OK"):
writeLog_xServer("get_distance_google: ['" . $origin[0] . ", " . $origin[1] . "', '" . $destination[0] . ", " . $destination[1] . "'] [\$mode = ". $mode . "]" .
"[giving up after " . $maxTries . " tries]");
elseif ($retryCnt + 1 < $maxTries):
writeLog_xServer("get_distance_google: ['" . $origin[0] . ", " . $origin[1] . "', '" . $destination[0] . ", " . $destination[1] . "'] [\$mode = ". $mode . "]" .
"[needed " . ($maxTries - $retryCnt + 1) . " tries]");
endif;
endif;
return $retVal;
}
function get_distance_osm($origin, $destination) {
$db_geo = get_db_geo();
global $phpVersion;
$retVal = 0;
$sqlquery = "SELECT dio_id, dio_distance, dio_weight, dio_modify FROM address_geo.distance_osm WHERE " .
"dio_lat_start = " . $origin[0] . " AND " .
"dio_long_start = " . $origin[1] . " AND " .
"dio_lat_dest = " . $destination[0] . " AND " .
"dio_long_dest = " . $destination[1];
// writeLog_xServer("get_distance_osm: [" . $sqlquery . "]");
$res = $db_geo->query($sqlquery);
if (DB::isError($res)) reportDie ("$PHP_SELF: '$sqlquery' : " . $res->getMessage());
$is_valid = false;
$update_dio_id = 0;
if ($row = ($phpVersion >= "8.0" ? $res->fetch_assoc() : $res->fetchRow())):
writeLog_xServer("get_distance_osm : [(" . $origin[0] . ", " . $origin[1] . ") -> (" . $destination[0] . ", " . $destination[1] . ") " .
"[" . $row["dio_distance"] . ", " . $row["dio_weight"] . ", " . $row["dio_modify"] . "]");
$is_valid = check_expired($row["dio_modify"]);
if (!$is_valid)
$update_dio_id = $row["dio_id"];
endif;
$res->free();
if ($is_valid):
$retVal = $row["dio_distance"];
else:
$request = "https://routing.openstreetmap.de/routed-car/route/v1/driving/" . $origin[1] . "," . $origin[0] . ";" . $destination[1] . "," . $destination[0] . "?overview=false&alternatives=false&steps=false";
$retVal = 0;
$maxTries = 1;
$retryCnt = $maxTries;
do {
$json_answer = file_get_contents($request);
$json_answerA = json_decode($json_answer, true);
writeLog_xServer("get_distance_osm: [" . $request . "]\n" . $json_answer, "");
if ($json_answerA["code"] == "Ok"):
// writeLog_xServer("get_distance_osm: " . $json_answerA["routes"][0]["distance"], "");
if ($json_answerA["routes"][0]["distance"] != 0):
$retVal = $json_answerA["routes"][0]["distance"];
writeLog_xServer("get_distance_osm: \$retArr = " . json_encode(
array(
$origin[0], $origin[1], $destination[0], $destination[1],
$json_answerA["routes"][0]["distance"],
$json_answerA["routes"][0]["duration"],
$json_answerA["routes"][0]["weight"])
));
if ($update_dio_id > 0):
$sqlquery =
"UPDATE address_geo.distance_osm SET dio_lat_start = " . $origin[0] . ", dio_long_start = " . $origin[1] .
", dio_lat_dest = " . $destination[0] . ", dio_long_dest = " . $destination[1] .
", dio_distance = " . $json_answerA["routes"][0]["distance"] .
", dio_duration = " . $json_answerA["routes"][0]["duration"] .
", dio_weight = " . $json_answerA["routes"][0]["weight"] .
", dio_modify = NOW()" .
" WHERE dio_id = " . $update_dio_id;
else:
$sqlquery =
"INSERT INTO address_geo.distance_osm (dio_lat_start, dio_long_start, dio_lat_dest, dio_long_dest, dio_distance, dio_duration, dio_weight) VALUES (" .
$origin[0] . ", " . $origin[1] . ", " . $destination[0] . ", " . $destination[1] . ", " .
$json_answerA["routes"][0]["distance"] . ", " .
$json_answerA["routes"][0]["duration"] . ", '" .
$json_answerA["routes"][0]["weight"] . "')";
endif;
writeLog_xServer("get_distance_osm: [" . $sqlquery . "]");
$res = $db_geo->query($sqlquery);
if (DB::isError($res)) reportDie ("$PHP_SELF: '$sqlquery' : " . $res->getMessage());
endif;
elseif ($retryCnt > 1):
writeLog_xServer("get_distance_osm: ['" . $origin . "', '" . $destination . "'] " .
"[doing " . ($maxTries - $retryCnt + 1) . ". retry]");
usleep(250000); // 0,25 sec schlafen
endif;
} while ($json_answerA["code"] != "Ok" && --$retryCnt > 0);
if ($json_answerA["code"] != "Ok"):
writeLog_xServer("get_distance_osm: ['" . $origin[0] . ", " . $origin[1] . "', '" . $destination[0] . ", " . $destination[1] . "'] " .
"[giving up after " . $maxTries . " tries]");
elseif ($retryCnt + 1 < $maxTries):
writeLog_xServer("get_distance_osm: ['" . $origin[0] . ", " . $origin[1] . "', '" . $destination[0] . ", " . $destination[1] . "'] " .
"[needed " . ($maxTries - $retryCnt + 1) . " tries]");
endif;
endif;
return $retVal;
}
function get_tour_distance_new($stops, $force_date = '0000-00-00 00:00:00', $mode = "km") {
global $hq_id, $phpVersion;
$db_geo = get_db_geo();
$retVal = 0;
$retVal_osm = 0;
$is_valid = false;
$stops[0][0] = round($stops[0][0], 6);
$stops[0][1] = round($stops[0][1], 6);
for ($i = 0; $i < count($stops) - 1; $i++):
$stops[$i+1][0] = round($stops[$i+1][0], 6);
$stops[$i+1][1] = round($stops[$i+1][1], 6);
if ($mode == "km") {
$sqlquery = "SELECT di_id, di_distance, di_duration, di_status, di_modify FROM address_geo.distance WHERE " .
"di_lat_start = " . $stops[$i][0] . " AND " .
"di_long_start = " . $stops[$i][1] . " AND " .
"di_lat_dest = " . $stops[$i+1][0] . " AND " .
"di_long_dest = " . $stops[$i+1][1];
$res = $db_geo->query($sqlquery);
if (DB::isError($res)) reportDie ("$PHP_SELF: '$sqlquery' : " . $res->getMessage());
$is_valid = false;
if ($row = ($phpVersion >= "8.0" ? $res->fetch_assoc() : $res->fetchRow())):
writeLog_xServer("get_tour_distance_new: [(" . $stops[$i][0] . ", " . $stops[$i][1] . ") -> (" . $stops[$i+1][0] . ", " . $stops[$i+1][1] . ") " .
"[" . $row["di_distance"] . ", " . $row["di_duration"] . ", " . $row["di_status"] . ", " . $row["di_modify"] . "]");
// $is_valid = check_expired($row["di_modify"], $force_date);
$is_valid = false;
if (!$is_valid):
writeLog_xServer("get_tour_distance_new: [no longer valid]");
break;
endif;
if ($mode == "km"):
$retVal += $row["di_distance"];
else:
$retVal += $row["di_duration"];
endif;
else:
writeLog_xServer("get_tour_distance_new: [(" . $stops[$i][0] . ", " . $stops[$i][1] . ") -> (" . $stops[$i+1][0] . ", " . $stops[$i+1][1] . ") " .
"[not found]");
break;
endif;
$res->free();
}
// if ($mode == "km")
// $retVal_osm += get_distance_osm($stops[$i], $stops[$i + 1]);
endfor;
if (!$is_valid) {
$zones = get_zone_distance($stops, 0, 0, ($mode != "km"), false, true);
if ($mode == "km")
$retVal = (int) str_replace(" km", "", $zones["distance"]);
else
$retVal = (int) str_replace("s", "", $zones["duration"]);
}
if ($mode == "km") {
writeLog_xServer("get_tour_distance_new: [" . ($retVal / 1000) . ", " . ($retVal_osm / 1000) . "] [\$mode = " . $mode . "]");
return array($retVal / 1000, $retVal_osm / 1000);
}
writeLog_xServer("get_tour_distance_new: [" . $retVal . ", " . $retVal_osm . "] [\$mode = " . $mode . "]");
return array($retVal, $retVal_osm);
}
function get_tour_distance($stops, $force_date = '0000-00-00 00:00:00', $mode = "km") {
$db_geo = get_db_geo();
get_tour_distance_new($stops, $force_date, $mode);
$retVal = 0;
$retVal_osm = 0;
$stops[0][0] = round($stops[0][0], 6);
$stops[0][1] = round($stops[0][1], 6);
for ($i = 0; $i < count($stops) - 1; $i++):
$stops[$i+1][0] = round($stops[$i+1][0], 6);
$stops[$i+1][1] = round($stops[$i+1][1], 6);
$retVal += get_distance_google($stops[$i], $stops[$i + 1], $force_date, $mode);
// if ($mode == "km")
// $retVal_osm += get_distance_osm($stops[$i], $stops[$i + 1]);
endfor;
if ($mode == "km") {
writeLog_xServer("get_tour_distance: [" . ($retVal / 1000) . ", " . ($retVal_osm / 1000) . "] [\$mode = " . $mode . "]");
return array($retVal / 1000, $retVal_osm / 1000);
}
writeLog_xServer("get_tour_distance: [" . $retVal . ", " . $retVal_osm . "] [\$mode = " . $mode . "]");
return array($retVal, $retVal_osm);
}
function get_zone_distance($stops, $hq_id, $jb_id = 0, $traffic = false, $optimized = false, $distanceOnly = false) {
global $db_geo, $phpVersion, $dbhostPZM, $dbhostPZM1, $check_bwv;
writeLog_xServer("get_zone_distance: [\$check_bwv = " . $check_bwv . "]");
if (!isset($check_bwv))
$check_bwv = false;
// writeLog_xServer("get_zone_distance: [\$check_bwv = " . $check_bwv . "]");
$stopsForPost = array();
for ($i = 0; $i < count($stops); $i++):
$stopsForPost[] = $stops[$i][0] . "," . $stops[$i][1];
endfor;
$shortest = false;
$ridiculousShortest = false;
$roundTripKm = false;
if (!$traffic && !$optimized /* && !$distanceOnly */ && !$check_bwv) {
// if ($hq_id == 4 || $hq_id == 6 || $hq_id == 8)
if (getParameterValue("0", "PZM_ROUNDTRIPKM", $hq_id) == "1")
$roundTripKm = true;
if (getParameterValue("0", "PZM_SHORTEST", $hq_id) == "1")
$shortest = true;
if (getParameterValue("0", "PZM_SHORTEST", $hq_id) == "2")
$ridiculousShortest = true;
}
// writeLog_xServer("get_zone_distance: [\$shortest = " . $shortest . "]");
if ($check_bwv)
$shortest = true; // zur Prüfung ob ein Auftrag ein Fern-BWV-Auftrag ist, soll "Best of Three" verwendet werden
// writeLog_xServer("get_zone_distance: [\$shortest = " . $shortest . "]");
// $url = "http://172.16.0.158:81/api/pzm";
// $url = "http://Preis-Zonen-Modell:8080/api/pzm";
$url = "http://" . $dbhostPZM . "/api/pzm";
$postArray = array(
"stations" => $stopsForPost,
"hq_id" => (int) $hq_id,
"jb_id" => (int) $jb_id,
"traffic" => (bool) $traffic,
"optimized" => (bool) $optimized,
"distanceOnly" => (bool) $distanceOnly,
"shortest" => (bool) $shortest,
"ridiculousShortest" => (bool) $ridiculousShortest,
"roundTripKm"=> (bool) $roundTripKm,
"api_key" => get_api_key()
);
$jsonData = json_encode($postArray);
writeLog_xServer("get_zone_distance: [" . $jsonData . "]");
$i = 0;
do {
if ($i++ == 1)
$url = "http://" . $dbhostPZM1 . "/api/pzm";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-type: application/json"));
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
$json_response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// if ($i == 1)
// $status = 0;
if ($status != 200) {
writeLog_xServer("get_zone_distance: " . "Error: call to URL " . $url . " failed with status " . $status . ", response \"" . $json_response . "\", curl_error " . curl_error($ch) . ", curl_errno " . curl_errno($ch));
// die("Error: call to URL $url failed with status $status, response $json_response, curl_error " . curl_error($ch) . ", curl_errno " . curl_errno($ch));
include_once("../include/email/htmlMimeMail.php");
$mailObj = new htmlMimeMail();
$mailObj->setFrom("auto-mailer@assecutor.de");
$mailObj->setSubject("PZM-Server " . $url . " nicht erreichbar");
$mailObj->setText("Error: call to URL " . $url . " failed with status " . $status . ", response \"" . $json_response . "\", curl_error " . curl_error($ch) . ", curl_errno " . curl_errno($ch));
$mailResult = $mailObj->send(array("ca@assecutor.de"), 'smtp');
// $mailResult = $mailObj->send(array("support@assecutor.de"), 'smtp');
}
curl_close($ch);
writeLog_xServer("get_zone_distance: [" . $json_response . "] [" . $status . "]");
} while($status != 200 && $i < 2 && $dbhostPZM1 != "");
$responseArr = json_decode($json_response, true);
$db_geo = get_db_geo();
// $distance = 0;
// $duration = 0;
$di_ids = array("legs" => "", "eapLeg" => "", "edcLeg" => "");
$di_modify = date("Y-m-d H:i:s");
if (!is_null($responseArr['timestamp']))
$di_modify = str_replace("T", " ", substr($responseArr['timestamp'], 0, 19));
foreach (array("legs", "eapLeg", "edcLeg") as $legs_name) {
// $i = 0;
foreach ($responseArr[$legs_name] as $leg) {
if (isset($leg["polyline"]["encodedPolyline"])) {
$update_di_id = 0;
$sqlquery = "SELECT di_id, di_distance, di_duration, di_status, di_modify FROM address_geo.distance WHERE " .
"di_lat_start = " . round($leg["startLocation"]["latLng"]["latitude"], 6) . " AND " .
"di_long_start = " . round($leg["startLocation"]["latLng"]["longitude"], 6) . " AND " .
"di_lat_dest = " . round($leg["endLocation"]["latLng"]["latitude"], 6) . " AND " .
"di_long_dest = " . round($leg["endLocation"]["latLng"]["longitude"], 6);
// "di_lat_start = " . $stops[$i][0] . " AND " .
// "di_long_start = " . $stops[$i][1] . " AND " .
// "di_lat_dest = " . $stops[$i+1][0] . " AND " .
// "di_long_dest = " . $stops[$i+1][1];
writeLog_xServer("get_zone_distance: " . "[" . $sqlquery . "]" . round($leg["endLocation"]["latLng"]["latitude"], 6) . "|" . round($leg["endLocation"]["latLng"]["longitude"], 6));
$res = $db_geo->query($sqlquery);
if (DB::isError($res)) reportDie ("$PHP_SELF: '$sqlquery' : " . $res->getMessage());
if ($row = ($phpVersion >= "8.0" ? $res->fetch_assoc() : $res->fetchRow())):
writeLog_xServer("get_zone_distance: [(" . round($leg["startLocation"]["latLng"]["latitude"], 6) . ", " . round($leg["startLocation"]["latLng"]["longitude"], 6) . ") -> (" . round($leg["endLocation"]["latLng"]["latitude"], 6) . ", " . round($leg["endLocation"]["latLng"]["longitude"], 6) . ") " .
"[" . $row["di_distance"] . ", " . $row["di_duration"] . ", " . $row["di_status"] . ", " . $row["di_modify"] . "]");
$update_di_id = $row["di_id"];
$update_di_distance = $row["di_distance"];
endif;
$res->free();
if ($update_di_id > 0):
$sqlquery =
"UPDATE address_geo.distance SET" .
// " di_lat_start = " . round($leg["startLocation"]["latLng"]["latitude"], 6) .
// ", di_long_start = " . round($leg["startLocation"]["latLng"]["longitude"], 6) .
// ", di_lat_dest = " . round($leg["endLocation"]["latLng"]["latitude"], 6) .
// ", di_long_dest = " . round($leg["endLocation"]["latLng"]["longitude"], 6) .
" di_distance = " . $leg["distanceMeters"] .
", di_duration = " . str_replace("s", "", $leg["duration"]) .
", di_polyline = '" . str_replace("\\", ".", $leg["polyline"]["encodedPolyline"]) . "'" .
", di_status = '" . "OK" . "'" .
", di_modify = '" . $di_modify . "'" .
" WHERE di_id = " . $update_di_id;
if ($update_di_distance != $leg["distanceMeters"]):
writeLog_xServer("get_zone_distance: \di_id = " . $update_di_id . ", di_distance old = " . $update_di_distance . ", di_distance new = " . $leg["distanceMeters"] . ", \$shortest = " . $shortest);
endif;
else:
$sqlquery =
"INSERT INTO address_geo.distance (di_lat_start, di_long_start, di_lat_dest, di_long_dest, di_distance, di_duration, di_polyline, di_status, di_modify) VALUES (" .
round($leg["startLocation"]["latLng"]["latitude"], 6) . ", " .
round($leg["startLocation"]["latLng"]["longitude"], 6) . ", " .
round($leg["endLocation"]["latLng"]["latitude"], 6) . ", " .
round($leg["endLocation"]["latLng"]["longitude"], 6) . ", " .
// $stops[$i][0] . ", " .
// $stops[$i][1] . ", " .
// $stops[$i+1][0] . ", " .
// $stops[$i+1][1] . ", " .
$leg["distanceMeters"] . ", " .
str_replace("s", "", $leg["duration"]) . ", '" .
str_replace("\\", ".", $leg["polyline"]["encodedPolyline"]) . "', '" .
"OK', '" .
$di_modify . "')";
endif;
writeLog_xServer("get_zone_distance: [" . $sqlquery . "]");
$res = $db_geo->query($sqlquery);
if (DB::isError($res)): reportDie ("$PHP_SELF: '$sqlquery' : " . $res->getMessage()); endif;
if ($update_di_id == 0)
$update_di_id = $db_geo->getOne("SELECT LAST_INSERT_ID()");
// $distance += $leg["distanceMeters"];
// $duration += (float) str_replace("s", "", $leg["duration"]);
$di_ids[$legs_name] .= ($di_ids[$legs_name] != "" ? "," : "") . $update_di_id;
} else {
writeLog_xServer("get_zone_distance: [" . "\$leg[\"polyline\"][\"encodedPolyline\"]" . " for " . $legs_name . "]");
}
// $i++;
}
}
// $responseArr["distance"] = ($distance / 1000) . " km";
// $responseArr["duration"] = $duration . "s";
$responseArr["di_ids"] = $di_ids;
// writeLog_xServer("get_zone_distance: ". var_export($responseArr, true));
writeLog_xServer("get_zone_distance: ". json_encode($responseArr));
return $responseArr;
}
// $start_lat = 0, $start_long = 0, $end_lat = 0, $end_long = 0 für BWV eingeführt
function get_job_distance($jb_id, $mode = "km", $tr_sort = 0, $start_lat = 0, $start_long = 0, $end_lat = 0, $end_long = 0) {
global $db, $phpVersion, $hq_id;
writeLog_xServer("get_job_distance: \$jb_id = " . $jb_id . ", \$mode = " . $mode . ", \$tr_sort = " . $tr_sort);
if (trim($jb_id) == "" || !is_numeric($jb_id) || $jb_id == 0)
return;
$db_geo = get_db_geo();
$hq_id = $db->getOne("SELECT hq_id FROM job WHERE jb_id = " . $jb_id);
if ($mode == "km") {
// km manuell angepasst?
$jbprc_remark = $db->getOne("SELECT jbprc_remark FROM jobprice WHERE jb_id = " . $jb_id . " AND mt_sort = 11");
if (strtolower(trim($jbprc_remark)) == "m" || $jbprc_remark == "c") {
writeLog_xServer("get_job_distance: km_value is " . ($jbprc_remark == "m" ? "manual" : ($jbprc_remark == "c" ? "jobcalculator" : $jbprc_remark)) . ", nothing to do");
return array(-1, -1);
}
}
$stops = array();
$cr_coords = false;
if ($mode == "traffic") {
$cr_id = $db->getOne("SELECT cr_id FROM job WHERE jb_id = " . $jb_id);
if ($cr_id != "") {
$cr_gps_time = $db->getOne("SELECT cr_gps_time FROM courier WHERE cr_id = " . $cr_id);
// Parameter für Verfallsdatum fehlt noch, hier jetzt hardcoded 15 Min
if (time() <= strtotime($cr_gps_time) + 15 * 60) {
$cr_gps_long = $db->getOne("SELECT cr_gps_long FROM courier WHERE cr_id = " . $cr_id);
$cr_gps_lat = $db->getOne("SELECT cr_gps_lat FROM courier WHERE cr_id = " . $cr_id);
$stops[0] = array($cr_gps_lat, $cr_gps_long);
$cr_coords = true;
} else {
writeLog_xServer("get_job_distance: coords are too old for \$cr_id = " . $cr_id . " (\$cr_gps_time = " . $cr_gps_time . ")");
}
} else {
writeLog_xServer("get_job_distance: \$cr_id = " . $cr_id . " (i. e. error: no courier associated)");
return array(-1, -1);
}
}
$error_station = 0;
$station_count = 0;
$last_finishtime = "0000-00-00 00:00:00";
$last_finish_tr_sort = 0;
$sqlquery = "SELECT tr_sort, tr_status, tr_finishtime, ad_street, ad_zipcode, ad_city, ad_country, tr_hsno " .
"FROM tour, address WHERE jb_id = " . $jb_id . " AND tour.ad_id = address.ad_id ORDER BY tr_sort";
$res = $db->query($sqlquery);
if (DB::isError($res)) die ("$PHP_SELF: '$sqlquery' : " . $res->getMessage());
while ($row = ($phpVersion >= "8.0" ? $res->fetch_assoc() : $res->fetchRow())):
$coords = get_coords($row["ad_country"], $row["ad_zipcode"], $row["ad_city"], $row["ad_street"], $row["tr_hsno"]);
if ($coords[0] != 0 && $coords[1] != 0) {
if ($mode != "traffic" || ($row["tr_status"] == 0 && $row["tr_sort"] <= $tr_sort)) {
if ($mode == "traffic" && !$cr_coords && time() > strtotime($last_finishtime) + 15 * 60) {
writeLog_xServer("courier-coords are too old and no finished station or finished station is too old (\$last_finishtime = " . $last_finishtime . ", \$last_finish_tr_sort = " . $last_finish_tr_sort . ")");
return array(-1, -1);
}
$stops[] = $coords;
if ($row["tr_sort"] < $tr_sort)
$station_count++;
} elseif(!$cr_coords && $row["tr_status"] == 1) {
$stops[0] = $coords;
$last_finishtime = $row["tr_finishtime"];
$last_finish_tr_sort = $row["tr_sort"];
}
} else {
$error_station = $row["tr_sort"];
break;
}
endwhile;
$res->free();
if ($start_lat != 0 && $start_long != 0 && $end_lat != 0 && $end_long != 0) {
array_unshift($stops, array($start_lat, $start_long));
$stops[] = array($end_lat, $end_long);
}
writeLog_xServer("get_job_distance: " . json_encode($stops));
$total_km = 0;
if (count($stops) > 0) {
if ($error_station == 0) {
list($total_km, $total_km_osm) = get_tour_distance($stops, '0000-00-00 00:00:00', $mode);
} else {
if ($mode == "traffic") {
$total_km = -1;
}
writeLog_xServer("get_job_distance: Adresse in Station " . $error_station . " nicht ok");
}
} else {
if ($mode == "traffic") {
$total_km = -1;
}
writeLog_xServer("get_job_distance: job has one station only");
}
if ($mode == "km" && $start_lat == 0 && $start_long == 0 && $end_lat == 0 && $end_long == 0) {
$db->query("DELETE FROM jobprice WHERE jb_id = " . $jb_id . " AND mt_sort = 11");
writeLog_xServer("get_job_distance: [INSERT INTO jobprice (jb_id, mt_sort, jbprc_price, jbprc_remark) VALUES (" . $jb_id . ", 11, " . $total_km . ", '" . $total_km_osm . "')]");
$db->query("INSERT INTO jobprice (jb_id, mt_sort, jbprc_price, jbprc_remark) VALUES (" . $jb_id . ", 11, " . $total_km . ", '" . $total_km_osm . "')");
}
writeLog_xServer("get_job_distance: \$total_km = " . $total_km . ", \$mode = " . $mode . ", " . ($mode == "km" ? "\$total_km_osm = " . $total_km_osm : "\$station_count = " . $station_count));
return array($total_km, ($mode == "km" ? $error_station : $station_count));
// return array($total_km, ($mode == "km" ? $total_km_osm : $station_count));
}
function get_tour_duration($tr_id) {
global $db;
writeLog_xServer("get_tour_duration: \$tr_id = " . $tr_id);
$gdc_content = $db->getOne("SELECT gdc_content FROM genericdatacontainer WHERE gdc_obj_type = 'tr' AND gdc_gen_fieldname = 'tr_tracking' AND gdc_obj_id = " . $tr_id);
$gdc_content_arr = explode("|", $gdc_content);
// Parameter für Verfallsdatum fehlt noch, hier jetzt hardcoded 15 Min (ebenso wie oben die 15 Minuten für das Höchstalter der letzten Ortung)
if (count($gdc_content_arr) > 1) {
//if (time() < strtotime($modify_date) + getParameterValue("0", "GEOCACHE_LIFETIME", "0") * 24 * 3600)
if (time() < strtotime($gdc_content_arr[1]) + 15 * 60 && $gdc_content_arr[2] != -1) {
$duration_in_traffic = $gdc_content_arr[2] - (time() - strtotime($gdc_content_arr[1]));
writeLog_xServer("get_tour_duration: " . (15 * 60 - (time() - strtotime($gdc_content_arr[1]))) . " secs until next request (\$tr_id = " . $tr_id . ", \$gdc_content_arr[1] = " . $gdc_content_arr[1] . ", \$gdc_content_arr[2] = " . $gdc_content_arr[2] . ", \$duration_in_traffic = " . $duration_in_traffic . ")");
return $duration_in_traffic;
}
}
$jb_id = $db->getOne("SELECT jb_id FROM tour WHERE tr_id = " . $tr_id);
$tr_sort = $db->getOne("SELECT tr_sort FROM tour WHERE tr_id = " . $tr_id);
list($duration_in_traffic, $station_count) = get_job_distance($jb_id, "traffic", $tr_sort);
$csc_id_payer = $db->getOne("SELECT csc_id_payer FROM job WHERE jb_id = " . $jb_id);
$cs_id = $db->getOne("SELECT cs_id FROM costcenter WHERE csc_id = " . $csc_id_payer);
$cs_charging_time = $db->getOne("SELECT cs_charging_time FROM customer WHERE cs_id = " . $cs_id);
// $duration_in_traffic = round($duration_in_traffic / 60 * 2 / 10) / 2 * 10 * 60 + $cs_charging_time * $station_count * 60;
if ($duration_in_traffic != -1)
$duration_in_traffic += $cs_charging_time * $station_count * 60;
updateStmt("genericdatacontainer", "gdc_obj_id", $tr_id, array("gdc_content", $gdc_content_arr[0] . "|" . date("Y-m-d H:i:s") . "|" . $duration_in_traffic), "gdc_obj_type = 'tr' AND gdc_gen_fieldname = 'tr_tracking'");
writeLog_xServer("get_tour_duration: \$jb_id = " . $jb_id . ", \$tr_id = " . $tr_id . ", \$duration_in_traffic = " . $duration_in_traffic);
return $duration_in_traffic;
}
/*******************************************************************************
Working:
Not working:
*******************************************************************************/
?>