Shapefile と OpenStreetMap を使用した情報の可視化を試してみる. 国土地理院の公開データを基に、GeoPandas の dissolve と simplify を用いて、市区町村の境界情報を含む shapefile を作成した.
データを読み込み日本全国の市区町村を表示してみる.
import pandas as pd
import geopandas as gpd
path = 'town.shp'
data = gpd.read_file(path, encoding = 'sjis')
data.plot()
東京23区のみを抜き出して、そこに千代田区千代田 1-1の地点を赤で表示してみる. 同じ座標系を使用するように設定した後に、23区の地図を表示. そこに点を重ね書きしている.
import pyproj
from shapely.geometry import Point
tokyo = data[data['都道府県']=='東京都']
wards = data[data['市区町村'].str.endswith('区')]
epsg3857 = pyproj.Proj(proj='longlat', ellps='GRS80').srs
pos = (139.7528, 35.685175) # (longitude, lattitude), 1-1 Chiyoda, Chiyoda-ku, Tokyo
ip = gpd.GeoDataFrame([[Point(pos[0], pos[1])]], geometry='geometry', crs=epsg3857, columns=['geometry'])
ip = ip.to_crs(crs=epsg3857)
wards = wards.to_crs(crs=epsg3857)
fig, ax = plt.subplots(figsize=(8,8))
wards.plot(ax=ax)
ip.plot(ax=ax, color='red', markersize=10)
これで、市区町村単位の情報を可視化する土台が出来た.
次に OpenStreetMap の情報を可視化してみる. まず、東京都千代田区の地図情報を取得する.
import osmnx as ox
place_name = "Chiyoda, Tokyo, Japan"
graph = ox.graph_from_place(place_name)
次に、同区内の points of interest (POI) を取得する. name 属性が null の POI を削除し、POI の種類を用いて食事に関する POI を抜き出す. さらに、店の種類毎に分類する.
import pandas as pd
pois = ox.pois.pois_from_place(place_name)
pois = pois[pois['name'].notnull()]
kind = ['cafe', 'restaurant', 'fast_food', 'bar', 'pub', 'biergarten', 'food_court', 'ice_cream', 'bar;cafe']
pois = pois[pois['amenity'].isin(kind)]
onehot = pois.join(pd.get_dummies(pois.amenity.apply(pd.Series).stack()).sum(level=0), lsuffix='_l')
最後に地図情報を表示し、千代田区の境界情報を重ねたうえで、restaurant の POI を表示する.
fig, ax = ox.plot_graph(graph, fig_height=6, fig_width=8, node_size=0, edge_alpha=0.1)
wards.geometry.boundary.plot(ax=ax, color=None, edgecolor='b', linewidth=1)
onehot[onehot.restaurant==1].plot(ax=ax, column='restaurant', alpha=0.1, linewidth=0, label="restaurant")
ip.plot(ax=ax, color='red', markersize=50)
区の境界はファイルサイズを小さくする為の単純化の度合いが過ぎたためか二重になって見える箇所がある. 位置情報を含む各種データがあれば、このように地図上に表示して何らかのパターンを探すことが出来る. データが時間情報を含んでいれば、更に時系列解析を行うことも可能. 電子マネー覇権を握ればかなりの情報を得る事が出来る. 逆に言えば、電子マネーの使用者はサービスの提供者にかなりの情報を渡していることになる.