Function Repository Resource:

GooglePolylineEncode

Source Notebook

Encode locations as a single string in the Google polyline format

Contributed by: Joseph Brennan

ResourceFunction["GooglePolylineEncode"][loc]

returns the polyline encoding string of location loc.

ResourceFunction["GooglePolylineEncode"][GeoPosition[{lat,lon}]]

returns the polyline encoding string of the GeoPosition with latitude lat and longitude lon.

ResourceFunction["GooglePolylineEncode"][{lat,lon}]

returns the polyline encoding string of the position with latitude lat and longitude lon.

ResourceFunction["GooglePolylineEncode"][locs]

returns the polyline encoding string of the list of positions locs.

Details

Polyline encoding is a lossy compression algorithm that represents a series of coordinates as a single string of ASCII characters.
To encode a list of locations, the algorithm uses the latitude/longitude offsets from the previous element for all elements except the first.
The algorithm works for a latitude range of -90° to +90°, and a longitude range of -180° to +180° up to a precision of 5 decimal places.
An Entity can be used, provided it has a valid "Position" property.

Examples

Basic Examples (2) 

Find the polyline string for New York City:

In[1]:=
ResourceFunction["GooglePolylineEncode"][
 Entity["City", {"NewYork", "NewYork", "UnitedStates"}]]
Out[1]=

Find the polyline string for a RandomGeoPosition:

In[2]:=
loc = RandomGeoPosition[]
Out[2]=
In[3]:=
ResourceFunction["GooglePolylineEncode"][loc]
Out[3]=

Use the latitude and longitude (as quantities) instead:

In[4]:=
latLongQuant = LatitudeLongitude[loc]
Out[4]=
In[5]:=
ResourceFunction["GooglePolylineEncode"][latLongQuant]
Out[5]=

Use real numbers for the latitude and longitude:

In[6]:=
latLongMag = QuantityMagnitude /@ latLongQuant
Out[6]=
In[7]:=
ResourceFunction["GooglePolylineEncode"][latLongMag]
Out[7]=

Scope (4) 

A list of locations is more commonly used to indicate geographic routes:

In[8]:=
cityPath = RandomEntity["City", 5]
Out[8]=
In[9]:=
ResourceFunction["GooglePolylineEncode"][cityPath]
Out[9]=

The polyline encoding of a route is not simply StringJoin of the polyline encoding of each individual location, due to the use of coordinate offsets:

In[10]:=
ResourceFunction["GooglePolylineEncode"] /@ cityPath
Out[10]=

Find the polyline encoding of a list of RandomGeoPositions:

In[11]:=
list = Table[RandomGeoPosition[], 5]
Out[11]=
In[12]:=
ResourceFunction["GooglePolylineEncode"][list]
Out[12]=

Integer values of latitude and longitude may be used:

In[13]:=
ResourceFunction["GooglePolylineEncode"][{50, -70}]
Out[13]=

If one of the coordinates is zero, this is indicated by a '?':

In[14]:=
randomLat = RandomReal[{-90, 90}]
Out[14]=
In[15]:=
ResourceFunction["GooglePolylineEncode"][{randomLat, 0}]
Out[15]=
In[16]:=
randomLon = RandomReal[{-180, 180}]
Out[16]=
In[17]:=
ResourceFunction["GooglePolylineEncode"][{0, randomLon}]
Out[17]=

Possible Issues (1) 

GooglePolylineEncode can encode latitudes and longitudes of up to five decimal places. Often, GeoPosition objects are displayed with fewer decimal places than this. If one simply copies and pastes the displayed latitude and longitude values returned by GeoPosition, a disagreement may occur between the output of GooglePolylineEncode and this website. Pasting the FullForm of the latitude and longitude ensures agreement with the site:

In[18]:=
pos = RandomGeoPosition[][[1]]
Out[18]=
In[19]:=
FullForm /@ pos
Out[19]=
In[20]:=
ResourceFunction["GooglePolylineEncode"][pos]
Out[20]=

Neat Examples (1) 

Encode a list of coordinates representing a hike up Scafell Pike, Lake District, UK:

In[21]:=
coords = {
GeoPosition[{54.46227, -3.25245}], 
GeoPosition[{54.46175, -3.25231}], 
GeoPosition[{54.46032, -3.25232}], 
GeoPosition[{54.46023, -3.25245}], 
GeoPosition[{54.45981, -3.2524}], 
GeoPosition[{54.45962, -3.25254}], 
GeoPosition[{54.45867, -3.25218}], 
GeoPosition[{54.4573, -3.25205}], 
GeoPosition[{54.45667, -3.25157}], 
GeoPosition[{54.45618, -3.25137}], 
GeoPosition[{54.45597, -3.25111}], 
GeoPosition[{54.45526, -3.25096}], 
GeoPosition[{54.45509, -3.25076}], 
GeoPosition[{54.4549, -3.2501}], 
GeoPosition[{54.45494, -3.2473}], 
GeoPosition[{54.45519, -3.24655}], 
GeoPosition[{54.45549, -3.24608}], 
GeoPosition[{54.45583, -3.24462}], 
GeoPosition[{54.4559, -3.2431}], 
GeoPosition[{54.45548, -3.24207}], 
GeoPosition[{54.45549, -3.24086}], 
GeoPosition[{54.45519, -3.23862}], 
GeoPosition[{54.45504, -3.23835}], 
GeoPosition[{54.4552, -3.23801}], 
GeoPosition[{54.45518, -3.23767}], 
GeoPosition[{54.45445, -3.23563}], 
GeoPosition[{54.45424, -3.23469}], 
GeoPosition[{54.45409, -3.23349}], 
GeoPosition[{54.45415, -3.23287}], 
GeoPosition[{54.45453, -3.23147}], 
GeoPosition[{54.45487, -3.22949}], 
GeoPosition[{54.45543, -3.22814}], 
GeoPosition[{54.45576, -3.22614}], 
GeoPosition[{54.45629, -3.22507}], 
GeoPosition[{54.45648, -3.22507}], 
GeoPosition[{54.45657, -3.22462}], 
GeoPosition[{54.45692, -3.22478}], 
GeoPosition[{54.45706, -3.2242}], 
GeoPosition[{54.4576, -3.22427}], 
GeoPosition[{54.45761, -3.22359}], 
GeoPosition[{54.45784, -3.22357}], 
GeoPosition[{54.45789, -3.22345}], 
GeoPosition[{54.45804, -3.22228}], 
GeoPosition[{54.45847, -3.22154}], 
GeoPosition[{54.45873, -3.22018}], 
GeoPosition[{54.45873, -3.2196}], 
GeoPosition[{54.45845, -3.21894}], 
GeoPosition[{54.45823, -3.21889}], 
GeoPosition[{54.45817, -3.2187}], 
GeoPosition[{54.45804, -3.21869}], 
GeoPosition[{54.45708, -3.21777}], 
GeoPosition[{54.4567, -3.21844}], 
GeoPosition[{54.45629, -3.21868}], 
GeoPosition[{54.45612, -3.21808}], 
GeoPosition[{54.45581, -3.21777}], 
GeoPosition[{54.45565, -3.21675}], 
GeoPosition[{54.45517, -3.21537}], 
GeoPosition[{54.45515, -3.2147}], 
GeoPosition[{54.45473, -3.2131}], 
GeoPosition[{54.45465, -3.21208}], 
GeoPosition[{54.45452, -3.21185}], 
GeoPosition[{54.45435, -3.21186}], 
GeoPosition[{54.45425, -3.21173}], 
GeoPosition[{54.45435, -3.2105}], 
GeoPosition[{54.45467, -3.21002}], 
GeoPosition[{54.45542, -3.20963}], 
GeoPosition[{54.45625, -3.20895}], 
GeoPosition[{54.45542, -3.20963}], 
GeoPosition[{54.45467, -3.21002}], 
GeoPosition[{54.45435, -3.2105}], 
GeoPosition[{54.45425, -3.21173}], 
GeoPosition[{54.45435, -3.21186}], 
GeoPosition[{54.45452, -3.21185}], 
GeoPosition[{54.45465, -3.21208}], 
GeoPosition[{54.45473, -3.2131}], 
GeoPosition[{54.45515, -3.2147}], 
GeoPosition[{54.45517, -3.21537}], 
GeoPosition[{54.45565, -3.21675}], 
GeoPosition[{54.45581, -3.21777}], 
GeoPosition[{54.45612, -3.21808}], 
GeoPosition[{54.45629, -3.21868}], 
GeoPosition[{54.4567, -3.21844}], 
GeoPosition[{54.45708, -3.21777}], 
GeoPosition[{54.45804, -3.21869}], 
GeoPosition[{54.45817, -3.2187}], 
GeoPosition[{54.45823, -3.21889}], 
GeoPosition[{54.45845, -3.21894}], 
GeoPosition[{54.45872, -3.2196}], 
GeoPosition[{54.4589, -3.21955}], 
GeoPosition[{54.45909, -3.21971}], 
GeoPosition[{54.45948, -3.22027}], 
GeoPosition[{54.45968, -3.22154}], 
GeoPosition[{54.45959, -3.22224}], 
GeoPosition[{54.45942, -3.22239}], 
GeoPosition[{54.46013, -3.22431}], 
GeoPosition[{54.46011, -3.22472}], 
GeoPosition[{54.45973, -3.2257}], 
GeoPosition[{54.45948, -3.22791}], 
GeoPosition[{54.45962, -3.22963}], 
GeoPosition[{54.45953, -3.23029}], 
GeoPosition[{54.45965, -3.23243}], 
GeoPosition[{54.46004, -3.23422}], 
GeoPosition[{54.46022, -3.23618}], 
GeoPosition[{54.46001, -3.23917}], 
GeoPosition[{54.45972, -3.2406}], 
GeoPosition[{54.45961, -3.24201}], 
GeoPosition[{54.45939, -3.24244}], 
GeoPosition[{54.45944, -3.24269}], 
GeoPosition[{54.45896, -3.24325}], 
GeoPosition[{54.45888, -3.24358}], 
GeoPosition[{54.45855, -3.24366}], 
GeoPosition[{54.45808, -3.245}], 
GeoPosition[{54.45717, -3.24661}], 
GeoPosition[{54.45693, -3.24731}], 
GeoPosition[{54.45652, -3.24771}], 
GeoPosition[{54.45573, -3.24899}], 
GeoPosition[{54.45509, -3.25076}], 
GeoPosition[{54.45526, -3.25096}], 
GeoPosition[{54.45597, -3.25111}], 
GeoPosition[{54.45618, -3.25137}], 
GeoPosition[{54.45667, -3.25157}], 
GeoPosition[{54.4573, -3.25205}], 
GeoPosition[{54.45867, -3.25218}], 
GeoPosition[{54.45962, -3.25254}], 
GeoPosition[{54.45981, -3.2524}], 
GeoPosition[{54.46023, -3.25245}], 
GeoPosition[{54.46032, -3.25232}], 
GeoPosition[{54.46175, -3.25231}], 
GeoPosition[{54.46215, -3.25245}], 
GeoPosition[{54.46249, -3.25238}], 
GeoPosition[{54.46287, -3.25394}], 
GeoPosition[{54.46346, -3.25518}], 
GeoPosition[{54.464, -3.25686}], 
GeoPosition[{54.46436, -3.25659}], 
GeoPosition[{54.46525, -3.25646}], 
GeoPosition[{54.46637, -3.25666}], 
GeoPosition[{54.46682, -3.25638}], 
GeoPosition[{54.46733, -3.25632}], 
GeoPosition[{54.46747, -3.25659}], 
GeoPosition[{54.46762, -3.25657}]};
In[22]:=
GeoListPlot[coords, Joined -> True, GeoBackground -> "Satellite"]
Out[22]=
In[23]:=
ResourceFunction["GooglePolylineEncode"][coords]
Out[23]=

Publisher

Joseph Brennan

Version History

  • 1.0.0 – 20 August 2025

Source Metadata

Related Resources

License Information