Minor bus stop moving UI
[bus.git] / betweenpoint.move.php
blob:a/betweenpoint.move.php -> blob:b/betweenpoint.move.php
<?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' 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) {
  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();
?> ?>