OSRM(オープンソースルーティングマシン) は、OpenStreetMap(OSM)道路ネットワーク用の超高速ルーティングエンジンです。以前のチュートリアルでは、自己ホスト型のOpenStreetMapタイルサーバーを設定するプロセスと、Nominatimを使用して住所検索機能をマップに追加する方法について説明しました。このチュートリアルでは、車のルーティングを提供するOSRMを使用してOpenStreetMapにナビゲーション機能を追加する方法を紹介します。 、自転車のルーティング 、およびウォークルーティング 。
このチュートリアルはUbuntu18.04でも機能します。
前提条件
このチュートリアルに従うには、OSMタイルサーバーが稼働している必要があります。そうでない場合は、以下のチュートリアルに従って、独自のOSMタイルサーバーをセットアップしてください。
- Ubuntu20.04でOpenStreetMapタイルサーバーを設定する方法
また、住所検索のためにNominatimなどのジオコーディングサービスにアクセスできる必要があります。
- Ubuntu20.04でOSMNominatimGeocodingServerをセットアップする
要件が満たされたら、以下の手順に従ってOSRMサーバーをセットアップします。
ステップ1:ソースからOSRMを構築する
依存関係パッケージをインストールします。
sudo apt update sudo apt install build-essential git cmake pkg-config doxygen libboost-all-dev libtbb-dev lua5.2 liblua5.2-dev libluabind-dev libstxxl-dev libstxxl1v5 libxml2 libxml2-dev libosmpbf-dev libbz2-dev libzip-dev libprotobuf-dev
osrm
を作成します ユーザー。 (このユーザーのパスワードを作成する必要はありません。)
sudo useradd -d /srv/osrm -s /bin/bash -m osrm
自分のユーザーアカウントに権限を付与します。
sudo apt install acl sudo setfacl -R -m u:username:rwx /srv/osrm/
/srv/osrm/
に変更します ディレクトリ。
cd /srv/osrm/
GithubリポジトリからOSRMソースコードをダウンロードします。
git clone https://github.com/Project-OSRM/osrm-backend.git
build
を作成します ディレクトリ。
mkdir build
このディレクトリに移動し、ビルド環境を構成します。
cd build cmake /srv/osrm/osrm-backend/
ソースコードをコンパイルします。
make
バイナリをインストールします。
sudo make install
次のバイナリがインストールされます。
- / usr / local / bin / osrm-extract:
- / usr / local / bin / osrm-partition:
- / usr / local / bin / osrm-customize:
- / usr / local / bin / osrm-contract:
- / usr / local / bin / osrm-datastore:
- / usr / local / bin / osrm-routed:
ステップ2:GNUScreenをインストールする
次のステップでは、OpenStreetMapから道路ネットワークを抽出する必要があります。これには長い時間がかかる可能性があります。コンピュータがインターネットから切断されている可能性があるため、GNUScreenユーティリティを使用してセッションを維持することをお勧めします。 Ubuntu 20.04サーバーに画面をインストールします:
sudo apt install screen
次に、画面を開始します:
screen
最初の起動時に、紹介テキストが表示されます。Enter
を押すだけです。 最後まで。その後、通常どおりコマンドを実行できるようになります。
ステップ3:OSRMルーティングデータを生成する
次に、OpenStreetMapデータをダウンロードして、ルーティングに使用できるようにする必要があります。次のコマンドを実行して、惑星全体(56G)の地図データをPBF(ProtoBufBinary)形式でダウンロードします。
wget -c http://planet.openstreetmap.org/pbf/planet-latest.osm.pbf -P /srv/osrm/osrm-backend
個々の国/州/県/市の地図が必要な場合は、http://download.geofabrik.deにアクセスしてください。たとえば、次のコマンドを使用して、英国(1.2G)の地図データをダウンロードします。
wget -c http://download.geofabrik.de/europe/great-britain-latest.osm.pbf -P /srv/osrm/osrm-backend
BBBike.orgは、世界中の200を超える都市と地域の抜粋をさまざまな形式で提供しています。
/srv/osrm/osrm-backend/
にいることを確認してください ディレクトリ。
cd /srv/osrm/osrm-backend/
OpenStreetMapデータからグラフを抽出します。
osrm-extract britain-and-ireland-latest.osm.pbf --threads=10
デフォルトでは、car.lua
を使用します プロファイル。
これで、サーバー上で他のことを行う必要がなくなる可能性があります。 Screenを使用しているので、 Ctrl + Aを押すことができます 、それらのキーを放してから、 D を押します 現在の画面セッションから切り離すためのキー。以下のようなメッセージが表示されます。
[detached from 32113.pts-1.focal]
これは、前の画面セッションIDが32113であることを示しています。SSHセッションからログアウトしたり、コンピューターをシャットダウンしたりすることもできます。心配しないでください、osrm-extract
プロセスはまだ実行中です。戻って進行状況を確認する必要がある場合は、サーバーにSSHで接続し、次のコマンドを実行して前の画面セッションIDを取得します。
screen -ls
サンプル出力:
There is a screen on: 32113.pts-1.focal (05/19/2020 03:45:29 PM) (Detached) 1 Socket in /run/screen/S-linuxbabe.
その後、前の画面セッションに再度接続できます。
screen -r 32113
このプロセスはメモリを大量に消費します。 (サーバーで7 GBのRAMを使用します。)完了すると、同じファイル名で.osrm
のファイルが作成されます。 拡大。次のコマンドを実行して、このグラフをセルに再帰的に分割します
osrm-partition britain-and-ireland-latest.osrm
すべてのセルのルーティングの重みを計算して、セルをカスタマイズします。
osrm-customize britain-and-ireland-latest.osrm
これで、ルーティングエンジンを起動できます。
osrm-routed --algorithm=MLD britain-and-ireland-latest.osrm
ご覧のとおり、TCPポート5000でリッスンします。
ステップ4:systemdサービスを作成する
osrm-routed --algorithm=MLD britain-and-ireland-latest.osrm
を使用して、OSRMルーティングエンジンを手動で実行できます。 、ただし、osrm-routedをsystemdサービスとしてバックグラウンドで実行する方が便利です。 Ctrl+C
を押します 次のコマンドを使用して、現在のosrm-routedプロセスを停止し、osrm-routedのsystemdサービスユニットファイルを作成します。
sudo nano /etc/systemd/system/osrm-routed.service
次の行をファイルに入れます。
[Unit] Description=Open Source Routing Machine Wants=network-online.target After=network.target network-online.target [Service] ExecStart=/usr/local/bin/osrm-routed --algorithm=MLD /srv/osrm/osrm-backend/britain-and-ireland-latest.osrm User=osrm Group=osrm Restart=always RestartSec=5s [Install] WantedBy=multi-user.target
ファイルを保存して閉じます。 /srv/osrm/osrm-backend/
の所有権を変更します ディレクトリ。
sudo chown osrm:osrm /srv/osrm/osrm-backend/ -R
これで、osrm-routed
を起動して有効にできます。 systemdサービス。
sudo systemctl start osrm-routed sudo systemctl enable osrm-routed
ステータスを確認してください。
systemctl status osrm-routed
osrm-routed
の場合 サービスがアクティブではない(実行中)場合は、次のコマンドを実行して何が問題なのかを確認できます。
sudo journalctl -eu osrm-routed
ステップ5:ApacheWebサーバーを構成する
ApacheWebサーバーをosrm-routed
のリバースプロキシとして構成できます。 ドメイン名を使用してルーティングサービスにアクセスし、HTTPS暗号化を有効にすることもできます。
ApacheWebサーバーをインストールします。
sudo apt install apache2
Apacheをリバースプロキシとして使用するには、proxy
を有効にする必要があります 、proxy_http
およびrewrite
モジュール。
sudo a2enmod proxy proxy_http rewrite
次に、OSRMの仮想ホストファイルを作成します。
sudo nano /etc/apache2/sites-available/osrm.conf
次のテキストをファイルに追加します。 osrm.your-domain.com
を置き換えます 実際のドメイン名を使用して、DNSAレコードを作成することを忘れないでください。
<VirtualHost *:80> ServerName osrm.your-domain.com ProxyPass / http://127.0.0.1:5000/ ProxyPassReverse / http://127.0.0.1:5000/ </VirtualHost>
ファイルを保存して閉じます。次に、この仮想ホストを有効にします。
sudo a2ensite osrm.conf
変更を有効にするためにApacheをリロードします。
sudo systemctl reload apache2
これで、ドメイン名(osrm.your-domain.com
)を入力して、OSRMにリモートアクセスできます。 )ブラウザのアドレスバーにあります。
ステップ6:HTTPSを有効にする
Let’s Encryptから発行された無料のTLS証明書をインストールすることで、HTTPSを有効にできます。 OSMタイルサーバーのセットアップチュートリアルでは、SnapストアからLet’s Encryptクライアント(certbot)をすでにインストールしています。したがって、TLS証明書を取得してインストールするには、次のコマンドを実行する必要があります。
sudo /snap/bin/certbot --apache --agree-tos --redirect --hsts --staple-ocsp --email [email protected] -d osrm.your-domain.com
場所:
-
--apache
:Apacheプラグインを使用してください。 -
--agree-tos
:利用規約に同意します。 --redirect
:301リダイレクトでHTTPSを強制します。-
--hsts
:すべてのHTTP応答にStrict-Transport-Securityヘッダーを追加します。ドメインに常にTLSを使用するようにブラウザを強制します。 SSL/TLSストリッピングから防御します。 -
--staple-ocsp
:OCSPステープリングを有効にします。有効なOCSP応答は、TLS中にサーバーが提供する証明書にホチキス止めされます。
これで、証明書が取得され、自動的にインストールされます。また、安全なHTTPS接続を介してWebminWebインターフェイスにアクセスできるようになります。
ステップ7:OSRMをSlippyMapと統合する
滑りやすい地図はLeafletJavaScriptライブラリを使用して表示され、滑りやすい地図にNominatimジオコーディングサービスが追加されていると思います。
OSRMを滑りやすい地図と統合するために、LeafletRoutingMachineと呼ばれるプラグインを使用できます。まず、LeafletルーティングマシンのJavaScriptファイルとCSSファイルを滑りやすい地図に含めます。メインのLeafletJavaScriptとLeafletControlGeocoderJavaScriptの後に配置する必要があることに注意してください。
<html> <head> .... .... <link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/leaflet-routing-machine.css" /> <script src="https://unpkg.com/[email protected]/dist/leaflet-routing-machine.js"></script> </head> <body> .... .... </body> </html>
次に、次の行を<script>...</script>
に追加します HTML本文のスニペット。
L.Routing.control({ serviceUrl: 'https://osrm.your-domain.com/route/v1', geocoder: L.Control.Geocoder.nominatim({serviceUrl:'https://tile.your-domain.com/nominatim/'}), routeWhileDragging: true }).addTo(map);
このように:
<html> <head> .... .... <link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/leaflet-routing-machine.css" /> <script src="https://unpkg.com/[email protected]/dist/leaflet-routing-machine.js"></script> </head> <body> <div id="map"></div> <script> .... .... L.Routing.control({ serviceUrl: 'https://osrm.your-domain.com/route/v1', geocoder: L.Control.Geocoder.nominatim({serviceUrl:'https://tile.your-domain.com/nominatim/'}), routeWhileDragging: true }).addTo(map); </script> </body> </html>
ファイルを保存して閉じます。次に、ウェブブラウザで地図を再読み込みすると、右上隅に開始アドレスと宛先アドレスを入力できるコントロールパネルが表示されます。
地図上でウェイポイントをドラッグすると、OSRMが自動的にルートを再計算します。