APERÇU

PYTHON · ROUTING OPENSTREETMAP · .OSM · .PBF

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
ROAD_GRAPH ROUTE FOUND
START END
build_graph() → Graph shortest_path() → (km, path)
100%
Python pur
2
Dépendances
2
Dijkstra · CH
3.8+
Python

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.

.osm .osm.pbf

Construction du graphe

hub

Conserve chaque voie highway, pondère chaque segment par la distance haversine et respecte oneway=yes.

GraphBuilder haversine

Dijkstra

directions

Plus court chemin exact avec une file de priorité en tas binaire et arrêt anticipé dès que la destination est atteinte.

heapq O(E log V)

Contraction Hierarchies

bolt

La technique au cœur d'OSRM : contraction des nœuds par importance, ajout de raccourcis, puis réponse par une recherche bidirectionnelle ascendante.

preprocess() query()

API REST

api

Un serveur Flask avec un endpoint /route/v1/driving façon OSRM : plusieurs points de passage, géométrie GeoJSON.

flask geojson

Modifiable

construction

Quelques centaines de lignes de Python simple réparties en modules clairs : idéal pour apprendre le routage ou prototyper votre propre algorithme.

docker unittest

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 DijkstraEngine sur le graphe, ou pré-traitez un ContractionHierarchies.
  • play_arrow Interrogez deux identifiants de nœuds OSM : vous obtenez la distance en kilomètres et la liste des nœuds du trajet.
RÉFÉRENCE API COMPLÈTE arrow_forward

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.

01 · INPUT
OSM

Extrait .osm XML ou .osm.pbf.

02 · EXTRACTOR
GraphBuilder

Parse nœuds et voies, construit les arêtes pondérées.

03 · ENGINE
Dijkstra · CH

Calcule le plus court chemin entre deux nœuds.

04 · SERVER
Flask API

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], ...] }
  }]
}