Lesezeit ca. 7 Min.
arrow_back

Kurz angezapft


Logo von LinuxUser
LinuxUser - epaper ⋅ Ausgabe 12/2021 vom 18.11.2021

Mit Nominatim und Python Distanzen berechnen

Artikelbild für den Artikel "Kurz angezapft" aus der Ausgabe 12/2021 von LinuxUser. Dieses epaper sofort kaufen oder online lesen mit der Zeitschriften-Flatrate United Kiosk NEWS.

Bildquelle: LinuxUser, Ausgabe 12/2021

README

Nominatim, der Datendienst hinter Open­ StreetMap, liefert die Geokoordinaten zu einem Ortsnamen als Breiten-und Längengrad aus und ermittelt umgekehrt die Ortsnamen zu Geokoordinaten. Aufgrund der Genauigkeit stellt Nominatim auch eine verlässliche Basis dar, um Distanzen zwischen zwei Orten zu ermitteln.

Wer früher auf kurvigen Landstraßen zurückzulegende Distanzen mithilfe einer Karte ermitteln wollte, benötigte ein Kurvimeter: Mit dem Rädchen an der Spitze des stiftartigen Geräts fuhr man die gewünschte Strecke auf der Karte ab, ein Zeiger auf einer Skala gab dann die entsprechende Distanz in mehreren Maßstäben an. In der digitalen Ära braucht man solche Werkzeuge nicht mehr: Google Maps oder OpenStreetMap liefern auf Knopfdruck exakte Zahlen.

Es gibt aber auch noch andere Wege mit den global verfügbaren Kartendaten zu arbeiten. Als Alternative ...

Weiterlesen
epaper-Einzelheft 7,99€
NEWS Jetzt gratis testen
Bereits gekauft?Anmelden & Lesen
Leseprobe: Abdruck mit freundlicher Genehmigung von LinuxUser. Alle Rechte vorbehalten.
Lesen Sie jetzt diesen Artikel und viele weitere spannende Reportagen, Interviews, Hintergrundberichte, Kommentare und mehr aus über 1050 Magazinen und Zeitungen. Mit der Zeitschriften-Flatrate NEWS von United Kiosk können Sie nicht nur in den aktuellen Ausgaben, sondern auch in Sonderheften und im umfassenden Archiv der Titel stöbern und nach Ihren Themen und Interessensgebieten suchen. Neben der großen Auswahl und dem einfachen Zugriff auf das aktuelle Wissen der Welt profitieren Sie unter anderem von diesen fünf Vorteilen:

  • Schwerpunkt auf deutschsprachige Magazine
  • Papier sparen & Umwelt schonen
  • Nur bei uns: Leselisten (wie Playlists)
  • Zertifizierte Sicherheit
  • Freundlicher Service
Erfahren Sie hier mehr über United Kiosk NEWS.

Mehr aus dieser Ausgabe

Titelbild der Ausgabe 12/2021 von Zukunft geht anders. Zeitschriften als Abo oder epaper bei United Kiosk online kaufen.
Zukunft geht anders
Titelbild der Ausgabe 12/2021 von Dateiverwalter. Zeitschriften als Abo oder epaper bei United Kiosk online kaufen.
Dateiverwalter
Titelbild der Ausgabe 12/2021 von Terminsammler. Zeitschriften als Abo oder epaper bei United Kiosk online kaufen.
Terminsammler
Titelbild der Ausgabe 12/2021 von Schöne neue Welt. Zeitschriften als Abo oder epaper bei United Kiosk online kaufen.
Schöne neue Welt
Mehr Lesetipps
Blättern im Magazin
Klar strukturiert
Vorheriger Artikel
Klar strukturiert
README
Nächster Artikel
README
Mehr Lesetipps

... zu den kommerziellen Kartendiensten und den diversen Routing-Tools bietet es sich an, den eigenen Computer rechnen zu lassen. Im Folgenden zeigen wir Ihnen, wie Sie das mithilfe der Programmiersprache Python und der Open-Source-Bibliothek Geopy bewerkstelligen. Dazu genügen eine Internet-Verbindung und wenige Programmzeilen Python-Code.

Berechnungen

Im Python-Universum finden sich eine ganze Reihe von Bibliotheken zum Umgang mit Geodaten, die an öffentlich verfügbare APIs andocken.

So dient das bereits erwähnte Geopy zum Umrechnen zwischen Geokoordinaten und Ortsangaben. Geotiler und Cartopy stellen dann dazu passende, in Kacheln (engl. „tiles“) unterteilte Kartenausschnitte bereit.

GeoPandas basiert auf Pandas und stellt länderspezifische, statistische Daten bereit, beispielsweise die einzelnen Länder der Erde samt deren geografischer Grenzen und Zugehörigkeit zu einem Kontinent, geschätzter Bevölkerungszahl, ISO-Code und Bruttoinlandsprodukt (engl. GDP).

GeoAlchemy , eine Erweiterung zu SQLAlchemy und PostGIS , ergänzt das Datenbankmanagementsystem PostgreSQL um Funktionen zum Verarbeiten von Geodaten. Geoviews ermöglicht das Erforschen und Darstellen geografischer, meteorologischer und ozeanografischer Daten, wie sie beispielsweise in der Klimaforschung benötigt werden.

Welche Bibliothek optimal zu dem von Ihnen angepeilten Anwendungsfall passt, hängt davon ab, in welchem Format und welcher Form Ihre Daten bislang vorliegen, was Sie ausrechnen möchten und wie Sie die Ausgabe gestalten wollen – als Daten in einer CSV-Datei oder Datenbank, als statische Datei in Form einer Grafik oder interaktiv für eine Webseite. Als Entscheidungshilfe legen wir Ihnen das PyViz-Tutorial ans Herz, das einen Überblick über die verschiedenen Bibliotheken gibt und sie anhand von Beispielen erläutert.

Verwandte Beiträge

Bereits in früheren Ausgaben von Linux­ User haben wir uns mit dem Auswerten und Verarbeiten von Geodaten beschäftigt. So zeigten wir etwa, wie Sie ein Fahrtenbuch mit Bordmitteln auswerten , mit Python und OpenLayers eigene Reisen visualisieren oder Routino als freien Offline-Routenplaner einsetzen .

Luftlinie per Geopy

Geopy dient als Python-Client für verschiedene populäre geobasierte Webdienste 1 1 , wie etwa OpenStreetMap Nominatim , Google Geocoding API (V3), Base Adresse Nationale France (BAN France ), Pelias oder auch Azure-Maps (Microsoft/​TomTom).

Im Folgenden zeigen wir, wie Sie mithilfe von Geopy die direkte Gesamtstrecke einer Reiseroute anhand von Ortsnamen ermitteln. Zu den Ortsangaben berechnet das Tool den jeweiligen Breitenund Längengrad und danach die Distanz zwischen diesen geografischen Punkten. Je detaillierter die Route mit den jeweiligen Ortsangaben vorliegt, desto exakter kalkuliert Geopy die Gesamtstrecke. Dabei ermittelt es die direkte geografische Distanz zwischen den Orten, lässt unterschiedliche Fortbewegungsarten, die verschiedenen Verkehrswege sowie Höhenunterschiede bei der Berechnung jedoch außer Acht.

Praktischerweise bezieht Geopy bei der Berechnung der Distanz die Erdkrümmung mit ein. Es sieht die Erde als Ellipsoid an und nicht als Kugel, wobei es derzeit sechs verschiedene Berechnungsmethoden für Abstände zwischen einzelnen geografischen Punkten unterstützt (siehe Tabelle Berechnungsmethoden). Als Standardverfahren nutzt Geopy WGS-84 , das auch die Basis des Global Positioning Systems (GPS) darstellt. Bitte beachten Sie, dass die Genauigkeit der errechneten Distanz zwischen zwei Punkten schwankt: Sie hängt von der gewählten Methode und den Orten ab, zwischen denen Sie die Entfernung berechnen.

Distanz zwischen Punkten

Nach der Installation von Geopy entweder über die Paketverwaltung der verwendeten Distribution oder via Pip steht Geopy zum Einsatz bereit. Listing 1 zeigt den ersten Schritt, das Ermitteln der Geokoordinaten zu einer Ortsangabe. Nominatim übernimmt dabei die Auswertung.

In Zeile 1 importieren Sie daher aus dem Geopy-Modul die gleichnamige Klasse. Anschließend erzeugen Sie ein passendes Objekt dieser Klasse (Zeile 2), um mit Nominatim zu kommunizieren (siehe auch Kasten Nominatim und der User Agent). Dabei müssen Sie zwingend einen (wahlfreien) User-Agent-String angeben, um eine Fehlermeldung zu vermeiden. In den Zeilen 4 und 8 senden Sie eine Anfrage an den Webservice von Nominatim, um zu dem als Parameter angegebenen Ort die entsprechenden Geokoordinaten zu bestimmen.

Anhand der Ortsangabe ermittelt Nominatim in seiner Datenbank die geografischen Daten als Gleitkommazahlen und liefert sie als Attribute zum Rückgabewert des Methodenaufrufs geocode() zurück. Im Attribut longitude finden Sie den Längengrad, in latitude den Breitengrad. Kann Nominatim die Ortsangabe nicht auflösen, weil es den Ort nicht kennt oder Sie ihn zu ungenau angegeben haben, bleibt das Ergebnis leer.

Im zweiten Schritt rechnen Sie danach die Distanz zwischen zwei geografischen Punkten aus. Hier kommt die Methode distance() zum Einsatz, die zwei Punkte als Aufzählung aus Breitengrad und Längengrad erwartet. Als Rückgabewert liefert sie ein Objekt mit den zwei Attributen km und miles zur Ausgabe in Kilometern und Meilen. Listing 2 zeigt den Aufruf und die Ausgabe der Entfernung in Kilometern zwischen den übergebenen Orten.

Nominatim und der User Agent

Nominatim dient in allererster Linie als Engine hinter OpenStreetMap, stellt seine Daten jedoch freundlicherweise über eine API auch der Allgemeinheit zur Verfügung. Dafür erwartet das Projekt jedoch im Gegenzug, dass Benutzer sich an gewisse Konventionen halten, die die Nominatim-Webseite klar aufführt. Vor allem setzt das Projekt voraus, dass Anwendungen sich auf maximal eine Anfrage pro Sekunde beschränken, um Überlasten zu vermeiden.

Darüber hinaus muss der Aufruf einen validen HTTP Referer oder User-Agent- String liefern, der die aufrufende Anwendung eindeutig identifiziert. Standard- User-Agents, wie sie etwa HTTP-Bibliotheken setzen, genügen nicht. Für kleine Experimente wie in den hier gezeigten Listings tut es ein wahlfreier String, um eine Fehlermeldung und einen Abbruch des Skripts zu vermeiden. Schreiben Sie jedoch tatsächlich eine Anwendung, die die API nutzt, sollten Sie darin auch einen korrekten User-Agent-String beziehungsweise HTTP Referer verwenden.

(jlu)

Reiserouten

Das Wissen aus diesen beiden Schritten kombinieren Sie jetzt, indem Sie eine ganze Liste von Ortsangaben verarbeiten (Listing 3). Unsere Entdeckertour um den Kaiserstuhl erfolgt im umgekehrten Uhrzeigersinn und umfasst die Orte Breisach, Ihringen, Bötzingen, Eichstetten, Bahlingen, Riegel und Endingen (ab Zeile 4). Sofern erforderlich, haben wir die Ortsangabe noch um den Text „am Kaiserstuhl“ ergänzt, um sie für Nominatim eindeutig zu machen.

Nun rufen Sie das Python-Skript in einem Terminalfenster auf. Die Berechnung dauert einen kleinen Moment, die Rückgabe erfolgt dann am Stück. In Zeile 34 begrenzt die Angabe %.2f in der print()-Anweisung die Anzahl der Nachkommastellen auf zwei. Das errechnete Ergebnis sieht wie in Listing 4 gezeigt aus und deckt sich mit dem Wert von Seiten wie etwa Luftlinie.org 2 .

Möchten Sie in Ihren Berechnungen ein anderes Verfahren als WGS-84 benutzen, dann parametrisieren Sie Geopy entsprechend (siehe Listing 5). Das gewünschte Verfahren definieren Sie über den Parameter ellipsoid in der Funktion distance.distance(). Als Wert übergeben Sie den Namen des Verfahrens aus der Tabelle Berechnungsmethoden, inklusive Leerzeichen und Klammern.

Optimierungen

Für eine Berechnung mit alltagstauglichen Werten passt das bislang beschriebene Vorgehen; es spielt in der Regel keine Rolle, ob der Weg 20 Meter kürzer oder länger als in der Realität ist. Möchten Sie jedoch das Ergebnis präzisieren, also die Distanz zwischen zwei Ortsangaben noch genauer bestimmen, bedarf es etwas Feinarbeit. Eine Option besteht darin, mehr Datenpunkte zu benutzen.

Auf diese Weise erhalten Sie einen genaueren Verlauf der Strecke, auch wenn die Berechnung dann mehr Zeit in Anspruch nimmt. Mehr Daten erzeugen Sie zum Beispiel über einen GPS-Tracker oder ein Smartphone mit einer Tracking- App, die Ihre Position genauer bestimmt und aufzeichnet.

Eine weitere Möglichkeit, die Präzision der Berechnung zu optimieren, liegt darin, die Berechnung nicht auf die Luftlinie zwischen zwei Orten zu beschränken, sondern auf real existierende Wege zu basieren. Hier kommen Online-Router ins Spiel, über deren API Sie auf deren Service zugreifen. Aus dem Überblick zu offenen Online-Routern picken wir als Beispiel Openrouteservice (ORS ) heraus. Dieser Dienst erscheint uns am vollständigsten und berücksichtigt in der Berechnung möglicher Routen Fußgänger, Radfahrer, Rollstuhlfahrer sowie Pkw und Lkw.

ORS wird am Heidelberg Institute for Geoinformation Technology (HeiGIT ) an der Universität Heidelberg entwickelt. Zu ORS bestehen eine Reihe von APIs, die sich mit Python, R, Javascript oder mit einem Plugin für das grafische Informationssystem QGIS ansprechen lassen.

Den Quellcode für die Python-Bibliothek zum Ansprechen der ORS-Routing-APIs finden Sie auf Github und auf PyPI , die Dokumentation auf Readthedocs .

Ein passendes Jupyter-Notebook finden Sie unter , Sie benötigen für den Zugriff jedoch einen API-Key vom HeiGIT.

Der Autor

Frank Hofmann arbeitet zumeist von unterwegs, bevorzugt aus Berlin, Genf und Kapstadt, als Entwickler, Trainer und Autor. Er gehört zu den Verfassern des Debian-Paketmanagement-Buchs.

Listing 6 zeigt den Quellcode, um die bereits angesprochene Tour rund um den Kaiserstuhl von ORS für die Benutzung eines Pkw berechnen zu lassen.

Bitte beachten Sie, dass die Angaben aus Längen- und Breitengraden bestehen, die Parameter müssen im Vergleich zu Geopy also in umgekehrter Reihenfolge vorliegen. Für den Aufruf in Zeile 6 benötigen Sie einen API-Key für ORS, den Sie vorher beim Dienst anfordern müssen. Als Ergebnis erhalten Sie eine Tabelle mit den berechneten Entfernungen.

ORS errechnet 30,9 Kilometer als Distanz und eine Fahrtdauer von knapp 55 Minuten für die gesamte Strecke. Beide Werte erscheinen realitätsnah. Wie die Strecke um den Kaiserstuhl verläuft, sehen Sie in Abbildung 3 .

Fazit

Wie Sie aus den hier gezeigten Beispielen ersehen, ist das Errechnen einer eigenen Fahrtroute kein Hexenwerk. Mit wenigen Zeilen Python-Code erhalten Sie eine verlässliche Distanz und Fahrtbeschreibung. Damit steht dem Entwickeln einer eigenen Anwendung nichts mehr im Weg. (cla/jlu) n

Dateien zum Artikel herunterladen unter

www.linux-user.de/dl/46877

Weitere Infos und interessante Links

www.linux-user.de/qr/46877