Qu'est-ce qu'un shapefile et de quels fichiers a-t-il besoin ?
Un shapefile est un format SIG vectoriel créé par Esri au début des années 1990. C'est un groupe de fichiers portant un même nom : le .shp contient la géométrie, le .shx un index et le .dbf les attributs. Un fichier .prj indique le système de coordonnées et un .cpg l'encodage du texte. FileReshape peut afficher un shapefile ou le convertir en GeoJSON, KML ou GeoPackage dans votre navigateur, sans l'envoyer.
D'où vient le shapefile
Esri a introduit le shapefile au début des années 1990 avec son logiciel de bureau ArcView, comme un moyen simple de stocker des points, des lignes et des polygones avec une table d'attributs. En 1998, Esri a publié l'ESRI Shapefile Technical Description, un livre blanc qui documente la structure des fichiers de géométrie et d'index. Comme la description était publique et le format simple, d'autres logiciels pouvaient le lire et l'écrire sans licence, et le shapefile est devenu le format d'échange courant des SIG de bureau.
C'est encore sa principale force aujourd'hui. Les portails de données ouvertes des administrations, les géomètres, les services d'urbanisme et les gestionnaires de réseaux publient des shapefiles parce que presque tous les logiciels SIG, de QGIS et ArcGIS Pro à GDAL, en passant par les outils de chargement de PostGIS et de nombreux logiciels de CAO, savent les lire. Le format montre aussi son âge, et les limites décrites ci-dessous sont la raison d'être des formats plus récents.
Les fichiers qui composent un shapefile
Un shapefile est un ensemble de fichiers qui partagent un nom de base, comme parcels.shp, parcels.shx et parcels.dbf. Trois d'entre eux sont obligatoires. Le fichier .shp stocke la géométrie de chaque entité sous forme de liste de coordonnées. Le fichier .shx est un index qui donne la position de chaque enregistrement dans le .shp, pour que les programmes puissent aller directement à l'entité numéro 5 000 au lieu de lire tout ce qui la précède. Le fichier .dbf est la table attributaire au format dBASE, avec une ligne par entité, dans le même ordre que les formes. Le lien entre une forme et sa ligne n'est rien de plus que cet ordre.
Les autres fichiers sont facultatifs. Le fichier .prj contient le système de coordonnées sous forme d'une ligne de texte WKT (well-known text), dans le dialecte qu'utilise Esri. Le fichier .cpg est un tout petit fichier texte qui indique l'encodage des caractères du .dbf, comme UTF-8 ou 1252. Les fichiers .sbn et .sbx sont un index spatial utilisé par les logiciels Esri, et .qix est un autre index spatial écrit par GDAL et MapServer ; les deux ne font qu'accélérer l'affichage et la recherche dans les gros fichiers. Le fichier .shp.xml contient des métadonnées comme une description, l'auteur et la date. Vous verrez peut-être aussi des fichiers .atx pour des index d'attributs. Si un fichier facultatif manque, les programmes peuvent toujours lire les données, mais sans .prj l'emplacement relève de la devinette, et sans .cpg les caractères spéciaux peuvent mal s'afficher.
Les noms de base doivent correspondre exactement, majuscules et minuscules comprises sur les systèmes qui les distinguent. Renommer seulement roads.shp en streets.shp casse l'ensemble. Renommez, copiez et envoyez toutes les parties ensemble ; le moyen le plus simple de les garder ensemble est un .zip de l'ensemble complet.
Un seul type de géométrie par shapefile
Chaque shapefile déclare un seul type de forme dans son en-tête, et chaque entité doit être de ce type ou vide. Les principaux types sont Point, MultiPoint, PolyLine (lignes) et Polygon, chacun dans une version 2D simple, une version avec des valeurs Z pour la hauteur et une version avec des valeurs M pour des mesures, comme la distance le long d'un itinéraire. Un type MultiPatch, rarement utilisé, décrit des surfaces 3D. Un fichier ne peut pas mélanger des points et des polygones : un jeu de données de bâtiments et de leurs entrées doit donc être stocké dans deux shapefiles.
Les polygones sont stockés sous forme d'anneaux. Dans la description publiée, le contour extérieur tourne dans le sens des aiguilles d'une montre et les trous dans le sens inverse, et un polygone en plusieurs parties séparées, comme un pays avec des îles, est une seule entité avec plusieurs anneaux. Le format ne stocke aucune topologie : deux parcelles voisines stockent chacune leur limite commune séparément, et rien dans le fichier ne garantit que les lignes coïncident.
Les limites de la table attributaire .dbf
Beaucoup des bizarreries du shapefile viennent du format de table dBASE, qui date des années 1980. Les noms de champs font au plus 10 caractères : Population_2020 doit donc devenir quelque chose comme POP_2020, et certains programmes les mettent aussi en majuscules. Les champs texte contiennent au plus 254 caractères. Le nombre de champs est limité lui aussi ; 255 est le chiffre généralement avancé.
Les types de données sont peu nombreux. Le texte est stocké dans des champs caractères de largeur fixe, les nombres dans des champs numériques ou à virgule flottante de largeur et de nombre de décimales fixes, vrai et faux dans des champs logiques, et les dates dans des champs date de la forme année, mois, jour. Il n'y a ni heure ni fuseau horaire : un horodatage doit donc être stocké en texte ou réparti dans plusieurs champs. Il n'y a pas non plus de vraie valeur nulle : un nombre vide est généralement écrit sous forme d'espaces ou de zéro, selon le programme, et certains lecteurs affichent alors 0 là où la valeur était en réalité inconnue. Il n'y a ni listes, ni valeurs imbriquées, ni champs binaires.
Les limites de taille des fichiers
Les en-têtes des fichiers .shp et .shx stockent les décalages et les longueurs sous forme de nombres de 32 bits, d'où la règle habituelle selon laquelle chaque partie d'un shapefile, en particulier le .shp et le .dbf, doit rester sous 2 Go. Certains programmes, dont GDAL, peuvent lire et écrire des fichiers jusqu'à environ 4 Go quand on le leur demande, mais d'autres logiciels peuvent les refuser. Un jeu de données plus gros doit être réparti en plusieurs shapefiles ou stocké dans un autre format. En pratique, le .dbf atteint souvent la limite en premier, car chaque champ texte occupe toute sa largeur dans chaque ligne, même lorsque la plupart des valeurs sont courtes.
L'encodage du texte et le fichier .cpg
Le format .dbf est antérieur à Unicode. Le texte est stocké sous forme d'octets, et l'en-tête comporte un octet, souvent appelé identifiant de pilote de langue, qui peut désigner une page de codes comme Windows-1252 ou une page de codes DOS. Beaucoup de programmes le laissent vide ou le remplissent mal. Le fichier .cpg a été ajouté plus tard pour indiquer clairement l'encodage, et les logiciels modernes écrivent de l'UTF-8 avec un .cpg qui le précise.
Lorsque ni le .cpg ni l'octet d'en-tête ne sont corrects, un programme doit deviner, et des noms comme Malmö, Ærø ou São Paulo se transforment en suites de symboles étranges. Dans ce cas, les données sont généralement intactes. Indiquez à votre logiciel SIG quel encodage utiliser à l'ouverture de la couche, par exemple dans les propriétés de la couche dans QGIS, ou ajoutez un fichier .cpg contenant le bon nom. Lorsque vous écrivez vous-même des shapefiles, choisissez UTF-8 et gardez le .cpg avec les autres parties.
Les systèmes de coordonnées et le fichier .prj
Le fichier .shp stocke de simples nombres sans dire ce qu'ils signifient. Il peut s'agir de longitudes et latitudes en degrés, de mètres dans une zone UTM ou de pieds dans un système State Plane américain. Seul le fichier .prj indique aux programmes quel système de coordonnées de référence s'applique, et il le fait sous forme de texte WKT plutôt que de code EPSG. La plupart des logiciels savent associer les définitions courantes à un code EPSG, mais des fichiers .prj inhabituels ou modifiés à la main conduisent parfois à une interprétation légèrement différente.
Sans .prj, un programme peut supposer du WGS84 ou vous demander. Des valeurs comprises entre -180 et 180 et entre -90 et 90 sont probablement des degrés ; de grandes valeurs, de l'ordre de centaines de milliers ou de millions, sont des mètres ou des pieds projetés. Attribuer un système de coordonnées ne fait qu'étiqueter les données. Reprojeter recalcule réellement les coordonnées, et il ne faut pas confondre les deux.
Les alternatives au shapefile
Le GeoPackage est un standard ouvert de l'Open Geospatial Consortium, construit sur une base de données SQLite dans un seul fichier .gpkg. Il accepte plusieurs couches, des noms de champs longs, de vraies dates et heures, des valeurs nulles et de gros jeux de données, et c'est le format par défaut de QGIS. C'est un bon choix pour transmettre un projet complet. Le GeoJSON est un format JSON en texte brut, normalisé sous le nom de RFC 7946. Il se lit facilement dans un éditeur de texte et c'est le format naturel des cartes web et des API, mais la norme attend des coordonnées en WGS84 et les fichiers deviennent lourds. Le FlatGeobuf est un format binaire plus récent, en un seul fichier, avec un index spatial intégré, conçu pour une lecture rapide et pour la diffusion en continu sur le web ; sa prise en charge progresse mais n'est pas encore aussi universelle que celle des autres.
Aucun d'eux ne convient à tous les cas. Le shapefile reste le choix le plus sûr lorsque vous ne savez pas quel logiciel utilise le destinataire, ou lorsqu'un système ou un client le demande explicitement. Lorsque ses limites deviennent gênantes, comme des noms de champs tronqués, des horodatages perdus ou des fichiers proches de 2 Go, la conversion en GeoPackage est généralement la solution la moins pénible.
Travailler avec des shapefiles dans votre navigateur avec FileReshape
Les outils shapefile de FileReshape lisent les parties avec GDAL compilé pour le web : les fichiers sont donc traités sur votre propre appareil et ne sont pas envoyés. La Visionneuse de shapefile affiche les entités sur une carte et la table attributaire, avec le type de chaque champ. Les convertisseurs shapefile en GeoJSON, shapefile en KML et shapefile en GeoPackage écrivent les mêmes données dans ces formats ; le GeoJSON et le KML sont écrits en WGS84, et le GeoPackage garde le système de coordonnées. Le convertisseur KML en shapefile fait le chemin inverse et écrit un .zip avec des fichiers .shp, .shx, .dbf, .prj et .cpg, un shapefile par type de géométrie. Vous pouvez déposer un .zip ou sélectionner les parties ensemble, et aucune conversion ne peut restaurer des noms déjà raccourcis à 10 caractères.
Questions fréquentes
Quels fichiers d'un shapefile sont obligatoires ?
Les fichiers .shp, .shx et .dbf sont obligatoires. Les fichiers .prj et .cpg sont facultatifs mais recommandés, et .sbn, .sbx, .qix et .shp.xml sont des index et des métadonnées dont on peut se passer.
Un shapefile peut-il contenir à la fois des points, des lignes et des polygones ?
Non. Chaque shapefile a un seul type de forme dans son en-tête. Des données mélangées doivent être réparties en un shapefile par type, ou stockées dans un format comme le GeoPackage ou le GeoJSON.
Pourquoi mon shapefile affiche-t-il des caractères étranges au lieu des lettres accentuées ?
Le programme a lu le .dbf avec le mauvais encodage. Choisissez le bon encodage à l'ouverture de la couche, ou ajoutez un fichier .cpg avec le bon nom, comme UTF-8 ou 1252.
Un shapefile peut-il stocker la date et l'heure ?
Il peut stocker une date, mais pas une heure. Les horodatages sont généralement conservés dans des champs texte, ou les données sont transférées dans un GeoPackage, qui dispose d'un vrai type date et heure.
Le shapefile est-il un format ouvert ?
Ses fichiers de géométrie et d'index sont documentés dans une description technique qu'Esri a publiée en 1998, et la table attributaire utilise le format dBASE, très connu : de nombreux logiciels gratuits et commerciaux lisent et écrivent donc des shapefiles.