motionless is a Python library that takes the pain out of generating Google Static Map URLs. Three map types are supported. Each is illustrated below. For fully worked code see the examples directory for code that parses and visualizes both GeoRSS feeds and GPX files.
motionless is tested with Python versions 3.9 to 3.11.
Code is licensed under Apache 2.0
For DecoratedMaps, paths are encoded using gpolyencode (shipped with motionless). This is useful for keeping URLs with in the 2048 character limit imposed by the service.
As of October 2018, Google Static Map API no longer supports keyless access. This means that if you want to continue using motionless, you'll need to generate and use a personal API key.
Motionless is a pure python package. Install it with conda (or mamba):
$ conda install -c conda-forge motionless
or pip:
$ pip install motionless
CenterMaps show a map with no markers or paths, centered on a single location.
from motionless import CenterMap
cmap = CenterMap(address='151 third st, san francisco, ca', key=key)
print(cmap.generate_url())
from motionless import CenterMap
cmap = CenterMap(lat=48.858278, lon=2.294489, maptype='satellite', key=key)
print(cmap.generate_url())
VisibleMaps show a map with no markers or paths, automatically sized and zoomed to make the specified locations visible.
from motionless import VisibleMap
vmap = VisibleMap(maptype='terrain', key=key)
vmap.add_address('Sugarbowl, Truckee, CA')
vmap.add_address('Tahoe City, CA')
print(vmap.generate_url())
DecoratedMaps contain markers and/or paths. They are automatically sized and zoomed to make the specified elements visible.
from motionless import DecoratedMap, LatLonMarker
dmap = DecoratedMap(maptype='satellite', key=key)
dmap.add_marker(LatLonMarker(27.988056, 86.925278, label='S'))
dmap.add_marker(LatLonMarker(28.007222, 86.859444, label='B'))
print(dmap.generate_url())
You can add a list of style definitions to add custom styling to your map.
from motionless import DecoratedMap, AddressMarker
road_styles = [{
'feature': 'road.highway',
'element': 'geomoetry',
'rules': {
'visibility': 'simplified',
'color': '#c280e9'
}
}, {
'feature': 'transit.line',
'rules': {
'visibility': 'simplified',
'color': '#bababa'
}
}]
dmap = DecoratedMap(style=road_styles, key=key)
dmap.add_marker(AddressMarker('1 Infinite Loop, Cupertino, CA',label='A'))
dmap.add_marker(AddressMarker('1600 Amphitheatre Parkway Mountain View, CA',label='G'))
print(dmap.generate_url())
Produced from parsing GPX file. See examples/munich.py
Produced from geojson feed. See examples/earthquakes.py