Exemples Overpass QL

Des requêtes à copier, chacune exécutée sur notre endpoint avant d'arriver sur cette page. Elles couvrent ce que les applications demandent le plus : des éléments près d'un point, dans un rectangle, dans une ville ou le long d'une ligne, et des comptages. Ce que l'endpoint prend en charge ou non est décrit sur la page alternative à l'API Overpass.

Envoyer une requête

Envoyez la requête en POST dans le champ data vers https://geo.runningcat.dev/v1/overpass/interpreter avec votre clé.

Python

import requests

query = """
[out:json][timeout:25];
node["amenity"="drinking_water"](around:2000,46.204,6.143);
out center;
"""
answer = requests.post(
    "https://geo.runningcat.dev/v1/overpass/interpreter",
    data={"data": query},
    headers={"Authorization": "Bearer YOUR_KEY"},
    timeout=60,
)
answer.raise_for_status()
for element in answer.json()["elements"]:
    print(element["id"], element.get("tags", {}).get("name"))

JavaScript

const query = `[out:json];
node["amenity"="cafe"](50.05,19.92,50.07,19.96);
out;`
const answer = await fetch('https://geo.runningcat.dev/v1/overpass/interpreter', {
  method: 'POST',
  headers: { Authorization: 'Bearer YOUR_KEY' },
  body: new URLSearchParams({ data: query }),
})
const { elements } = await answer.json()

Un client qui ne peut pas envoyer d'en-têtes peut mettre la clé dans l'adresse : /v1/overpass/interpreter?key=YOUR_KEY.

Autour d'un point

Eau potable à moins de 2 km de la gare de Genève : 185 fontaines en moins de 2 secondes. Avec nwr au lieu de node, out center donne aussi un point unique pour les fontaines cartographiées comme des surfaces.

[out:json][timeout:25];
node["amenity"="drinking_water"](around:2000,46.204,6.143);
out center;

Dans un rectangle

Les cafés du centre de Cracovie. Le rectangle s'écrit sud, ouest, nord, est, comme dans Overpass. 234 cafés en moins d'une demi-seconde.

[out:json];
node["amenity"="cafe"](50.05,19.92,50.07,19.96);
out;

Le paramètre [bbox] applique un même rectangle à toutes les requêtes du script ; ici, il compte les tables de pique-nique au lieu de les lister.

[out:json][bbox:50.0,19.8,50.1,20.1];
node["leisure"="picnic_table"];
out count;

Dans une ville ou un parc

area[...] trouve une limite administrative ou une zone protégée d'après ses tags, et (area.name) garde ce qui se trouve à l'intérieur. Boulangeries dans la ville de Cracovie : 408 commerces en environ 3 secondes.

[out:json][timeout:60];
area["name"="Kraków"]["admin_level"="8"]->.city;
nwr["shop"="bakery"](area.city);
out center;

Ajouter admin_level ou boundary=protected_area au filtre de la zone accélère la recherche. Les identifiants de zone fonctionnent aussi : 3600000000 plus l'identifiant d'une relation, ou 2400000000 plus celui d'un way.

Pour faire l'inverse et demander quelles limites contiennent un point :

[out:json];
is_in(46.204,6.143);
out tags;

Le long d'une ligne

around avec plusieurs paires de coordonnées mesure la distance à la ligne qui les relie. Toilettes et eau potable à moins de 300 m d'une sortie de Genève à Chamonix, dans une seule union :

[out:json];
(
  node["amenity"="toilets"](around:300,46.204,6.143,46.07,6.40,45.924,6.869);
  node["amenity"="drinking_water"](around:300,46.204,6.143,46.07,6.40,45.924,6.869);
);
out;

Pour un long parcours enregistré, l'endpoint POI le long d'un itinéraire prend la ligne GeoJSON et renvoie chaque arrêt avec son kilomètre.

Relations d'itinéraires avec géométrie

Itinéraires de randonnée de la vallée de Chamonix, les trois premiers avec leur géométrie. Chaque membre est un way qui porte sa géométrie, ce qui permet de tracer l'itinéraire sans récupérer les nœuds.

[out:json];
rel["route"="hiking"](45.85,6.8,46.0,6.95);
out geom 3;

Expressions régulières

Les noms commençant par « saint » quelle que soit la casse, avec ,i :

[out:json];
nwr["name"~"^saint",i]["amenity"="place_of_worship"](45.85,6.8,46.0,6.95);
out center;

Ensembles nommés

Une requête peut enregistrer son résultat avec ->.name, et la requête suivante peut filtrer cet ensemble. Un ensemble seul dans une union, comme (.a; .b;);, n'est pas pris en charge ; mettez plutôt les deux requêtes dans l'union.

[out:json];
node["amenity"="bicycle_parking"](46.19,6.12,46.22,6.16)->.parking;
node.parking["covered"="yes"];
out;

Lieux ouverts à une heure donnée

Ajoutez open_at à l'adresse sous forme de date et d'heure locales, YYYY-MM-DDTHH:MM dans le fuseau horaire de chaque lieu, et la réponse ne garde que les lieux dont le tag opening_hours indique qu'ils sont ouverts à ce moment. Cela ne fait pas partie d'Overpass. Boulangeries de Vienne ouvertes à 06:59 un mardi, ce qui permet de demander celles qui ouvrent avant 7 h :

POST /v1/overpass/interpreter?open_at=2026-11-10T06:59

[out:json][timeout:60];
area["name"="Wien"]["admin_level"="4"]->.city;
nwr["shop"="bakery"](area.city);
out center;

Les lieux sans tag opening_hours, ou avec un tag illisible, sont écartés. L'objet open_at de la réponse compte les lieux ouverts, fermés et inconnus, ce qui permet de voir combien n'avaient pas d'horaires. Les règles pour les jours fériés et les vacances scolaires (PH, SH) sont lues sans tenir compte de ces jours.

Quand une requête est refusée

Une requête à laquelle l'endpoint ne peut pas répondre reçoit le statut 400 et un remark qui en donne la raison, par exemple static error: line 3: recursion ">" is not supported: ways come without their nodes; use out geom or out center. Une requête qui dure plus de 30 secondes, ou qui renverrait plus d'éléments que le forfait ne le permet (10 000 en Free, 25 000 en Developer, 50 000 en Pro), reçoit le statut 200 sans éléments et un remark « runtime error: », comme le fait Overpass. Le guide des erreurs Overpass traite des erreurs 429 et 504.

L’offre gratuite donne 500 requêtes par jour, y compris pour les applications commerciales. Créez un compte avec Google ou votre e-mail et générez vos clés tout de suite.