
Nominatimジオコーダーを専用サーバーにインストールすることについての私の話をしたいと思います。 当初、このタスクには約5〜7時間かかると想定されていましたが、ここにはありませんでした。したがって、サイトが完全に動作するまでNominatimのサーバーへの展開について説明する記事を書くことにしました。 しかし、まず最初に。
はじめに
ジオコーダーを使用したサービスは多数ありますが、ここではそれらをすべてリストしません。このテーマに関するHabréの優れた記事があることに注意してください。
知らない人のために: ジオコーディングは、入力された住所で緯度と経度を見つけるプロセスです。
Nominatimを選択した理由は、サーバーにデプロイでき、リクエストの数に制限されないため、OSMカードの経験もあり、それを適用したいからです。
ドキュメント
すでに機能しているマップのあるサイトは、 OpenStreetMap Nominatimにあります。
そして、ここにサンプルクエリへのリンクがあります: Wiki nominatim
Nominatim Installationをインストールするためのリンクもあります。 しかし、このドキュメントは少し時代遅れです。この特定の記事にインストールするためには、タンバリンで少し踊る必要があります。 以下で説明するものはすべて、タンバリンの参加なしでのみ、このインストール記事を参照します。
また、docker container nominatim dockerもあります。 何らかの理由で、おそらく古いインストールパッケージが原因である可能性が高いため、このコンテナは私と一緒に起動しませんでした。
ステップ1:仮想マシンを作成する
このマシンは、2つのコア、7 GBのRAM、100 GBのSSDという特徴を持つMicrosoft Azure標準D2シリーズのクラウドから取得されました。 Nominatimがインストールされるのはこのマシン上です。 ウクライナの地図はそれほど大きくないので、100GBは実際には私のタスクに必要以上です。 必要なすべてのコンポーネントをインストールした後、70%は無料のままです。
ステップ2:必要なパッケージのインストール
sudo apt-get update sudo apt-get -y install wget sudo apt-get -y install build-essential automake sudo apt-get -y install libxml2-dev sudo apt-get -y install libgeos-dev sudo apt-get -y install libpq-dev sudo apt-get -y install libbz2-dev sudo apt-get -y install libtool libproj-dev sudo apt-get -y install libgeos++-dev sudo apt-get -y install gcc proj-bin libgeos-c1 git osmosis sudo apt-get -y install php5 php-pear php5-pgsql php5-json sudo apt-get -y install bc sudo apt-get -y install postgresql-9.4 postgresql-9.4-postgis-2.1 postgresql-contrib-9.4 postgresql-server-dev-9.4 sudo apt-get -y install libboost-chrono1.55-dev libboost-thread1.55-dev libboost-filesystem1.55-dev sudo apt-get -y install python-software-properties && add-apt-repository -y ppa:kakrueger/openstreetmap && apt-get update && apt-get --no-install-recommends install -y osm2pgsql
ステップ3:セットアップ
sudo -i pear install DB sudo -u username sudo mkdir -p /app/nominatim sudo -i useradd -m -p password1234 -d /app/nominatim nominatim chown nominatim: /app/nominatim cd /app/nominatim wget http://www.nominatim.org/release/Nominatim-2.4.0.tar.bz2 tar xvf Nominatim-2.4.0.tar.bz2 rm Nominatim-2.4.0.tar.bz2 mv Nominatim-2.4.0/* . rm Nominatim-2.4.0/ sudo -u nominatim ./autogen.sh ./configure && make
これらのコマンド行を理解するのは難しくないと思います。 アクセス権の取得でエラーが発生した場合は、すべてのユーザーとグループに読み取りおよび実行アクセス権を設定しますchmod -R 755 / app makeコマンドの実行時に問題が発生する場合があることに注意してください。 この問題がある場合は、 sudo make cleanコマンドを使用してから./configure && makeを使用します。
ステップ4:PostgreSQL
当初、postgresは戦闘サーバー用に構成されていなかったため、ここで構成する必要があるのは、nominatimドキュメンテーションwikiからのヒントです。
Ubuntuの場所/etc/postgresql/9.x/main/postgresql.conf
CentOSの場所/var/lib/pgsql/data/postgresql.conf
shared_buffers(4GB)
maintenance_work_mem(10GB)
work_mem(50MB)
effective_cache_size(24GB)
synchronous_commit = off
checkpoint_segments = 100
checkpoint_timeout = 10分
checkpoint_completion_target = 0.9
一部のパラメーターの後ろにある括弧内の数字は、32GB RAMマシンでは正常に機能するようです
sudo passwd postgres sudo usermod -a -G sudo postgres service postgresql start && pg_dropcluster --stop 9.4 main service postgresql start && pg_createcluster --start -e UTF-8 9.4 main service postgresql start && sudo -u postgres psql postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='nominatim'" | grep -q 1 || sudo -u postgres createuser -s nominatim && sudo -u postgres psql postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='www-data'" | grep -q 1 || sudo -u postgres createuser -SDR www-data && sudo -u postgres psql postgres -c "DROP DATABASE IF EXISTS nominatim"
これはインストールの最も簡単な部分です。 それから、ハードコアが始まります。これは、それ以降のアクションが常に正しく実行されるとは限らないためです。 そして、残念ながら、このような誤った完了後、新しい仮想マシンで新たにアクションを実行しなければならない場合があります。
ステップ5:osmカードをダウンロードしてインストールする
最初に、サイトからカード自体を* .pbf形式でダウンロードする必要があります: OpenStreetMap Data Extracts 。 例として、ウクライナの地図をダウンロードし、data.pbfに名前を変更します。
wget --output-document=data.pbf http://download.geofabrik.de/europe/ukraine-latest.osm.pbf chown nominatim: data.pbf touch local.php /app/nominatim/settings/local.php nano /app/nominatim/settings/local.php
最後のコマンドは、nominatimをインストールするための構成ファイルを開きます。 local.phpファイルに、以下に説明するコードを入力する必要があります。
<?php // Paths @define('CONST_Postgresql_Version', '9.4'); @define('CONST_Postgis_Version', '2.1'); // Website settings @define('CONST_Website_BaseURL', 'http://geocoder.cloudapp.net/'); ?>
BaseURLとして、nominatimを起動するサイトのアドレスを入力する必要があります。
次に、nominatimインストールコマンドを実行します。 この操作には非常に長い時間がかかります。たとえば、ウクライナの地図では、インストールは約7時間続きました。 私はすべてのコマンドをsshで実行し、インターネットのさまざまな切断の影響を受けるため、インストールコマンドは画面で実行されます 。
screen service postgresql start && sudo -u nominatim -- ./utils/setup.php --osm-file /app/nominatim/data.pbf --all --threads 2 2>&1; sudo -u nominatim -- ./utils/setup.php --index --create-search-indices
画面を終了するには、Ctrl + A、Ctrl + Dの組み合わせを入力する必要があります。 screen -rコマンドは画面に戻ります。
さっそくサイトを立ち上げてください:
./utils/setup.php --create-website /var/www/html rm /var/www/html/index.html /etc/init.d/apache2 restart
他の記事のHabréで簡単に読むことができるので、Apacheを設定したりnginxを使用したりすることなく管理しました。 はい、そしてサイトをセットアップすることなく素晴らしい作品です。
サイトをテストする
その結果、画面に次のようなものが表示されるはずです。

リクエストを作成して、APIの動作を確認しましょう。
http://geocoder.cloudapp.net/?format=json&addressdetails=1&q=Odessa&format=json&limit=1
応答:
[{"place_id":"1145869","licence":"Data © OpenStreetMap contributors, ODbL 1.0. http:\/\/www.openstreetmap.org\/copyright","osm_type":"relation","osm_id":"1413934","boundingbox":["46.342707","46.6291187","30.6114013","30.8313753"],"lat":"46.4858883","lon":"30.68365101101","display_name":", , ","class":"place","type":"city","importance":0.45,"icon":"http:\/\/geocoder.cloudapp.net\/images\/mapicons\/poi_place_city.p.20.png","address":{"city":"","county":"","state":" ","country":"","country_code":"ua"}}]
結論
最後に、Earthマップをダウンロードするには、ダウンロードに1週間待たない場合、D2シリーズよりも強力なサーバーが必要です。 この問題は、サーバーを一時的にD14シリーズ(16コア、112 GBのメモリ)に拡張することでも解決できます。 しかし、検索クエリを完了するのにかかる時間は非常に優れています。平均して、ウクライナでの検索にはわずか300ミリ秒かかります。
この記事が、他の開発者がNominatimの展開に費やす時間を短縮し、必要な場合に役立つことを願っています。 たぶんあなたはそれを準備して使用するべきですか?
habrosocietyの誰かがNominatimなどの作業用のDockerコンテナーを必要としている場合、または他のアイデアを書いている場合、私はいつも話ができてうれしい。