【Python】foliumで日本地図と市町村の線を描く


日本地図に市町村の線を引きたい

Pythonのfoliumで、手軽に市町村の地図を描きます。
今回は東京都の八王子市のラインが必要だと仮定します。

必要なもの
- python(folium)
- curl

手順は2つです。

  1. 市町村のgeojsonデータをcurlで取得
  2. pythonで可視化

1. 市町村のgeojsonデータをcurlで取得

geoJsonがまとまっているすごいrepositoryを発見しました。

  • 以下から必要な市町村を選択

  • rawのリンクを取得

  • curlでデータ取得してjson形式で保存

get_json.sh
$ curl https://raw.githubusercontent.com/niiyz/JapanCityGeoJson/master/geojson/13/13201.json > cityline.json

これで必要なデータが取得できるので、pythonで扱う際に都合の良い場所に置きます。
今回はdata/フォルダに移動させます。

$ mv cityline.json data/cityline.json 

2.python(folium)で可視化

  • pythonで地図を描いて、cityline.jsonを表示させる

線がわかりやすいように、白地の地図をベースに指定しております。

map.py
# 地図のベースを指定
copyright_st = '© ' \
            'Map tiles by <a href="http://stamen.com">Stamen Design</a>,' \
            ' under <a href="http://creativecommons.org/licenses/by/3.0">CC BY 3.0</a>.' \
            'Data by <a href="http://openstreetmap.org">OpenStreetMap</a>,' \
            'under <a href="http://www.openstreetmap.org/copyright">ODbL</a>.'

# ベースマップにlineを描く関数
def jap_map(base_map, geojson_path):
    # geojson読み込み
    base_map.choropleth(geo_data=geojson_path, 
                        line_color="red", 
                        line_weight=5, 
                        fill_color='white', 
                        fill_opacity=0.1, 
                        line_opacity=0.5)

# ベースマップ定義
base_map = folium.Map(location=[35.655616, 139.338853], 
                      attr=copyright_st,
                      tiles='https://stamen-tiles-{s}.a.ssl.fastly.net/toner-lite/{z}/{x}/{y}.png',
                      zoom_start=10.0)

# ベースマップに八王子駅のpopup追加
folium.Marker([35.655616, 139.338853],
              popup='八王子駅',
              icon=folium.Icon(color='red', icon='train', prefix='fa')).add_to(base_map)

# ベースマップに枠線追加
jap_map(base_map=base_map, geojson_path='data/cityline.json')

base_map
  • 市町村のlineが入った地図が表示される

niiyx/JapanCityGeoJsonの偉業のおかげでとても低コストでいい感じの地図がかけました!

参考

Folium 0.5.0 documentation

niiyx/JapanCityGeoJson