M1 MacにGeoPandasを導入してみた

2022.08.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、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を導入し、軽く動作確認を行ってみました。

ドキュメントや他のブログを読むとポリゴン計算や可視化した地図画像の生成など他にも様々な地理空間情報の操作が出来るようです。とても面白そうなので引き続き触ってみます。

参考

以上