意外と大変だったのでメモ
geopandasはdataframeで扱うの楽そうだと思ったので。pydeckはstreamlitがmapのplot用に使っていたので
結果として静止画で問題なければgeopandasだけ使えばよい。インタラクティブにしたいときはpydeckも組み合わせるとよさそうだった
geopandasで都道府県名からgeocoding
geopandas.tools.geocode()
いろいろな参照先を指定できるらしい、認証とかいらず、それっぽく取得できるものを指定した
import geopandas
import geopandas.tools as gts
prefs = [
'北海道', '青森県', '岩手県', '宮城県', '秋田県', '山形県',
'福島県', '茨城県', '栃木県', '群馬県', '埼玉県', '千葉県',
'東京都', '神奈川県', '新潟県', '富山県', '石川県', '福井県',
'山梨県', '長野県', '岐阜県', '静岡県', '愛知県', '三重県',
'滋賀県', '京都府', '大阪府', '兵庫県', '奈良県', '和歌山県',
'鳥取県', '島根県', '岡山県', '広島県', '山口県', '徳島県',
'香川県', '愛媛県', '高知県', '福岡県', '佐賀県', '長崎県',
'熊本県', '大分県', '宮崎県', '鹿児島県', '沖縄県'
]
codes = gts.geocode(prefs, provider='nominatim', user_agent='test')
# save to GeoJSON
#outpath = './prefs.geojson'
#codes.to_file(outpath, driver='GeoJSON', encoding='utf-8')
だいたいdataframeっぽく使うことができる
- 中身の取得
緯度、経度、県名の取得ができる
pref = codes["address"][0]
# lon
lon = codes["geometry"][0].x
# lat
lat = codes["geometry"][0].y
print(f'{pref}の緯度経度: ({lon},{lat})')
# '北海道, 日本の緯度経度: (142.8197834,43.4519831)'
参考
- https://geopandas.org/en/stable/docs/user_guide/geocoding.html
- GISの説明から載っていて親切だった https://sorabatake.jp/20510/
pydeckのheatmap layerで可視化
geocofingで取得した座標に対して適当に値をつけて、heatmapを作成する
緯度と経度は独立した列に格納しておく
import random
# 適当な値
codes['rand'] = codes['geometry'].map(lambda x: random.randint(1, 10))
codes['lon'] = codes['geometry'].map(lambda x: x.x)
codes['lat'] = codes['geometry'].map(lambda x: x.y)
view_stateにて初期状態を定義して、そこに任意のlayerを被せる
import pydeck as pdk
from pydeck.types import String
# layer option https://deck.gl/docs/api-reference/aggregation-layers/heatmap-layer
layer = pdk.Layer(
'HeatmapLayer',
codes,
get_position=['lon', 'lat'],
get_radius=100,
pickable=True,
opacity=0.7,
radiusPixels=20,
aggregation=String('MEAN'),
get_weight="rand"
)
# 座標参考: https://www.gsi.go.jp/KOKUJYOHO/center.htm
view_state = pdk.ViewState(
longitude=137.5936,
latitude=36.047,
zoom=5,
min_zoom=1,
max_zoom=15,
pitch=50,
bearing=-0
)
r = pdk.Deck(
layers=[layer], initial_view_state=view_state,
)
r.to_html('heatmap.html')
目玉焼きみたい
参考
公開済みのgeojson(topojson)を使う
座標が点なの微妙だなと思ったら、矩形単位でデータを持っているgeojsonを見つけたのでそちらを試してみる
もはや静止画でよければこちらを使うのがはやい
japan = geopandas.read_file('https://raw.githubusercontent.com/dataofjapan/land/master/japan.topojson')
japan.plot()
参考
pydeckのgeojson layerで可視化
また、pydeckのlayerにgeojsonデータ形式を指定できた。これに色を指定してやればheatmapっぽいのができる
import pydeck as pdk
# 座標参考: https://www.gsi.go.jp/KOKUJYOHO/center.htm
view_state = pdk.ViewState(
longitude=137.5936,
latitude=36.047,
zoom=4,
min_zoom=1,
max_zoom=15,
pitch=50,
bearing=-0
)
geojson = pdk.Layer(
"GeoJsonLayer",
japan,
opacity=0.8,
stroked=False,
filled=True,
extruded=True,
wireframe=True,
get_fill_color="[255, rand * 255, 255]",
get_line_color=[255, 255, 255],
)
r = pdk.Deck(layers=[geojson], initial_view_state=view_state)
r.to_html("geojson.html")