ジオコーディングには、いろいろな方法があります。
手っ取り早いモノは、APIの利用です。
でも、そのAPIの無償利用にはいろいろと制約があります。
アクセス制限があったり、商用利用が制限されているなどの制約です。
その制約が嫌なら、有償利用すればいいのですけどね。
でも、それは最終手段です。
では、どうしましょうか?
あなたがPythonを触れるなら、pydamsを使いましょう。
本記事の内容
- pydamsとは?
- pydamsのシステム要件
- pydamsのインストール
- pydamsの動作確認
それでは、上記に沿って解説していきましょう。
pydamsとは?
pydamsとは、DAMSのPythonバインディングです。
pydamsを使えば、日本国内の住所文字列をジオコーディングすることができます。
上記では、DAMSというキーワードが出てきました。
このDAMSとは、東京大学空間情報科学研究センターが開発したソフトウェアのことです。
また、DAMS自体はC++で開発されています。
そのため、高速にジオコーディングの処理が可能となります。
以上より、pydamsはPythonからDAMSを利用するためのライブラリと言えます。
次に、pydamsのシステム要件を確認します。
pydamsのシステム要件
pydamsのシステム要件には、DAMSのシステム要件も含めます。
それらを含めたモノは、以下。
- Linux
- C++コンパイラ
- Python
- Cython
それぞれを下記で説明します。
Linux
DAMSが、Linuxサーバーで動く前提です。
そのため、pydamsもLinuxでしか動かないと言えます。
macOSなら頑張れば、なんとか動きそうな感じもします。
でも、素直に仮想環境などでLinuxを用意した方がよいでしょう。
なお、この記事ではUbuntu(Debianは同じ)を前提に話を進めます。
C++コンパイラ
残念ながら、 pydamsはpipコマンドでインストールができません。
GitHubから、ソースをダウンロードしてビルドする必要があります。
そのため、C++コンパイラが必要となります。
それ以前に、DAMSのインストールにもC++コンパイラを利用します。
もし、C++コンパイラがなければ用意しておきます。
以下のコマンドを実行するだけです。
$ sudo apt update $ sudo apt install build-essential libbz2-dev libdb-dev \ libreadline-dev libffi-dev libgdbm-dev liblzma-dev \ libncursesw5-dev libsqlite3-dev libssl-dev \ zlib1g-dev uuid-dev tk-dev
Python
動作確認は以下のバージョンで行われています。
- Python 2.7
- Python 3.6
上記バージョンで動けば、どのバージョンでも動きそうです。
今回は、以下のバージョンで検証しています。
$ python -V Python 3.9.2
Cython
pydamsは、Cythonに依存しています。
そのため、Cythonを事前にインストールしておく必要があります。
そうしないと、ビルドの際に次のようなエラーが表示されます。
ModuleNotFoundError: No module named 'Cython'
インストールされていない場合は、以下のコマンドでインストールしておきましょう。
pip install cython
まとめ
Linuxマシンでコンパイルさえできれば、何とかなりそうです。
しかし、Cythonのインストールに関しては特に記載はありません。
ハマるとすれば、これぐらいでしょうか。
C++コンパイラやCythonの準備ができたら、pydamsのインストールを行います。
pydamsのインストール
pydamsのインストールは、以下の2つに分けて説明します。
- DAMSのインストール
- pydamsのインストール
それぞれを下記で説明します。
DAMSのインストール
適当な作業ディレクトリに移動します。
そして、DAMSのソースをダウンロードして解凍します。
$ wget http://newspat.csis.u-tokyo.ac.jp/download/dams-4.3.4.tgz $ tar -xzvf dams-4.3.4.tgz
次は、パッチを適用します。
このパッチはpydamsの本リポジトリからダウンロードします。
$ git clone https://github.com/hottolink/pydams.git $ patch -d ./dams-4.3.4 -p1 < ./pydams/patch/dams-4.3.4.diff
パッチの適用が終わったら、次はソースのビルドです。
$ cd dams-4.3.4 $ ./configure $ make
このビルドにより、共有ライブラリ(libdams-4.3.4.so)が作成されます。
生成された共有ライブラリをインストールします。
同時にキャッシュに登録します。
$ sudo make install $ sudo ldconfig
インストールされたかどうかは、以下のコマンドで確認できます。
$ ldconfig -v | grep dams ~~ libdams-4.3.4.so -> libdams.so
上記「libdams-4.3.4.so -> libdams.so」が表示されれば、インストールは成功です。
最後に、地域語辞書をインストールします。
DAMSは、この地域語辞書をもとにジオコーディングしています。
辞書のベースは、CSV(テキストファイル)です。
このCSVをDAMS上で高速に処理するためにバイナリに変換します。
そのための作業が、以下です。
$ make dic $ sudo make install-dic
以上より、DAMSのインストールは完了です。
pydamsのインストール
最初に、現状のインストール済みパッケージを確認しておきます。
$ pip list Package Version ---------- ------- Cython 0.29.22 pip 21.0.1 setuptools 49.2.1
Cythonは、事前にインストール必須です。
では、pydamsのインストールを始めましょう。
pydamsもソースからビルドしてインストールする形になります。
pydamsは、先ほどダウンロード済みです。
そのディレクトリに移動して、そこでビルドします。
$ cd ../ $ cd pydams $ make all $ make install
では、インストール状況を確認しましょう。
$ pip list Package Version ---------- ------- Cython 0.29.22 pip 21.0.1 pydams 1.0.4 setuptools 49.2.1
pydamsが、インストールされていますね。
他には、次の確認方法があります。
$ pip freeze | grep pydams pydams==1.0.4
以上より、pydamsのインストールが完了です。
pydamsの動作確認
公式のサンプルコードの住所部分を変更したモノです。
from pydams import DAMS from pydams.helpers import pretty_print DAMS.init_dams() address = u"豊洲" # geocode() method geocoded = DAMS.geocode(address) pretty_print(geocoded) # geocode_simplify() method geocoded = DAMS.geocode_simplify(address) pretty_print(geocoded)
上記を実行すると、以下の結果が表示されます。
score: 2 candidates: 2 candidate: 0, address level: 5 address:青森県, lat:40.82516098022461, long:140.73976135253906 address:八戸市, lat:40.51185989379883, long:141.49000549316406 address:豊洲, lat:40.53669357299805, long:141.51519775390625 candidate: 1, address level: 5 address:東京都, lat:35.68949890136719, long:139.69163513183594 address:江東区, lat:35.67298889160156, long:139.8163604736328 address:豊洲, lat:35.66179656982422, long:139.7923126220703 score: 2 candidates: 2 candidate: 0, address level: 5 address:青森県八戸市豊洲, lat:40.53669357299805, long:141.51519775390625 candidate: 1, address level: 5 address:東京都江東区豊洲, lat:35.66179656982422, long:139.7923126220703
候補が二つあることを示しています。
青森にも豊洲があることを初めて知りました。
上記のような結果が出れば、動作確認は成功です。