Hi All,<br><br>I have just recently started using openlayers and think it is great. <br><br>I have set up a map with several postgis layers in it using geoserver and openlayers. Now I would like to add a dynamic routing layer to the map using a user entered start and end point. I followed the pgrouting example for doing this with openlayers on the pgrouting website but when it the calculate route button is pressed nothing happens. Im not sure if the ax_routing.php file is being run. It is in the same directory as the html file.<br>
<br><br>Openlayers code:<br><br><html xmlns="<a href="http://www.w3.org/1999/xhtml" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">http://www.w3.org/1999/xhtml</a>"><br> <head><br>
<style type="text/css"><br> #map {<br>
width: 500px;<br> height: 312px;<br> border: 1px solid black;<br> }<br> </style><br> <script src="./OpenLayers-google/lib/OpenLayers.js"></script><br>
<script type="text/javascript"><br><br><br> var SinglePoint = OpenLayers.Class.create();<br> SinglePoint.prototype = OpenLayers.Class.inherit(OpenLayers.Handler.Point, {<br> createFeature: function(evt) {<br>
this.control.layer.removeFeatures(this.control.layer.features);<br> OpenLayers.Handler.Point.prototype.createFeature.apply(this, arguments);<br> }<br> });<br><br> var start_style = OpenLayers.Util.applyDefaults({<br>
externalGraphic: "start.png",<br> graphicWidth: 18,<br> graphicHeight: 26,<br> graphicYOffset: -26,<br> graphicOpacity: 1<br> }, OpenLayers.Feature.Vector.style['default']);<br>
<br> var stop_style = OpenLayers.Util.applyDefaults({<br> externalGraphic: "stop.png",<br> graphicWidth: 18,<br> graphicHeight: 26,<br> graphicYOffset: -26,<br>
graphicOpacity: 1<br> }, OpenLayers.Feature.Vector.style['default']);<br><br> var result_style = OpenLayers.Util.applyDefaults({<br> strokeWidth: 3,<br> strokeColor: "#ff0000",<br>
fillOpacity: 0<br> }, OpenLayers.Feature.Vector.style['default']);<br><br><br><br> // global variables<br> var map, parser, start, stop, downtown, result, controls;<br><br> function init() {<br>
var bounds = new OpenLayers.Bounds(<br> <br> 305097.5401555448, 226935.368699667, // left, bottom<br> 318253.033844963, 237653.04983245343 // right, top<br>
<br> );<br><br><br> var options = {<br> controls: [],<br> maxExtent: bounds, <br> maxResolution: 39.6698972242898,<br>
projection: "EPSG:29900",<br> units: 'm'<br> };<br><br><br> map = new OpenLayers.Map('map', options);<br><br><br><br> <br> // create and add layers to the map<br>
var satellite = new OpenLayers.Layer.WMS(<br> "pedestrianRouteFinder:required_roads - Untiled", "<a href="http://localhost:8080/geoserver/wms" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">http://localhost:8080/geoserver/wms</a>",<br>
{<br> height: '652',<br> width: '800',<br> layers: 'pedestrianRouteFinder:required_roads',<br> styles: 'required_roads_style',<br>
srs: 'EPSG:29900',<br> format: 'image/png'<br> },<br> {isBaseLayer:true},<br> {singleTile: true} <br> );<br> <br>
<br> start = new OpenLayers.Layer.Vector("Start point", { style: start_style });<br> stop = new OpenLayers.Layer.Vector("End point", {style: stop_style});<br> <br>
<br><br> map.addLayers([satellite, start, stop]);<br> downtown = new OpenLayers.Layer.Vector("Downtown data area", <br> {style: result_style});<br>
result = new OpenLayers.Layer.Vector("Routing results", <br> {style: result_style});<br><br> map.addLayers([satellite, start, stop, downtown, result]); //<br>
<br> // create a feature from a wkt string and add it to the map<br> parser = new OpenLayers.Format.WKT();<br> <br> var wkt = "POLYGON((310097.5401555448 237653.04983245343, 310097.5401555448 226935.368699667, 318253.033844963 226935.368699667, 318253.033844963 237653.04983245343, 310097.5401555448 237653.04983245343))";<br>
// var wkt = "POLYGON((-13737893 6151394,<br> // -13737893 6141906, <br> // -13728396 6141906, <br> // -13728396 6151394, <br>
// -13737893 6151394))";<br> <br> <br> <br> //-13737893, 6141906, -13728396, 6151394<br>
<br><br> <br> var geometry = parser.read(wkt);<br> var feature = new OpenLayers.Feature.Vector(geometry);<br> downtown.addFeatures([feature]);<br><br><br> // set default position<br>
map.zoomToExtent(bounds);<br><br> // controls<br> controls = {<br> start: new OpenLayers.Control.DrawFeature(start, SinglePoint),<br> stop: new OpenLayers.Control.DrawFeature(stop, SinglePoint)<br>
}<br> for (var key in controls) {<br> map.addControl(controls[key]);<br> }<br><br><br><br> map.addControl(new OpenLayers.Control.PanZoomBar());<br> map.addControl(new OpenLayers.Control.Navigation());<br>
map.addControl(new OpenLayers.Control.MousePosition({element: $('location')}));<br> map.addControl(new OpenLayers.Control.LayerSwitcher());<br><br><br> } // end init<br><br> function toggleControl(element) {<br>
for (key in controls) {<br> if (element.value == key && element.checked) {<br> controls[key].activate();<br> } else {<br> controls[key].deactivate();<br>
}<br> }<br> }<br><br> function compute() {<br> var startPoint = start.features[0];<br> var stopPoint = stop.features[0];<br><br> if (startPoint && stopPoint) {<br>
var result = {<br> startpoint: startPoint.geometry.x + ' ' + startPoint.geometry.y,<br> finalpoint: stopPoint.geometry.x + ' ' + stopPoint.geometry.y,<br>
method: OpenLayers.Util.getElement('method').value,<br> region: "downtown",<br> srid: "29900"<br> };<br><br> OpenLayers.loadURL("./ax_routing.php",<br>
OpenLayers.Util.getParameterString(result),<br> null,<br> displayRoute);<br> }<br> }<br><br> function displayRoute(response) {<br>
if (response && response.responseXML) {<br> // erase the previous results<br> result.removeFeatures(result.features);<br><br> // parse the features<br> var edges = response.responseXML.getElementsByTagName('edge');<br>
var features = [];<br> for (var i = 0; i < edges.length; i++) {<br> var g = parser.read(edges[i].getElementsByTagName('wkt')[0].textContent);<br> features.push(new OpenLayers.Feature.Vector(g));<br>
}<br> result.addFeatures(features);<br> }<br> }<br><br> </script><br> </head><br> <body onload="init()"><br> <div id="map"></div><br>
<br> <ul><br> <li><br> <input type="radio" name="control" id="noneToggle"<br> onclick="toggleControl(this);" checked="checked" /><br>
<label for="noneToggle">navigate</label><br> </li><br> <li><br> <input type="radio" name="control" value="start" id="startToggle"<br>
onclick="toggleControl(this);" /><br> <label for="startToggle">set start point</label><br> </li><br> <li><br> <input type="radio" name="control" value="stop" id="stopToggle"<br>
onclick="toggleControl(this);" /><br> <label for="stopToggle">set stop point</label><br> </li><br> </ul><br><br> <select id="method"><br>
<option value="SPD">Shortest Path Dijkstra - undirected (BBox)</option><br> <option value="SPA">Shortest Path A Star - undirected</option><br> <option value="SPS">Shortest Path Shooting Star</option><br>
</select><br> <button onclick="compute()">Calculate Route</button><br><br> </body><br></html><br><br><br><span style="font-weight: bold;">ax_routing.php code:</span><br><br>
<?php<br><br><br><br> // Database connection settings<br>
define("PG_DB" , "pedestrianRouteFinder");<br> define("PG_HOST", "localhost"); <br> define("PG_USER", "fyp");<br> define("PG_PSWD", "postgres");<br>
define("PG_PORT", "5432"); <br> define("TABLE", "required_roads"); <br><br> $counter = $pathlength = 0;<br><br> // Retrieve start point<br> $start = split(' ',$_REQUEST['startpoint']);<br>
$startPoint = array($start[0], $start[1]);<br> <br> // Retrieve end point<br> $end = split(' ',$_REQUEST['finalpoint']);<br> $endPoint = array($end[0], $end[1]);<br><br> // Find the nearest edge<br>
$startEdge = findNearestEdge($startPoint);<br> $endEdge = findNearestEdge($endPoint);<br><br> // FUNCTION findNearestEdge<br> function findNearestEdge($lonlat) {<br> <br> // Connect to database<br> $con = pg_connect("dbname=".PG_DB." host=".PG_HOST." user=".PG_USER." password=".PG_PSWD);<br>
<br> $sql = "SELECT gid, source, target, the_geom, <br> distance(the_geom, GeometryFromText(<br> 'POINT(".$lonlat[0]." ".$lonlat[1].")', 54004)) AS dist <br>
FROM ".TABLE." <br> WHERE the_geom && setsrid(<br> 'BOX3D(".($lonlat[0]-200)." <br> ".($lonlat[1]-200).", <br> ".($lonlat[0]+200)." <br>
".($lonlat[1]+200).")'::box3d, 54004) <br> ORDER BY dist LIMIT 1";<br><br> $query = pg_query($con,$sql); <br> <br> $edge['gid'] = pg_fetch_result($query, 0, 0); <br>
$edge['source'] = pg_fetch_result($query, 0, 1); <br> $edge['target'] = pg_fetch_result($query, 0, 2); <br> $edge['the_geom'] = pg_fetch_result($query, 0, 3); <br><br> // Close database connection<br>
pg_close($con);<br><br> return $edge;<br> }<br><br> // Select the routing algorithm<br> switch($_REQUEST['method']) {<br><br> case 'SPD' : // Shortest Path Dijkstra <br><br> $sql = "SELECT rt.gid, AsText(rt.the_geom) AS wkt, <br>
length(rt.the_geom) AS length, ".TABLE.".id <br> FROM ".TABLE.", <br> (SELECT gid, the_geom <br> FROM dijkstra_sp_delta(<br>
'".TABLE."',<br>
".$startEdge['source'].",<br> ".$endEdge['target'].",<br> 3000)<br> ) as rt <br> WHERE ".TABLE.".gid=rt.gid;";<br>
break;<br><br> case 'SPA' : // Shortest Path A* <br><br> $sql = "SELECT rt.gid, AsText(rt.the_geom) AS wkt, <br> length(rt.the_geom) AS length, ".TABLE.".id <br> FROM ".TABLE.", <br>
(SELECT gid, the_geom <br> FROM astar_sp_delta(<br> '".TABLE."',<br> ".$startEdge['source'].",<br>
".$endEdge['target'].",<br> 3000)<br> ) as rt <br> WHERE ".TABLE.".gid=rt.gid;"; <br> break;<br>
<br> case 'SPS' : // Shortest Path Shooting*<br><br> $sql = "SELECT rt.gid, AsText(rt.the_geom) AS wkt, <br> length(rt.the_geom) AS length, ".TABLE.".id <br> FROM ".TABLE.", <br>
(SELECT gid, the_geom <br> FROM shootingstar_sp(<br> '".TABLE."',<br> ".$startEdge['gid'].",<br>
".$endEdge['gid'].",<br> 3000, 'length', false, false)<br> ) as rt <br> WHERE ".TABLE.".gid=rt.gid;";<br>
break; <br><br> } // close switch<br><br> // Database connection and query<br> $dbcon = pg_connect("dbname=".PG_DB." host=".PG_HOST." user=".PG_USER);<br><br> $query = pg_query($dbcon,$sql); <br>
<br> // Return route as XML<br> $xml = '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>'."\n";<br> $xml .= "<route>\n";<br> <br> // Add edges to XML file<br>
while($edge=pg_fetch_assoc($query)) { <br><br> $pathlength += $edge['length'];<br><br> $xml .= "\t<edge id='".++$counter."'>\n";<br> $xml .= "\t\t<id>".$edge['id']."</id>\n";<br>
$xml .= "\t\t<wkt>".$edge['wkt']."</wkt>\n";<br> $xml .= "\t\t<length>".round(($pathlength/1000),3)."</length>\n";<br> $xml .= "\t</edge>\n";<br>
}<br> <br> $xml .= "</route>\n";<br> <br> // Close database connection<br> pg_close($dbcon);<br><br> // Return routing result<br> header('Content-type: text/xml',true);<br> echo $xml;<br>
<br>?><br><br><br>I have the latest php installed at c:\PHP\, and added to the path variable.<br>Anybody point me in the right direction?<br><br>Thanks<br>osgis<br>