Files
votianng/html/geo/distance.php
2026-03-29 10:34:57 +02:00

368 lines
14 KiB
PHP

<?php
/*=======================================================================
*
* distance.php
*
* Autor: Marc Vollmann
*
=======================================================================*/
include_once ("../include/global.inc.php");
include_once ("../include/auth.inc.php");
include_once('../geo/geocode.inc.php');
function draw_route($target,$stationlist,&$GlobalRouteList,&$imageurl,&$imageurlT,$targetmap = false)
{
global $Application,$map_width,$map_height;
list($tcpip,$path,$requestname,$imageurl) = GetNextRequestParameter($tcpip,$path,$requestname,$imageurl2,$map,$language);
$RouteObject=null;
include_once($Application['OBJECT_BASE'].'alroute.inc.php');
$RouteObject = new ALRoute;
$RouteObject->BPUseTCPIP="TRUE";
$RouteObject->BPMaxCalcWait=60000;
if ($Application["COM_LOG"])
$RouteObject->BPLogFilePath=$Application["COM_LOG_FILE"];
$RouteObject->BPParaRequestFileName=$requestname;
$RouteObject->BPMapsByStream=false;
$RouteObject->BPStreamDirectory=$Application["MAP_PATH"];
// Language-Code: D=7, F=12, GB=9, I=16, E=10, NL=19, PT=22, SW=29
$GetLanguageCode="7";
$RouteObject->BFAddParam("CLIENT","LANGUAGEID",$GetLanguageCode);
$RouteObject->BPALS=$tcpip;
$stationdelimiter="|";
$RouteObject->BFAddParam("CLIENT","STATIONDELIMITER",$stationdelimiter);
// $stationen=intval(count($stationlist)/3);
// Fixed, because always "start" and "finish"
$stationen=2;
for ($i=1; $i<=$stationen; $i=$i+1)
$RouteObject->BFAddParam("CLIENT","STATION" . $i, "COORDINATES" . $stationdelimiter . $stationlist["x" . $i] . $stationdelimiter . $stationlist["y" . $i] . $stationdelimiter . $stationlist["l" . $i]);
$RouteObject->RouteTableDefString="nothing";
$RouteObject->RouteInfo=true;
$RouteObject->RouteNodeLevel=5;
$RouteObject->RouteDetailLimit=10000;
$RouteObject->BFAddParam("CLIENT","PACKEDROUTELIST", "TRUE");
$RouteObject->AddToMap=false;
$result=$RouteObject->RouteRequest("");
if ($result!=2)
$logicalrect="0,0,0,0";
else {
if ($target=="")
$logicalrect=$RouteObject->BFGetParam($RouteObject->eATAns,"SERVER","LOGICALRECT","0,0,0,0");
else
$logicalrect=$RouteObject->BFGetParam($RouteObject->eATAns,"SERVER","LOGICALTARGETRECT","0,0,0,0");
$num_objects=intval($RouteObject->BFGetParam($RouteObject->eATAns,"RESULT","NUMNODES","0"));
$rowcount=0;
for ($i=1; $i<=$num_objects; $i=$i+1)
$GlobalRouteList["NODE_".$i]=$RouteObject->BFGetParam($RouteObject->eATAns,"RESULT","NODE".$i,"nada");
$GlobalRouteList["DISTTODRIVE"]= $RouteObject->BFGetParam($RouteObject->eATAns,"SERVER","DISTTODRIVE","");
$GlobalRouteList["TIMETODRIVE"]= $RouteObject->BFGetParam($RouteObject->eATAns,"SERVER","TIMETODRIVE","");
$GlobalRouteList["COSTS"]= $RouteObject->BFGetParam($RouteObject->eATAns,"SERVER","COSTS","");
$GlobalRouteList["ARRIVALTIME"]= $RouteObject->BFGetParam($RouteObject->eATAns,"SERVER","ARRIVALTIME","");
$GlobalRouteList["DEPARTURETIME"]= $RouteObject->BFGetParam($RouteObject->eATAns,"SERVER","DEPARTURETIME","");
$GlobalRouteList["ARRIVALDATE"]= $RouteObject->BFGetParam($RouteObject->eATAns,"SERVER","ARRIVALDATE","");
$GlobalRouteList["DEPARTUREDATE"]= $RouteObject->BFGetParam($RouteObject->eATAns,"SERVER","DEPARTUREDATE","");
$RouteObject=null;
return $logicalrect;
} // error while routing
$RouteObject=null;
return $logicalrect;
}
// Inserts the distance of a specified from- and a specified to-address
// REMARK: This function should not be called directly! Use the function "getDistance()", because
// a specified tour (adress to address) will be checked there and if the distance does not
// exist, the route-server would be contacted to get the data which are automatically stored
// into the database for invoicing!
// $adStreet1 : street of the from-address
// $adZipcode1 : zipcode of the from-address
// $adCity1 : city of the from-address
// $adHsno1 : house-number of the from-address
// $adStreet2 : street of the to-address
// $adZipcode2 : zipcode of the to-address
// $adCity2 : city of the to-address
// $adHsno2 : house-number of the to-address
function insertDistance($distance, $adStreet1, $adZipcode1, $adCity1, $adCountry1 = "DE", $adHsno1, $adStreet2, $adZipcode2, $adCity2, $adCountry2 = "DE", $adHsno2) {
global $db, $PHP_SELF;
$ok = FALSE;
$distance = trim($distance);
$adStreet1 = trim($adStreet1);
$adZipcode1 = trim($adZipcode1);
$adCity1 = trim($adCity1);
$adCountry1 = trim($adCountry1);
$adHsno1 = trim($adHsno1);
$adStreet2 = trim($adStreet2);
$adZipcode2 = trim($adZipcode2);
$adCity2 = trim($adCity2);
$adCountry2 = trim($adCountry2);
$adHsno2 = trim($adHsno2);
if ($adStreet1 != "" && $adZipcode1 != "" && $adCity1 != "" && $adCountry1 != "" && $adHsno1 != "" &&
$adStreet2 != "" && $adZipcode2 != "" && $adCity2 != "" && $adCountry2 != "" && $adHsno2 != "" && $distance != ""):
// Insert first address or get the existing address-id
$tmpArray = insertAddress($adStreet1, $adZipcode1, $adCity1, $adCountry1);
$adId1 = $tmpArray[0];
// Insert second address or get the existing address-id
$tmpArray = insertAddress($adStreet2, $adZipcode2, $adCity2, $adCountry2);
$adId2 = $tmpArray[0];
$distance = str_replace (",", ".", $distance);
// Insert distance
insertStmt("distance", array("ad_id_from", $adId1, "ds_hsno_from", $adHsno1,
"ad_id_to", $adId2, "ds_hsno_to", $adHsno2,
"ds_distance", $distance));
$ok = TRUE;
endif;
return $ok;
}
// Returns the distance of a specified from- and a specified to-address
// $adStreet1 : street of the from-address
// $adZipcode1 : zipcode of the from-address
// $adCity1 : city of the from-address
// $adHsno1 : house-number of the from-address
// $adStreet2 : street of the to-address
// $adZipcode2 : zipcode of the to-address
// $adCity2 : city of the to-address
// $adHsno2 : house-number of the to-address
function getDistance($adStreet1, $adZipcode1, $adCity1, $adCountry1 = "DE", $adHsno1, $adStreet2, $adZipcode2, $adCity2, $adCountry2 = "DE", $adHsno2) {
return 0;
global $db, $PHP_SELF, $statusMessage;
global $MGObject;
$distance = "";
$adStreet1 = trim($adStreet1);
$adZipcode1 = trim($adZipcode1);
$adCity1 = trim($adCity1);
$adCountry1 = trim($adCountry1);
$adHsno1 = trim($adHsno1);
$adStreet2 = trim($adStreet2);
$adZipcode2 = trim($adZipcode2);
$adCity2 = trim($adCity2);
$adCountry2 = trim($adCountry2);
$adHsno2 = trim($adHsno2);
if ($adStreet1 != "" && $adZipcode1 != "" && $adCity1 != "" && $adCountry1 != "" && $adHsno1 != "" &&
$adStreet2 != "" && $adZipcode2 != "" && $adCity2 != "" && $adCountry2 != "" && $adHsno2 != ""):
$sqlquery = "SELECT ds.ds_distance"
. " FROM distance AS ds, address AS ad1, address AS ad2"
. " WHERE ds.ds_hsno_from = '$adHsno1'"
. " AND ds.ds_hsno_to = '$adHsno2'"
. " AND ds.ad_id_from = ad1.ad_id"
. " AND ds.ad_id_to = ad2.ad_id"
. " AND ad1.ad_street = '$adStreet1'"
. " AND ad1.ad_zipcode = '$adZipcode1'"
. " AND ad1.ad_city = '$adCity1'"
. " AND ad1.ad_country = '$adCountry1'"
. " AND ad2.ad_street = '$adStreet2'"
. " AND ad2.ad_zipcode = '$adZipcode2'"
. " AND ad2.ad_city = '$adCity2'"
. " AND ad2.ad_country = '$adCountry2'";
$result = $db->query($sqlquery);
if (DB::isError($result)) die ("$PHP_SELF: " . $result->getMessage());
if ($row = $result->fetch_assoc()):
$distance = $row[ds_distance];
endif;
$result->free();
// if $distance = 0 then get distance-data from route-server
// ...
if ($distance == "") :
// *** START-ADDRESS ***
$resultType = getGeoCode($adStreet1,$adZipcode1,$adCity1,$adHsno1,$adCountry1,"");
// resultType == 2 -> exact match
if ($resultType == 2) :
// Geo-Coordinates
$xcoord=$MGObject->GeoCoordinateX;
$ycoord=$MGObject->GeoCoordinateY;
// Check for existing entry in address (because of redundance)
if ($xcoord == "" || $xcoord == 0 || $ycoord == "" || $ycoord == 0):
$statusMessage = "Die Startadresse konnte nicht geocodiert werden!";
endif;
// Initialize object
$MGObject=null;
endif;
// *** FINISH-ADDRESS ***
$resultType = getGeoCode($adStreet2,$adZipcode2,$adCity2,$adHsno2,$adCountry2,"");
// resultType == 2 -> exact match
if ($resultType == 2) :
// Geo-Coordinates
$xcoord2=$MGObject->GeoCoordinateX;
$ycoord2=$MGObject->GeoCoordinateY;
// Check for existing entry in address (because of redundance)
if ($xcoord2 == "" || $xcoord2 == 0 || $ycoord2 == "" || $ycoord2 == 0):
$statusMessage = "Die Zieladresse konnte nicht geocodiert werden!";
endif;
// Initialize object
$MGObject=null;
endif;
// *** Computation of the distance and storing into the database ***
if ($statusMessage == ""):
$stationlist["x1"]=$xcoord;
$stationlist["y1"]=$ycoord;
$stationlist["x2"]=$xcoord2;
$stationlist["y2"]=$ycoord2;
$GlobalRouteList="";
$logicalrect=draw_route($target,$stationlist,$GlobalRouteList,$imageurl,$imageurlT);
$distance =$GlobalRouteList["DISTTODRIVE"];
// $drivingTime = $GlobalRouteList["TIMETODRIVE"];
// Insert the new distance-data from the route-server into the database for invoicing later on
if ($distance != ""):
insertDistance($distance, $adStreet1, $adZipcode1, $adCity1, $adCountry1, $adHsno1, $adStreet2, $adZipcode2, $adCity2, $adCountry2, $adHsno2);
endif;
endif;
endif;
endif;
$distance = str_replace (",", ".", $distance);
return $distance;
}
// Returns the distance of a specified from- and a specified to-address
// $adId1 : ID of the from-address
// $adHsno1 : house-number of the from-address
// $adId2 : ID of the to-address
// $adHsno2 : house-number of the to-address
function getDistancePerID($adId1, $adHsno1, $adId2, $adHsno2) {
global $db, $PHP_SELF, $statusMessage;
global $MGObject;
$distance = "";
$adId1 = trim($adId1);
$adHsno1 = trim($adHsno1);
$adId2 = trim($adId2);
$adHsno2 = trim($adHsno2);
if ($adId1 != "" && $adHsno1 != "" && $adId2 != "" && $adHsno2 != ""):
$sqlquery = "SELECT ds.ds_distance"
. " FROM distance AS ds"
. " WHERE ds.ds_hsno_from = '$adHsno1'"
. " AND ds.ds_hsno_to = '$adHsno2'"
. " AND ds.ad_id_from = $adId1"
. " AND ds.ad_id_to = $adId2";
$result = $db->query($sqlquery);
if (DB::isError($result)) die ("$PHP_SELF: " . $result->getMessage());
if ($row = $result->fetch_assoc()):
$distance = $row[ds_distance];
endif;
$result->free();
// if $distance = 0 then get distance-data from route-server
// ...
if ($distance == "") :
// Check existence of the address-entries in the table "address"
// Check from-address
$tmpFields = getFieldsValueFromId("address","ad_id",$adId1,array("ad_street","ad_zipcode","ad_city","ad_country"));
$adStreet1 = $tmpFields[0];
$adZipcode1 = $tmpFields[1];
$adCity1 = $tmpFields[2];
$adCountry1 = $tmpFields[3];
// If from-address does not exist then to-address has not to be checked
if ($adStreet1 != "" && $adZipcode1 != "" && $adCity1 != "" && $adCountry1 != "" && $adHsno1 != ""):
// Check to-address
$tmpFields = getFieldsValueFromId("address","ad_id",$adId2,array("ad_street","ad_zipcode","ad_city","ad_country"));
$adStreet2 = $tmpFields[0];
$adZipcode2 = $tmpFields[1];
$adCity2 = $tmpFields[2];
$adCountry2 = $tmpFields[3];
endif;
if ($adStreet1 != "" && $adZipcode1 != "" && $adCity1 != "" && $adCountry1 != "" && $adHsno1 != "" &&
$adStreet2 != "" && $adZipcode2 != "" && $adCity2 != "" && $adCountry2 != "" && $adHsno2 != ""):
// Both addresses are existent and the distance can be computed
$distance = getDistance($adStreet1, $adZipcode1, $adCity1, $adCountry1, $adHsno1, $adStreet2, $adZipcode2, $adCity2, $adCountry2, $adHsno2);
endif;
endif;
endif;
$distance = str_replace (",", ".", $distance);
return $distance;
}
// ACTIVATE ONLY FOR TESTING!!!
// $distance = getDistance("Alsterdorfer Str.", "22297", "Hamburg", "D", "190", "Am Ochsenzoll", "22851", "Norderstedt", "D", "147");
// echo "Distanz: " . $distance . "<br><br>";
// $distance = getDistance("Langer Kamp", "22850", "Norderstedt", "D", "124a", "Langer Kamp", "22850", "Norderstedt", "D", "1");
// echo "Distanz: " . $distance . "<br><br>";
// $distance = getDistance("Alsterdorfer Str.", "22297", "Hamburg", "D", "190", "Friedrichshulder Weg", "25469", "Halstenbek", "D", "81");
// echo "Distanz: " . $distance . "<br><br>";
// $distance = getDistancePerID(1, "124", 2, "147");
// echo "Distanz: " . $distance . "<br><br>";
// $x = getAddressFromGeoCode(52, 13);
// echo "DISTANCE: ";
// echo $x[0] . " " . $x[1] . " " . $x[2] . "<br>";
?>