Du "télécharge puis ouvre QGIS" au SQL spatial cloud-native — le guide pratique pour migrer vos workflows GIS en 2026.
Pour qui ? Data engineers, GIS analysts, consultants SIG et toute personne qui passe plus de temps à analyser des snapshots de données qu'à les éditer.
Pré-requis : Savoir ce qu'est un Shapefile. Avoir déjà utilisé QGIS ou ArcGIS. Python et SQL basique appréciés mais pas obligatoires.
Un cadastre France entière représente environ 8 GB en Shapefile. Pour analyser Paris intra-muros — soit 0,2 % du territoire national — QGIS télécharge intégralement ces 8 GB avant d'afficher quoi que ce soit.
Ce n'est pas un bug ni un problème de machine. C'est une conséquence du format. Les formats géospatiaux classiques (Shapefile, GeoJSON, GeoPackage) sont séquentiels : ils ne savent pas "lire seulement la partie qui concerne l'Île-de-France". C'est tout ou rien.
| Opération | Workflow classique | Cloud-native |
|---|---|---|
| Accès cadastre France entière | 8 GB à télécharger, ~8 min | Requête directe, ~4 sec |
| Analyse sur 5 % du territoire | Lit 100 % du fichier | Lit ~5 % du fichier |
| Taille après optimisation | 8 GB (Shapefile) | ~1,4 GB (GeoParquet + ZSTD) |
| Partage avec un collègue | .zip par email ou Wetransfer | URL S3 + script DuckDB |
| Mise à jour du dataset | Re-télécharger tout | Remplacer la partition concernée |
| Stockage local requis | 10–50 GB pour quelques datasets | 0 (ou cache temporaire) |
Exporter "brut" depuis QGIS ou GDAL génère un GeoParquet non ordonné. Sans Hilbert sorting ni bbox columns, les performances cloud sont identiques à un GeoJSON — le fichier est parcouru en entier à chaque requête. C'est de là que vient le "j'ai essayé GeoParquet, ça ne change rien".
GeoParquet est un format analytique conçu pour les snapshots. Si vos données subissent des UPDATE granulaires quotidiens — mise à jour d'adresses, édition de tracés terrain — PostGIS reste le bon choix. Confondre les deux use cases garantit la déception.
QGIS reste irremplaçable pour la cartographie exploratoire, l'édition manuelle de géométries et les livrables visuels PDF/print. La stack cloud-native ne le remplace pas — elle le rend optionnel pour les 70 % de cas qui relèvent de l'analytique pure.
La donnée vit dans un fichier local.
Le logiciel SIG est le centre de gravité.
Workflow : télécharger → ouvrir → analyser → exporter
La donnée vit dans le cloud.
Le SQL est le centre de gravité.
Workflow : interroger → filtrer → visualiser
💡 Insight clé
GeoParquet + Hilbert ordering, c'est une bibliothèque dont on ne lit que les pages qui nous intéressent. Le tri physique des données dans l'espace rend la lecture partielle possible — et dix fois plus rapide.
Cinq étapes, deux outils (gpio et duckdb). Chaque étape peut être utilisée indépendamment selon votre contexte.
pip install geoparquet-io duckdb
# Vérifier les installations
gpio --version
duckdb --version
# Fichier local
gpio inspect mon_fichier.parquet
# Fichier distant — aucun téléchargement, lecture des métadonnées seulement
gpio inspect https://cadastre.data.gouv.fr/data/etalab-cadastre/latest/geoparquet/france/cadastre.parquet
# Résultat : CRS, nombre de features, bbox, compression, colonnes disponibles
# Depuis Shapefile
gpio convert input.shp output.parquet
# Depuis GeoJSON
gpio convert input.geojson output.parquet
# Depuis GeoPackage
gpio convert input.gpkg output.parquet
# Optimisation complète : Hilbert + bbox + ZSTD
gpio optimize output.parquet \
--spatial-sort hilbert \
--add-bbox \
--compression zstd
# En une seule commande : conversion + optimisation
gpio convert input.shp output.parquet \
--spatial-sort hilbert \
--add-bbox \
--compression zstd
💡 Pourquoi
--add-bbox?
DuckDB peut filtrer sur les colonnesbbox.minx / bbox.maxx / bbox.miny / bbox.maxyavant même de toucher à la géométrie. C'est ce qui divise le temps de requête par 10 sur les gros datasets cloud — sans cette option, vous ne bénéficiez que de la compression, pas de la lecture partielle.
# Partitionnement par admin boundary (France : level 4 = département)
gpio partition output.parquet \
--by admin \
--admin-level 4 \
--output-dir ./by_dept/
# Partitionnement par H3 (résolution 5 ≈ hexagones de 250 km²)
gpio partition output.parquet \
--by h3 \
--resolution 5 \
--output-dir ./h3_partitions/
-- Charger l'extension spatiale
LOAD spatial;
-- Requête directe sur S3 — zéro téléchargement local
SELECT * FROM read_parquet('https://cadastre.data.gouv.fr/data/etalab-cadastre/latest/geoparquet/france/cadastre.parquet')
WHERE departement like '91' AND commune like '91477'
Ou avec une bbox
WHERE bbox.minx >= 511150 AND bbox.maxx <= 660000
AND bbox.miny >= 6333210 AND bbox.maxy <= 6430000;
-- Agréger par département sur données partitionnées
SELECT dept_code, COUNT(*) AS nb_parcelles
FROM read_parquet('s3://mon-bucket/by_dept/*.parquet')
GROUP BY dept_code
ORDER BY nb_parcelles DESC;
-- Join spatial avec une autre table
SELECT a.id, b.nom_commune
FROM read_parquet('parcels.parquet') a
JOIN read_parquet('communes.parquet') b
ON ST_Within(a.geometry, b.geometry);
| Workflow | Classique (Shapefile + QGIS) | Cloud-native (GeoParquet + DuckDB) |
|---|---|---|
| Outil central | QGIS / ArcGIS | DuckDB + SQL |
| Format source | .shp, .geojson, .gpkg | .parquet (Hilbert-sorted) |
| Lieu de la donnée | Disque local | S3 / GCS / Azure Blob |
| Lecture pour une zone cible | 100 % du fichier | 5–10 % (si Hilbert) |
| Partage des données | Compression + envoi | URL S3 partagée |
| Reproductibilité | "Ouvre ce fichier dans QGIS" | Script SQL versionnable (git) |
| Coût d'entrée | 0 € (open source) | 0 € (gpio + DuckDB open source) |
| Couche | Outil | Pourquoi |
|---|---|---|
| Conversion / optimisation | gpio (Cloud Native Geo, mars 2026) | Hilbert + bbox + ZSTD en une commande, open source |
| Stockage | GeoParquet sur S3/Azure | Cloud-native, partitionnable, lecture partielle |
| Query engine | DuckDB Spatial | Lit S3 en SQL, R-tree natif, zéro infrastructure |
| Partitionnement | H3 (Uber) ou admin boundaries | Découpages stables, indépendants de tout vendor |
| Visualisation | Felt / Kepler.gl / DeckGL | Rendu GeoParquet natif, sans serveur de tuiles |
# 1. Inspecter un fichier distant (0 téléchargement)
gpio inspect https://data.source.com/file.parquet
# 2. Conversion + optimisation complète (tout en une commande)
gpio convert input.shp output.parquet \
--spatial-sort hilbert --add-bbox --compression zstd
# 3. Statistiques du fichier résultant
gpio stats output.parquet
# 4. Partitionnement par département (France : admin level 4)
gpio partition output.parquet \
--by admin --admin-level 4 --output-dir ./by_dept/
# 5. Requête DuckDB depuis S3 (adapter les coordonnées bbox)
duckdb -c "LOAD spatial; \
SELECT COUNT(*) FROM read_parquet('s3://bucket/data.parquet') \
WHERE bbox.minx > 2.2 AND bbox.maxx < 2.5 \
AND bbox.miny > 48.8 AND bbox.maxy < 49.1;"
# 6. Partitionnement par H3 résolution 5
gpio partition output.parquet \
--by h3 --resolution 5 --output-dir ./h3_r5/
| Cas d'usage | Outil recommandé | Pourquoi |
|---|---|---|
| Snapshot analytique cloud | GeoParquet + gpio + DuckDB | Lecture partielle, SQL versionnable, 0 € infra |
| Données transactionnelles (UPDATE quotidien) | PostGIS | ACID, granularité, écosystème étendu (pgRouting…) |
| Cartographie exploratoire visuelle | QGIS | IHM, sémiologie graphique, exports PDF/print |
| Données > 100 GB, équipe multi-users | Snowflake / BigQuery Spatial | Scalabilité, gouvernance, concurrence |
| Partage avec non-techniciens | Felt (sur warehouse) | Pas de setup client, interface carte intuitive |
| R&D, prototypage rapide local | DuckDB en local | Zéro infrastructure, résultat en secondes |
UPDATE tous les jours, restez sur PostGIS. Si vous faites des snapshots hebdomadaires ou mensuels, GeoParquet + DuckDB vous fera gagner 80 % du temps de setup.
--spatial-sort hilbert --add-bbox — c'est elle qui change tout.