読者です 読者をやめる 読者になる 読者になる

雑食性雑感雑記

知識の整理場。ため込んだ知識をブログ記事として再構築します。

OpenStreetMap Nominatim をローカル環境で利用する。

概要

  • OpenStreetMap のデータをローカルにダウンロードする。
  • geocoding ができる Web API「Nominatim」をローカル環境内で利用できるようにする。
  • Nominatim を使って、緯度 経度 から場所を取得する。
    • 逆ジオコーディング (reverse geocoding)。

情報

OpenStreetMap って??

  • 道路地図などの地理情報データを誰でも利用できるよう、フリーの地理情報データを作成することを目的としたプロジェクト。
  • Google 版は基本無料で使えるけど、多量のデータが欲しくなるとお金がかかってくる。。

Nominatim

  • OpenStreetMap のデータを利用した、geocoding & reverse geocoding ができる Web API。
  • geocoding & reverse geocoding
    • geocoding : 住所や地名から lat & lng 等を持ってくる。
    • reverse geocoding : lat & lng 等から住所や地名を持ってくる。

  • Google Maps API にも同様の機能はあるけど…
    • 無料で使えるのは 2500件 / 1day。多量のデータが欲しい時は無理。

  • Nominatim は無料で使えるけど…
    • Web Access するので『常識的な範囲で使ってね』とのポリシーがある。
    • 『常識的な範囲』を超える使い方をするなら、ローカルに環境構築する。今回はコレ。

今回の構築環境

  • CentOS 6.4 64bit
  • ※ 実験的に色々使っていたマシンで試したので、(既に入っていたために)以下の設定ではライブラリが足りない可能性があります。

構築手順

概要

  • Planet.osm
  • PostgreSQL
  • PostGIS
  • Osm2pgsql
  • Nominatim

Planet.osm

  • OpenStreetMap の全データが詰め込まれているもの。
  • 上記 Wiki ページにある「Downloading」から mirror を選択し、Planet.osm を wget してくる。
    • 私の環境ではダウンロードに 2h 程かかった。
    • bz2 は osm2pgsql (後述) でそのまま読めるため、展開の必要はない。
      • ( …ことを知らず、展開したら 4h超かかってしまった orz... )

PostgreSQL

  • 言わずと知れたオープンソースのDB。
  • 今回は 9.3 を使用。source から Download & Install。(詳細省略)
    • パスはそのまま。「/usr/local/pgsql」を使用。
  • contrib の hstore が後々必要になる。make して配置。
# cd ./postgresql-9.3.4/contrib
# make
# make install

  • config の設定
    • postgresql.conf と pg_hba.conf => localhost から接続できる設定。
      • postgresql.conf の「listen_addresses」と「port」のコメントアウトを外す
      • 「listen_addresses」は "localhost" ではなく "*" にする。
    • postgresql.conf => マシンに合った設定 ( 高速化のための設定 )
      • (ここでは省略。Notinatim の Install ページにも書かれていたりする。)

  • 備考
    • DBのサイズは超巨大になるので、十分な容量がある所で initdb しておく必要あり。

PostGIS

  • PostgreSQL で空間データを扱うことができる。
  • 2.1.3 をsourceから持ってきてDownload & Install。
# cd ./postgis-2.1.3/
# ./configure
# make
# make comments
# make install
# make comments-install

  • トラブルシューティング

Osm2Pgsql

  • OpenStreetMap のデータを PostgreSQL の DB に入れることができる。
  • CentOS では yum 使えないらしい。上記 Wiki を参照してsourceからgitで。
# git clone https://github.com/openstreetmap/osm2pgsql.git
# cd osm2pgsql
# ./autogen.sh
# ./configure
# make
# make install

  • 確認
    • 下記コマンドで import が始まることを確認。
    • ※ 実際には Nominatim が Osm2pgsql を利用して import するので、確認できたら止める。
$ createdb planet
$ psql -d planet -f /usr/local/pgsql/share/contrib/postgis-2.1/postgis.sql
$ psql -d planet -f /usr/local/pgsql/share/contrib/postgis-2.1/spatial_ref_sys.sql
$ osm2pgsql -s -d planet ./planet.osm

Nominatim

事前準備
  • 今回は「httpd + php」で実行。
    • httpd は CentOS のデフォルトで入っていたが、source から最新をダウンロードした。
    • php も source から入れた。
  • その他、必要なものが上記 Wiki ページに書いてあるので、足りなければ入れる。

  • 地図データ実行ユーザ作成
    • adduser して、実行グループ・ユーザを作成 ( nominatim とする )。
    • createuser して、DB 作成ユーザとしても追加。
    • apache の実行ユーザにも設定。
# groupadd nominatim
# adduser nominatim
# createuser -a -d -U postgres nominatim
# vi /etc/httpd/conf/httpd.conf

    • httpd.conf (該当部分のみ)
# user apache
# group apache
user nominatim
group nominatim
Install
  • git clone を使用
# wget http://www.nominatim.org/release/Nominatim-2.2.0.tar.bz2
# tar xvf Nominatim-2.2.0.tar.bz2
# cd Nominatim
# ./autogen.sh
# ./configure
make

配置
  • ./configure 終わったものを、ディレクトリごと公開領域に移す。
  • ユーザ・グループを設定。
# cp -r Nominatim-2.2.0 /var/www/html/nominatim
# cd /var/www/html
# chown -R nominatim:nominatim nominatim
# chmod +x nominatim
# chmod +x nominatim/module
設定
  • Wikiの「Coustomization of the Installation」の項目を見て設定。
  • setting.php を local.php にコピーした上で、以下を設定。
    • DB への接続パス (CONST_Database_DSN)
    • PostgreSQL のバージョン (CONST_Postgresql_Version)
    • PostGIS のバージョン (CONST_Postgis_Version)
    • PostgreSQL、contrib へのパス (CONST_Path_Postgresql_Contrib)
    • Osm2pgsql のパス (CONST_Osm2pgsql_Binary)
    • Website の baseurl (CONST_Website_BaseURL) : localhost実行
    • (その他必要な設定があれば)
$ cp ./settings/settings.php ./settings/local.php
$ vi ./settings/local.php

    • local.php (変更したもののみ)
<?php

    // General settings
    @define('CONST_Database_DSN', 'pgsql://nominatim@localhost/planet');

    // Software versions
    @define('CONST_Postgresql_Version', '9.3');
    @define('CONST_Postgis_Version', '2.1');

    // Paths
    @define('CONST_Path_Postgresql_Contrib', '/usr/local/pgsql/share/contrib');
    @define('CONST_Osm2pgsql_Binary', /usr/local/bin/osm2pgsql');

    // Website settings
    @define('CONST_Website_BaseURL', 'http://localhost/nominatim/');

データインポート
  • Wiki のコマンドの通り。
  • ただし、凄く時間かかるので、nouhp コマンドでかける。
( nominatim ユーザ )
$ nohup php ./utils/setup.php --osm-file planet.osm --all &

  • 更に、国コードや国名を追加。
$ php ./utils/specialphrases.php --countries > ./data/specialphrases_countries.sql
$ psql -d nominatim -f ./data/specialphrases_countries.sql

  • トラブルシューティング
    • 以下のエラーが表示された:
ERROR:  could not load library "/usr/local/pgsql/lib/rtpostgis-2.1.so": libgdal.so.1: cannot open shared object file: No such file or directory

      • pgsql の lib 内の「rtpostgis-2.1.so」が「libgdal.so.1」を見えない。と言っている。
      • libgdal.so.1 がある「/usr/local/lib」へのパスを追加しても解決せず。
      • 最終的に、libgdal.so.1 へのシンボリックリンクを/usr/local/pgsql/lib に置くことで解決。
# cd /usr/local/pgsql/lib
# ln -s /usr/local/lib/libgdal.so.1 libgdal.so.1
website の設定
  • Wiki のコマンドの通り
( nominatim ユーザ )
$ php ./utils/setup.php --create-website /var/www/html/nominatim

使用

逆ジオコーディングができること確認

  • Nominatim Wiki のサンプル
$ curl "http://localhost/nominatim/reverse.php?format=xml&lat=52.5487429714954&lon=-1.81602098644987&zoom=18&addressdetails=1"

  • 結果
<?xml version="1.0" encoding="UTF-8" ?>
<reversegeocode
    timestamp="Thu, 12 Jun 14 11:49:52 +0900"
    attribution="Data c OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright"
    querystring="format=xml&amp;lat=52.5487429714954&amp;lon=-1.81602098644987&amp;zoom=18&amp;addressdetails=1">

    <result
        place_id="127319075"
        osm_type="way"
        osm_id="218846952"
        ref="Pilkington Avenue"
        lat="52.5505325"
        lon="-1.8195855">

        Pilkington Avenue, Castle Vale, Birmingham, Warwickshire, West Midlands, England, B72, United Kingdom

    </result>

    <addressparts>
        <road>Pilkington Avenue</road>
        <suburb>Castle Vale</suburb>
        <city>Birmingham</city>
        <county>Warwickshire</county>
        <state_district>West Midlands</state_district>
        <state>England</state>
        <postcode>B72</postcode>
        <country>United Kingdom</country>
        <country_code>gb</country_code>
    </addressparts>
</reversegeocode>

  • 渋谷・桜ヶ丘
$ curl "http://localhost/nominatim/reverse.php?format=xml&lat=35.655845&lon=139.700567&zoom=18&addressdetails=1"

  • 結果
<?xml version="1.0" encoding="UTF-8" ?>
<reversegeocode
    timestamp="Thu, 12 Jun 14 13:36:33 +0900"
    attribution="Data c OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright"
    querystring="format=xml&lat=35.655845&lon=139.700567&zoom=18&addressdetails=1">

    <result
        place_id="7388564"
        osm_type="node"
        osm_id="742561055"
        ref="ジョナサン"
        lat="35.6558284"
        lon="139.7005138">

        ジョナサン, 玉川通り, 宇田川町, 渋谷区, Kita-Adachi, 150-0031, 日本

    </result>

    <addressparts>
        <restaurant>ジョナサン</restaurant>
        <road>玉川通り</road>
        <suburb>宇田川町</suburb>
        <city>渋谷区</city>
        <county>Kita-Adachi</county>
        <postcode>150-0031</postcode>
        <country>日本</country>
        <country_code>jp</country_code>
    </addressparts>
</reversegeocode>

    • ↑ 若干間違っている…。が、フリーのデータだから仕方ないか。
    • フリーだからこそ、自分で修正したりとかですね。。