Pythonでジオコーディング(住所から緯度経度に変換)【pydams】

Pythonでジオコーディング(住所から緯度経度に変換)【pydams】 プログラミング

ジオコーディングには、いろいろな方法があります。
手っ取り早いモノは、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

候補が二つあることを示しています。
青森にも豊洲があることを初めて知りました。

上記のような結果が出れば、動作確認は成功です。

タイトルとURLをコピーしました