APERÇU
py-osrm-backend
Le cœur d'OSRM, en Python pur.
Transformez un extrait OpenStreetMap en graphe routable, calculez des plus courts chemins avec Dijkstra ou les Contraction Hierarchies, et servez-les via une API REST façon OSRM. Pas de chaîne de compilation C++, un code lisible et facile à étendre.
pip install py-osrm-backend
FONCTIONNALITÉS
D'un fichier de carte brut à un itinéraire servi en HTTP.
Parsing OSM
map
Lisez des extraits OpenStreetMap en XML (en flux avec iterparse) ou en PBF (via osmium) pour en extraire les nœuds et les voies.
Construction du graphe
hub
Conserve chaque voie highway, pondère chaque segment par la distance haversine et respecte oneway=yes.
Dijkstra
directionsPlus court chemin exact avec une file de priorité en tas binaire et arrêt anticipé dès que la destination est atteinte.
Contraction Hierarchies
boltLa technique au cœur d'OSRM : contraction des nœuds par importance, ajout de raccourcis, puis réponse par une recherche bidirectionnelle ascendante.
API REST
api
Un serveur Flask avec un endpoint /route/v1/driving façon OSRM : plusieurs points de passage, géométrie GeoJSON.
Modifiable
constructionQuelques centaines de lignes de Python simple réparties en modules clairs : idéal pour apprendre le routage ou prototyper votre propre algorithme.
DÉMARRAGE RAPIDE
- play_arrow
Téléchargez un extrait (par exemple sur Geofabrik) et passez-le à
GraphBuilder. Le format est détecté d'après l'extension. - play_arrow
Créez un
DijkstraEnginesur le graphe, ou pré-traitez unContractionHierarchies. - play_arrow Interrogez deux identifiants de nœuds OSM : vous obtenez la distance en kilomètres et la liste des nœuds du trajet.
code quickstart.py
from osrm import GraphBuilder, DijkstraEngine # Parse la carte et construit le graphe routable graph = GraphBuilder().build_graph("monaco.osm.pbf") # Moteur de routage engine = DijkstraEngine(graph) # Deux identifiants de nœuds OSM distance, path = engine.shortest_path(start_id, end_id) print(f"{distance:.2f} km via {len(path)} nœuds") for node_id in path: node = graph.get_node(node_id) print(node.lat, node.lon)
PIPELINE
Chaque étape est un module à part : remplacez le parser, les poids ou l'algorithme sans toucher au reste.
Extrait .osm XML ou .osm.pbf.
Parse nœuds et voies, construit les arêtes pondérées.
Calcule le plus court chemin entre deux nœuds.
Accroche les coordonnées au graphe, renvoie du GeoJSON.
terminal GET /route/v1/driving
$ curl "http://localhost:5000/route/v1/driving/7.4197,43.7311;7.4260,43.7384" { "code": "Ok", "routes": [{ "distance": 1210.4, "duration": 87.7, "geometry": { "type": "LineString", "coordinates": [[7.4197, 43.7311], ...] } }] }