Extraire des données OpenStreetMap avec Overpass

Interroger la base OSM pour récupérer pistes cyclables, fontaines ou boulangeries d'une zone, en quelques lignes de requête.

OpenStreetMap contient bien plus qu'un fond de carte : des millions de bancs, fontaines, pistes cyclables, arbres, horaires d'ouverture… L'API Overpass permet d'interroger cette base comme un moteur de recherche géographique et d'en extraire exactement ce dont vous avez besoin.

Comprendre le modèle OSM

  • Node (nœud) : un point avec latitude et longitude. Une fontaine, un arbre.
  • Way (chemin) : une suite ordonnée de nœuds. Une route, ou un bâtiment s'il est fermé.
  • Relation : un regroupement d'éléments. Une ligne de bus, une commune, un polygone à trous.

Chaque élément porte des tags clé=valeur : amenity=drinking_water, highway=cycleway, shop=bakery. Le wiki OSM documente toutes les conventions.

Overpass Turbo, l'atelier

Ouvrez overpass-turbo.eu. À gauche l'éditeur de requêtes, à droite la carte. Déplacez la carte sur votre zone, collez la requête puis cliquez sur Exécuter.

Première requête : les fontaines

[out:json][timeout:25];
// Points d'eau potable dans la vue actuelle
node["amenity"="drinking_water"]({{bbox}});
out geom;

{{bbox}} est remplacé automatiquement par l'emprise de la carte. Ailleurs (script, API), utilisez des coordonnées (sud, ouest, nord, est) — notre outil d'emprise les génère pour vous.

Chercher dans une commune

[out:json][timeout:60];
area["name"="Lyon"]["admin_level"="8"]->.ville;
(
  way["highway"="cycleway"](area.ville);
  way["cycleway"~"lane|track"](area.ville);
);
out geom;

L'opérateur ~ accepte une expression régulière. Les parenthèses forment une union de plusieurs requêtes.

Combiner les filtres

[out:json];
// Boulangeries ouvertes le dimanche, nœuds ET bâtiments
nwr["shop"="bakery"]["opening_hours"~"Su"]({{bbox}});
out center;
  • nwr = node, way et relation à la fois.
  • out center renvoie le centre des polygones : pratique pour tout afficher sous forme de points.
  • ["clé"] seul teste la présence d'un tag ; [!"clé"] son absence.

Recherche de proximité

[out:json];
// Arrêts de bus à moins de 300 m d'une école
nwr["amenity"="school"]({{bbox}})->.ecoles;
node["highway"="bus_stop"](around.ecoles:300);
out;

Exporter et automatiser

Dans Overpass Turbo, le bouton Exporter propose GeoJSON, GPX ou KML. Pour automatiser, interrogez directement l'API :

import requests

requete = """
[out:json][timeout:25];
node["amenity"="drinking_water"](45.70,4.77,45.81,4.90);
out;
"""
r = requests.post("https://overpass-api.de/api/interpreter", data={"data": requete})
fontaines = r.json()["elements"]
print(len(fontaines), "fontaines trouvées")

Les serveurs Overpass publics sont partagés et gratuits : limitez la taille des zones, ajoutez un timeout, et pour des pays entiers, téléchargez plutôt un extrait sur Geofabrik. N'oubliez pas l'attribution « © contributeurs OpenStreetMap » (licence ODbL).

Dans QGIS, l'extension QuickOSM construit et exécute les requêtes Overpass pour vous et charge le résultat directement en couches.

Démonstration

Un petit Overpass Turbo : les requêtes de ce tutoriel exécutées en direct sur la base OpenStreetMap, dans l'emprise de la carte.

À essayer : choisissez une requête (fontaines, boulangeries ouvertes le dimanche, pistes cyclables…), déplacez-vous sur votre quartier, puis Exécuter. Cliquez un résultat pour lire ses tags OSM, modifiez la requête à la main (par exemple amenity=toilets) et téléchargez le résultat en GeoJSON. Les serveurs Overpass gratuits sont parfois saturés : la démo essaie alors des serveurs miroirs.