Salut

Une belle personne m’a parlée de QuackOSM quand je lui faisais part de la difficulté d’installer un serveur Overpass-API pour faire des requêtes en locales sans charger les serveurs communautaires.

Alors j’ai essayé … Et ça déchire de simplicité. 🤩

📢 ATTENTION: la doc est explicite : relations must be of type boundary or multipolygon. Il y d’autres contraintes, ce sera donc à voir selon les besoins …

Comme QuackOSM est un module Python et que je m’y perd tout le temps j’ai utilisé uv. QuackOSM se charge du téléchargement des fichiers PBF par exemple sur GeoFabrik OpenStreetMap Data Extracts.

Il suffit donc d’une seule ligne :

uvx --from 'quackosm[cli]' quackosm \
 --osm-extract-query France \
 --osm-extract-source geofabrik \
 --working-directory ./ \
--ignore-cache \
--cpu-limit 8

Ou si vous avez déjà le fichier “france-latest.osm.pbf”

uvx --from 'quackosm[cli]' quackosm france-latest.osm.pbf \
 --ignore-cache \
 --cpu-limit 8

Pour obtenir le fichier “geofabrik_europe_france_nofilter_noclip_compact_sorted.parquet” (9 Go) au format GeoParquet.

À noter:

  • l’extra quackosm[cli] pour éviter “ModuleNotFoundError: No module named ‘click’”
  • Au premier appel, uv télécharge et résout les ~40 dépendances (duckdb, pyarrow, numpy, shapely, etc.) et les met en cache localement

En suite on peut utiliser DuckDB pour faire des requêtes sur des objets OSM.

Par exemple avec l’outil de bureau DBeaver on créer une connexion DuckDB (le driver est téléchargé automatiquement), on ouvre une console SQL sur la connexion et :


-- les points d'eau potable dans le périmètre de "Tours Métropole Val de Loire"

INSTALL spatial;
LOAD spatial;

-- Récupérer la géométrie de "Tours Métropole" (un POLYGON)
WITH tours_metropole AS (
    SELECT geometry
    FROM geofabrik_europe_france_nofilter_noclip_compact_sorted
    WHERE tags['boundary'] = 'local_authority'
      AND tags['name'] = 'Tours Métropole Val de Loire'
    LIMIT 1
)

-- Récupérer les points d'eau potable (POINTS) dans cette géométrie
SELECT
    feature_id,
    tags['name'] AS name,
    ST_X(geometry) AS longitude,
    ST_Y(geometry) AS latitude
FROM geofabrik_europe_france_nofilter_noclip_compact_sorted
WHERE
    -- Filtre sur les points d'eau potable (amenity=drinking_water)
    tags['amenity'] = 'drinking_water'
    -- et que la géométrie est un POINT
    AND ST_GeometryType(geometry) = 'POINT'
    -- et que le point est dans la géométrie de "Tours Métropole"
    AND ST_Within(
        geometry,
        (SELECT geometry FROM tours_metropole)
    );

-- Et 3.7 secondes plus tard :

|feature_id|name|longitude|latitude|
|----------|----|---------|--------|
|node/7285184855||0.5381852|47.3109468|
|node/2431342938||0.5143303|47.3412371|
|node/461205675||0.5452565|47.3481125|
|node/6624591422||0.5471518|47.3482322|
|node/3613483888||0.5489893|47.3489299|

Notes:

  • le “FROM” est le nom du fichier GeoParquet sans l’extension

Et on peut utiliser tout plein d’autres connecteurs DuckDB pour l’utiliser dans son langage préféré.

J’adore ! Il est content Rosco. 🥳

Discussion

Comment from Cyrille37 on 31 August 2026 at 12:38

QuackOSM était annoncé dans hebdoOSM 719 et hebdoOSM 711.

Comment from Cyrille37 on 31 August 2026 at 13:45

Sur la performance, avec entrée “france-latest.osm.pbf” (4.8 Go) et sortie “france-latest_nofilter_noclip_compact_sorted.parquet” (8.4 Go)

Laptop, Intel Core i7-1360P, 32 Go RAM, Samsung SSD 990 PRO

  • real 31m55,951s
  • user 232m23,054s
  • sys 21m5,672s

Tower Intel Core Ultra 7 270K Plus, 96 Go RAM, Crucial SSD PCIe Gen4 NVMe

  • real 8m23.464s
  • user 27m46.839s
  • sys 1m33.769s

Leave a comment

Log in to leave a comment