Sommaire
1. À quoi sert cet outil#
L'outil convertit un fichier GeoPackage (.gpkg) en :
| Sortie | Usage | Contenu |
|---|---|---|
| GeoJSON (partie A) | Une couche à la fois, avec transformations (reprojection, filtre, simplification, éclatement des multi-géométries) | Un .geojson, ou un .zip de .geojson en mode « toutes les couches » |
| Shapefile (partie B) | Toutes les couches (ou une sélection) en une fois, éventuellement fusionnées par type de géométrie | Un .zip contenant les .shp/.shx/.dbf/.prj |
Tout est traité dans le navigateur : le fichier n'est jamais envoyé au serveur. La conversion utilise GDAL/OGR compilé en WebAssembly (bibliothèque gdal3.js).
2. Prérequis#
- Un navigateur récent (Chrome, Edge, Firefox).
- Une connexion Internet : le moteur GDAL (~quelques Mo), Leaflet, JSZip et le fond de carte OpenStreetMap sont chargés depuis des CDN (jsdelivr, unpkg). Hors ligne, la page affiche « Échec du chargement du moteur GDAL ».
- Un fichier
.gpkgcontenant au moins une couche vectorielle.
3. Vue d'ensemble de la page#

La page est organisée en trois blocs, de haut en bas :
- Étape 01 — Import du GeoPackage : commun aux deux sorties.
- Partie A — export GeoJSON, couche par couche : étapes 1 (couche et champs), 2 (transformations) et 3 (génération).
- Partie B — export Shapefile, toutes les couches.
Les pastilles numérotées à gauche suivent la progression : contour turquoise = étape en cours, pastille pleine = étape terminée.
4. Étape 01 — Import du GeoPackage#
4.1 Attendre le moteur GDAL#
À l'ouverture de la page, le moteur GDAL se charge (quelques secondes). Pendant ce temps la zone de dépôt est désactivée :

Lorsque le message passe à « Moteur GDAL prêt. » (en turquoise), on peut importer un fichier :

4.2 Choisir le fichier#
Deux possibilités :
- cliquer dans la zone en pointillés et choisir le
.gpkgdans l'explorateur ; - glisser-déposer le
.gpkgsur la zone (elle s'éclaire en turquoise au survol).
Après lecture, un message confirme le nom du fichier et le nombre de couches détectées :

Dès ce moment :
- la liste « Couche source » (partie A) est remplie ;
- la liste des couches de la partie B est remplie (toutes cochées) ;
- les boutons Générer le GeoJSON et Exporter en Shapefile deviennent actifs.
5. Partie A — Export GeoJSON, couche par couche#
A1. Couche et champs#

| Élément | Rôle |
|---|---|
| Exporter toutes les couches du GeoPackage | Active le mode multi-couches (voir plus bas). |
| Couche source | La couche à convertir. Le nombre d'entités est indiqué entre parenthèses. |
| Attributs à conserver | Une case par champ de la couche, toutes cochées par défaut, + liens tout sélectionner / tout désélectionner. Décocher un champ le retire du GeoJSON (ci-dessus, commune est exclu). |
La liste des champs est rechargée à chaque changement de couche. Si la structure du fichier ne peut pas être lue, la page affiche « Aucun champ détecté… » et tous les attributs sont exportés.
A2. Transformations#
Ces options sont appliquées par ogr2ogr pendant la conversion.

Reprojection (CRS de sortie)#
| Choix | Effet |
|---|---|
| Conserver le CRS d'origine | Aucune reprojection. |
| Lambert-93 (EPSG:2154) | Reprojette en Lambert-93. |
| WGS84 (EPSG:4326) | Reprojette en longitude/latitude — recommandé pour un GeoJSON (c'est le CRS attendu par la norme RFC 7946 et par la plupart des outils web). |
| Autre — code EPSG personnalisé | Fait apparaître un champ où saisir le code : 3857 ou EPSG:3857. |

Tolérance de simplification#
Valeur numérique passée à -simplify. Vide = pas de simplification. L'unité est celle du CRS de sortie : mètres en Lambert-93 (ex. 0.5), degrés en WGS84 (ex. 0.00001 ≈ 1 m).
Filtre attributaire (SQL WHERE)#
Restreint les entités exportées. On saisit uniquement la condition, sans le mot WHERE. La page construit la requête :
SELECT * FROM "<couche>" WHERE <votre condition>
Syntaxe (dialecte OGR SQL) :
| Exemple | Signification |
|---|---|
statut = 'accepte' | Texte : guillemets simples |
contenance_m2 > 2000 | Nombre |
section = 'AB' AND statut <> 'refuse' | Combinaison |
numero IN ('0001','0002') | Liste de valeurs |
commune LIKE 'Péri%' | Motif |
Multi-géométries#
Éclater en géométries simples (-explodecollections) : chaque partie d'un MultiPolygon / MultiLineString / MultiPoint devient une entité distincte (les attributs sont dupliqués). Le nombre d'entités en sortie peut donc augmenter.
A3. Génération et export#
Cliquer sur Générer le GeoJSON. Pendant le traitement le bouton est grisé et une roue tourne. Une fois terminé :

| Élément | Contenu |
|---|---|
| Message d'état | GeoJSON généré : <couche>.geojson |
| entités | Nombre d'entités dans le fichier (après filtre / éclatement). Ici 11 parcelles au statut accepte sur 24. |
| taille du fichier | Poids du GeoJSON produit. |
| champs conservés | Nombre d'attributs gardés (ici 4 sur 5, commune ayant été décoché ; — si la liste des champs n'a pas pu être lue). |
| Carte d'aperçu | Les entités sur fond OpenStreetMap, cadrées automatiquement. Polygones/lignes en turquoise, points en orange. Molette désactivée : zoomer avec les boutons + / −. |
| Télécharger le GeoJSON | Enregistre <nom_de_couche>.geojson (caractères spéciaux remplacés par _). |
Notes :
- L'aperçu est toujours affiché en WGS84, quel que soit le CRS choisi pour l'export. Il applique le filtre, mais pas la simplification ni l'éclatement.
- Les coordonnées sont écrites avec 7 décimales (
COORDINATE_PRECISION=7, soit ~1 cm en WGS84).
Détails techniques#
Le bloc repliable « Détails techniques (structure GDAL brute) » affiche la description du fichier renvoyée par ogrinfo -so -json (couches, nombre d'entités, champs et types, type de géométrie, emprise, CRS). Utile pour diagnostiquer un fichier qui ne se lit pas correctement.

Mode « toutes les couches »#
En cochant Exporter toutes les couches du GeoPackage, le bloc couche/attributs est grisé (inactif) et le bouton devient Générer les GeoJSON (toutes les couches) :

Dans ce mode :
- la couche source et la sélection d'attributs sont ignorées — chaque couche est exportée avec tous ses champs ;
- la reprojection, le filtre, la simplification et l'éclatement s'appliquent à chaque couche. Attention : un filtre portant sur un champ absent d'une couche fera échouer cette couche (elle est alors ignorée et signalée) ;
- le résultat est un fichier
export_geojson.zipcontenant un<couche>.geojsonpar couche ; - les statistiques affichent le total des entités, la taille du
.zip, et « tous » pour les champs ; il n'y a pas d'aperçu carte.

6. Partie B — Export Shapefile, toutes les couches#
Cette partie est indépendante de la partie A (elle n'utilise ni le filtre ni la simplification).

6.1 Choisir les couches#
Toutes les couches sont cochées par défaut. Décocher celles à exclure, ou utiliser tout sélectionner / tout désélectionner. Au moins une couche doit être cochée (sinon : « Sélectionne au moins une couche. »).
6.2 Export simple (une couche = un Shapefile)#
Sans l'option de fusion, chaque couche cochée donne un jeu .shp / .shx / .dbf / .prj portant le nom de la couche (caractères spéciaux remplacés par _, 40 caractères max).
Choisir éventuellement une reprojection, puis cliquer Exporter en Shapefile (.zip). Le message indique le nombre de fichiers et la taille, puis le bouton Télécharger le .zip apparaît (export_shapefile.zip) :

Exemple avec le fichier de démo : 4 couches → 16 fichiers.
6.3 Export fusionné par type de géométrie#
Cocher Fusionner les couches sélectionnées par type de géométrie regroupe toutes les couches cochées en au plus 4 Shapefiles :
| Fichier | Contenu |
|---|---|
fusion_point | toutes les couches de points |
fusion_ligne | toutes les couches de lignes |
fusion_polygone | toutes les couches de polygones |
fusion_sansgeom | les tables attributaires sans géométrie (.dbf seul) |
Chaque entité reçoit un champ couche_src contenant le nom de sa couche d'origine. Les géométries simples sont promues en multi (PROMOTE_TO_MULTI) pour pouvoir cohabiter.

En cochant la fusion, la reprojection passe automatiquement à Lambert-93 (si elle était sur « Conserver ») : les couches d'origine pouvant avoir des CRS différents, un CRS commun est obligatoire. Il reste modifiable. Si on remet « Conserver le CRS d'origine », Lambert-93 est malgré tout utilisé.

6.4 Contraintes du format Shapefile#
- un seul type de géométrie par fichier (d'où la fusion par type) ;
- noms de champs limités à 10 caractères : GDAL les tronque automatiquement (
contenance_m2→contenance) ; en cas de collision il renomme (champ_1…) ; - en mode fusion, deux couches ayant un champ de même nom mais de types différents peuvent aussi provoquer un renommage.
7. Réinitialiser#
Le bouton Réinitialiser (partie A, étape 3) ferme le fichier et remet toute la page à zéro (partie A et partie B) : listes vidées, options remises par défaut, résultats et carte masqués. Il faut ensuite réimporter un fichier.
8. Messages et dépannage#
| Message | Cause | Solution |
|---|---|---|
| Échec du chargement du moteur GDAL. Vérifie la connexion au CDN jsdelivr. | Pas d'Internet, CDN bloqué (proxy, pare-feu). | Vérifier la connexion, recharger la page. |
| La zone de dépôt ne réagit pas | Le moteur n'est pas encore prêt. | Attendre « Moteur GDAL prêt. ». |
| Aucune couche vectorielle détectée dans ce fichier. | GeoPackage raster uniquement, ou vide. | Vérifier le fichier dans QGIS. |
| Erreur à l'ouverture du fichier : … | Fichier corrompu ou pas un GeoPackage. | Vérifier l'extension et le contenu. |
| Erreur pendant la conversion : Pointer 'hDS' is NULL in 'GDALGetFileList'. — vérifie le filtre… | Le plus souvent : filtre SQL invalide (guillemets doubles, champ inexistant, faute de syntaxe) ou code EPSG inconnu. | Corriger le filtre (guillemets simples) ou le code EPSG, puis cliquer à nouveau sur Générer. Pas besoin de réimporter. |
| N couche(s) ignorée(s) — détail dans la console. | Une ou plusieurs couches n'ont pas pu être converties. | Ouvrir la console du navigateur (F12) pour le détail. |
| Aucun fichier n'a pu être généré… | Toutes les couches ont échoué. | Idem, consulter la console. |
Exemple de l'erreur provoquée par un filtre avec guillemets doubles (statut = "accepte") :

9. Fonctionnement technique#
Bibliothèques chargées par la page :
| Bibliothèque | Version | Rôle |
|---|---|---|
| gdal3.js | 2.8.1 | GDAL/OGR en WebAssembly (ogr2ogr, getInfo) |
| Leaflet | 1.9.4 | Carte d'aperçu |
| JSZip | 3.10.1 | Création des archives .zip |
Commande ogr2ogr équivalente pour l'export GeoJSON d'une couche :
ogr2ogr -f GeoJSON sortie.geojson fichier.gpkg \
-dialect OGRSQL -sql 'SELECT * FROM "parcelles" WHERE statut = '"'"'accepte'"'"'' \
-lco COORDINATE_PRECISION=7 \
-t_srs EPSG:4326 -simplify 0.00001 -explodecollections
Export Shapefile simple (par couche) :
ogr2ogr -f "ESRI Shapefile" -overwrite <nom_couche> fichier.gpkg \
-dialect OGRSQL -sql 'SELECT * FROM "<couche>"' [-t_srs EPSG:xxxx]
Export fusionné : chaque couche est d'abord convertie en GeoJSON (dans le CRS commun), les entités sont regroupées par type de géométrie avec ajout de couche_src, puis chaque groupe est écrit en Shapefile avec -nlt PROMOTE_TO_MULTI (ou -nlt NONE pour les tables sans géométrie).
La sélection d'attributs (quand elle est disponible) est appliquée après la conversion, en JavaScript, sur les propriétés du GeoJSON.
10. Limites connues#
- Dépendance aux CDN : la page ne fonctionne pas hors ligne.
- Traitement en mémoire : les très gros fichiers peuvent saturer l'onglet.
- Le message d'erreur de GDAL reste technique (
Pointer 'hDS' is NULL…) ; la page ajoute une indication sur le filtre quand un filtre est saisi.
Corrections apportées (octobre 2026)#
| Problème constaté | Correction |
|---|---|
La liste « Attributs à conserver » restait vide (getInfo() de gdal3.js 2.8.1 ne renvoie ni champs ni type de géométrie). | Lecture de la structure avec Gdal.ogrinfo(['-so','-json']), repli sur getInfo() en cas d'échec. |
Exemple du filtre trompeur (statut = "accepte"). | Exemple corrigé en statut = 'accepte' + aide sous le champ. |
| Après une erreur de conversion, toutes les conversions suivantes échouaient jusqu'au réimport du fichier. | Chaque conversion écrit dans un fichier de sortie au nom unique (nextOutName()), le fichier laissé par l'échec ne bloque plus ; message d'erreur complété quand un filtre est saisi. |
Classe CSS dimmed non définie : le bloc couche/champs n'était pas grisé en mode « toutes les couches ». | Classe .dimmed ajoutée (opacité réduite, bloc non cliquable). |
