[OSRM-talk] Polyline Encoding, &geomformat=cmp and Coordinate Hinting
ponder at creshal.de
ponder at creshal.de
Tue Aug 20 02:25:07 UTC 2013
While trying to use the API of the demo server at
router.project-osrm.org I stumbled upon some things which puzzle me
and I hope you can me help out there.
First, the wiki page on "API usage policy" requires clients to query
the route geometry by the parameter "&geomformat=cmp", however I
cannot see a difference in the returned json. That is the value of the
"route_geometry" attribute does not seem to change at all, whether I add
"&geomformat=cmp" to the URL or not. Is this is already the default?
If so, what other value than "cmp" can it have?
Or am I misunderstanding things and send wrong queries?
My application sends queries to URIs like this
"http://router.project-osrm.org/viaroute?geomformat=cmp&loc=$X1,$Y1&loc=$X2,$Y2"
as described in the "Server API" wiki page.
Second, (and this might be related to the first) it seems that either
I am missing some subtleties in the Google's Polyline Algorithm Format
or the coordinates which are returned by demo server are off by a
factor of ten.
As an example, querying the demo server with
"/viaroute?loc=52,13&loc=52.001,13&geomformat=cmp" returns a
route_geometry of "svzdbBurpxWaP~Ecd@`O" which is parsed by my code
(see bottom for full code) and the Google Online Utility
(https://developers.google.com/maps/documentation/utilities/polylineutility?csw=1)
to the following route:
[[520.00634, 130.01531],
[520.0090700000001, 130.01419],
[520.0150100000001, 130.01162000000002]]
Those are obviously off by a factor of 10. I currently work around
this issue by just dividing the decoded integers by 1e6 instead of 1e5
as specified by Google's Algorithm.
Am I missing something or did you deliberately chose to provide
coordinates up to a precision of 6 decimal places?
Third, the "Server API" wiki page specifies that &checksum=$value
should be added to the URI when using coordinate hinting, where $value
is drawn from the last query's hint.checksum attribute. I noticed
however, that in all responses I checked in the last week (about a
good two dozen, which I checked manually) that this value is always
1373382413.
Again, am I missing something? If not what point does this value serve?
Turned out longer than I expected, hope this is not too much to ask,
thanks in advance.
===== Poly.js =====
This is the code I use to parse the route_geometry attribute.
If I use it with 1e5 in decodeValue it seems to be consistent with the
examples Google provides
(https://developers.google.com/maps/documentation/utilities/polylinealgorithm),
I only get meaningful results with 1e6 with the responses from the
demo server.
function decodeValue (val) {
var z = 0;
for (i = 0; i < val.length; i++) {
z += ((val.charCodeAt (i) - 63) % 0x20) << (5 * i);
}
var neg = z % 2;
z >>= 1;
if (neg) {
z = ~z;
}
return z / 1e6 // this is supposed to be 1e5 by the google algorithm..
}
function decodePolyline (line) {
var last_p = [0, 0];
var points = [];
var index = 0;
while (line != "") {
var o = index % 2;
var i = 0;
for (; (line.charCodeAt (i) - 63) >> 5; i++);
i++;
var c = line.slice (0, i);
line = line.slice (i);
var new_c = decodeValue (c);
last_p [o] += new_c;
if (o == 1) {
points [Math.floor (index / 2)] [1] = last_p [1];
} else {
points.push ([last_p [0], 0]);
}
index += 1;
}
return points;
}
More information about the OSRM-talk
mailing list