Added RouteGeometryCompression and ShortLink support

This commit is contained in:
Pascal Neis 2011-06-30 11:35:08 +00:00
parent 9551eff4fb
commit e7a4070339

View File

@ -23,12 +23,13 @@
* Description: JS file for routing * Description: JS file for routing
* *
* @author Pascal Neis, pascal@neis-one.org * @author Pascal Neis, pascal@neis-one.org
* @version 0.1 2011-05-15 * @version 0.2 2011-06-23
*/ */
//====================== //======================
// OBJECTS // OBJECTS
//Map //Map
var HOST_WEBSITE = 'http://map.project-osrm.org/';//location.host
var HOST_ROUTING_URL = 'http://routingdemo.geofabrik.de/route-de/'; var HOST_ROUTING_URL = 'http://routingdemo.geofabrik.de/route-de/';
var ISCALCULATING = false; var ISCALCULATING = false;
var EPSG_4326 = new OpenLayers.Projection("EPSG:4326"); var EPSG_4326 = new OpenLayers.Projection("EPSG:4326");
@ -80,7 +81,7 @@ function routing(isDragRoute){
} }
script.src = HOST_ROUTING_URL + "&"+from.lat + '&' + from.lon + '&' + to.lat + '&' + to.lon + script.src = HOST_ROUTING_URL + "&"+from.lat + '&' + from.lon + '&' + to.lat + '&' + to.lon +
'&z='+this.map.getZoom()+'&output=json&jsonp='+callBackFunction+instructions;//+'&simplified=yes'; '&z='+this.map.getZoom()+'&output=json&jsonp='+callBackFunction+instructions+'&geomformat=cmp';//+'&simplified=yes';
document.body.appendChild(script); document.body.appendChild(script);
} }
@ -119,22 +120,22 @@ function showResultsRoute(response) {
var endFeat = getMarkerByName('end'); var endFeat = getMarkerByName('end');
var from = new OpenLayers.LonLat(startFeat.geometry.x,startFeat.geometry.y).transform(EPSG_900913,EPSG_4326); var from = new OpenLayers.LonLat(startFeat.geometry.x,startFeat.geometry.y).transform(EPSG_900913,EPSG_4326);
var to = new OpenLayers.LonLat(endFeat.geometry.x,endFeat.geometry.y).transform(EPSG_900913,EPSG_4326); var to = new OpenLayers.LonLat(endFeat.geometry.x,endFeat.geometry.y).transform(EPSG_900913,EPSG_4326);
var routeLink = document.URL+'?fr='+from.lat.toFixed(6)+','+from.lon.toFixed(6)+'&to='+to.lat.toFixed(6)+','+to.lon.toFixed(6); var routelink = '<div id="routelink"><input name="routelink" type="submit" title="Get Link" onClick="createShortLink(\''+HOST_WEBSITE+'?fr='+from.lat.toFixed(6)+','+from.lon.toFixed(6)+'&to='+to.lat.toFixed(6)+','+to.lon.toFixed(6)+'\');" value="Get Link"></div>';
routeLink = '<a target=\"_blank\" href="'+routeLink+'\">Your link to the route ...</a>';    
   
       //Show Route Summary        //Show Route Summary
       var output = '<p class="routeSummaryHL">Some information about your Way <br> from \'<span class="routeSummaryHLlight">'+response.route_summary.start_point+'</span>\' to \'<span class="routeSummaryHLlight">'+response.route_summary.end_point+'</span>\'</p>';        var output = '<p class="routeSummaryHL">Some information about your Way <br> from \'<span class="routeSummaryHLlight">'+response.route_summary.start_point+'</span>\' to \'<span class="routeSummaryHLlight">'+response.route_summary.end_point+'</span>\'</p>';
       output += '<p class="routeSummary">Distance: <span class="routeSummarybold">'+response.route_summary.total_distance/1000+' km</span> - Duration: <span class="routeSummarybold">'+secondsToTime(response.route_summary.total_time)+'</span></p><p>'+routeLink+'</p><pclass="routeInstructionsHL"> The Route-Instructions:</p>';        output += '<p class="routeSummary">Distance: <span class="routeSummarybold">'+response.route_summary.total_distance/1000+' km</span> - Duration: <span class="routeSummarybold">'+secondsToTime(response.route_summary.total_time)+'</span></p><p>'+routelink+'</p><pclass="routeInstructionsHL"> The Route-Instructions:</p>';
       //Show Route Instructions        //Show Route Instructions
       output += '<table>';        output += '<table>';
       var lengthOfArray = response.route_instructions.length;        var lengthOfArray = response.route_instructions.length;
       var geometry = decodeRouteGeometry(response.route_geometry, 5);
       for (var i = 0; i < lengthOfArray; i++) {        for (var i = 0; i < lengthOfArray; i++) {
        //odd or even ?         //odd or even ?
        var rowstyle='routeInstructionsOdd';         var rowstyle='routeInstructionsOdd';
        if(i%2==0){ rowstyle='routeInstructionsEven'; }         if(i%2==0){ rowstyle='routeInstructionsEven'; }
           var indexPos = response.route_instructions[i][3];            var indexPos = response.route_instructions[i][3];
           var point = new OpenLayers.Geometry.Point(response.route_geometry[indexPos][1], response.route_geometry[indexPos][0]);            var point = new OpenLayers.Geometry.Point(geometry[indexPos][1], geometry[indexPos][0]);
                   output += '<tr class="'+rowstyle+'"><td align="right" valign="top"><span class="routeSummarybold">'+(i+1)+'.</span></td><td class="'+rowstyle+'"><a href="#" class="nolinkStyle" onclick="setMapCenter(new OpenLayers.LonLat('+point.x+','+point.y+'));">'+response.route_instructions[i][0]+' on '+response.route_instructions[i][1]+' for '+getDistanceWithUnit(response.route_instructions[i][2])+'</a></td></tr>';        }                    output += '<tr class="'+rowstyle+'"><td align="right" valign="top"><span class="routeSummarybold">'+(i+1)+'.</span></td><td class="'+rowstyle+'"><a href="#" class="nolinkStyle" onclick="setMapCenter(new OpenLayers.LonLat('+point.x+','+point.y+'));">'+response.route_instructions[i][0]+' on '+response.route_instructions[i][1]+' for '+getDistanceWithUnit(response.route_instructions[i][2])+'</a></td></tr>';        }
       output += '</table>';        output += '</table>';
       //alert(vectorLayerRoute.features[0].geometry.getVertices());        //alert(vectorLayerRoute.features[0].geometry.getVertices());
@ -147,10 +148,15 @@ function showResultsRoute(response) {
* showResultsRoute()-Function to show route result * showResultsRoute()-Function to show route result
*/ */
function showRouteGeometry(response) { function showRouteGeometry(response) {
   if (response) {     vectorLayerRoute.removeFeatures(vectorLayerRoute.features);     var lengthOfArray = response.route_geometry.length;    if (response) {     vectorLayerRoute.removeFeatures(vectorLayerRoute.features);
       var points = [];        points.length = lengthOfArray;
    // now with compression of the route geometry
       var geometry = decodeRouteGeometry(response.route_geometry, 5);
      var lengthOfArray = geometry.length;
       var points = [];
       points.length = lengthOfArray;
               
       //Create Route Layer for Display        for (var i = 0; i < lengthOfArray; i++) {            var point = new OpenLayers.Geometry.Point(                    response.route_geometry[i][1], response.route_geometry[i][0]).transform(EPSG_4326, EPSG_900913);            points.push(point);        //Create Route Layer for Display        for (var i = 0; i < lengthOfArray; i++) {            var point = new OpenLayers.Geometry.Point(geometry[i][1], geometry[i][0]).transform(EPSG_4326, EPSG_900913);            points.push(point);
                       
if(i % 1024 == 0 && i>0 || i==lengthOfArray-1){ if(i % 1024 == 0 && i>0 || i==lengthOfArray-1){
var feature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LineString(points), null, { var feature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LineString(points), null, {
@ -162,12 +168,6 @@ function showRouteGeometry(response) {
points = []; points = [];
points.push(point); points.push(point);
}        } }        }
       /*var feature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LineString(points), null, {
strokeColor: "#0033ff",
strokeOpacity: 0.7,
strokeWidth: 5
});
vectorLayerRoute.addFeatures([feature]);*/
  }   }
} }
@ -175,7 +175,11 @@ function showRouteGeometry(response) {
* showNoNameStreets()-Function to show route result * showNoNameStreets()-Function to show route result
*/ */
function showNoNameStreets(response) { function showNoNameStreets(response) {
   if (response) {     vectorLayerRoute.removeFeatures(vectorLayerRoute.features);     var lengthOfArray = response.route_geometry.length;    if (response) {     vectorLayerRoute.removeFeatures(vectorLayerRoute.features);
   
    // now with compression of the route geometry
       var geometry = decodeRouteGeometry(response.route_geometry, 5);
      var lengthOfArray = geometry.length;
       var points = [];        points.length = lengthOfArray;        var points = [];        points.length = lengthOfArray;
               
       //Check if a instruction has no name !        //Check if a instruction has no name !
@ -191,7 +195,7 @@ function showNoNameStreets(response) {
               
       //Create Route Layer for Display        //Create Route Layer for Display
       var color = "#0033ff";        var color = "#0033ff";
       var changeColor = false;        for (var i = 0; i < lengthOfArray; i++) {            var point = new OpenLayers.Geometry.Point(                    response.route_geometry[i][1], response.route_geometry[i][0]).transform(EPSG_4326, EPSG_900913);            points.push(point);        var changeColor = false;        for (var i = 0; i < lengthOfArray; i++) {            var point = new OpenLayers.Geometry.Point(geometry[i][1], geometry[i][0]).transform(EPSG_4326, EPSG_900913);            points.push(point);
                       
           if(colors[i] != undefined){ changeColor=true;}            if(colors[i] != undefined){ changeColor=true;}
                       
@ -208,15 +212,12 @@ function showNoNameStreets(response) {
if(colors[i] != undefined){ color = colors[i]; } if(colors[i] != undefined){ color = colors[i]; }
changeColor=false; changeColor=false;
}        } }        }
       /*var feature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LineString(points), null, {
strokeColor: "#0033ff",
strokeOpacity: 0.7,
strokeWidth: 5
});
vectorLayerRoute.addFeatures([feature]);*/
  }   }
} }
/*
* secondsToTime()-Function to transform seconds to a time string
*/
function secondsToTime(seconds){ function secondsToTime(seconds){
seconds = parseInt(seconds); seconds = parseInt(seconds);
minutes = parseInt(seconds/60); minutes = parseInt(seconds/60);
@ -232,12 +233,18 @@ function secondsToTime(seconds){
} }
} }
/*
* getDistanceWithUnit()-Function to return a distance with units
*/
function getDistanceWithUnit(distance){ function getDistanceWithUnit(distance){
distance = parseInt(distance); distance = parseInt(distance);
if(distance >= 1000){ return (parseInt(distance/1000))+' km'; } if(distance >= 1000){ return (parseInt(distance/1000))+' km'; }
else{ return distance+' m'; } else{ return distance+' m'; }
} }
/*
* setMapCenter()-Function to add a marker and center the map
*/
function setMapCenter(lonlat){ function setMapCenter(lonlat){
lonlat.transform(new OpenLayers.Projection("EPSG:4326"), new OpenLayers.Projection("EPSG:900913")); lonlat.transform(new OpenLayers.Projection("EPSG:4326"), new OpenLayers.Projection("EPSG:900913"));
@ -247,7 +254,48 @@ function setMapCenter(lonlat){
var offset = new OpenLayers.Pixel(-(size.w/2), -size.h); var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);
var icon = new OpenLayers.Icon('img/marker.png',size,offset); var icon = new OpenLayers.Icon('img/marker.png',size,offset);
markersLayer.addMarker(new OpenLayers.Marker(lonlat,icon)); markersLayer.addMarker(new OpenLayers.Marker(lonlat,icon));
//Hack - FIXME ! //Hack - FIXME !
map.setCenter(new OpenLayers.LonLat(lonlat.lon-200, lonlat.lat), 17); map.setCenter(new OpenLayers.LonLat(lonlat.lon-200, lonlat.lat), 17);
} }
/*
* decodeRouteGeometry()-Function to decode encoded Route Geometry
*/
function decodeRouteGeometry(encoded, precision) {
precision = Math.pow(10, -precision);
var len = encoded.length, index=0, lat=0, lng = 0, array = [];
while (index < len) {
var b, shift = 0, result = 0;
do {
b = encoded.charCodeAt(index++) - 63;
result |= (b & 0x1f) << shift;
shift += 5;
} while (b >= 0x20);
var dlat = ((result & 1) ? ~(result >> 1) : (result >> 1));
lat += dlat;
shift = 0;
result = 0;
do {
b = encoded.charCodeAt(index++) - 63;
result |= (b & 0x1f) << shift;
shift += 5;
} while (b >= 0x20);
var dlng = ((result & 1) ? ~(result >> 1) : (result >> 1));
lng += dlng;
array.push([lat * precision, lng * precision]);
}
return array;
}
function createShortLink(str){
var script = document.createElement('script');
script.type = 'text/javascript';
var callBackFunction = 'showRouteLink';
script.src = 'http://map.project-osrm.org/shorten/'+str+'&jsonp=showRouteLink';
document.body.appendChild(script);
}
function showRouteLink(response){
document.getElementById('routelink').innerHTML = '<span class="routeSummarybold"> >> Your ShortLink:</span> <a href="'+response.ShortURL+'">'+response.ShortURL+'</a>';
}