はじめに
国土数値情報などから得られるShapeファイルをJupyter notebookで加工する必要があった。
期待通りの結果になっているかを地図上で確認するために、加工結果を再度Shapeファイルにして、QGISでに読み込ませて表示する、ということをやっていたが面倒だった。
Foliumというライブラリを使えば、Jupyter notebook上で地図表示が可能だということを知ったので本記事を書いた。
国土数値情報のダウンロード
国土数値情報から適当なデータをダウンロードする。
ここではポイントデータとして東京都の避難施設とする。
ライブラリのインストール
pip install shapely
pip install folium
ポイントデータの読み込みと表示
ポイントデータのShapeファイルを読み込む関数を定義する。
read_shape_point.py
import shapefile
import pandas as pd
def read_shape_point(path):
src = shapefile.Reader(path, encoding='cp932')
shps = src.shapes()
recs = src.records()
result = {}
for i, (shp, rec) in enumerate(zip(shps, recs)):
result[i] = rec.as_dict()
result[i]['lon'] = shp.points[0][0]
result[i]['lat'] = shp.points[0][1]
return pd.DataFrame(result).T
shpファイルを読み込む。
import glob
path = 'data\P20-12_13_GML'
shp_paths = glob.glob(path + '\?????????.shp')
hinan = read_shape_point(shp_paths[0])
読み込んだデータを表示。
hinan
先頭2行だけを表示した。 施設名称の列名が[P20_002]、住所が[P20_003 ]となっている。
P20_001 | P20_002 | P20_003 | P20_004 | P20_005 | P20_006 | P20_007 | P20_008 | P20_009 | P20_010 | P20_011 | P20_012 | レベル | 備考 | 緯度 | 経度 | NO | lon | lat | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 13101 | いきいきプラザ一番町 | 東京都千代田区一番町12-2 | 指定避難所、二次避難所 | -1 | -1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 35.6869 | 139.74 | 1 | 139.74 | 35.6869 | |
2 | 13101 | ちよだパークサイドプラザ | 東京都千代田区神田和泉町1 | 指定避難所、地区救援センター | -1 | -1 | 0 | 0 | 0 | 0 | 0 | 1 | 3 | 35.6993 | 139.779 | 3 | 139.779 | 35.6993 |
緯度経度を指定し地図に読み込ませていく。 重たくなるので先頭500個だけ。
folium_map = folium.Map(location=[hinan.loc[0]['lat'], hinan.loc[0]['lon']], zoom_start=10)
for i in range(500):
folium.Marker(
location=[hinan.loc[i]['lat'], hinan.loc[i]['lon']],
popup = hinan.loc[i]['P20_002'] + "\n" + hinan.loc[i]['P20_003']
).add_to(folium_map)
folium_map
地図を表示する。
folium_map