Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

polyline snap to road using google maps api v3

In google maps api v2 it was easy,

var map = new GMap2(document.getElementById("map"));     map.setCenter(new GLatLng(53.7877, -2.9832),13) //    map.addControl(new GLargeMapControl()); //    map.addControl(new GMapTypeControl());     var dirn = new GDirections();  //      var firstpoint = true;     var gmarkers = [];     var gpolys = [];     var dist = 0;  // == When the user clicks on a the map, get directiobns from that point to itself ==  gmarkers.push(new google.maps.LatLng(53.7877, -2.9832)); gmarkers.push(new google.maps.LatLng(53.9007, -2.9832)); gmarkers.push(new GLatLng(53.600, -2.700));    for (var i = 0; i < gmarkers.length-1; i++) {     console.log(gmarkers[i]);                 dirn.loadFromWaypoints([gmarkers[i].toUrlValue(6),gmarkers[i+1].toUrlValue(6)],{getPolyline:true});  }   // == when the load event completes, plot the point on the street ==     GEvent.addListener(dirn,"load", function() { // snap to last vertex in the polyline         var n = dirn.getPolyline().getVertexCount();             map.addOverlay(dirn.getPolyline());             gpolys.push(dirn.getPolyline());             dist += dirn.getPolyline().getDistance();             document.getElementById("distance").innerHTML="Path length: "+(dist/1000).toFixed(2)+" km. "+(dist/1609.344).toFixed(2)+" miles.";            });     GEvent.addListener(dirn,"error", function() {         GLog.write("Failed: "+dirn.getStatus().code);     }); console.log(dirn); 

In google api V3 this way simple doesnt work. There is something like directions service but I dont have any idea how I can draw polyline through my points and polyline will be snaped to road.

like image 267
Martus0 Avatar asked May 09 '12 09:05

Martus0


People also ask

What is snap to road on Google Maps?

The Google Maps Roads API provides a “snap-to-road” feature, which is essentially a map matching feature that ensures that the GPS data is tied to the road that you are traveling on and doesn't jitter your tracks leading to confusion.

What is snap to road API?

The Roads API takes up to 100 GPS points collected along a route, and returns a similar set of data, with the points snapped to the most likely roads the vehicle was traveling along. Optionally, you can request that the points be interpolated, resulting in a path that smoothly follows the geometry of the road.

How do I use Google road API?

To obtain a Roads API key, follow the instructions in the API key section of the Roads docs and add it to the google_maps_web_services_key field in app/src/debug/res/values/api_keys. xml . Alternatively, import the source code into Android Studio (File, Import Project) and hit the ▶️ play button.


2 Answers

You were on the right track with the directions service. Here's sample code:

var map, path = new google.maps.MVCArray(),     service = new google.maps.DirectionsService(), poly;  function Init() {   var myOptions = {     zoom: 17,     center: new google.maps.LatLng(37.2008385157313, -93.2812106609344),     mapTypeId: google.maps.MapTypeId.HYBRID,     mapTypeControlOptions: {       mapTypeIds: [google.maps.MapTypeId.ROADMAP, google.maps.MapTypeId.HYBRID,           google.maps.MapTypeId.SATELLITE]     },     disableDoubleClickZoom: true,     scrollwheel: false,     draggableCursor: "crosshair"   }    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);   poly = new google.maps.Polyline({ map: map });   google.maps.event.addListener(map, "click", function(evt) {     if (path.getLength() === 0) {       path.push(evt.latLng);       poly.setPath(path);     } else {       service.route({         origin: path.getAt(path.getLength() - 1),         destination: evt.latLng,         travelMode: google.maps.DirectionsTravelMode.DRIVING       }, function(result, status) {         if (status == google.maps.DirectionsStatus.OK) {           for (var i = 0, len = result.routes[0].overview_path.length;               i < len; i++) {             path.push(result.routes[0].overview_path[i]);           }         }       });     }   }); } 

Also, see my working example: http://people.missouristate.edu/chadkillingsworth/mapsexamples/snaptoroad.htm

like image 97
Chad Killingsworth Avatar answered Sep 23 '22 05:09

Chad Killingsworth


Its better to use Snap to Roads API, and set interpolate to true to get perfect snaped polyline. https://developers.google.com/maps/documentation/roads/snap

like image 25
Ismail Moukafih Avatar answered Sep 25 '22 05:09

Ismail Moukafih