anoved: arcencode is my Tcl implementation of the coordinate list compression algorithm used by MapQuest and Google Maps. It is useful for encoding a long sequence of coordinate data as a single comparatively compact URL parameter. The code is available at GitHub. Here is an excerpt from the Readme:
The arcencode package provides a Tcl implementation of the coordinate list compression algorithm used by MapQuest Platform Services and the Google Maps API. The algorithm converts a list of coordinate pairs to a string of printable non-space ASCII characters. Compression limits coordinate precision to three digits left of decimal and a default precision of five digits right of decimal.
The arcencode code is derived from the MapQuest JavaScript Sample Source . The default five digit right-of-decimal precision is compatible with Google Maps API convention.
The arcencode package exports two procedures: arcencode and arcdecode. No input validation or error checking is currently performed.
arcencode::arcencode points ?precision?
The points argument is expected to be a list of coordinate values containing an even number of elements (conventionally, an alternating sequence of latitude and longitude values). The precision argument specifies how many digits to preserve right-of-decimal; the default precision is 5. The procedure returns an encoded string representation of the point list.
arcencode::arcdecode strval ?precision?
The strval argument is expected to be a string value generated by arcencode or a compatible source. The precision argument specifies how many digits to recover right-of-decimal; the default precision is 5. The procedure returns a list containing an even number of coordinate values (conventionally presumed to be an alternating sequence of latitude and longitude values).
These example values are drawn from the default MapQuest Interactive Example .
package require arcencode set coordinates { 45.967 -83.928700032549 55 -83.928420000 35 -83.97948699748273 25.000000 -83.000000 15.00000000000 -83.9279400000 0.9600 -83.9275623435 35.90 -0.90 35.900 -83.00 35.000 -83.000 35.90000 -83.0000 35.00000 -83.00000 35.000004190 -83.00000123490 } set encoded [arcencode::arcencode $coordinates] set decoded [arcencode::arcdecode $encoded]
The contents of encoded:
w|pwGjig_Oggcv@w@~fayBd~H~b`|@yh~D~b`|@rftD~dutAkA_fgtEgiwyN?~cbtN~wnD?_xnD?~wnD???
The contents of decoded (compare to the input coordinates):
45.96700 -83.92870 55.00000 -83.92842 35.00000 -83.97949 25.00000 -83.00000 15.00000 -83.92794 0.96000 -83.92756 35.90000 -0.90000 35.90000 -83.00000 35.00000 -83.00000 35.90000 -83.00000 35.00000 -83.00000 35.00000 -83.00000
Note how the decoded values have been rounded to a uniform fixed precision.