如何在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