2023年9月2日土曜日

地図あそび

地理情報システム(Geographical Information System),GISと呼ばれるシステムがある.GISは地理に関するデータを処理する情報システムで,場所に紐づいたデータを可視化して分析するなどの用途で使われる.

GIS事例

次の図は,八王子市図書館の利用状況を示す図である.地図上に示された9箇所のマーカーは,図書館の位置を示す.また,各町丁目は,来館者密度比の値で塗り分けられている.

来館者密度比とは何か.町丁目ごとに,利用者数を住民数で割った値を来館者密度と定義する.なお,ここで利用者数は2022年度に図書館を1度でも利用した人の数である.9箇所の図書館でそれぞれ利用者数がカウントされており,今回,利用者はその合計とした.一人の利用者が複数の図書館を利用したとすると重複してカウントされてしまうので,正確には「のべ利用者」である.また,住民数は2022年12月時のものを,八王子市のオープンデータから拝借した.

来館者密度比は,来館者密度の最大値で割って正規化したものである.すなわち,最も利用者が多かった地区を基準として,それに対して各地区の来館者密度がどのくらいの割合になっているかを示す指標である.

0〜10%をグレーとし,それ以上は10%ごとに,紺,緑,黄,橙で塗り分けている.50%以上は赤とした.

多くの図書館で,図書館の近くになるほど来館者密度は高くなっていることがお分かりだろう.また,八王子の北部エリア,東端,高尾山の裏(地図では左下)は,利用率が低い.これは地理的な理由によるものである.

このように,地図上にデータを示すことで状況がとてもよくわかる.まさに,一目瞭然,GISの面目躍如というところである.

どうやって作ったか

この地図は,PythonのGISライブラリであるGeoPandasとFoliumを用いて作成した.df_users という変数に,町丁目のデータ(境界を示すポリゴンデータや来館者密度比のデータ)が格納され(次図),df_libs には図書館の位置情報が記されている.

地図を表示するコードは次のようなものである.Google Colablratory ノートから,地図表示に関する部分を抜粋する.

m = folium.Map(location=[35.66, 139.30], zoom_start=12, tiles='stamenterrain',
zoom_control=False, scrollWheelZoom=False, dragging=False)
# to disable zoom, scroll, and dragging functions

for _, r in df_users.iterrows():
sim_geo = gpd.GeoSeries(r['geometry'])
geo_j = sim_geo.to_json()
data = json.loads(geo_j)
data['features'][0]['properties'] = {'color': rcolor(r['Ratio'])}
geo_j = json.dumps(data)
geo_j = folium.GeoJson(data=geo_j, style_function=lambda x: styles(x))
geo_j.add_to(m)

for _, row in df_libs.iterrows():
folium.Marker(location=[row['geometry'].y, row['geometry'].x], popup=row['Name']).add_to(m)

m

ここで,folium.Map() の引数 tiles で指定しているタイルとは,地図の絵柄を示すものである.冒頭で示した4つの地図は,タイルがそれぞれ異なる.左上から時計回りに,stamenterrain, openstreetmap, stamentoner, cartodbpositron を指定して描画した地図である.

ビルトインで指定できるタイルは他にもあり,その他にも外部から取り込むよう指定すれば,別の地図タイルを用いることができるらしい.

このように,タイルで遊んでみるのも一興.皆さんはどのタイルがお好みかな?

0 件のコメント:

コメントを投稿