前書き

http://www.openstreetmap.org%5D [OpenStreetMap]プロジェクトは、数千人のユーザーによって収集および集約された生の地図データで構成されています。 しかし、そのオープンアクセスポリシーにより、商用マッピングサービスで通常提供される機能の多くをまとめてカバーする多数の担保プロジェクトが発生しました。

OpenStreetMapは無料(ビールでも音声でも)のソフトウェアであるため、商用ソリューションよりもOpenStreetMapベースのソフトウェアを使用することの最も明白な利点は経済的な利便性です。 欠点は、機能するWebサービスをセットアップするために少し構成が必要なことです。

このチュートリアルでは、次のような質問に答えることができるWebサービスの構成と保守について説明します。

  • 座標のペアに最も近い通りは何ですか?

  • ポイントAからポイントBに到達する最良の方法は何ですか?

  • 車で、または徒歩でポイントAからポイントBに到達するのにどれくらいかかりますか

これを可能にするソフトウェアは、http://project-osrm.org [Open Source Routing Machine(OSRM)]と呼ばれるオープンソースプロジェクトで、OpenStreetMapデータに基づいています。 WebページにOpenStreetMapsを埋め込む機能は、http://openlayers.org [OpenLayers]などのAPIによってすぐに使用できるようになっています。

前提条件

このチュートリアルを実行するには、次のものが必要です。

ソースからのOSRMの構築や前処理段階など、このチュートリアルの操作の一部はメモリを集中的に使用します。 メモリが少ないDropletでは、これらの操作が失敗する場合があります。そのため、スワップファイルを割り当てる必要があります。

Webサービスは通常、実行中に追加のスワップを必要としないため、セットアップの完了後にこのスワップファイルを削除できます。 ただし、大きなマップを提供する場合、特に低メモリドロップレットでは、実際には小さなスワップファイルが必要になる場合があります。 その場合は、上記のチュートリアルの指示に従って、スワップファイルを永続化します。

ステップ1-更新とセキュリティ

この手順では、サーバーの更新を構成します。

サーバーを常に最新の状態に保ち、長期にわたって安全に保つことが重要です。 したがって、最初に次のコマンドを実行して、システム内のすべてのパッケージをアップグレードします。

sudo apt-get update
sudo apt-get upgrade

次に、Ubuntuの無人セキュリティアップグレードを有効にします。 これを行うには、まず必要なパッケージをインストールする必要があります。

sudo apt-get install unattended-upgrades

次に、ファイル `+ / etc / apt / apt.conf.d / 10periodic `を編集して自動アップグレードを有効にします。 これはシステム全体の設定ファイルであるため、「 sudo +」を使用する必要があります。

sudo nano /etc/apt/apt.conf.d/10periodic

ファイルの最後に次の行を追加し、保存して閉じます。

APT::Periodic::Unattended-Upgrade "1";

ステップ2-マップエクスポートのダウンロード

このステップでは、マップのエクスポートを選択してダウンロードします。

すべてを整理整頓するために、コードのビルド、マップの処理などを行う専用のディレクトリを作成することをお勧めします。

mkdir osrm

新しいディレクトリに移動します。

cd osrm

私たちのWebサービスは、OpenStreetMapからのマップエクスポートに基づいています。 マップのエクスポートを取得するには、いくつかの方法があります。

最初のオプションは、ブラウザでOpenStreetMapのhttp://www.openstreetmap.org/export [エクスポートページ]にアクセスし、関心のある領域を拡大して、[エクスポート]をクリックすることです。 (ネイティブエクスポートが機能しない場合は、他のソースのいずれかを使用する必要がある場合があります。OverpassAPIが適切な選択です。)これにより、マップに含めるエリアを細かく選択し、一般的に、前処理時間。

ただし、OSRM Webサイトから取得できるエクスポートのサイズには制限があるため、既製のエクスポートをダウンロードすることをお勧めします。 http://download.geofabrik.de [Geofabrik]やhttps://mapzen.com/metro-extracts[Mapzen]などの多くのサービスは、国および選択した大都市圏の更新さ​​れた既製の地図エクスポートを提供します。ほとんどのユースケースに適しています。

どちらの方法を使用する場合でも、エクスポートのURLをコピーして、ドロップレットにダウンロードします。

wget -O map.osm

これで、作業ディレクトリに「+ map.osm +」という名前のファイルができました。

ステップ3-依存関係のインストール

このステップでは、OSRMの依存関係をインストールします。

OSRMはソースからコンパイルする必要があるため、最初に必要なビルドマシンをインストールする必要があります。 幸いなことに、Ubuntuには、必要なコンパイラツールチェーンを含む「+ build-essential 」という便利なメタパッケージが付属しています。 さらに、OSRMソースコードを取得するには ` git `、ビルドシステムを生成するには ` CMake +`が必要です。 次のコマンドは、これら3つすべてをインストールします。

sudo apt-get install build-essential git cmake

OSRMはかなり複雑なソフトウェアであり、多くのライブラリにも依存しています。 次のコマンドを使用して、必要な依存関係をインストールできます。

sudo apt-get install libboost-all-dev libtbb-dev liblua5.2-dev libluabind-dev libstxxl-dev libxml2 libxml2-dev libosmpbf-dev libbz2-dev libprotobuf-dev

これらの依存関係はさまざまな目的に使用されます。 Luaは、カスタム速度プロファイルスクリプトを定義するために使用されます。 制限のない二次道路では車は平均80 km / hで走行し、砂利道では平均速度は50 km / hであると定義しています。 STXXLはC ++の標準ライブラリのバージョンであり、メモリとしてディスクスペースを使用し、大きなファイルを操作するために使用されます。 LibXMLとプロトコルバッファーは、OSMファイルの読み込み、書き込み、操作に使用され、BoostとTBBは、並列化とデータ構造の表現に使用されます。

ステップ4-OSRMのコンパイル

このステップでは、OSRMのソースコードを取得してコンパイルします。

OSRMの最適なビルドシステムはCMakeであるため、依存関係をインストールすると、ビルドファイルの生成とOSRMのコンパイルが非常に簡単になります。

まず、プロジェクトのhttps://github.com/Project-OSRM/osrm-backend[page]からソースコードを複製します。 このプロジェクトは、さまざまな機能を処理する複数のリポジトリで構成されています。 バックエンド(サーバー側の部分)に関心があります。

git clone https://github.com/Project-OSRM/osrm-backend.git

次に、コードディレクトリに移動します。

cd osrm-backend

次のステップは、CMakeを使用してビルドファイルを生成することです。 一時的なビルドファイルでソースディレクトリを汚染しないように、ソースコードルートの専用の `+ build +`ディレクトリでOSRMをビルドすることをお勧めします。

ビルドディレクトリを作成します。

mkdir build

ビルドディレクトリに移動します。

cd build

最後に、 `+ cmake `でビルドファイルを生成します。 このコマンドは、 ` build +`ディレクトリツリーに多数のディレクトリとMakefileを生成します。

cmake ..

ここでエラーが発生した場合は、前提条件の指示に従ってスワップが有効になっていることを確認してください。

次に、OSRMをコンパイルしてインストールします。

sudo make install

:これには5〜10分かかる場合があります。

ここでは、インストールターゲットが必要なものを含め、システムのバイナリパス内のいくつかの実行可能ファイルをコピーするため、「+ sudo +」でビルドする必要があります。 すなわち:

  • `+ osrm-extract +`は、マップファイルを開き、データに対して最初の前処理ステップを実行します。

  • `+ osrm-prepare `は、 ` osrm-extract +`の出力を処理し、指定されたLua速度プロファイルに従ってすべてのマップエッジの移動時間を計算します。

  • `+ osrm-routed +`は実際のWebサービスデーモンです。これにより、距離と場所を照会できます。

ステップ5-STXXLの構成

このステップでは、STXXLの構成ファイルを作成します。

Webサービスを実行する前に、マップのエクスポートを前処理する必要があります。 システムパスに必要なバイナリをインストールしたため、どこからでもこれを行うことができます。 このチュートリアルの目的のために、作成した `+ osrm +`ディレクトリのルートで前処理を実行します。

最初に、 `+ osrm +`ディレクトリに移動します。

cd ~/osrm

マップの前処理は、かなりのメモリを消費します。 このため、OSRMはhttp://stxxl.sourceforge.net/[STXXL]というライブラリを使用して、ハードディスク上の内部操作をマッピングします。 STXXLは、ソフトウェアを実行しているのと同じディレクトリに存在する「+ .stxxl 」という設定ファイルに依存して、STXXLデータ構造専用の領域を決定します。 Dropletの容量と処理するマップのサイズに応じて、適切な「 .stxxl +」設定ファイルを作成し、操作に十分なメモリを割り当てる必要があります。

編集のために `+ .stxxl +`を作成して開きます。

nano .stxxl

ファイルには、フォーマット「+ disk = ,, 」の1行が含まれている必要があります。「 path 」は割り当てファイルが配置されるパス、「 capacity 」はファイルの容量、「 access +」ファイルアクセスの実装です。

以下に、 `+ .stxxl `ファイルの例を示します。 これを「 .stxxl +」に貼り付けることができますが、使用しているマップとドロップレットのサイズに基づいてファイルのサイズを変更することもできます。 詳細オプションについては、http://stxxl.sourceforge.net/tags/master/install_config.html [ドキュメント]を参照してください。

disk=/tmp/stxxl,10G,syscall

`+ .stxxl +`を保存して閉じます。

ステップ6-マップの抽出

このステップでは、マップを抽出します。

前処理の最初のステップは、マップの抽出です。 `+ osrm-extract `コマンドは、引数としてマップエクスポートのパスを想定し、作業ディレクトリに ` profile.lua +`という名前の適切な速度プロファイルスクリプトが存在することを前提としています。 速度プロファイルは、使用可能なルートのどれを使用できるかを判断するために使用されます(たとえば、トラックの速度プロファイルは一部の道路を禁止する場合があります)。

OSRMバックエンド配布には、リポジトリの `+ profiles `ディレクトリの下にいくつかのデフォルトの速度プロファイルスクリプトが含まれています。 このチュートリアルでは、ほとんどのユースケースに適した ` car.lua +`プロファイルを使用します

速度プロファイルスクリプトは、プロファイルライブラリで定義されたいくつかのLua関数に依存する可能性があるため、次の2つのコマンドを実行して、同じディレクトリにシンボリックリンクを作成します。

ln -s osrm-backend/profiles/car.lua profile.lua
ln -s osrm-backend/profiles/lib

マップのエクスポートは「+ map.osm +」と呼ばれるため、次に実行します:

osrm-extract map.osm

このステップは、次のステップへの入力である `+ map.osrm +`を含む、前処理ディレクトリに一連のファイルを生成します。

ステップ7-移動時間の計算

このステップでは、マップの移動時間を計算します。

このステップは、「+ osrm-prepare +」コマンドによって実行されます。このコマンドは、速度プロファイルスクリプトを使用して、マップグラフの各エッジの移動時間を計算します。 これを行うには、次のコマンドを実行します。

osrm-prepare map.osrm

このステップでは、次のセクションで設定するWebサービスに必要な追加のファイルも作成します。

手順8-Webサービスの実行とテスト

このステップでは、OSRMを実行し、ブラウザー経由で動作することをテストします。

OSRMバックエンドには、最後のコマンド「+ osrm-routed +」が付属しています。このコマンドは、処理済みのマップを読み取り、WebサービスAPIを介してクエリを実行できます。 テストするには、次を実行します:

osrm-routed map.osrm

これで、ブラウザで「+ http://:5000+」を指定することで、Webサービスの動作を確認できるようになります。 正しいクエリ形式を使用していないため、 `+ {” status_message “:”クエリ文字列の位置が0に近い不正な形式 “、” status “:400} +`のようなエラーメッセージが表示されます。

テストとして、マップ境界内の緯度と経度の座標のセットを選択し、次のURLに移動して、「」と「」を選択した座標に置き換えます。

http://:5000/nearest?loc=,

次のようなJSON出力が表示されるはずです。

{
   "name": "",
   "mapped_coordinate": [
       ,

   ],
   "status":0
}

これの代わりにエラーメッセージが表示された場合は、マップの境界外の座標セットを選択しているか、クエリ構文が間違っている可能性があります。 利用可能なクエリについては、https://github.com/Project-OSRM/osrm-backend/wiki/Server-api [server API]をご覧ください。

これで、 `+ CTRL + C `を使用して ` osrm-routed +`を停止できます。

ステップ9-Nginxのセットアップ

このステップでは、 `+ osrm-routed +`で動作するようにNginxをセットアップします。

これで機能するWebサービスができましたが、ポートを指定してクエリを実行するのは面倒です。 さらに、異なるマップまたは異なる速度プロファイルで処理されたマップを提供することにした場合、ポートのコレクションを覚えておく必要はありません。

Nginxは高性能のWebサーバーであり、プロキシとしても機能し、Webサービスのゲートウェイとしても機能します。 `+ osrm-routed +`で動作するように設定するのはかなり簡単です。

まず、Nginxをインストールします。

sudo apt-get install nginx

次に、Webサービスの構成ファイルを追加します。 Nginxはサイト固有の設定ファイルに2つのディレクトリを使用します: + / etc / nginx / sites-available +(提供可能なすべてのサイト)および + / etc / nginx / sites-enabled +(提供されているすべてのサイト) )。 サイトを追加する標準的な方法は、設定ファイルを「+ sites-available 」に追加し、「 sites-enabled +」でシンボリックにリンクすることです。

そのため、最初にOSMの設定ファイルを `+ sites-available`に追加します。

sudo nano /etc/nginx/sites-available/osrm.conf

設定ファイルは、Webサービスとポート80でリッスンし、クエリのサブセットをアップストリームにリダイレクトするサーバーを指す「+ upstream +」を定義します。

以下の設定ファイルを `+ osrm.conf `に貼り付けます。 以下で強調表示されている2つの変数を指定する必要があります:サーバーIPとパス( ` http:/// +`のようにWebサービスへのアクセスに使用されます)。

upstream osrm {
   server 0.0.0.0:5000;
}

server {
   listen 80;
   server_name ;

   location  {
       proxy_pass http://osrm/;
       proxy_set_header Host $http_host;
   }
}

ファイルを保存したら、 `+ sites-enabled`ディレクトリに移動します。

cd /etc/nginx/sites-enabled

それから、 `+ osrm.conf +`ファイルをリンクできます。

sudo ln -s /etc/nginx/sites-available/osrm.conf

次に、構成を再読み込みします。

sudo service nginx reload

最後に、Nginxを再起動します。

sudo service nginx restart

ここで、 `+ osrm-routed +`を再実行します。

osrm-routed ~/osrm/map.osrm

ブラウザで `+ http:/// `を指定すると、Webサービスにアクセスできるはずです。 ポートを指定する必要がなくなったことに注意してください。 これで、 ` CTRL + C `を使用して ` osrm-routed +`を停止できます。

さらにアップストリームと場所を追加し、「-p +」または「-port 」でポートを指定して「 osrm-routed +」を実行することで、Webサービスのインスタンスをさらに実行し、異なるパスにバインドできます。 このチュートリアルではこれについて詳しく説明しませんが、詳細についてはhttps://github.com/Project-OSRM/osrm-backend/wiki/Server-api[OSRMバックエンドドキュメント]をご覧ください。

ステップ10-スーパーバイザーのインストールと構成

このステップでは、Nginxを実行し続けるようにスーパーバイザーをインストールおよび構成し、再起動を通じてWebサービスを利用できるようにします。

Nginxは、Webサービスのゲートウェイとして機能するようになりました。 ただし、手動で起動しているため、システムからログアウトすると実行が停止します。 Webサービスをリブート後も存続させ、一般的に、起こりうる障害から回復させるために、http://supervisord.org [Supervisor]というツールを使用できます。

スーパーバイザーは、サービスを適切に実行し続けることの大部分を処理するプロセス制御システムです。 設定はとても簡単です。 最初に、Supervisor自体をインストールします。

sudo apt-get install supervisor

次に、新しい構成ファイルを追加して、Supervisorが制御するサービスのプールにWebサービスを追加します。

sudo nano /etc/supervisor/conf.d/osrm.conf

構成ファイルには、監視するすべてのWebサービスのこのフォームの定義が含まれている必要があり、プログラム名はWebサービスごとに異なる必要があります。

以下の設定を `+ osrm.conf +`ファイルに貼り付け、保存して閉じます。

[program:osrm]
directory=/home/osrm/osrm
command=/usr/local/bin/osrm-routed -p 5000 map.osrm
user=osrm

この設定の内容は、ユーザー + osrm +`にコマンド `+ / usr / local / bin / osrm-routed -p 5000 map.osrm +`を実行したままにしておき、指定したディレクトリから実行する必要があることです。 `+ / home / osrm / osrm +(コマンドで相対パスとして `+ map.osrm `を指定する方法です)。 この例では、ポートを増やすことで複数のプログラムを追加できるように、「-p 」を使用して「 osrm-routed +」のポートを指定しました。

ファイルを保存して閉じたら、Supervisorを再起動します。

sudo service supervisor restart

その後、次を実行してWebサービスのステータスを確認できます。

sudo supervisorctl status

すべてがうまくいけば、これに似たものが見えるはずです

osrm          RUNNING    pid 12698, uptime 0:00:40

これは、Webサービスが実行されていることを意味します。 アップストリームはポート5000を指しているため、Nginxは指定されたパスでサービスを提供できます。

結論

このチュートリアルでは、OSRMバックエンドのインストールについて説明していますが、詳細なドキュメントはhttps://github.com/Project-OSRM/osrm-backend/wiki [このページ]で入手できます。

執筆時点では、OSRMバックエンドはまだベータ版であり、1つのクエリに含めることができる場所の数にハードコードされた制限があります(現在は100、タイムマトリックスAPIに影響します)。 そのような制限は無効にすることができますが、それを行うためには `+ osrm-routed +`のソースコードを修正する必要があります。

マップのサイズとドロップレットの容量に応じて、Webサービスを適切に動作させるために、より大きなスワップファイルを割り当てるか、 `+ .stxxl +`設定ファイルの容量を増やす必要があります。 セットアップに最適なものを確認するには、いくつかの構成をテストする必要がある場合があります。