uni memo

geopandasとpydeckで日本地図(都道府県)可視化

geopandasとpydeckで日本地図(都道府県)可視化

意外と大変だったのでメモ

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)'

参考

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")

参考

2024, Built with Gatsby. This site uses Google Analytics.