<?php |
<?php |
/* |
/* |
* GeoPo Encode in PHP |
* GeoPo Encode in PHP |
* @author : Shintaro Inagaki |
* @author : Shintaro Inagaki |
* @param $location (Array) |
* @param $location (Array) |
* @return $geopo (String) |
* @return $geopo (String) |
*/ |
*/ |
function geopoEncode($lat, $lng) |
function geopoEncode($lat, $lng) |
{ |
{ |
// 64characters (number + big and small letter + hyphen + underscore) |
// 64characters (number + big and small letter + hyphen + underscore) |
$chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_"; |
$chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_"; |
|
|
$geopo = ""; |
$geopo = ""; |
$scale = 7; |
$scale = 7; |
|
|
// Change a degree measure to a decimal number |
// Change a degree measure to a decimal number |
$lat = ($lat + 90) / 180 * pow(8, 10); |
$lat = ($lat + 90) / 180 * pow(8, 10); |
$lng = ($lng + 180) / 360 * pow(8, 10); |
$lng = ($lng + 180) / 360 * pow(8, 10); |
// Compute a GeoPo code from head and concatenate |
// Compute a GeoPo code from head and concatenate |
for ($i = 0; $i < $scale; $i++) { |
for ($i = 0; $i < $scale; $i++) { |
$geopo .= substr($chars, floor($lat / pow(8, 9 - $i) % 8) + floor($lng / pow(8, 9 - $i) % 8) * 8, 1); |
$geopo .= substr($chars, floor($lat / pow(8, 9 - $i) % 8) + floor($lng / pow(8, 9 - $i) % 8) * 8, 1); |
} |
} |
return $geopo; |
return $geopo; |
} |
} |
|
|
/* |
/* |
* GeoPo Decode in PHP |
* GeoPo Decode in PHP |
* @author : Shintaro Inagaki |
* @author : Shintaro Inagaki |
* @param $geopo (String) |
* @param $geopo (String) |
* @return $location (Array) |
* @return $location (Array) |
*/ |
*/ |
function geopoDecode($geopo) |
function geopoDecode($geopo) |
{ |
{ |
// 64characters (number + big and small letter + hyphen + underscore) |
// 64characters (number + big and small letter + hyphen + underscore) |
$chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_"; |
$chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_"; |
// Array for geolocation |
// Array for geolocation |
$location = array(); |
$location = array(); |
|
|
for ($i = 0; $i < strlen($geopo); $i++) { |
for ($i = 0; $i < strlen($geopo); $i++) { |
// What number of character that equal to a GeoPo code (0-63) |
// What number of character that equal to a GeoPo code (0-63) |
$order = strpos($chars, substr($geopo, $i, 1)); |
$order = strpos($chars, substr($geopo, $i, 1)); |
// Lat/Lng plus geolocation value of scale |
// Lat/Lng plus geolocation value of scale |
$location['lat'] = $location['lat'] + floor($order % 8) * pow(8, 9 - $i); |
$location['lat'] = $location['lat'] + floor($order % 8) * pow(8, 9 - $i); |
$location['lng'] = $location['lng'] + floor($order / 8) * pow(8, 9 - $i); |
$location['lng'] = $location['lng'] + floor($order / 8) * pow(8, 9 - $i); |
} |
} |
|
|
// Change a decimal number to a degree measure, and plus revised value that shift center of area |
// Change a decimal number to a degree measure, and plus revised value that shift center of area |
$location['lat'] = $location['lat'] * 180 / pow(8, 10) + 180 / pow(8, strlen($geopo)) / 2 - 90; |
$location['lat'] = $location['lat'] * 180 / pow(8, 10) + 180 / pow(8, strlen($geopo)) / 2 - 90; |
$location['lng'] = $location['lng'] * 360 / pow(8, 10) + 360 / pow(8, strlen($geopo)) / 2 - 180; |
$location['lng'] = $location['lng'] * 360 / pow(8, 10) + 360 / pow(8, strlen($geopo)) / 2 - 180; |
$location['scale'] = strlen($geopo); |
$location['scale'] = strlen($geopo); |
|
|
return $location; |
return $location; |
} |
} |
|
|
$conn = pg_connect("dbname=bus user=postgres password=snmc"); |
$conn = pg_connect("dbname=bus user=postgres password=snmc"); |
if (!$conn) { |
if (!$conn) { |
echo "An error occured.\n"; |
echo "An error occured.\n"; |
exit; |
exit; |
} |
} |
if ($_REQUEST['newlatlng']) { |
if ($_REQUEST['newlatlng']) { |
$latlng = explode(";", $_REQUEST['newlatlng']); |
$latlng = explode(";", $_REQUEST['newlatlng']); |
$lat = (float)$latlng[0]; |
$lat = (float)$latlng[0]; |
$lng = (float)$latlng[1]; |
$lng = (float)$latlng[1]; |
|
|
$geoPo = geopoEncode($lat, $lng); |
$geoPo = geopoEncode($lat, $lng); |
$nodelat = (int)($lat * 10000000); |
$nodelat = (int)($lat * 10000000); |
$nodelon = (int)($lng * 10000000); |
$nodelon = (int)($lng * 10000000); |
echo($nodelat . "," . $nodelon . "=$geoPo<br>"); |
echo($nodelat . "," . $nodelon . "=$geoPo<br>"); |
$sql = "UPDATE stops SET geohash='$geoPo', lat='$nodelat', lng='$nodelon', name=null, suburb=null WHERE geohash = '{$_REQUEST['oldgeopo']}'"; |
$sql = "UPDATE stops SET geohash='$geoPo', lat='$nodelat', lng='$nodelon', name=null, suburb=null WHERE geohash = '{$_REQUEST['oldgeopo']}'"; |
$result = pg_query($conn, $sql); |
$result = pg_query($conn, $sql); |
if (!$result) { |
if (!$result) { |
echo("Error in SQL query: " . pg_last_error() . "<br>\n"); |
echo("Error in SQL query: " . pg_last_error() . "<br>\n"); |
} else if (pg_affected_rows($result) == 0) { |
} else if (pg_affected_rows($result) == 0) { |
echo ("Error 0 points moved, please refresh page and try again"); |
echo ("Error 0 points moved, please refresh page and try again"); |
} else { |
} else { |
echo $_REQUEST['oldgeopo'] . " replaced with $geoPo <br>"; |
echo $_REQUEST['oldgeopo'] . " replaced with $geoPo <br>"; |
$updatedroutes = 0; |
$updatedroutes = 0; |
$result_outdatedroutes = pg_query($conn, "Select * FROM between_stops where points LIKE '%" . $_REQUEST['oldgeopo'] . ";%'"); |
$result_outdatedroutes = pg_query($conn, "Select * FROM between_stops where points LIKE '%" . $_REQUEST['oldgeopo'] . ";%'"); |
while ($outdatedroute = pg_fetch_assoc($result_outdatedroutes)) { |
while ($outdatedroute = pg_fetch_assoc($result_outdatedroutes)) { |
$newpoints = str_replace($_REQUEST['oldgeopo'], $geoPo, $outdatedroute['points']); |
$newpoints = str_replace($_REQUEST['oldgeopo'], $geoPo, $outdatedroute['points']); |
$sql = "UPDATE between_stops set points='$newpoints' where fromlocation = '{$outdatedroute['fromlocation']}' AND tolocation = '{$outdatedroute['tolocation']}' "; |
$sql = "UPDATE between_stops set points='$newpoints' where |
|
fromlocation = '".pg_escape_string($outdatedroute['fromlocation']). |
|
"' AND tolocation = '".pg_escape_string($outdatedroute['tolocation'])."' "; |
$result = pg_query($conn, $sql); |
$result = pg_query($conn, $sql); |
if (!$result) { |
if (!$result) { |
echo("Error in SQL query: " . pg_last_error() . "<br>\n"); |
echo("Error in SQL query: " . pg_last_error() . "<br>\n"); |
} |
} |
|
echo "updated ".$outdatedroute['fromlocation']."->".$outdatedroute['tolocation']."<br>"; |
$updatedroutes++; |
$updatedroutes++; |
} |
} |
echo "updated $updatedroutes routes<br>"; |
echo "updated $updatedroutes routes<br>"; |
} |
} |
} |
} |
flush(); |
flush(); |
?> |
?> |