Python folium 指定できる 地図の タイル について


folium で、地図の tiles を指定できますが、何が指定できるのかわからなかったので、調べてみました。


地図の タイル とは何か?

わからなかったのでまずここから確認しました。
地図タイルについて - smellman’s Broken Diaryで、地図タイルってなんなの にわかりやすい説明記載されています。
タイルの URL の意味がこれでわかりました。


folium で 指定できるタイルについて

example が記載されている記事があります。
Folium Map Tiles - deparkes
また、folium 自体 の example に TilesExample.ipynb という notebook があり、タイルの使い方が記載されています。
folium/TilesExample.ipynb at master · python-visualization/folium
exmaple では、tiles='OpenStreetMap'tiles='Mapbox Bright' 等で指定していますが、この指定可能なタイルには、どんなものがあるのか気になったので以下にまとめます。

使用できる ビルドインタイル

以下のタイルが folium のパッケージ内に含まれていて、名称での指定が可能です。
folium/folium/templates/tiles at master · python-visualization/folium

  • mapboxbright
  • cartodbdark_matter
  • cartodbpositron
  • cloudmade
  • mapbox
  • mapboxcontrolroom
  • openstreetmap
  • stamenterrain
  • stamentoner
  • stamenwatercolor

tiles='Mapbox Bright' だと、mapboxbright が使われ、tiles='mapboxbright' でも mapboxbright が使われます。

jupyter で 動かしてみる

以下、jupyter notbook 上で動作確認した結果を記載します。
API キーを発行する必要があるタイルもあります。

version の出力

import os
import folium
print(folium.__version__)
0.5.0

OpenStreetMap をタイルに指定する

lon, lat = -38.625, -12.875
zoom_start = 8
m = folium.Map(location=[lat, lon], tiles='OpenStreetMap', zoom_start=zoom_start)
m

Mapbox Bright をタイルに指定する

m = folium.Map(location=[lat, lon], tiles='Mapbox Bright', zoom_start=zoom_start)
m

mapboxbright をタイルに指定する

m = folium.Map(location=[lat, lon], tiles='mapboxbright', zoom_start=zoom_start)
m

cartodbdark_matter をタイルに指定する

m = folium.Map(location=[lat, lon], tiles='cartodbdark_matter', zoom_start=zoom_start)
m

cartodbpositron を タイルに指定する

m = folium.Map(location=[lat, lon], tiles='cartodbpositron', zoom_start=zoom_start)
m

cloudmade をタイルに指定する

m = folium.Map(location=[lat, lon], tiles='cloudmade', zoom_start=zoom_start)
m
---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-15-56f01905df85> in <module>()
----> 1 m = folium.Map(location=[lat, lon], tiles='cloudmade', zoom_start=zoom_start)
      2 m


/Library/Python/2.7/site-packages/folium/map.pyc in __init__(self, location, width, height, left, top, position, tiles, API_key, max_zoom, min_zoom, zoom_start, world_copy_jump, no_wrap, attr, min_lat, max_lat, min_lon, max_lon, max_bounds, detect_retina, crs, control_scale, prefer_canvas, no_touch, disable_3d, subdomains, png_enabled)
    201                 no_wrap=no_wrap, attr=attr,
    202                 API_key=API_key, detect_retina=detect_retina,
--> 203                 subdomains=subdomains
    204             )
    205


/Library/Python/2.7/site-packages/folium/map.pyc in add_tile_layer(self, tiles, name, API_key, max_zoom, min_zoom, attr, active, detect_retina, no_wrap, subdomains, **kwargs)
    297                                detect_retina=detect_retina,
    298                                subdomains=subdomains,
--> 299                                no_wrap=no_wrap)
    300         self.add_child(tile_layer, name=tile_layer.tile_name)
    301


/Library/Python/2.7/site-packages/folium/map.pyc in __init__(self, tiles, min_zoom, max_zoom, attr, API_key, detect_retina, name, overlay, control, no_wrap, subdomains)
    439         self.tiles = ''.join(tiles.lower().strip().split())
    440         if self.tiles in ('cloudmade', 'mapbox') and not API_key:
--> 441             raise ValueError('You must pass an API key if using Cloudmade'
    442                              ' or non-default Mapbox tiles.')
    443         templates = list(self._env.list_templates(


ValueError: You must pass an API key if using Cloudmade or non-default Mapbox tiles.

API Key が必要との旨でエラーになります。

mapbox をタイルに指定する

m = folium.Map(location=[lat, lon], tiles='mapbox', zoom_start=zoom_start)
m
---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-16-3f5fb80e95a5> in <module>()
----> 1 m = folium.Map(location=[lat, lon], tiles='mapbox', zoom_start=zoom_start)
      2 m


/Library/Python/2.7/site-packages/folium/map.pyc in __init__(self, location, width, height, left, top, position, tiles, API_key, max_zoom, min_zoom, zoom_start, world_copy_jump, no_wrap, attr, min_lat, max_lat, min_lon, max_lon, max_bounds, detect_retina, crs, control_scale, prefer_canvas, no_touch, disable_3d, subdomains, png_enabled)
    201                 no_wrap=no_wrap, attr=attr,
    202                 API_key=API_key, detect_retina=detect_retina,
--> 203                 subdomains=subdomains
    204             )
    205


/Library/Python/2.7/site-packages/folium/map.pyc in add_tile_layer(self, tiles, name, API_key, max_zoom, min_zoom, attr, active, detect_retina, no_wrap, subdomains, **kwargs)
    297                                detect_retina=detect_retina,
    298                                subdomains=subdomains,
--> 299                                no_wrap=no_wrap)
    300         self.add_child(tile_layer, name=tile_layer.tile_name)
    301


/Library/Python/2.7/site-packages/folium/map.pyc in __init__(self, tiles, min_zoom, max_zoom, attr, API_key, detect_retina, name, overlay, control, no_wrap, subdomains)
    439         self.tiles = ''.join(tiles.lower().strip().split())
    440         if self.tiles in ('cloudmade', 'mapbox') and not API_key:
--> 441             raise ValueError('You must pass an API key if using Cloudmade'
    442                              ' or non-default Mapbox tiles.')
    443         templates = list(self._env.list_templates(


ValueError: You must pass an API key if using Cloudmade or non-default Mapbox tiles.

API キーが必要との旨でエラーとなります。

mapboxcontrolroom をタイルに指定する

m = folium.Map(location=[lat, lon], tiles='mapboxcontrolroom', zoom_start=zoom_start)
m

openstreetmap をタイルに指定する

m = folium.Map(location=[lat, lon], tiles='openstreetmap', zoom_start=zoom_start)
m

defalut の openstreetmap の タイルが適用されます。 後述しますが、openstreetmap の タイルは他にも多数あります。

stamenterrain を タイルに指定する

m = folium.Map(location=[lat, lon], tiles='stamenterrain', zoom_start=zoom_start)
m

stamentoner を タイル に指定する

m = folium.Map(location=[lat, lon], tiles='stamentoner', zoom_start=zoom_start)
m

stamenwatercolor を タイル に指定する

m = folium.Map(location=[lat, lon], tiles='stamenwatercolor', zoom_start=zoom_start)
m

ビルドインタイル 以外で指定可能なタイルについて

folium というか Leaflet は、WMS 、 TMS のタイルの指定ができます。
Using WMS and TMS services - Leaflet - a JavaScript library for interactive maps Leaflet では、WMS と TMS で、メソッドが異なり、それは、folium でも同じかと思われます。
検索して見た限り、add_wms_layer というメソッドを使って、WMS のタイルが指定できるようです。
Adding WMS layers to your folium maps

上記、記載はしたものの、厳密にはWMS、 TMS でもないタイルのフォーマットが主に使われているようなのでメソッドの動作確認はスルーして、folium で使える 地図タイルを探します。


地図タイルの提供してくれるサービス

無料で使用可能なものとして以下がありました。

探す過程では、以下の記事を参考にしました。
行政サイトでウェブ地図を使う際の注意点などまとめ - Qiita

jupyter で 動かしてみる

jupyter で tile を指定して動かしてみます。

version の出力

import os
import folium
print(folium.__version__)
0.5.0

国土地理院 の タイル を 指定する 空中写真(1961~1964年)

zoom_start = 15
m = folium.Map(location=[35.658593, 139.745441],
                   tiles='https://cyberjapandata.gsi.go.jp/xyz/ort_old10/{z}/{x}/{y}.png',
                   attr='国土地理院 空中写真(1961~1964年)',
                   zoom_start=zoom_start)
m

出典:国土地理院ウェブサイト 地理院地図|地理院タイル一覧

国土地理院のタイルを指定する 植生(樹木被覆率)

zoom_start = 5
m = folium.Map(location=[35.658593, 139.745441],
                   tiles='https://cyberjapandata.gsi.go.jp/xyz/gmld_ptc2/{z}/{x}/{y}.png',
                   attr='国土地理院 植生(樹木被覆率)',
                   zoom_start=zoom_start)
m

出典:国土地理院ウェブサイト 地理院地図|地理院タイル一覧

tamen TonerLite をタイル に指定する

zoom_start = 3
m = folium.Map(location=[35.658593, 139.745441],
                   tiles='https://stamen-tiles-{s}.a.ssl.fastly.net/toner-lite/{z}/{x}/{y}.png',
                   attr= 'Map tiles by <a href="http://stamen.com">Stamen Design</a>, <a href="http://creativecommons.org/licenses/by/3.0">CC BY 3.0</a> &mdash; Map data &copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>',
                   zoom_start=zoom_start)
m

サンプルコードのURLは'https://stamen-tiles-{s}.a.ssl.fastly.net/toner-lite/{z}/{x}/{y}.{ext}' です。
'{ext}' をfolium からの指定する方法がわからなかったので、'https://stamen-tiles-{s}.a.ssl.fastly.net/toner-lite/{z}/{x}/{y}.ping' としました。

HikeBike.HikeBike をタイルに指定する

zoom_start = 5
m = folium.Map(location=[35.658593, 139.745441],
                   tiles='http://{s}.tiles.wmflabs.org/hikebike/{z}/{x}/{y}.png',
                   attr= '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>',
                   zoom_start=zoom_start)
m

まとめ

folium で 指定できる 地図タイルについて調べてみました。以下、まとめます。

コメント