<?php | |
/* | |
* GeoPo Encode in PHP | |
* @author : Shintaro Inagaki | |
* @param $location (Array) | |
* @return $geopo (String) | |
*/ | |
function geopoEncode($lat, $lng) | |
{ | |
// 64characters (number + big and small letter + hyphen + underscore) | |
$chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_"; | |
$geopo = ""; | |
$scale = 7; | |
// Change a degree measure to a decimal number | |
$lat = ($lat + 90) / 180 * pow(8, 10); | |
$lng = ($lng + 180) / 360 * pow(8, 10); | |
// Compute a GeoPo code from head and concatenate | |
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); | |
} | |
return $geopo; | |
} | |
$conn = pg_connect("dbname=bus user=postgres password=snmc"); | |
if (!$conn) { | |
echo "An error occured.\n"; | |
exit; | |
} | |
if ($_REQUEST['newlatlng']) { | |
$latlng = explode(";", $_REQUEST['newlatlng']); | |
$lat = (float)$latlng[0]; | |
$lng = (float)$latlng[1]; | |
$geoPo = geopoEncode($lat, $lng); | |
$nodelat = (int)($lat * 10000000); | |
$nodelon = (int)($lng * 10000000); | |
echo($nodelat . "," . $nodelon . "=$geoPo<br>"); | |
$sql = "INSERT INTO stops (geohash,lat,lng) VALUES ('$geoPo', '$nodelat', '$nodelon')"; | |
$result = pg_query($conn, $sql); | |
if (!$result) { | |
echo("Error in SQL query: " . pg_last_error() . "<br>\n"); | |
} else { | |
echo "Inserted new point at $geoPo <br>"; | |
} | |
} | |
flush(); | |
?> |
<?php | |
$conn = pg_connect("dbname=bus user=postgres password=snmc"); | |
if (!$conn) { | |
echo "An error occured.\n"; | |
exit; | |
} | |
if ($_REQUEST['oldgeopo']) { | |
$sql = " DELETE from stops WHERE geohash = '{$_REQUEST['oldgeopo']}'"; | |
$result = pg_query($conn, $sql); | |
if (!$result) { | |
echo("Error in SQL query: " . pg_last_error() . "<br>\n"); | |
} else { | |
echo "Deleted {$_REQUEST['oldgeopo']}<br>"; | |
} | |
} | |
flush(); | |
?> |
<?php | |
/* | |
* GeoPo Encode in PHP | |
* @author : Shintaro Inagaki | |
* @param $location (Array) | |
* @return $geopo (String) | |
*/ | |
function geopoEncode($lat, $lng) | |
{ | |
// 64characters (number + big and small letter + hyphen + underscore) | |
$chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_"; | |
$geopo = ""; | |
$scale = 7; | |
// Change a degree measure to a decimal number | |
$lat = ($lat + 90) / 180 * pow(8, 10); | |
$lng = ($lng + 180) / 360 * pow(8, 10); | |
// Compute a GeoPo code from head and concatenate | |
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); | |
} | |
return $geopo; | |
} | |
/* | |
* GeoPo Decode in PHP | |
* @author : Shintaro Inagaki | |
* @param $geopo (String) | |
* @return $location (Array) | |
*/ | |
function geopoDecode($geopo) | |
{ | |
// 64characters (number + big and small letter + hyphen + underscore) | |
$chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_"; | |
// Array for geolocation | |
$location = array(); | |
for ($i = 0; $i < strlen($geopo); $i++) { | |
// What number of character that equal to a GeoPo code (0-63) | |
$order = strpos($chars, substr($geopo, $i, 1)); | |
// Lat/Lng plus geolocation value of scale | |
$location['lat'] = $location['lat'] + 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 | |
$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['scale'] = strlen($geopo); | |
return $location; | |
} | |
$conn = pg_connect("dbname=bus user=postgres password=snmc"); | |
if (!$conn) { | |
echo "An error occured.\n"; | |
exit; | |
} | |
if ($_REQUEST['newlatlng']) { | |
$latlng = explode(";", $_REQUEST['newlatlng']); | |
$lat = (float)$latlng[0]; | |
$lng = (float)$latlng[1]; | |
$geoPo = geopoEncode($lat, $lng); | |
$nodelat = (int)($lat * 10000000); | |
$nodelon = (int)($lng * 10000000); | |
echo($nodelat . "," . $nodelon . "=$geoPo<br>"); | |
$sql = "UPDATE stops SET geohash='$geoPo', lat='$nodelat', lng='$nodelon', name=null, suburb=null WHERE geohash = '{$_REQUEST['oldgeopo']}'"; | |
$result = pg_query($conn, $sql); | |
if (!$result) { | |
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 { | |
echo $_REQUEST['oldgeopo'] . " replaced with $geoPo <br>"; | |
$updatedroutes = 0; | |
$result_outdatedroutes = pg_query($conn, "Select * FROM between_stops where points LIKE '%" . $_REQUEST['oldgeopo'] . ";%'"); | |
while ($outdatedroute = pg_fetch_assoc($result_outdatedroutes)) { | |
$newpoints = str_replace($_REQUEST['oldgeopo'], $geoPo, $outdatedroute['points']); | |
$sql = "UPDATE between_stops set points='$newpoints' where fromlocation = '{$outdatedroute['fromlocation']}' AND tolocation = '{$outdatedroute['tolocation']}' "; | |
$result = pg_query($conn, $sql); | |
if (!$result) { | |
echo("Error in SQL query: " . pg_last_error() . "<br>\n"); | |
} | |
$updatedroutes++; | |
} | |
echo "updated $updatedroutes routes<br>"; | |
} | |
} | |
flush(); | |
?> |
<html xmlns="http://www.w3.org/1999/xhtml"> | <html xmlns="http://www.w3.org/1999/xhtml"> |
<head> | <head> |
<script src="openlayers/OpenLayers.js"></script> | <script src="openlayers/OpenLayers.js"></script> |
<SCRIPT TYPE="text/javascript" SRC="OpenStreetMap.js"></SCRIPT> | <SCRIPT TYPE="text/javascript" SRC="OpenStreetMap.js"></SCRIPT> |
<script type="text/javascript" src="jquery.1.3.2.min.js"></script> | <script type="text/javascript" src="jquery.1.3.2.min.js"></script> |
<script type="text/javascript"> | <script type="text/javascript"> |
function init() | function init() |
{ | { |
// create the ol map object | // create the ol map object |
var map = new OpenLayers.Map('map'); | var map = new OpenLayers.Map('map'); |
var osmtiles = new OpenLayers.Layer.OSM("local", "http://127.0.0.1/tiles/${z}/${x}/${y}.png") | var osmtiles = new OpenLayers.Layer.OSM("local", "http://10.0.1.154/tiles/${z}/${x}/${y}.png") |
// use http://open.atlas.free.fr/GMapsTransparenciesImgOver.php and http://code.google.com/p/googletilecutter/ to make tiles | // use http://open.atlas.free.fr/GMapsTransparenciesImgOver.php and http://code.google.com/p/googletilecutter/ to make tiles |
markers = new OpenLayers.Layer.Markers("Between Stop Markers"); | markers = new OpenLayers.Layer.Markers("Between Stop Markers"); |
//hanlde mousedown on regions that are not points by reporting latlng | |
OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control, { | |
defaultHandlerOptions: { | |
'single': true, | |
'double': false, | |
'pixelTolerance': 0, | |
'stopSingle': false, | |
'stopDouble': false | |
}, | |
initialize: function(options) { | |
this.handlerOptions = OpenLayers.Util.extend( | |
{}, this.defaultHandlerOptions | |
); | |
OpenLayers.Control.prototype.initialize.apply( | |
this, arguments | |
); | |
this.handler = new OpenLayers.Handler.Click( | |
this, { | |
'click': this.trigger | |
}, this.handlerOptions | |
); | |
}, | |
trigger: function(e) { | |
var lonlat = map.getLonLatFromViewPortPx(e.xy).transform( | |
new OpenLayers.Projection("EPSG:900913"), | |
new OpenLayers.Projection("EPSG:4326") | |
); | |
$('form input[name="newlatlng"]').val(lonlat.lat + ";" + lonlat.lon ); | |
} | |
}); | |
var click = new OpenLayers.Control.Click(); | |
map.addControl(click); | |
click.activate(); | |
<?php | <?php |
$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; |
} | } |
$result_stops = pg_query($conn, "Select * FROM stops"); | $result_stops = pg_query($conn, "Select * FROM stops"); |
while ($stop = pg_fetch_assoc($result_stops)) { | while ($stop = pg_fetch_assoc($result_stops)) { |
echo 'marker = new OpenLayers.Marker(new OpenLayers.LonLat(' . ($stop['lng'] / 10000000) . "," . ($stop['lat'] / 10000000) . ') | echo 'marker = new OpenLayers.Marker(new OpenLayers.LonLat(' . ($stop['lng'] / 10000000) . "," . ($stop['lat'] / 10000000) . ') |
.transform( | .transform( |
new OpenLayers.Projection("EPSG:4326"), // transform from WGS 1984 | new OpenLayers.Projection("EPSG:4326"), // transform from WGS 1984 |
new OpenLayers.Projection("EPSG:900913") // to Spherical Mercator Projection | new OpenLayers.Projection("EPSG:900913") // to Spherical Mercator Projection |
));'; | ));'; |
echo ' | echo ' |
marker.id="' . $stop['geohash'] . '"; | marker.id="' . $stop['geohash'] . '"; |
markers.addMarker(marker); | markers.addMarker(marker); |
marker.events.register("mousedown", marker, function() { | marker.events.register("mousedown", marker, function() { |
document.getElementById("between_points").innerHTML += this.id+";"; | document.getElementById("between_points").innerHTML += this.id+";"; |
$(\'form input[name="oldgeopo"]\').val(this.id); | |
}); | }); |
'; | '; |
} | } |
?> | ?> |
var timeicon = new OpenLayers.Icon("http://maps.google.com/mapfiles/kml/pushpin/grn-pushpin.png",new OpenLayers.Size(32,32)); | var timeicon = new OpenLayers.Icon("http://maps.google.com/mapfiles/kml/pushpin/grn-pushpin.png",new OpenLayers.Size(32,32)); |
var timepoints = new OpenLayers.Layer.GeoRSS("Timing Points", "displaytimepoints.georss.php", { icon: timeicon }); | var timepoints = new OpenLayers.Layer.GeoRSS("Timing Points", "displaytimepoints.georss.php", { icon: timeicon }); |
map.addLayers([osmtiles, markers,timepoints]); | map.addLayers([osmtiles, markers,timepoints]); |
map.addControl(new OpenLayers.Control.LayerSwitcher()); | map.addControl(new OpenLayers.Control.LayerSwitcher()); |
map.zoomToExtent(markers.getDataExtent()); | map.zoomToExtent(markers.getDataExtent()); |
} | } |
</script> | </script> |
<script type="text/javascript"> | <script type="text/javascript"> |
function submitBetween () { | function submitBetween () { |
$.post("betweenpoint.submit.php", $("#inputform").serialize( |