不動産の分析に取り掛かる際、重要な前処理の一つがgeocodingと呼ばれる住所データの緯度経度変換です。 文字列情報である住所を数値情報である緯度経度に変換することで、分析を行いやすくすることができます。
このgeocodingを数十万件単位で行いたい場合、問題となってくるのが実行時間です。 多くの場合、HTTPでgeocoding APIを叩いて結果を取得することになるため、1件1秒としても50万件では6日近くの時間がかかってしまいます。
そこで今回はローカルで大量のgeocodingが可能なpydamsというライブラリをご紹介します。
pydamsとは
pydamsとは、dams(Distributed Address Matching System)というアドレスマッチングライブラリのpythonラッパーです。
まずdamsの方から紹介します。 damsは東京大学空間情報科学研究センターによる「アドレスマッチングサービス」および「シンプルジオコーディング実験」の成果物がオープンソースとして公開されたC++ライブラリです。 住所と緯度経度のマッピングテーブルを元にローカルで高速にマッチングを行うことができます。
damsは優秀なライブラリではあるのですが、C++で書かれているため敷居が高く利用しづらいのが現状です。 それに対する利便性向上のために、株式会社ホットリンクが開発したPythonラッパーライブラリであるpydamsが公開されています。
こちらの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年程度で更新が止まっているケースがあるようです。
正確なデータが必要な場合、国土交通省の位置参照情報を元に、カスタムのマッピングテーブルが作成して利用する必要があります。
pydamsの活用事例
pydamsを用いることで、数十万件程度のgeocodingであれば数分以内に実行を完了させることができます。 これにより、前処理に費やす時間を減らし、素早く分析に取り掛かることができるようになります。
まとめ
大量の住所情報を緯度経度にgeocodingする場合、pydamsというライブラリが便利です。 数十万件単位の住所データも、数分程度で高速に緯度経度に変換することができます。