| Points clés | Détails à retenir |
|---|---|
| 📦 Installation | Ajout de la dépendance Maven ou Gradle |
| 🗺️ Données | Extraction des extraits OpenStreetMap nécessaires |
| ⚙️ Configuration | Personnalisation des profils et options de routing |
| 🚀 Exécution | Chargement des graphes et calcul d’itinéraires |
| 🔍 Optimisation | Ré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.
Sommaire
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.

Optimisations avancées
Une fois le flux basique opérationnel, deux leviers majeurs s’offrent à vous :
- Compression mémoire : activez l’option
dataAccessen 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 commeaccess=noou les tagsmotor_vehicle=nosont pris en compte lors de l’import.