こんにちは、CX事業本部 IoT事業部の若槻です。
最近地理空間情報を扱う中で、GeoPandasという良さげなPythonライブラリを見つけました。
GeoPandasでは、その名前の通り、pandasで使われているデータ形式DataFrameを地理空間データ形式に拡張しています。
そこで今回は、M1 MacにGeoPandasを導入し、軽く動作確認を行ってみました。
やってみた
環境
端末はM1 MacBookで、次のような環境となります。
$ sw_vers
ProductName: macOS
ProductVersion: 12.5
BuildVersion: 21G72
$ pip3 -V
pip 22.2.2 from /opt/homebrew/lib/python3.10/site-packages/pip (python 3.10)
$ python3 -V
Python 3.10.6
インストール
GeoPandasのインストールは、ドキュメントを読むとAnacondaまたはcondaによる方法が推奨されています。本記事ではそれらを使わずにPipを利用してGeoPandasを導入してみます。
まずGDALをHomebrewでインストールします。GDALはベクター(画像)形式およびベクター形式の地理空間データの変換を行うライブラリで、GeoPandasの依存であるFionaで必要となります。
brew install gdal
GeoPandasをPipでインストールします。
pip3 install geopandas
ちなみにGDALが未導入の場合は次のようなエラーとなります。
pip install エラー
pip3 install geopandas
Collecting geopandas
Downloading geopandas-0.11.1-py3-none-any.whl (1.0 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.0/1.0 MB 6.4 MB/s eta 0:00:00
Collecting fiona>=1.8
Downloading Fiona-1.8.21.tar.gz (1.0 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.0/1.0 MB 9.4 MB/s eta 0:00:00
Preparing metadata (setup.py) ... error
error: subprocess-exited-with-error
× python setup.py egg_info did not run successfully.
│ exit code: 1
╰─> [2 lines of output]
Failed to get options via gdal-config: [Errno 2] No such file or directory: 'gdal-config'
A GDAL API version must be specified. Provide a path to gdal-config using a GDAL_CONFIG environment variable or use a GDAL_VERSION environment variable.
[end of output]
note: This error originates from a subprocess, and is likely not a problem with pip.
error: metadata-generation-failed
× Encountered error while generating package metadata.
╰─> See above for output.
note: This is an issue with the package mentioned above, not pip.
hint: See above for details.
このエラーの解決にかなり時間を要してしまいました。
動作確認
GeoPandasが導入できたので、基本的な動作を確認してみます。
ファイル読み込み
東京都人口推計データのCSVファイルを読み込ませてみます。このCSVはヘッダー行となる6行目の前に余分な行が含まれているのですが、ちゃんとヘッダー行が認識されてDataFrameにも使われています。
>>> import geopandas
>>> populations_df = geopandas.read_file("js228v0000_3.csv", encoding="SHIFT_JIS")
>>> df
field_1 field_2 field_3 field_4 field_5 field_6 field_7 ... field_12 field_13 field_14 field_15 field_16 field_17 geometry
0 6 国籍 地域階層 地域コード 地域 全体の増減 他県との移動/増減 ... 都内間移動/転出 自然動態/増減 自然動態/出生 自然動態/死亡 その他の増減 (別掲)日本人全体の増減 None
1 9 総数 4 13101 千代田区 -82 -8 ... 458 2 35 33 78 -104 None
2 10 総数 4 13102 中央区 140 5 ... 751 78 154 76 91 -44 None
3 11 総数 4 13103 港区 8 -25 ... 1218 74 229 155 124 -5 None
4 12 総数 4 13104 新宿区 249 -83 ... 1941 -45 185 230 936 -459 None
.. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
63 74 総数 3 13400 八丈支庁 -1 -1 ... 7 -1 4 5 0 -2 None
64 75 総数 4 13401 八丈町 -1 -1 ... 7 -1 4 5 0 -2 None
65 76 総数 4 13402 青ヶ島村 0 0 ... 0 0 0 0 0 0 None
66 77 総数 3 13420 小笠原支庁 -4 -3 ... 8 0 1 1 2 -5 None
67 78 総数 4 13421 小笠原村 -4 -3 ... 8 0 1 1 2 -5 None
[68 rows x 18 columns]
ジオコーディング
続いてジオコーディング(住所やランドマークから、緯度/経度への変換)を試してみます。一番気になっていた機能です。
geopandas.tools.geocode()
で出来るとのことなので試してみるとエラーとなりました。
>>> geopandas.tools.geocode("千代田区")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/opt/homebrew/lib/python3.10/site-packages/geopandas/tools/geocoding.py", line 65, in geocode
throttle_time = _get_throttle_time(provider)
File "/opt/homebrew/lib/python3.10/site-packages/geopandas/tools/geocoding.py", line 16, in _get_throttle_time
import geopy.geocoders
ModuleNotFoundError: No module named 'geopy'
geopy
が必要とのことなのでインストールします。
pip3 install geopy
するとジオコーディングが出来るようになりました。
日本語の住所を指定すると上手くジオコーディングが行われず、英語だと行われますね。ただし東京スカイツリー
のようなランドマークだと日本語の場合でもジオコーディングが行われます。
>>> geopandas.tools.geocode("千代田区")
geometry address
0 GEOMETRYCOLLECTION EMPTY None
>>> geopandas.tools.geocode("東京都千代田区")
geometry address
0 GEOMETRYCOLLECTION EMPTY None
>>> geopandas.tools.geocode("東京都千代田区九段南1-2-1")
geometry address
0 GEOMETRYCOLLECTION EMPTY None
>>> geopandas.tools.geocode("boston, ma")
geometry address
0 POINT (-71.06051 42.35543) Boston, Massachusetts, United States
>>> geopandas.tools.geocode("東京スカイツリー")
geometry address
0 POINT (139.81292 35.71061) 押上〈スカイツリー前〉, 1F, 131-0045, 1F, 東京都, 日本
日本の住所でも英語で指定するとそれっぽい緯度/経度(および日本語の住所)が取得できます。
>>> geopandas.tools.geocode("Japan, Tokyo")
geometry address
0 POINT (139.75945 35.68284) 東京都, 日本
>>> geopandas.tools.geocode("Japan, Tokyo, Chiyoda-Ku")
geometry address
0 POINT (139.76124 35.68450) パレスホテル東京, 1-1-1 Marunouchi, Chiyoda-ku, Tokyo,...
>>> geopandas.tools.geocode("Tokyo, Japan")
geometry address
0 POINT (139.75945 35.68284) 東京都, 日本
このGeoPandasでのジオコーディングは外部のプロパイダーのAPIを使用しているので、使い方に応じてプロバイダーを指定すると良いのかも知れません。ここは要検証ですね。
おわりに
M1 MacにGeoPandasを導入し、軽く動作確認を行ってみました。
ドキュメントや他のブログを読むとポリゴン計算や可視化した地図画像の生成など他にも様々な地理空間情報の操作が出来るようです。とても面白そうなので引き続き触ってみます。
参考
- 【PythonでGIS】GeoPandasまとめ - Qiita
- installation - Fiona · PyPI
- Installation — GeoPandas 0.11.0+0.g1977b50.dirty documentation
以上