Search code examples
osrm

How do I use the snap to road function using OSRM?


I am currently working with OSRM and used some GPS data for testing which i generated using googles Interactive Polyline Encoder Utility https://developers.google.com/maps/documentation/utilities/polylineutility

The concept im going for is that a car is driving along a street sending every 20 seconds its GPS location. I want to display the path and the kilometers it drove at the end of its trip.

I set up a Client in C# performing a GET request with the match algorithm to communicate with the api on the open demoserver backend http://router.project-osrm.org

The problem is that i cannot use the match algorithm because it only takes two GPS points instead of a polyline consisting of several GPS locations. To me this does not make sense.

I tried this and it worked not that bad but it lost track and somehow ended at a point i didn't define, probably because of the quite long distance between the two points but i need it to work for more than two though: here's the picture of it where it went wrong

enter image description here

http://router.project-osrm.org/match/v1/driving/13.682632,47.393753;13.6849281,47.3935649?overview=full&radiuses=49;49

I also found some decent blogs and websites telling me that I should use the OSRM matching algorithm as a Snap to road tool. One of them is this one: https://www.jamesrcroft.com/2015/06/snapping-gps-tracks-to-roads/

I also tried the route method which according to the OSRM wiki finds the fastest route between coordinates in the supplied order. Thats not exactly what I want. At least it could take a polyline of GPS locations but it was always extremely inacurate and faulty.

This is the GET Request for the method route I used:

Pic of how it looked before OSRM, it is slightly inacurate so i want it snapped to the road:

enter image description here

string polyline = @"kz~dHclrbBbAfAn@iBb@{Cf@aBXkA_@s@m@i@_A}@c@c@Fu@Tq@ZWXT";
string.Format("http://router.project-osrm.org/route/v1/driving/polyline({0})?overview=full", polyline);

As response i got this polyline in the attribute geometry:

mz~dHalrbB`@b@XZFFFHBK@CBI@E\\uA\\mA?[?SH[Ru@Nm@XkAFOg@a@m@g@AA}@_Ac@c@IIPk@Tq@Nc@?A??

This is what i got when I decoded it through the google polyline encoder: a complete mess.. enter image description here

Could someone explain what I am doing wrong? Thank you in advance!


Solution

  • I am sure the problem is that you do not send the timestamp of each geolocation in unix time.

    Take a look at the official documentation: http://project-osrm.org/docs/v5.5.1/api/#match-service

    This is how your request should look like:

    http://router.project-osrm.org/match/v1/driving/13.682632,47.393753;13.6849281,47.3935649?overview=full&radiuses=49;49&timestamps=1563459949;1563460007