shobylogy

叩けシンプルの杖

Pythonで数十万件の住所データを緯度経度に変換する(pydams)

不動産の分析に取り掛かる際、重要な前処理の一つがgeocodingと呼ばれる住所データの緯度経度変換です。 文字列情報である住所を数値情報である緯度経度に変換することで、分析を行いやすくすることができます。

このgeocodingを数十万件単位で行いたい場合、問題となってくるのが実行時間です。 多くの場合、HTTPでgeocoding APIを叩いて結果を取得することになるため、1件1秒としても50万件では6日近くの時間がかかってしまいます。

そこで今回はローカルで大量のgeocodingが可能なpydamsというライブラリをご紹介します。

pydamsとは

pydamsとは、dams(Distributed Address Matching System)というアドレスマッチングライブラリのpythonラッパーです。

github.com

まずdamsの方から紹介します。 damsは東京大学空間情報科学研究センターによる「アドレスマッチングサービス」および「シンプルジオコーディング実験」の成果物がオープンソースとして公開されたC++ライブラリです。 住所と緯度経度のマッピングテーブルを元にローカルで高速にマッチングを行うことができます。

newspat.csis.u-tokyo.ac.jp

damsは優秀なライブラリではあるのですが、C++で書かれているため敷居が高く利用しづらいのが現状です。 それに対する利便性向上のために、株式会社ホットリンクが開発したPythonラッパーライブラリであるpydamsが公開されています。

www.hottolink.co.jp

こちらのpydamsを用いることにより、数十万件単位のgeocodingをPythonから高速に行うことができます。

pydamsのセットアップ

pydamsはdamsのPythonラッパーであるため、damsを必要とします。 damsやpydamsはC++やCythonで書かれているため、ビルドに少しコツが必要です。

以下に、Mac環境でのビルド方法をご紹介します。

一時的にClangをgccにする

brew install gcc
ln -s /usr/local/bin/gcc-9 /usr/local/bin/gcc
ln -s /usr/local/bin/g++-9 /usr/local/bin/g++

damsの取得

gzip -dc dams-4.3.4.tgz | tar xf -
mv dams-4.3.4 ~/.dams
cd ~/.dams

環境変数の設定

# これがないと実行時に `dyld: lazy symbol binding failed: Symbol not found: _iconv_open` というエラーが出る

export DYLD_LIBRARY_PATH=/usr/lib/:$DYLD_LIBRARY_PATH
export LDFLAGS="$LDFLAGS -liconv"

damsのビルド

./configure
make
make dic

damsのテスト

# 緯度経度が出力されればOK

make test

damsのインストール

# /usr/local/includeにheader、/usr/local/libにライブラリを設置

sudo make install
sudo make install-dic

シンボリックリンクを削除してclangに戻す

rm /usr/local/bin/gcc
/usr/local/bin/g++

pydamsのインストール

pip install cython

export CC=gcc-9 CXX=g++-9 # clangだとうまくビルドできないのでgccを使う
pip install --global-option=build_ext --global-option="-I/usr/local/include/" --global-option="-L/usr/local/lib" git+https://github.com/hottolink/pydams.git#egg=pydams

pydamsのテスト

python
from pydams import DAMS
DAMS.init_dams()
DAMS.geocode_simplify('千代田区')

pydamsの注意点

damsのデフォルトの住所マッピングテーブルは2005年程度で更新が止まっているケースがあるようです。

gri.jp

正確なデータが必要な場合、国土交通省の位置参照情報を元に、カスタムのマッピングテーブルが作成して利用する必要があります。

newspat.csis.u-tokyo.ac.jp

pydamsの活用事例

pydamsを用いることで、数十万件程度のgeocodingであれば数分以内に実行を完了させることができます。 これにより、前処理に費やす時間を減らし、素早く分析に取り掛かることができるようになります。

まとめ

大量の住所情報を緯度経度にgeocodingする場合、pydamsというライブラリが便利です。 数十万件単位の住所データも、数分程度で高速に緯度経度に変換することができます。