如何在Ubuntu 20.04上安裝OSRM –開源路由機

OSRM(開源路由機) 是用於OpenStreetMap(OSM)道路網絡的超快速路由引擎。 在以前的教程中,我們介紹了設置自託管的OpenStreetMap切片服務器的過程以及如何使用Nominatim向地圖添加地址查找功能。 本教程將向您展示如何使用OSRM向OpenStreetMap添加導航功能,該功能可提供 汽車路線自行車路線, 和 步行路線

本教程還適用於Ubuntu 18.04。

先決條件

要遵循本教程,您應該已啟動並運行OSM切片服務器。 如果沒有,請按照以下教程設置您自己的OSM切片服務器。

  • 如何在Ubuntu 20.04上設置OpenStreetMap Tile Server

您還應該可以訪問諸如Nominatim之類的地理編碼服務以進行地址查找。

  • 在Ubuntu 20.04上設置OSM Nominatim地理編碼服務器

滿足要求後,請按照以下說明設置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

從源碼ubuntu 20.04構建OSRM

安裝二進制文件。

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路由:

步驟2:安裝GNU屏幕

下一步,我們需要從OpenStreetMap中提取道路網絡,這可能需要很長時間。 您的計算機可能已與Internet斷開連接,因此建議使用GNU Screen實用程序使會話保持活動狀態。 Ubuntu 20.04服務器上的“安裝”屏幕:

sudo apt install screen

然後開始屏幕:

screen

首次啟動時,您會看到介紹文字,只需按 Enter 結束。 然後,您將能夠照常運行命令。

步驟3:生成OSRM路由數據

現在我們需要下載OpenStreetMap數據並使其可用於路由。 運行以下命令以PBF(ProtoBufBinary)格式下載整個星球(56G)的地圖數據。

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 輪廓。

生成OSRM路由數據Ubuntu 20.04

現在您可能不需要在服務器上執行其他操作。 由於您正在使用屏幕,因此您可以按 Ctrl + A,釋放這些鍵,然後按 d 與當前的Screen會話分離的鍵。 您將看到如下消息。

[detached from 32113.pts-1.focal]

這告訴我以前的Screen會話ID為32113。您可以從SSH會話註銷,甚至關閉計算機。 別擔心, osrm-extract 進程仍在運行。 當您需要返回並檢查進度時,請通過SSH進入服務器並運行以下命令以獲取先前的Screen Session 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

此過程佔用大量內存。 (它在我的服務器上使用7GB的RAM。)完成操作後,將有一個文件名相同但文件名相同的文件。 .osrm 擴大。 運行以下命令以將此圖遞歸地劃分為單元格

osrm-partition britain-and-ireland-latest.osrm

osrm-分區ubuntu 20.04

通過計算所有單元的路由權重來自定義單元。

osrm-customize britain-and-ireland-latest.osrm

osrm-customize ubuntu 20.04

現在,您可以啟動路由引擎。

osrm-routed --algorithm=MLD britain-and-ireland-latest.osrm

osrm路由的ubuntu 20.04

如您所見,它偵聽TCP端口5000。

步驟4:創建systemd服務

我們可以使用以下命令手動運行OSRM路由引擎 osrm-routed --algorithm=MLD britain-and-ireland-latest.osrm,但在後台運行osrm-routed作為systemd服務更為方便。 按 Ctrl+C 停止當前的osrm路由進程,並使用以下命令為osrm路由創建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 系統服務。

sudo systemctl start osrm-routed

sudo systemctl enable osrm-routed

檢查狀態。

systemctl status osrm-routed

osrm路由的系統服務ubuntu 20.04

如果 osrm-routed 服務未處於活動狀態(正在運行),您可以運行以下命令查看問題所在。

sudo journalctl -eu osrm-routed

步驟5:配置Apache Web服務器

我們可以將Apache Web服務器配置為該服務器的反向代理 osrm-routed 服務,因此我們可以使用域名來訪問路由服務,還可以啟用HTTPS加密。

安裝Apache Web服務器。

sudo apt install apache2

要將Apache用作反向代理,我們需要啟用 proxyproxy_httprewrite 模塊。

sudo a2enmod proxy proxy_http rewrite

然後為OSRM創建一個虛擬主機文件。

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

將以下文本添加到文件中。 代替 osrm.your-domain.com 使用您的實際域名,不要忘記為其創建DNS A記錄。

<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(osrm.your-domain.com )在瀏覽器地址欄中。

步驟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:將Strict-Transport-Security標頭添加到每個HTTP響應。 強制瀏覽器始終對域使用TLS。 防禦SSL / TLS剝離。
  • --staple-ocsp:啟用OCSP裝訂。 有效的OCSP響應被裝訂到服務器在TLS期間提供的證書。

現在應該獲得證書並自動安裝。 您將能夠通過安全的HTTPS連接訪問Webmin Web界面。

osrm https certbot ubuntu 20.04

步驟7:將OSRM與Slippy Map集成

我假設您的滑動地圖是使用Leaflet JavaScript庫顯示的,並且您已將Nominatim地理編碼服務添加到了滑動地圖。

要將OSRM與草繪地圖集成,我們可以使用一個名為Leaflet Routing Machine的插件。 首先,將Leaflet路由機器的JavaScript和CSS文件包括到您的草繪地圖中。 請注意,它們應放在主Leaflet JavaScript和Leaflet Control Geocoder JavaScript之後。

<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>

保存並關閉文件。 然後在網絡瀏覽器中重新加載地圖,您應該在右上角看到一個控制面板,您可以在其中輸入起始地址和目標地址。

在Ubuntu 20.04上安裝OSRM

您可以在地圖上拖動航路點,OSRM會自動重新計算路線。

包起來

我希望本教程可以幫助您在Ubuntu 20.04上設置OSRM服務器。 與往常一樣,如果您發現這篇文章很有用,請訂閱我們的免費新聞通訊以獲取更多提示和技巧。 保重🙂

Sidebar