So richten Sie einen OSRM-Server unter Ubuntu 14.04 ein

Einführung

Das Projekt http: //www.openstreetmap.org%5D [OpenStreetMap] besteht aus rohen Kartendaten, die von Tausenden von Benutzern gesammelt und aggregiert werden. Die Open-Access-Richtlinie löste jedoch eine Reihe von Sicherheitenprojekten aus, die gemeinsam viele der Funktionen abdecken, die in der Regel von kommerziellen Kartierungsdiensten angeboten werden.

Der offensichtlichste Vorteil bei der Verwendung von OpenStreetMap-basierter Software gegenüber einer kommerziellen Lösung ist die wirtschaftliche Bequemlichkeit, da OpenStreetMap als kostenlose Software (sowohl in Bier als auch in Sprache) erhältlich ist. Der Nachteil ist, dass eine kleine Konfiguration erforderlich ist, um einen funktionierenden Webdienst einzurichten.

Dieses Tutorial behandelt die Konfiguration und Wartung eines Webdienstes, der Fragen beantworten kann wie:

  • Was ist die nächste Straße zu einem gegebenen Koordinatenpaar?

  • Wie komme ich am besten von Punkt A nach Punkt B?

  • Wie lange dauert es, mit dem Auto oder zu Fuß von Punkt A nach Punkt B zu gelangen?

Die Software, die dies ermöglicht, ist ein Open-Source-Projekt mit dem Namen http://project-osrm.org [Open Source Routing Machine (OSRM)], das auf den OpenStreetMap-Daten basiert. Funktionen zum Einbetten von OpenStreetMaps in Webseiten werden bereits von APIs wie http://openlayers.org [OpenLayers] bereitgestellt.

Voraussetzungen

Um diesem Tutorial zu folgen, benötigen Sie:

Einige der Vorgänge in diesem Lernprogramm, z. B. das Erstellen von OSRM aus dem Quellcode und die Vorverarbeitungsphase, sind speicherintensiv. Bei Droplets mit geringem Arbeitsspeicher können diese Vorgänge fehlschlagen. Aus diesem Grund muss eine Auslagerungsdatei zugewiesen werden.

Der Webservice erfordert normalerweise keinen zusätzlichen Swap während der Ausführung. Diese Swap-Datei kann daher nach Abschluss des Setups entfernt werden. Wenn Sie jedoch große Karten bereitstellen, ist möglicherweise eine kleine Auslagerungsdatei erforderlich, insbesondere bei Droplets mit geringem Arbeitsspeicher. Befolgen Sie in diesem Fall die Anweisungen im obigen Lernprogramm, um die Auslagerungsdatei dauerhaft zu erhalten.

Schritt 1 - Updates und Sicherheit

In diesem Schritt konfigurieren wir Updates für den Server.

Es ist wichtig, unseren Server auf dem neuesten Stand und im Laufe der Zeit sicher zu halten. Daher aktualisieren wir zuerst alle Pakete im System, indem wir die folgenden Befehle ausführen.

sudo apt-get update
sudo apt-get upgrade

Anschließend schalten wir die unbeaufsichtigten Sicherheitsupgrades von Ubuntu ein. Dazu müssen wir zuerst die erforderlichen Pakete installieren.

sudo apt-get install unattended-upgrades

Schalten Sie als nächstes die automatischen Upgrades ein, indem Sie die Datei "+ / etc / apt / apt.conf.d / 10periodic " bearbeiten. Wir müssen ` sudo +` verwenden, da dies eine systemweite Konfigurationsdatei ist.

sudo nano /etc/apt/apt.conf.d/10periodic

Fügen Sie die folgende Zeile am Ende der Datei hinzu, speichern und schließen Sie sie.

APT::Periodic::Unattended-Upgrade "1";

Schritt 2 - Laden Sie einen Kartenexport herunter

In diesem Schritt wählen wir einen Kartenexport aus und laden ihn herunter.

Um alles aufgeräumt und sauber zu halten, empfiehlt es sich, ein dediziertes Verzeichnis zu erstellen, in dem der Code erstellt, die Karte verarbeitet usw. werden kann.

mkdir osrm

In das neue Verzeichnis verschieben.

cd osrm

Unser Webservice basiert auf einem Kartenexport von OpenStreetMap. Es gibt verschiedene Möglichkeiten, einen Kartenexport zu erhalten.

Die erste Möglichkeit besteht darin, Ihren Browser auf die export page von OpenStreetMap zu richten, den gewünschten Bereich zu vergrößern und auf * Exportieren * zu klicken. (Möglicherweise müssen Sie eine der anderen Quellen verwenden, wenn der native Export nicht funktioniert. Die Überführungs-API ist eine gute Wahl.) Auf diese Weise können Sie genau auswählen, welche Bereiche in Ihre Karte aufgenommen und im Allgemeinen reduziert werden sollen die Vorlaufzeiten.

Die Größe des Exports, den Sie von der OSRM-Website herunterladen können, ist jedoch begrenzt. Daher möchten Sie möglicherweise einen vorgefertigten Export herunterladen. Eine Reihe von Diensten wie http://download.geofabrik.de [Geofabrik] und Mapzen bieten aktualisierte und vorgefertigte Kartenexporte von Ländern und ausgewählten Ballungsräumen an sind gut für die meisten Anwendungsfälle.

Egal welche Methode Sie verwenden, kopieren Sie die URL des Exports und laden Sie sie in Ihr Droplet herunter.

wget -O map.osm

Sie sollten jetzt eine Datei mit dem Namen "+ map.osm +" in Ihrem Arbeitsverzeichnis haben.

Schritt 3 - Abhängigkeiten installieren

In diesem Schritt installieren wir die OSRM-Abhängigkeiten.

OSRM muss aus dem Quellcode kompiliert werden, daher müssen wir zuerst die erforderlichen Build-Maschinen installieren. Glücklicherweise wird Ubuntu mit einem praktischen Metapaket namens "+ build-essential " ausgeliefert, das die benötigte Compiler-Toolchain enthält. Außerdem benötigen wir " git ", um den OSRM-Quellcode abzurufen, und " CMake +", um das Build-System zu generieren. Der folgende Befehl installiert alle 3 davon.

sudo apt-get install build-essential git cmake

OSRM ist eine ziemlich komplexe Software und stützt sich auch auf eine Reihe von Bibliotheken. Wir können die erforderlichen Abhängigkeiten mit dem folgenden Befehl installieren.

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

Diese Abhängigkeiten werden für verschiedene Dinge verwendet. Lua wird zum Definieren von benutzerdefinierten Geschwindigkeitsprofilskripten verwendet, z. Definiert, dass ein Auto auf einer Nebenstraße ohne Begrenzung durchschnittlich 80 km / h schnell ist und dass auf einer Schotterstraße die Durchschnittsgeschwindigkeit 50 km / h beträgt. STXXL ist eine Version der C ++ - Standardbibliothek, die Speicherplatz für die Bearbeitung großer Dateien verwendet. LibXML- und Protokollpuffer werden zum Laden, Schreiben und Bearbeiten von OSM-Dateien verwendet. Boost und TBB werden zur Parallelisierung und Darstellung von Datenstrukturen verwendet.

Schritt 4 - OSRM kompilieren

In diesem Schritt erhalten wir den OSRM-Quellcode und kompilieren ihn.

Dank der Tatsache, dass das von OSRM bevorzugte Build-System CMake ist, ist es nach der Installation der Abhängigkeiten recht einfach, Build-Dateien zu generieren und OSRM zu kompilieren.

Zunächst klonen wir den Quellcode von der page des Projekts. Das Projekt besteht aus mehreren Repositories, die unterschiedliche Funktionalitäten verwalten. Wir interessieren uns für das Backend (den serverseitigen Teil).

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

Wechseln Sie anschließend in das Codeverzeichnis.

cd osrm-backend

Der nächste Schritt besteht darin, CMake zum Generieren der Build-Dateien zu verwenden. Es wird empfohlen, OSRM in einem dedizierten "+ build +" - Verzeichnis im Quellcode-Stammverzeichnis zu erstellen, um zu vermeiden, dass die Quellverzeichnisse mit temporären Build-Dateien verschmutzt werden.

Erstellen Sie ein Erstellungsverzeichnis.

mkdir build

Wechseln Sie in das Build-Verzeichnis.

cd build

Schließlich werden wir die Build-Dateien mit + cmake + erzeugen. Dieser Befehl generiert eine Reihe von Verzeichnissen und Makefiles im Verzeichnisbaum.

cmake ..

Wenn Sie hier eine Fehlermeldung erhalten, vergewissern Sie sich, dass Sie den Tausch über die Anweisungen in den Voraussetzungen aktiviert haben.

Als nächstes kompilieren und installieren Sie OSRM.

sudo make install
  • Hinweis *: Dies kann 5 bis 10 Minuten dauern.

Das Erstellen mit + sudo + ist hier erforderlich, da das Installationsziel einige ausführbare Dateien in den Binärpfad des Systems kopiert, einschließlich einiger, die wir benötigen. Nämlich:

  • + osrm-extract + öffnet die Map-Datei und führt einen ersten Vorverarbeitungsschritt für die Daten aus.

  • + osrm-prepare + verarbeitet die Ausgabe von + osrm-extract + und berechnet die Laufzeiten für alle Kartenränder gemäß einem bestimmten Lua-Geschwindigkeitsprofil.

  • + osrm-routed + der eigentliche Webservice-Daemon, mit dem wir Entfernungen und Standorte abfragen können.

Schritt 5 - Konfigurieren Sie STXXL

In diesem Schritt erstellen wir eine Konfigurationsdatei für STXXL.

Vor dem Ausführen des Webdienstes müssen wir unseren Kartenexport vorverarbeiten. Da wir die erforderlichen Binärdateien im Systempfad installiert haben, können wir dies von überall aus tun. In diesem Tutorial führen wir die Vorverarbeitung im Stammverzeichnis des von uns erstellten Verzeichnisses "+ osrm +" durch.

Wechseln Sie zunächst in das Verzeichnis "+ osrm +".

cd ~/osrm

Die Kartenvorverarbeitung ist sehr speicherintensiv. Aus diesem Grund verwendet OSRM eine Bibliothek mit dem Namen STXXL, um die internen Vorgänge auf der Festplatte zuzuordnen. STXXL verwendet eine Konfigurationsdatei mit dem Namen "+ .stxxl ", die sich in demselben Verzeichnis befindet, in dem Sie Ihre Software ausführen, um zu bestimmen, wie viel Speicherplatz für die STXXL-Datenstrukturen reserviert ist. Abhängig von der Kapazität unseres Droplets und der Größe der Karte, die wir verarbeiten möchten, müssen wir eine geeignete " .stxxl +" - Konfigurationsdatei schreiben und genügend Speicher für die Vorgänge zuweisen.

Erstellen und öffnen Sie + .stxxl + zum Bearbeiten.

nano .stxxl

Die Datei muss eine einzelne Zeile mit dem Format "+ disk = ,, " enthalten, wobei " path " der Pfad ist, in dem die Zuordnungsdatei abgelegt wird, " capacity " die Kapazität der Datei ist und " access +" ist eine Dateizugriffsimplementierung.

Hier ist ein Beispiel einer + .stxxl + Datei. Sie können dies in "+ .stxxl +" einfügen, möchten jedoch möglicherweise die Größe der Datei basierend auf der von Ihnen verwendeten Karte und der Größe Ihres Droplets ändern. Weitere Optionen finden Sie in der documentation.

disk=/tmp/stxxl,10G,syscall

Speichern und schließen Sie + .stxxl +.

Schritt 6 - Extrahieren Sie die Karte

In diesem Schritt extrahieren wir die Karte.

Der erste Schritt der Vorverarbeitung ist die Extraktion der Karte. Der Befehl "+ osrm-extract " erwartet den Pfad eines Kartenexports als Argument und setzt das Vorhandensein eines geeigneten Geschwindigkeitsprofilskripts unter dem Namen " profile.lua +" im Arbeitsverzeichnis voraus. Das Geschwindigkeitsprofil wird verwendet, um herauszufinden, welche der verfügbaren Routen verwendet werden können (z. B. könnte ein Geschwindigkeitsprofil für einen LKW einige Straßen verbieten).

Die OSRM-Backend-Distribution enthält eine Reihe von Standard-Skripten für Geschwindigkeitsprofile im Verzeichnis "+ profiles " des Repository. In diesem Tutorial verwenden wir das Profil " car.lua +", das für die meisten Anwendungsfälle geeignet ist

Da das Geschwindigkeitsprofilskript möglicherweise von einigen Lua-Funktionen abhängt, die in der Profilbibliothek definiert sind, erstellen wir auch eine symbolische Verknüpfung zu diesem Skript im selben Verzeichnis, indem Sie die folgenden beiden Befehle ausführen.

ln -s osrm-backend/profiles/car.lua profile.lua
ln -s osrm-backend/profiles/lib

Unser Kartenexport heißt + map.osm +, also führe als nächstes aus:

osrm-extract map.osm

Dieser Schritt generiert eine Reihe von Dateien im Vorverarbeitungsverzeichnis, einschließlich "+ map.osrm +", die als Eingabe für den nächsten Schritt dienen.

Schritt 7 - Reisezeiten berechnen

In diesem Schritt berechnen wir die Fahrzeiten für die Karte.

Der Schritt wird mit dem Befehl "+ osrm-prepare +" ausgeführt, der wiederum das Geschwindigkeitsprofilskript verwendet, um die Fahrzeiten für jede Kante des Kartengraphen zu berechnen. Führen Sie dazu den folgenden Befehl aus.

osrm-prepare map.osrm

In diesem Schritt werden auch einige zusätzliche Dateien erstellt, die vom Webdienst benötigt werden. Diese werden im nächsten Abschnitt eingerichtet.

Schritt 8 - Führen Sie den Webdienst aus und testen Sie ihn

In diesem Schritt führen wir OSRM aus und testen, ob es über einen Browser funktioniert.

Das OSRM-Backend enthält einen abschließenden Befehl, "+ osrm-routed +", der die verarbeitete Karte lesen und über eine Webservice-API abfragen kann. Führen Sie zum Testen Folgendes aus:

osrm-routed map.osrm

Wenn Sie jetzt Ihren Browser auf "+ http: //: 5000 " richten, sollten Sie den Webdienst jetzt in Aktion sehen können. Es wird eine Fehlermeldung wie " {" status_message ":" Abfragezeichenfolge nahe Position 0 fehlerhaft "," status ": 400} +" angezeigt, da Sie nicht das richtige Abfrageformat verwenden.

Wählen Sie als Test einen Satz von Breiten- und Längengradkoordinaten innerhalb Ihrer Kartengrenzen und rufen Sie die folgende URL auf. Ersetzen Sie dabei ` und ` durch die von Ihnen gewählten Koordinaten.

http://:5000/nearest?loc=,

Sie sollten eine JSON-Ausgabe ähnlich der folgenden sehen:

{
   "name": "",
   "mapped_coordinate": [
       ,

   ],
   "status":0
}

Wenn stattdessen eine Fehlermeldung angezeigt wird, haben Sie möglicherweise einen Satz von Koordinaten außerhalb der Kartengrenzen ausgewählt, oder Ihre Abfragesyntax ist möglicherweise falsch. Weitere verfügbare Abfragen finden Sie unter server API.

Sie können jetzt das "+ osrm-routed " mit " STRG + C +" beenden.

Schritt 9 - Nginx einrichten

In diesem Schritt richten wir Nginx für die Arbeit mit "+ osrm-routed +" ein.

Wir haben jetzt einen funktionierenden Webdienst, aber es ist umständlich, ihn durch Angabe des Ports abzufragen. Wenn wir uns entscheiden, unterschiedliche Karten oder Karten mit unterschiedlichen Geschwindigkeitsprofilen bereitzustellen, möchten wir außerdem vermeiden, dass wir uns an eine Sammlung von Ports erinnern müssen.

Nginx ist ein leistungsstarker Webserver, der auch als Proxy und als Gateway für unsere Webservices fungieren kann. Es ist ziemlich einfach, es für die Arbeit mit "+ osrm-routed +" einzurichten.

Zuerst installieren wir Nginx.

sudo apt-get install nginx

Als Nächstes fügen wir eine Konfigurationsdatei für unsere Webdienste hinzu. Nginx verwendet zwei Verzeichnisse für seine standortspezifischen Konfigurationsdateien: "+ / etc / nginx / sites-available " (alle Sites, die bedient werden können) und " / etc / nginx / sites-enabled " (alle Sites, die bedient werden) ). Die Standardmethode zum Hinzufügen einer Site ist das Hinzufügen ihrer Konfigurationsdatei zu " sites-available " und anschließendes symbolisches Verknüpfen in " sites-enabled +".

Als erstes fügen wir eine Konfigurationsdatei für OSRM zu + sites-available hinzu.

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

In unserer Konfigurationsdatei wird ein "+ Upstream +" definiert, das auf unseren Webdienst und einen Server verweist, der Port 80 überwacht und eine Teilmenge der Abfragen an unseren Upstream weiterleitet.

Fügen Sie die folgende Konfigurationsdatei in die Datei "+ osrm.conf " ein. Sie müssen zwei Variablen angeben, die unten hervorgehoben sind: Ihre Server-IP und einen Pfad (der für den Zugriff auf den Webdienst verwendet wird, wie in ` http: /// +`).

upstream osrm {
   server 0.0.0.0:5000;
}

server {
   listen 80;
   server_name ;

   location  {
       proxy_pass http://osrm/;
       proxy_set_header Host $http_host;
   }
}

Nachdem Sie die Datei gespeichert haben, wechseln Sie in das Verzeichnis "+ sites-enabled".

cd /etc/nginx/sites-enabled

Dann können wir die Datei + osrm.conf + verlinken.

sudo ln -s /etc/nginx/sites-available/osrm.conf

Laden Sie als nächstes die Konfiguration neu.

sudo service nginx reload

Starten Sie schließlich Nginx neu.

sudo service nginx restart

Führen Sie nun + osrm-routed + erneut aus.

osrm-routed ~/osrm/map.osrm

Sie sollten in der Lage sein, auf den Webdienst zuzugreifen, indem Sie unseren Browser auf "+ http: /// " zeigen. Beachten Sie, dass Sie den Port nicht mehr angeben müssen. Sie können jetzt das " osrm-routed " mit " STRG + C +" beenden.

Durch Hinzufügen weiterer Upstreams und Standorte und Ausführen von "+ osrm-routed " durch Angeben des Ports mit " -p " oder " - port +" können wir mehr Instanzen des Webdienstes ausführen und diese an verschiedene Pfade binden. In diesem Tutorial werden keine Details dazu erläutert. Weitere Informationen finden Sie in der OSRM-Backend-Dokumentation.

Schritt 10 - Supervisor installieren und konfigurieren

In diesem Schritt installieren und konfigurieren wir Supervisor so, dass Nginx weiterhin ausgeführt wird und unser Webdienst über Neustarts verfügbar ist.

Nginx fungiert jetzt als Gateway für unseren Webservice. Wir haben es jedoch manuell gestartet. Wenn wir uns vom System abmelden, wird es nicht mehr ausgeführt. Um zu gewährleisten, dass unsere Webservices auch nach einem Neustart überleben und sich im Allgemeinen von möglichen Fehlern erholen, können wir ein Tool namens http://supervisord.org [Supervisor] verwenden.

Supervisor ist ein Prozessleitsystem, das hauptsächlich dafür sorgt, dass die Dienste ordnungsgemäß ausgeführt werden. Das Einrichten ist ganz einfach. Zuerst installieren wir Supervisor selbst.

sudo apt-get install supervisor

Anschließend fügen wir unseren Webdienst dem von Supervisor kontrollierten Pool von Diensten hinzu, indem wir eine neue Konfigurationsdatei hinzufügen.

sudo nano /etc/supervisor/conf.d/osrm.conf

Die Konfigurationsdatei muss eine Definition dieses Formulars für jeden zu überwachenden Webdienst enthalten, und der Programmname muss für jeden Webdienst unterschiedlich sein.

Fügen Sie die folgende Konfiguration in die Datei + osrm.conf + ein, speichern und schließen Sie sie.

[program:osrm]
directory=/home/osrm/osrm
command=/usr/local/bin/osrm-routed -p 5000 map.osrm
user=osrm

Diese Konfiguration besagt, dass der Benutzer "+ osrm " den Befehl " / usr / local / bin / osrm-routed -p 5000 map.osrm " ausführen soll und dass er vom angegebenen Verzeichnis ausgeführt werden muss. ` / home / osrm / osrm ` (auf diese Weise können wir ` map.osrm ` als relativen Pfad im Befehl angeben). In diesem Beispiel haben wir den Port für " osrm-routed " mit " -p +" angegeben, damit durch Erhöhen des Ports mehrere Programme hinzugefügt werden können.

Starten Sie Supervisor neu, sobald Sie die Datei gespeichert und geschlossen haben.

sudo service supervisor restart

Anschließend können wir den Status des Webdienstes überprüfen, indem wir Folgendes ausführen:

sudo supervisorctl status

Wenn alles in Ordnung ist, sollten wir etwas Ähnliches sehen

osrm          RUNNING    pid 12698, uptime 0:00:40

Dies bedeutet, dass unser Webservice ausgeführt wird. Da der Upstream auf Port 5000 zeigt, kann Nginx ihn auf dem angegebenen Pfad bereitstellen.

Fazit

In diesem Tutorial wird die Installation des OSRM-Backends beschrieben. Weitere Dokumentation finden Sie unter this page.

Zum Zeitpunkt des Schreibens befindet sich das OSRM-Back-End noch in der Beta-Phase und weist einige fest programmierte Einschränkungen hinsichtlich der Anzahl der Speicherorte auf, die in einer einzelnen Abfrage enthalten sein können (derzeit 100, die sich auf die Zeitmatrix-API auswirken). Solche Einschränkungen können deaktiviert werden, es ist jedoch erforderlich, den Quellcode von "+ osrm-routed +" zu ändern, um dies zu erreichen.

Abhängig von der Größe Ihrer Karte und der Kapazität Ihres Droplets müssen Sie möglicherweise eine größere Auslagerungsdatei zuweisen oder die Kapazität in der Konfigurationsdatei "+ .stxxl +" erhöhen, damit der Webdienst ordnungsgemäß funktioniert. Möglicherweise müssen Sie einige Konfigurationen testen, um festzustellen, welche für Ihr Setup am besten geeignet sind.