Anleitung: GraphHopper Schritt für Schritt in eine Java-Anwendung integrieren


Leitfaden: GraphHopper Schritt für Schritt in eine Java-Anwendung integrieren

Schlüsselthemen Wichtige Details
📦 Installation Hinzufügen der Maven- oder Gradle-Abhängigkeit
🗺️ Daten Extraktion der benötigten OpenStreetMap-Ausschnitte
⚙️ Konfiguration Personalisierung der Profile und Routing-Optionen
🚀 Ausführung Laden der Graphen und Berechnung von Routen
🔍 Optimierung Reduzierung der Antwortzeit und des Speicherbedarfs

Die Anpassung einer Routenberechnung innerhalb einer Java-Anwendung kann komplex erscheinen, besonders wenn man sich mit der Handhabung von Straßenkarten und OSM-Daten beschäftigt. Dennoch bietet GraphHopper eine elegante und modulare API, die sich nahtlos in Ihr Projekt einfügt. In diesem Leitfaden entdecken Sie jede Phase – von der Installation bis zur Leistungsoptimierung – mit konkreten Beispielen und Tipps, um die Feinheiten der Konfiguration zu meistern.

Vorstellung von GraphHopper

GraphHopper ist eine Open-Source-Bibliothek, die für die Bereitstellung von Offline-Routen entwickelt wurde. Sie basiert auf OpenStreetMap-Daten (OSM) und ermöglicht die Berechnung optimierter Routen nach verschiedenen Kriterien: Entfernung, Zeit, Fahrzeugprofil (Auto, Fahrrad, zu Fuß). Tatsächlich beschränkt sich GraphHopper nicht nur auf die Berechnung des kürzesten Weges: Sie können Einschränkungen definieren, Sprachansagen verwenden und sogar spezielle Oberflächen für Fahrräder und spezialisierte Straßenfahrzeuge nutzen.

Herkunft und Anwendungsfälle

Ursprünglich für Web-Geolokalisierungsdienste entwickelt, hat GraphHopper schnell das Interesse von Java-Desktop- und Embedded-Entwicklern geweckt. Lieferanwendungen, Reiseplanungswerkzeuge und Flottenmanagement-Software basieren auf seiner Engine. Zum Beispiel kann GraphHopper in eine Android-Anwendung integriert werden, aber auch in einen Backend-Service, der Routen über eine REST-API bereitstellt.

Voraussetzungen und erste Installation

Erstellung eines Java-Projekts

Beginnen Sie mit der Erstellung eines Maven- oder Gradle-Projekts, falls Sie noch keines haben. In Eclipse oder IntelliJ IDEA wählen Sie ein Standard-Java-Projekt und stellen sicher, dass Sie Java 8 oder neuer verwenden. GraphHopper nutzt Streams und einige moderne Java-APIs, daher wird oft ein JDK 11 oder 17 empfohlen, um von Leistung und Stabilität zu profitieren.

Hinzufügen der GraphHopper-Abhängigkeit

Fügen Sie in Ihrer pom.xml Folgendes hinzu:

<dependency>
  <groupId>com.graphhopper</groupId>
  <artifactId>graphhopper-core</artifactId>
  <version>8.3</version>
</dependency>

Wenn Sie Gradle verwenden:

implementation "com.graphhopper:graphhopper-core:8.3"

Diese einzige Abhängigkeit enthält die Routing-Engine sowie die Module zum Lesen der PBF-Dateien aus OSM.

OpenStreetMap-Daten vorbereiten

Damit ein Router funktioniert, benötigt er einen OSM-Ausschnitt, der das gewünschte geografische Gebiet abdeckt. Sie können eine .pbf-Datei von Geofabrik oder einem anderen Spiegel herunterladen. Ein Tipp: Beschränken Sie sich auf das genaue Gebiet (zum Beispiel einen Landkreis), um die Verarbeitungszeit und den Speicherverbrauch zu reduzieren.

Vor dem Import kann es manchmal hilfreich sein, die OSM-Datei leicht zu bereinigen oder zu bearbeiten. Bei kollaborativen Projekten vergleicht man Werkzeuge zur Öffentlichen OpenStreetMap-Bearbeitung, um die Tags anzupassen.

Schrittweise Integration

1. Daten laden

Instanziieren Sie ein GraphHopper-Objekt und geben Sie den Pfad zu Ihrer PBF-Datei an:

GraphHopper hopper = new GraphHopper()
  .setGraphHopperLocation("data/graph-cache")
  .setOSMFile("data/map.osm.pbf");
hopper.importOrLoad();

Der erste Lauf erstellt einen optimierten Graphen im Cache, während die folgenden Aufrufe diese Dateien direkt laden.

2. Router initialisieren

Bevor Sie eine Anfrage starten, können Sie die Fahrzeugprofile anpassen:

hopper.setProfiles(
  new Profile("car").setVehicle("car").setWeighting("fastest"),
  new Profile("bike").setVehicle("bike").setWeighting("shortest")
);

Jedes Profil steuert die Routing-Strategie und die Art der Straße, die GraphHopper bevorzugen soll. Es ist möglich, Profile für LKW, Fußgänger oder sogar Roller zu erstellen.

3. Routing-Anfrage ausführen

Um eine Route zu erhalten, erstellen Sie eine Anfrage:

GHRequest req = new GHRequest(48.8566, 2.3522, 43.6047, 1.4442)
  .setProfile("car")
  .setLocale(Locale.FRENCH);
GHResponse resp = hopper.route(req);

Das Ergebnis enthält die Entfernung, die Zeit und eine Liste geografischer Punkte. Sie können auch detaillierte Anweisungen (Turn-by-Turn) anfordern.

4. Ergebnisse verwalten

Die Klasse GHResponse bietet mehrere Methoden:

  • getBest() zum Abrufen des besten Weges
  • getPoints() für die Geometrie
  • getInstructions() für die Aktionsliste

Diese Daten eignen sich zur Anzeige auf einer interaktiven Karte oder zum Export als GeoJSON.

Screenshot einer Java-Anwendung, die GraphHopper zur Berechnung einer Route verwendet

Erweiterte Optimierungen

Sobald der Basis-Workflow läuft, stehen Ihnen zwei wichtige Hebel zur Verfügung:

  • Speicherkompression: Aktivieren Sie die Option dataAccess im MMap-Modus für ein leichteres Laden.
  • Multithreading: Starten Sie mehrere Threads im Routing-Modul, um mehrere Anfragen gleichzeitig zu bearbeiten.

Sie können auch die Granularität der OSM-Daten anpassen (nur Hauptstraßen behalten) oder Pruning-Skripte erstellen, um kleine, irrelevante Wege zu entfernen.

Praktische Beispiele und Perspektiven

Angenommen, Sie möchten eine Route auf einer nationalen Straßenkarte von Frankreich anzeigen. Nach der Berechnung exportieren Sie Ihre Punkte als GeoJSON und legen die Spur über eine Leaflet- oder Mapbox-Ebene. Diese Integration bietet Ihnen die Flexibilität, Wegpunkte hinzuzufügen, die Route in Echtzeit neu zu berechnen oder Entfernungs- und Höhenstatistiken anzuzeigen.

In einem anderen Fall kann man GraphHopper im Servermodus (Standalone-JAR) starten und Anfragen per HTTP senden, wodurch Ihre Java-Anwendung zu einem Routing-Mikroservice wird, der Tausende von Aufrufen pro Sekunde bedienen kann.

FAQ

F : Welche Java-Version sollte man mit GraphHopper verwenden?
A : GraphHopper empfiehlt Java 11 oder höher, um von den neuesten APIs und einer besseren Speicherverwaltung zu profitieren.

F : Kann man Points of Interest (POI) in die Berechnungen einbeziehen?
A : Ja, fügen Sie Ihre POI einfach als Wegpunkte in der GHRequest-Anfrage hinzu oder passen Sie den Graphen an, indem Sie spezifische Knoten hinzufügen.

F : Wie kann man die Größe des Graphen im Speicher reduzieren?
A : Verwenden Sie die Konfiguration .setDataAccessType(DataAccessType.MMAP) und begrenzen Sie das OSM-Gebiet auf das Wesentliche durch einen gezielten PBF-Ausschnitt.

F : Berücksichtigt GraphHopper Verkehrsbeschränkungen?
A : Ja, OSM-Eigenschaften wie access=no oder Tags wie motor_vehicle=no werden beim Import berücksichtigt.

A lire  Wisewand Bewertung: Umfassender Test des KI-Schreibtools, optimiert für SEO

Schreibe einen Kommentar