Guide : Intégrer GraphHopper dans une application Java étape par étape


Guide : Intégrer GraphHopper dans une application Java étape par étape

Points clésDétails à retenir
📦 InstallationAjout de la dépendance Maven ou Gradle
🗺️ DonnéesExtraction des extraits OpenStreetMap nécessaires
⚙️ ConfigurationPersonnalisation des profils et options de routing
🚀 ExécutionChargement des graphes et calcul d’itinéraires
🔍 OptimisationRéduction du temps de réponse et taille mémoire

Personnaliser un calcul d’itinéraire au sein d’une application Java peut sembler complexe, surtout quand on aborde la manipulation de graphes routiers et de données OSM. Pourtant, GraphHopper offre une API élégante et modulable, prête à s’insérer dans votre projet. Dans ce guide, vous découvrirez chaque phase – de l’installation à l’affinement des performances – avec des exemples concrets et des astuces pour maîtriser les subtilités de la configuration.

Présentation de GraphHopper

GraphHopper est une bibliothèque open source conçue pour fournir des itinéraires routiers en mode offline. Elle s’appuie sur les données OpenStreetMap (OSM) et permet de calculer des trajets optimisés selon plusieurs critères : distance, temps, profil de véhicule (voiture, vélo, à pied). En vrai, GraphHopper ne se limite pas à un simple calcul de chemin le plus court : vous pouvez définir des contraintes, utiliser des instructions vocales, et même exploiter des surfaces pour vélos et routiers spécialisés.

Origine et cas d’usage

Initialement lancé pour des services web de géolocalisation, GraphHopper a rapidement intéressé les développeurs Java desktop et embarqué. Des applications de livraison, des outils de planification de voyages et des logiciels de gestion de flotte s’appuient sur son moteur. À titre d’exemple, on peut intégrer GraphHopper dans une application Android, mais aussi dans un service backend qui expose des itinéraires via une API REST.

Pré-requis et installation initiale

Création d’un projet Java

Commencez par créer un projet Maven ou Gradle si vous n’en avez pas déjà un. Sur Eclipse ou IntelliJ IDEA, sélectionnez un projet Java standard puis assurez-vous d’utiliser Java 8 ou plus récent. GraphHopper profite des streams et de certaines API Java modernes, donc un JDK 11 ou 17 est souvent recommandé pour bénéficier des performances et de la stabilité.

Ajout de la dépendance GraphHopper

Dans votre fichier pom.xml, ajoutez :

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

Si vous utilisez Gradle :

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

Cette unique dépendance embarque le moteur de routing, ainsi que les modules de lecture des fichiers PBF issus d’OSM.

Préparer les données OpenStreetMap

Pour qu’un routeur fonctionne, il a besoin d’un extrait OSM couvrant la zone géographique visée. Vous pouvez télécharger un fichier .pbf depuis Geofabrik ou un autre miroir. Un conseil : limitez-vous à la zone précise (par exemple, un département), afin de réduire le temps de traitement et la mémoire consommée.

Avant d’importer, il est parfois utile de nettoyer ou d’éditer légèrement le fichier OSM. Sur des projets collaboratifs, on compare des outils d’édition OpenStreetMap pour ajuster les tags.

Intégration étape par étape

1. Charger les données

Instanciez un objet GraphHopper et indiquez-lui le chemin vers votre PBF :

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

La première exécution créera en cache un graphe optimisé, tandis que les appels suivants chargeront directement ces fichiers.

2. Initialiser le routeur

Avant de lancer une requête, vous pouvez ajuster les profils de véhicule :

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

Chaque profil contrôle la stratégie de routing et le type de route que GraphHopper doit privilégier. Il est possible de créer des profils pour camions, piétons ou même scooters.

3. Exécuter une requête d’itinéraire

Pour obtenir un trajet, construisez une requête :

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

Le résultat contient la distance, le temps et une liste de points géographiques. Vous pouvez aussi demander des instructions détaillées (tours-by-turn).

4. Gérer les résultats

La classe GHResponse propose plusieurs méthodes :

  • getBest() pour récupérer le meilleur chemin
  • getPoints() pour la géométrie
  • getInstructions() pour la liste d’actions

Ces données se prêtent à l’affichage sur une carte interactive ou à l’export GeoJSON.

Capture d’écran d’une application Java utilisant GraphHopper pour calculer un itinéraire

Optimisations avancées

Une fois le flux basique opérationnel, deux leviers majeurs s’offrent à vous :

  • Compression mémoire : activez l’option dataAccess en mode MMap pour un chargement plus léger.
  • Multi-threading : instanciez plusieurs threads sur le module de routing pour traiter plusieurs requêtes simultanément.

Vous pouvez aussi adapter la granularité des données OSM (ne conserver que les routes principales) ou générer des scripts de pruning pour supprimer les petits chemins non pertinents.

Exemples pratiques et mises en perspective

Imaginons que vous souhaitiez afficher un itinéraire sur une carte routière de France nationale. Après calcul, vous exportez vos points en GeoJSON et vous superposez la trace sur une couche Leaflet ou Mapbox. Cette intégration vous donne la flexibilité d’ajouter des waypoints, de recalculer le trajet en temps réel ou d’afficher des statistiques de distance et de dénivelé.

Dans un autre cas, on peut lancer GraphHopper en mode serveur (jar autonome) et y envoyer des requêtes via HTTP, transformant votre application Java en un microservice de routing capable de servir des milliers d’appels par seconde.

FAQ

Q : Quelle version de Java utiliser avec GraphHopper ?
R : GraphHopper recommande Java 11 ou supérieur pour profiter des APIs récentes et d’une meilleure gestion mémoire.

Q : Peut-on intégrer des points d’intérêt (POI) dans les calculs ?
R : Oui, il suffit d’ajouter vos POI sous forme de waypoints dans la requête GHRequest, ou de personnaliser le graphe en y ajoutant des nœuds spécifiques.

Q : Comment réduire la taille du graphe en mémoire ?
R : Utilisez la configuration .setDataAccessType(DataAccessType.MMAP) et limitez la zone OSM à l’essentiel grâce à un extrait PBF ciblé.

Q : GraphHopper gère-t-il les restrictions de circulation ?
R : Oui, les propriétés OSM comme access=no ou les tags motor_vehicle=no sont pris en compte lors de l’import.

A lire  Guide pratique pour acheter des billets d’avion pas chers : calendrier, comparateurs et stratégies

Laisser un commentaire