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 の全データが詰め込まれているもの。
- Planet.osmのWikiページ
- 圧縮して 29GB、展開すると 400GB と書いてある。
- 上記 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 ページにも書かれていたりする。)
- postgresql.conf と pg_hba.conf => localhost から接続できる設定。
- 備考
- DBのサイズは超巨大になるので、十分な容量がある所で initdb しておく必要あり。
PostGIS
- PostgreSQL で空間データを扱うことができる。
- 2.1.3 をsourceから持ってきてDownload & Install。
# cd ./postgis-2.1.3/ # ./configure # make # make comments # make install # make comments-install
- トラブルシューティング
- ./configure 時に「gdal のバージョンが低い (1.9以上)」と怒られた。
- gdal 1.9 を取ってきて Install。http://trac.osgeo.org/gdal/wiki/DownloadSource。
- geos-devel が無いと怒られた。
- 「# yum install geos-devel」
- proj4 が無いと怒られた。
- 「# wget ftp://ftp.remotesensing.org/proj/proj-4.6.0.tar.gz」してきて Install。
- protobuf や lua についての warning が出ているので、最新版を入れて解消。
- ./configure 時に「gdal のバージョンが低い (1.9以上)」と怒られた。
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
- インストールの基本は Wiki に書いてある。
事前準備
- 今回は「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&lat=52.5487429714954&lon=-1.81602098644987&zoom=18&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>
-
- ↑ 若干間違っている…。が、フリーのデータだから仕方ないか。
- フリーだからこそ、自分で修正したりとかですね。。