Geopandas
前回、日本地図を表示するライブラリjapanmapを紹介しました。
今回はさらに世界地図や特定の地域の地図を表示することができるgeopandasというライブラリをいじってみます。
前回のjapanmapはmatplotlibを使って日本地図を表示していましたが、今回のgeopandasはその名が示す通りPandasの拡張ライブラリのようです。
それでは始めていきましょう。
geopandasのインストール
geopandasのインストールはいつも通りpipでできます。
pip install geopandas
世界地図を表示
geopandasのライブラリには最初から3つのサンプルデータが入っています。
一つ目が「naturalearth_lowres」、二つ目が「raturalearth_cities」、三つ目が「nybb」です。
そして「naturalearth_lowres」には世界の国の形のデータ、人口、存在する大陸名、3文字表記などの情報が含まれています。
データを読み込むには、geopandasをインポートして、「geopandas.datasets.get_path(“サンプルデータ名”)」、そして「geopandas.read_file(データ)」とします。
import geopandas
world = geopandas.datasets.get_path("naturalearth_lowres")
data = geopandas.read_file(world)
print(data)
実行結果
pop_est continent name iso_a3 gdp_md_est
0 889953.0 Oceania Fiji FJI 5496 \
1 58005463.0 Africa Tanzania TZA 63177
2 603253.0 Africa W. Sahara ESH 907
3 37589262.0 North America Canada CAN 1736425
4 328239523.0 North America United States of America USA 21433226
.. ... ... ... ... ...
172 6944975.0 Europe Serbia SRB 51475
173 622137.0 Europe Montenegro MNE 5542
174 1794248.0 Europe Kosovo -99 7926
175 1394973.0 North America Trinidad and Tobago TTO 24269
176 11062113.0 Africa S. Sudan SSD 11998
geometry
0 MULTIPOLYGON (((180.00000 -16.06713, 180.00000...
1 POLYGON ((33.90371 -0.95000, 34.07262 -1.05982...
2 POLYGON ((-8.66559 27.65643, -8.66512 27.58948...
3 MULTIPOLYGON (((-122.84000 49.00000, -122.9742...
4 MULTIPOLYGON (((-122.84000 49.00000, -120.0000...
.. ...
172 POLYGON ((18.82982 45.90887, 18.82984 45.90888...
173 POLYGON ((20.07070 42.58863, 19.80161 42.50009...
174 POLYGON ((20.59025 41.85541, 20.52295 42.21787...
175 POLYGON ((-61.68000 10.76000, -61.10500 10.890...
176 POLYGON ((30.83385 3.50917, 29.95350 4.17370, ...
[177 rows x 6 columns]
2023年6月現在の国連加盟国は193カ国なのに対し、177カ国しかないことに注意してください。
このデータから世界地図を表示するには読み込んだデータに「.plot()」とします。
import geopandas
world = geopandas.datasets.get_path("naturalearth_lowres")
data = geopandas.read_file(world)
data.plot()
実行結果
ちなみに「raturalearth_cities」には世界の都市に関する位置情報が含まれています。
import geopandas
cities = geopandas.datasets.get_path("naturalearth_cities")
data = geopandas.read_file(cities)
print(data)
実行結果
name geometry
0 Vatican City POINT (12.45339 41.90328)
1 San Marino POINT (12.44177 43.93610)
2 Vaduz POINT (9.51667 47.13372)
3 Lobamba POINT (31.20000 -26.46667)
4 Luxembourg POINT (6.13000 49.61166)
.. ... ...
238 Rio de Janeiro POINT (-43.21212 -22.90731)
239 São Paulo POINT (-46.62697 -23.55673)
240 Sydney POINT (151.21255 -33.87137)
241 Singapore POINT (103.85387 1.29498)
242 Hong Kong POINT (114.18306 22.30693)
[243 rows x 2 columns]
こちらも243都市しかないので、あくまでも一部ということです。
ちなみに先ほどの世界地図上に都市をプロットするにはそれぞれのデータを読み込んで、「都市データ.plot(ax=地図データ)」とします。
またこの際、「color」のオプションでマーカーの色を、「markersize」でマーカーのサイズを変えることができます。
import geopandas
world = geopandas.datasets.get_path("naturalearth_lowres")
world_data = geopandas.read_file(world)
cities = geopandas.datasets.get_path("naturalearth_cities")
cities_data = geopandas.read_file(cities)
data = world_data.plot()
cities_data.plot(ax=data, color="Red", markersize=2)
実行結果
ちなみに「nybb」はニューヨークのデータらしいので割愛します。
地図に色を塗る方法
geopandasで地図に色を塗る場合、地域を指定して色を塗るというのではなく、ある列のデータを使って色を塗り分けるという形になります。
「naturalearth_lowres」のデータには「pop_est」という列があり、これは人工を示しているので、こちらの列のデータを使って世界地図を塗り分けてみましょう。
「.plot()」のオプションに「column=”カラム名”」、「cmap=”カラーマップ名”」を追加します。
import geopandas
world = geopandas.datasets.get_path("naturalearth_lowres")
data = geopandas.read_file(world)
data.plot(column="pop_est", cmap="jet")
実行結果
特定の地域の地図を表示
geopandasは世界地図専用のライブラリではなく、シェープデータと呼ばれる地図上に記載される地域の位置や形状の情報を使い、地図を表示するライブラリです。
つまりシェープデータがあれば他の地域も表示できるというわけです。
例えばこちらのサイトでは色々な地域のシェープデータを取得することができます。
ページにアクセスして、下の方に進むとデータ一覧がありますので、「Name」の場所の「Filter」に「Japan」と入力すると日本のデータがピックアップされます。
「Full Release」の列のダウンロードマークをクリックするとデータをダウンロードできます。
ダウンロードしたデータを開いてみると色々なファイルがあることがわかります。
今回使用するのは「geoBoundaries-JPN-ADM0_simplified.geojson」です。
「geopandas.read_file(データファイルパス)」でgeopandasに読み込むことができます。
import geopandas
japan = "./geoBoundaries-JPN-ADM0-all/geoBoundaries-JPN-ADM0.geojson"
data = geopandas.read_file(japan)
data.plot()
ただ気をつけることはこのシェープデータは日本のシェープデータで、都道府県とか地域とかに分かれていないので、先ほどのように人口で塗り分けるなんてことはできません。
次回はJupyter notebookでファイル名をライブラリ名としてしまったことで起きたエラーを紹介します。
ではでは今回はこんな感じで。
コメント