序章

OpenStreetMap プロジェクトは、何千人ものユーザーによって収集および集約された生の地図データで構成されています。 しかし、そのオープンアクセスポリシーは、商用マッピングサービスによって通常提供される機能の多くをまとめてカバーする多くの担保プロジェクトを引き起こしました。

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

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

  • 与えられた座標のペアに最も近い通りは何ですか?
  • ポイントAからポイントBに移動するための最良の方法は何ですか?
  • A地点からB地点まで車で、または徒歩で行くのにどれくらい時間がかかりますか?

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

前提条件

このチュートリアルに従うには、次のものが必要です。

  • Ubuntu14.04ドロップレット。
  • このチュートリアルに従って作成できるsudo非rootユーザー。 このチュートリアルでは、sudoのroot以外のユーザー名が osrm.
  • Ubuntu 14.04 でスワップを追加する方法で説明されているように、推奨される4ギガバイトのスワップ。

ソースからのOSRMの構築や前処理フェーズなど、このチュートリアルの一部の操作は、メモリを大量に消費します。 メモリの少ないドロップレットでは、これらの操作が失敗する可能性があるため、スワップファイルを割り当てる必要があります。

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のエクスポートページをポイントし、関心のある領域を拡大して、エクスポートをクリックすることです。 (ネイティブエクスポートが機能しない場合は、他のソースの1つを使用する必要がある場合があります。OverpassAPIが適切な選択です。)これにより、マップに含める領域を細かく選択し、一般に削減することができます。前処理時間。

ただし、OSRM Webサイトから取得できるエクスポートのサイズには制限があるため、既製のエクスポートをダウンロードすることをお勧めします。 GeofabrikMapzenなどの多くのサービスは、ほとんどのユースケースに適した国や選択された大都市圏の更新された既製の地図のエクスポートを提供します。

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

wget -O map.osm url_of_the_export

これで、という名前のファイルが作成されます。 map.osm 作業ディレクトリにあります。

ステップ3—依存関係をインストールする

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

OSRMはソースからコンパイルする必要があるため、最初に必要なビルド機構をインストールする必要があります。 幸い、Ubuntuには便利なメタパッケージが付属しています。 build-essential 必要なコンパイラツールチェーンが含まれています。 また、 git OSRMソースコードを取得し、 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で走行し、砂利道では平均速度は時速50kmであると定義されています。 STXXLは、大きなファイルを操作するために使用されるメモリとしてディスクスペースを使用するC++の標準ライブラリのバージョンです。 LibXMLおよびProtocolバッファーは、OSMファイルのロード、書き込み、および操作に使用され、BoostおよびTBBは、並列化およびデータ構造の表現に使用されます。

ステップ4—OSRMをコンパイルします

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

選択したOSRMのビルドシステムがCMakeであるという事実のおかげで、依存関係がインストールされると、ビルドファイルの生成とOSRMのコンパイルがかなり簡単になります。

まず、プロジェクトのページからソースコードのクローンを作成します。 プロジェクトはいくつかのリポジトリで構成され、さまざまな機能を処理します。 バックエンド(サーバー側の部分)に関心があります。

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

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

cd osrm-backend

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

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

mkdir build

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

cd build

最後に、ビルドファイルを次のように生成します cmake. このコマンドは、いくつかのディレクトリとMakefileを生成します。 build ディレクトリツリー。

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は STXXL というライブラリを使用して、ハードディスク上の内部操作をマップします。 STXXLは、と呼ばれる構成ファイルに依存しています .stxxl、ソフトウェアを実行しているのと同じディレクトリにあり、STXXLデータ構造専用のスペースを決定します。 ドロップレットの容量と処理するマップのサイズに応じて、適切なものを作成する必要があります .stxxl 構成ファイル。操作に十分なメモリを割り当てます。

作成して開く .stxxl 編集用。

nano .stxxl

ファイルには、次の形式の1行が含まれている必要があります disk=path,capacity,access、 どこ path 割り当てファイルが配置されるパスです。 capacity はファイルの容量であり、 access ファイルアクセスの実装です。

これが例です .stxxl ファイル。 これを貼り付けることができます .stxxl、ただし、使用しているマップとドロップレットのサイズに基づいてファイルのサイズを変更したい場合があります。 詳細オプションについては、ドキュメントを参照してください。

disk=/tmp/stxxl,10G,syscall

保存して閉じます .stxxl.

ステップ6—マップを抽出する

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

前処理の最初のステップは、マップの抽出です。 The 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://your_server_ip:5000、これでWebサービスの動作を確認できるはずです。 次のようなエラーメッセージが表示されます {"status_message":"Query string malformed close to position 0","status":400} 正しいクエリ形式を使用していないためです。

テストとして、マップ境界内の緯度と経度の座標のセットを選択し、次のURLに移動して、 latitudelongitude 選択した座標で。

http://your_server_ip:5000/nearest?loc=latitude,longitude

次のようなJSON出力が表示されます。

{
    "name": "street_name",
    "mapped_coordinate": [
        latitude,
        longitude
    ],
    "status":0
}

これの代わりにエラーメッセージが表示される場合は、マップ境界の外側にある座標のセットを選択したか、クエリ構文が間違っている可能性があります。 その他の利用可能なクエリについては、サーバーAPIを確認してください。

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

ステップ9—Nginxを設定する

このステップでは、Nginxをセットアップして使用します osrm-routed.

これで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.

したがって、最初に、OSRMの構成フレームをに追加します。 sites-available.

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

構成ファイルは upstream これは、Webサービスと、ポート80でリッスンし、クエリのサブセットをアップストリームにリダイレクトするサーバーを指します。

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

upstream osrm {
    server 0.0.0.0:5000;
}

server {
    listen 80;
    server_name your_server_ip;

    location /example_path {
        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

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

さらにアップストリームと場所を追加し、実行することによって osrm-routed でポートを指定することによって -p また --port Webサービスのより多くのインスタンスを実行し、それらを異なるパスにバインドできます。 このチュートリアルではこれについて詳しくは説明しませんが、詳細についてはOSRMバックエンドのドキュメントを確認してください。

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

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

Nginxは、Webサービスのゲートウェイとして機能するようになりました。 ただし、手動で開始したため、システムからログアウトすると実行が停止します。 再起動後もWebサービスを存続させ、一般に、起こりうる障害からWebサービスを回復させるために、スーパーバイザーと呼ばれるツールを使用できます。

スーパーバイザーは、サービスを適切に実行し続けることを主に処理するプロセス制御システムです。 設定はとても簡単です。 まず、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 コマンドの相対パスとして)。 この例では、次のポートを指定しました osrm-routed を使用して -p ポートを増やすことで複数のプログラムを追加できるようにします。

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

sudo service supervisor restart

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

sudo supervisorctl status

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

osrm          RUNNING    pid 12698, uptime 0:00:40

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

結論

このチュートリアルでは、OSRMバックエンドのインストールについて説明しますが、このページで詳細なドキュメントを入手できます。

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

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