La réponse courte
Pour les nouveaux travaux, GeoPackage est le format de bureau et d'échange par défaut le plus sensé, GeoJSON est le bon choix pour les cartes web et les API, et le shapefile devrait être réservé aux cas où un outil en aval l'exige réellement. Le shapefile n'est pas « faux », mais il porte des contraintes vieilles de trois décennies — une limite de 10 caractères pour les noms de champ, un plafond de 2 Go par composant, un seul type de géométrie par fichier et une structure multi-fichiers qui casse en cas de transfert incomplet — qui causent des pertes de données silencieuses. GeoPackage supprime toutes ces limites ; GeoJSON troque l'efficacité contre une lisibilité web universelle.
Ce que chaque format est réellement
Shapefile
Un shapefile n'est pas un fichier mais un ensemble de fichiers partageant un nom de base. Les trois obligatoires sont .shp (géométrie), .shx (index de géométrie) et .dbf (attributs, une table dBASE). En pratique, vous avez aussi besoin de .prj (le SCR en WKT) et souvent de .cpg (l'encodage des attributs). Perdez le .prj et la donnée est positionnellement dénuée de sens jusqu'à ce que quelqu'un devine le SCR ; perdez le .dbf et vous avez une géométrie sans attributs. C'est le format Esri de 1993, encore omniprésent parce que tout le lit.
GeoPackage
GeoPackage (.gpkg) est une norme OGC bâtie sur un unique fichier de base de données SQLite. Un seul .gpkg peut contenir de nombreuses couches vecteur, des tuiles raster, des tables d'attributs, des index spatiaux (R-tree) et des métadonnées de couche, le tout dans un fichier portable unique. Comme c'est du SQLite, vous pouvez l'ouvrir avec n'importe quel client SQLite et l'interroger en SQL. C'est le format que l'OGC et QGIS recommandent désormais comme successeur du shapefile.
GeoJSON
GeoJSON (.geojson / .json) est un format textuel défini par la RFC 7946. Il est lisible par l'humain, trivialement analysable en JavaScript, et la monnaie native des cartes web et de nombreuses API. La RFC 7946 impose WGS84 longitude-latitude (EPSG:4326) avec des coordonnées dans l'ordre lon, lat — une source fréquente de bugs « mes points sont dans l'océan » quand quelqu'un fournit du lat, lon. Il n'a pas d'index intégré et gonfle en taille, il est donc médiocre pour les grands jeux de données ou ceux à géométrie lourde.
Les contraintes qui mordent en pratique
| Préoccupation | Shapefile | GeoPackage | GeoJSON |
|---|---|---|---|
| Longueur des noms de champ | 10 car. (tronqué) | Illimitée | Illimitée |
| Taille max | ~2 Go par .shp/.dbf | Pratiquement illimitée | Limitée par la mémoire/l'analyseur |
| Couches par fichier | Une | Plusieurs | Une collection d'entités |
| Types de géométrie par couche | Un | Un (mais plusieurs couches) | Mixte autorisé |
| SCR | Tout (dans .prj) | Tout | WGS84 lon/lat uniquement |
| Encodage | dBASE, souvent hérité | UTF-8 | UTF-8 |
| Null vs zéro | Ne stocke pas bien un vrai NULL | NULL correct | null correct |
| Date/heure | Date seule, sans heure | Datetime complet | Chaîne (ISO 8601) |
La troncature des noms de champ est le tueur silencieux. Exportez une couche avec les colonnes sample_id, concentration_ppm et concentration_pct vers un shapefile et vous obtenez sample_id, concentr_1, concentr_2 — noms mutilés et réordonnés. Le problème du NULL compte en géologie : un shapefile ne peut pas distinguer proprement « la valeur du dosage est zéro » de « le dosage n'a pas été mesuré », car le .dbf tend à remplir les blancs par 0. GeoPackage stocke un vrai NULL.
Guide de décision
- GeoPackage quand vous éditez dans QGIS/ArcGIS, échangez des projets multi-couches, archivez, ou voulez un fichier propre avec index et noms de champ longs.
- GeoJSON pour les cartes web, les couches Leaflet/MapLibre, les API et les petites données vecteur faciles à comparer et versionnées.
- Tuiles vectorielles (MBTiles/PMTiles) ou PostGIS quand les données sont volumineuses, partagées par de nombreux utilisateurs ou industrialisées — GeoJSON ne passe pas à l'échelle et un GeoPackage unique n'est pas une base de données multi-utilisateurs concurrente.
- Shapefile seulement quand le logiciel d'un destinataire ne sait rien lire d'autre.
Conversions avec ogr2ogr
ogr2ogr (qui fait partie de GDAL/OGR) est la façon fiable et inspectable de convertir — bien plus sûre que des exports répétés par menus.
Shapefile vers GeoPackage, en corrigeant l'encodage :
ogr2ogr -f GPKG output.gpkg input.shp \
-nln samples -lco SPATIAL_INDEX=YES \
--config SHAPE_ENCODING UTF-8
Couche GeoPackage vers GeoJSON en WGS84 lon/lat correct :
ogr2ogr -f GeoJSON samples.geojson output.gpkg samples \
-t_srs EPSG:4326 -lco RFC7946=YES -lco COORDINATE_PRECISION=6
L'option RFC7946=YES impose l'ordre lon/lat et les règles de la norme ; COORDINATE_PRECISION=6 rogne les coordonnées à environ 0,1 m de précision et réduit le fichier. Dans l'autre sens, poussez du GeoJSON dans PostGIS :
ogr2ogr -f PostgreSQL "PG:dbname=geo user=gis" samples.geojson \
-nln public.samples -lco GEOMETRY_NAME=geom -nlt PROMOTE_TO_MULTI
PROMOTE_TO_MULTI évite l'échec courant où une couche mêle Polygon et MultiPolygon.
Inspecter avant de faire confiance à une conversion
Lancez ogrinfo -so output.gpkg samples pour lire le résumé sans déverser toutes les entités : il montre le type de géométrie, le nombre d'entités, le SCR et le schéma des champs. Vérifiez que les noms de champ sont intacts, que le SCR est celui attendu et que le nombre d'entités correspond à la source. Pour le GeoJSON, ouvrez-le dans un éditeur de texte et confirmez que les coordonnées sont dans l'ordre lon, lat et que le membre crs (s'il est présent) ne contredit pas la RFC 7946.
Erreurs fréquentes et leurs causes
- N'envoyer que le
.shp. Les destinataires reçoivent une géométrie sans attributs ou sans SCR parce que les fichiers frères ont été laissés de côté ; les shapefiles voyagent en ensemble ou en zip. - Supposer que la réussite de l'export signifie des données propres. Un export de shapefile réussi peut comporter des noms tronqués, des composantes horaires perdues et des zéros à la place de NULL — le tout sans erreur.
- Ordre lat/lon en GeoJSON. La RFC 7946 est lon, lat ; les outils qui émettent lat, lon placent les entités dans le mauvais hémisphère. Vérifiez toujours avec un point connu.
- Utiliser GeoJSON pour de l'analytique lourde. Un GeoJSON de 200 Mo rampera dans un navigateur et pourra dépasser les limites de l'analyseur ; tuilez-le ou déplacez-le vers PostGIS.
- Incohérence d'encodage. Les attributs accentués ou non latins deviennent du charabia quand le
.cpg/l'encodage d'un shapefile est faux. L'UTF-8 par défaut de GeoPackage évite cela.
Le point de vue Bathyl
Nous traitons le choix de format comme une décision de livraison, pas comme un réglage par défaut. Un jeu de données est terminé quand le destinataire peut l'ouvrir, l'interroger, le publier et le maintenir sans perdre noms de champ, NULL ou position — nous livrons donc du GeoPackage pour les analystes, du GeoJSON ou des tuiles pour le web, et documentons le SCR, le schéma et la source à chaque transmission.
À lire aussi
- Pourquoi un shapefile comporte-t-il plusieurs fichiers ?
- GeoPackage pour les projets QGIS
- Pourquoi vos couches SIG ne s'alignent pas
- Produits de données spatiales