概要
- Python 用ライブラリの py-staticmaps を使って OpenStreetMap や地理院地図の画像を取得する
今回の環境
- macOS Catalina + Python 3.9.0 + py-staticmaps 0.1.1
py-staticmaps のインストール
py-staticmaps パッケージをインストールする。
$ pip install py-staticmaps
依存ライブラリとして pycairo や s2sphere 等もインストールされる。
OpenStreetMap の地図画像を取得する
ソースコード。
import staticmaps
# Context オブジェクトを生成してズームレベルと緯度・経度を指定
# 緯度・経度は create_latlng で生成した s2sphere.LatLng オブジェクトを指定
context = staticmaps.Context()
context.set_zoom(17)
context.set_center(staticmaps.create_latlng(35.170560, 136.882090))
# 画像の横幅と縦幅を指定して pycairo の cairo.ImageSurface オブジェクトを取得
image_surface = context.render_cairo(800, 600)
# 地図画像 PNG ファイルを出力
image_surface.write_to_png('osm.png')
実行結果。
地理院地図の地図画像を取得する
ソースコード。
import staticmaps
# 国土地理院の地理院タイル用の TileProvider オブジェクトを生成
tile_provider_chiriin = staticmaps.TileProvider(
name='chiriin',
url_pattern='https://cyberjapandata.gsi.go.jp/xyz/std/$z/$x/$y.png', # 地理院タイルURL
attribution='Source: Geospatial Information Authority of Japan', # 日本語が使えないので英語表記
max_zoom=18, # 使用可能な最大ズームレベル
)
# Context オブジェクトを生成して TileProvider とズームレベルと緯度・経度を指定
context = staticmaps.Context()
context.set_tile_provider(tile_provider_chiriin)
context.set_zoom(14)
context.set_center(staticmaps.create_latlng(35.170560, 136.882090))
# 画像の横幅と縦幅を指定して pycairo の cairo.ImageSurface オブジェクトを取得
image_surface = context.render_cairo(800, 600)
# 地図画像 PNG ファイルを出力
image_surface.write_to_png('chiriin.png')
実行結果。
参考資料
- GitHub - flopp/py-staticmaps: A python module to create static map images with markers, geodesic lines, etc.
- Tiles - OpenStreetMap Wiki
- Zoom levels - OpenStreetMap Wiki
- Tile Usage Policy (OSMF Operations Working Group)
- 地理院地図|地理院タイルについて
- 地理院地図|地理院タイル一覧
- Surfaces — Pycairo documentation
- API — s2sphere 0.2.5 documentation