OSRM (máquina de enrutamiento de código abierto) es un motor de enrutamiento súper rápido para redes de carreteras OpenStreetMap (OSM). En tutoriales anteriores, explicamos el proceso de configuración de un servidor de teselas OpenStreetMap autohospedado y cómo agregar la funcionalidad de búsqueda de direcciones a su mapa con Nominatim. Este tutorial le mostrará cómo agregar funciones de navegación a su OpenStreetMap con OSRM, que proporciona rutas de automóviles. , rutas para bicicletas y rutas peatonales .
Este tutorial también funciona en Ubuntu 18.04.
Requisitos
Para seguir este tutorial, debe tener un servidor de teselas OSM en funcionamiento. De lo contrario, siga el tutorial a continuación para configurar su propio servidor de teselas OSM.
- Cómo configurar OpenStreetMap Tile Server en Ubuntu 20.04
También debe tener acceso a un servicio de codificación geográfica como Nominatim para la búsqueda de direcciones.
- Configurar el servidor de geocodificación OSM Nominatim en Ubuntu 20.04
Una vez que se cumplan los requisitos, siga las instrucciones a continuación para configurar el servidor OSRM.
Paso 1:compilar OSRM desde la fuente
Instalar paquetes de dependencia.
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
Crear el osrm
usuario. (No es necesario crear una contraseña para este usuario).
sudo useradd -d /srv/osrm -s /bin/bash -m osrm
Otorga permisos a tu propia cuenta de usuario.
sudo apt install acl sudo setfacl -R -m u:username:rwx /srv/osrm/
Cambie a /srv/osrm/
directorio.
cd /srv/osrm/
Descarga el código fuente de OSRM desde su repositorio de Github.
git clone https://github.com/Project-OSRM/osrm-backend.git
Crea la build
directorio.
mkdir build
Cambie a este directorio y configure el entorno de compilación.
cd build cmake /srv/osrm/osrm-backend/
Compile el código fuente.
make
Instale los binarios.
sudo make install
Se instalarán los siguientes binarios.
- /usr/local/bin/osrm-extract:
- /usr/local/bin/partición-osrm:
- /usr/local/bin/osrm-personalizar:
- /usr/local/bin/osrm-contrato:
- /usr/local/bin/osrm-datastore:
- /usr/local/bin/osrm-routed:
Paso 2:Instalar GNU Screen
En el siguiente paso, necesitaremos extraer las redes de carreteras de OpenStreetMap, lo que puede llevar mucho tiempo. Es posible que su computadora esté desconectada de Internet, por lo que se recomienda usar la utilidad GNU Screen para mantener activa su sesión. Pantalla de instalación en el servidor Ubuntu 20.04:
sudo apt install screen
Luego pantalla de inicio:
screen
En el primer lanzamiento, verá un texto de introducción, simplemente presione Enter
para terminar. Entonces podrá ejecutar comandos como de costumbre.
Paso 3:generar datos de enrutamiento OSRM
Ahora necesitamos descargar los datos de OpenStreetMap y hacerlo utilizable para el enrutamiento. Ejecute el siguiente comando para descargar los datos del mapa de todo el planeta (56G) en formato PBF (ProtoBufBinary).
wget -c http://planet.openstreetmap.org/pbf/planet-latest.osm.pbf -P /srv/osrm/osrm-backend
Si desea un mapa de un país/estado/provincia/ciudad individual, vaya a http://download.geofabrik.de. Por ejemplo, descargue los datos del mapa de Gran Bretaña (1.2G) con el siguiente comando.
wget -c http://download.geofabrik.de/europe/great-britain-latest.osm.pbf -P /srv/osrm/osrm-backend
BBBike.org también ofrece extractos de más de 200 ciudades y regiones de todo el mundo en diferentes formatos.
Asegúrate de estar en /srv/osrm/osrm-backend/
directorio.
cd /srv/osrm/osrm-backend/
Extraiga un gráfico de los datos de OpenStreetMap.
osrm-extract britain-and-ireland-latest.osm.pbf --threads=10
Por defecto, usará el car.lua
perfil.
Ahora probablemente no necesite hacer otras cosas en su servidor. Ya que está utilizando Pantalla, puede presionar Ctrl+A , suelte esas teclas y luego presione D para desconectarse de la sesión de pantalla actual. Verá un mensaje como el siguiente.
[detached from 32113.pts-1.focal]
Esto me dice que el ID de sesión de pantalla anterior es 32113. Puede cerrar la sesión de SSH e incluso apagar su computadora. No te preocupes, el osrm-extract
el proceso aún se está ejecutando. Cuando necesite regresar y verificar el progreso, acceda a SSH a su servidor y ejecute el siguiente comando para obtener el ID de sesión de pantalla anterior.
screen -ls
Salida de muestra:
There is a screen on: 32113.pts-1.focal (05/19/2020 03:45:29 PM) (Detached) 1 Socket in /run/screen/S-linuxbabe.
Luego puede volver a adjuntar a la sesión de pantalla anterior.
screen -r 32113
Este proceso requiere mucha memoria. (Usa 7 GB de RAM en mi servidor). Una vez que esté terminado, habrá un archivo con el mismo nombre pero con .osrm
extensión. Ejecute el siguiente comando para particionar este gráfico recursivamente en celdas
osrm-partition britain-and-ireland-latest.osrm
Personalice las celdas calculando los pesos de enrutamiento para todas las celdas.
osrm-customize britain-and-ireland-latest.osrm
Ahora puede iniciar el motor de enrutamiento.
osrm-routed --algorithm=MLD britain-and-ireland-latest.osrm
Como puede ver, escucha en el puerto TCP 5000.
Paso 4:Creación de un servicio systemd
Podemos ejecutar manualmente el motor de enrutamiento OSRM con osrm-routed --algorithm=MLD britain-and-ireland-latest.osrm
, pero es más conveniente ejecutar osrm-routed como un servicio systemd en segundo plano. Presiona Ctrl+C
para detener el proceso enrutado osrm actual y crear un archivo de unidad de servicio systemd para enrutado osrm con el siguiente comando.
sudo nano /etc/systemd/system/osrm-routed.service
Ponga las siguientes líneas en el archivo.
[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
Guarde y cierre el archivo. Cambiar la propiedad de /srv/osrm/osrm-backend/
directorio.
sudo chown osrm:osrm /srv/osrm/osrm-backend/ -R
Ahora podemos iniciar y habilitar el osrm-routed
servicio systemd.
sudo systemctl start osrm-routed sudo systemctl enable osrm-routed
Comprobar estado.
systemctl status osrm-routed
Si el osrm-routed
el servicio no está activo (en ejecución), puede ejecutar el siguiente comando para ver qué está mal.
sudo journalctl -eu osrm-routed
Paso 5:configurar el servidor web Apache
Podemos configurar el servidor web Apache como un proxy inverso para el osrm-routed
servicio, por lo que podemos usar un nombre de dominio para acceder al servicio de enrutamiento y también habilitar el cifrado HTTPS.
Instale el servidor web Apache.
sudo apt install apache2
Para usar Apache como proxy inverso, debemos habilitar el proxy
, proxy_http
y rewrite
módulo.
sudo a2enmod proxy proxy_http rewrite
Luego cree un archivo de host virtual para OSRM.
sudo nano /etc/apache2/sites-available/osrm.conf
Agregue los siguientes textos al archivo. Reemplace osrm.your-domain.com
con su nombre de dominio real y no olvide crear un registro DNS A para él.
<VirtualHost *:80> ServerName osrm.your-domain.com ProxyPass / http://127.0.0.1:5000/ ProxyPassReverse / http://127.0.0.1:5000/ </VirtualHost>
Guarde y cierre el archivo. Luego habilite este servidor virtual.
sudo a2ensite osrm.conf
Vuelva a cargar Apache para que los cambios surtan efecto.
sudo systemctl reload apache2
Ahora puede acceder a OSRM de forma remota ingresando el nombre de dominio (osrm.your-domain.com
) en la barra de direcciones del navegador.
Paso 6:habilite HTTPS
Podemos habilitar HTTPS instalando un certificado TLS gratuito emitido por Let's Encrypt. En el tutorial de configuración del servidor de teselas de OSM, ya instalamos el cliente Let's Encrypt (certbot) desde la tienda Snap. Entonces solo necesitamos ejecutar el siguiente comando para obtener e instalar el certificado TLS.
sudo /snap/bin/certbot --apache --agree-tos --redirect --hsts --staple-ocsp --email [email protected] -d osrm.your-domain.com
donde:
--apache
:Utilice el complemento de Apache.--agree-tos
:Acepto los términos del servicio.--redirect
:Forzar HTTPS por redirección 301.--hsts
:agregue el encabezado Strict-Transport-Security a cada respuesta HTTP. Obligar al navegador a usar siempre TLS para el dominio. Protege contra la eliminación de SSL/TLS.--staple-ocsp
:activa el grapado OCSP. Se grapa una respuesta OCSP válida al certificado que ofrece el servidor durante TLS.
Ahora se debe obtener el certificado e instalarlo automáticamente. Y podrá acceder a la interfaz web de Webmin a través de una conexión HTTPS segura.
Paso 7:integre OSRM con un mapa deslizable
Asumo que su mapa deslizable se muestra usando la biblioteca de JavaScript del folleto, y ha agregado el servicio de geocodificación de Nominatim a su mapa deslizable.
Para integrar OSRM con un mapa deslizante, podemos usar un complemento llamado Leaflet Routing Machine. Primero, incluya el archivo JavaScript y CSS de la máquina de enrutamiento de folletos en su mapa deslizable. Tenga en cuenta que deben colocarse después del JavaScript del folleto principal y del JavaScript del geocodificador de control del folleto.
<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>
A continuación, agregue las siguientes líneas al <script>...</script>
fragmento en el cuerpo 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);
Así:
<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>
Guarde y cierre el archivo. Luego vuelva a cargar el mapa en su navegador web, debería ver un panel de control en la esquina superior derecha, donde puede ingresar la dirección de inicio y la dirección de destino.
Puede arrastrar los waypoints en el mapa y OSRM recalculará automáticamente la ruta.