Skip to Content

Python et les Shapefiles


python

Lorsqu'en 1998, la firme ESRI publie les spécifications du format shapefile (http://www.esri.com/library/whitepap.../shapefile.pdf), elle fait oeuvre de pionnier en libérant ce format. Elle en fait un format universel non lié à une plateforme ni à un logiciel (contrairement à ses pratiques actuelles, Geodatabases and co...).


Il est vrai, qu'à l'époque la firme œuvrait encore dans le monde UNIX avant de se lier totalement à Windows.
Ces spécifications sont résumées sur le Wikipedia anglais (http://en.wikipedia.org/wiki/Shapefile).
En gros, les fichiers .shp et .shx sont des fichiers binaires avec une structure bien définie dans les divers tableaux des deux liens précédents.
Cela peut paraître du charabia à certains mais pas aux programmeurs qui savent alors comment les décoder et donc faire des programmes qui savent lire et écrire des shapefiles.

Le premier qui s'y colle est Frank Warderman qui dès 1998 sort une librairie C "Shapefile C Library" (opensource). Il développe ensuite Gdal/Ogr. La librairie, quant à elle évolue toujours (http://shapelib.maptools.org/) et on peut toujours l'utiliser.
Bernhard Herzog en a rapidement produit une implémentation python (python bindings): pyshapelib (ftp://intevation.de/users/bh/pyshapelib/) toujours aussi disponible et utilisable. Elle est utilisée, entre autres, par Thuban (http://thuban.intevation.org/), gis en python et par le module cartographique de matplotlib: Basemap (matplotlib.sourceforge.net/basemap/doc/html/)

Gdal/Ogr a aussi une implémentation Python, bien connue à l'heure actuelle.

Mapnik (www.mapnik.org/) permet aussi le traitement des shapefiles

Parallèlement, au lieu d' "emballer" une librairie C, comme les précédents, d'autres vont utiliser directement Python et ses modules standards. En effet, le module STRUCT (http://quentel.pierre.free.fr/python...le-struct.html - pour une référence en français) permet de lire et de traiter les données binaires pour les rendre accessibles à des traitements futurs. Dans un premier temps, au lieu d'en faire des librairies, ils vont décrire la démarche

Si je prends un simple exemple, en utilisant l'en tête(100 bytes) du fichier .shp d'après Wikipedia :

Bytes Type Endianness Usage
...
32–35 int32 little Shape type
36–67 double little Minimum bounding rectangle (MBR) of all shapes contained within the shapefile; four doubles in the following order: min X, min Y, max X, max Y
...

Ça a l'air compliqué comme ça mais en gros on a :

  • le type de shape (point, ligne polygone...32-35 ),
  • le cadre (bounding-box) 36-67


Prenons un fichier shapefile de polygones (les symboles <l ou <dddd permettent de traiter l'encodage de Type et Endianness) :

python_shp

  1. >>> import struct
  2. >>> fichier='testpoly.shp'
  3. >>> f = open(fichier,'rb')
  4. >>> shpread = f.read(100) #lecture des 100 premiers bytes
  5. >>> shptype = struct.unpack('<l',shpread[32:36]) #type de shape
  6. >>> print shptype[0]
  7. 5 # 5 = polygone, voir tableau de correspondance dans Wikipedia
  8. >>> box = struct.unpack('<dddd',shpread[36:68]) # cadre global du shapefile
  9. >>> print box
  10. (-0.009020000000000002, -0.0050160000000000005, 0.0055000000000000014, 0.007392000000000001)

et ainsi de suite. Pour les divers objets dans le shapefile il y a un en tête (8 byte) avec comme premier élément le numero, et le second la longueur, ensuite l'objet géométrique proprement dit (suivant les cas, cord. x,y (point), liste de coordonnées xy (lignes, polygones etc.)).
Je ne continue pas de peur de décourager certains mais finalement des modules sont arrivés et l'examen de ceux-ci permet d'en savoir plus :


Pour les modules permettant de lire les fichiers dbf, l'histoire est à peu de chose près la même.

On le voit, les possibilités sont multiples et variées.


Site officiel : Python

Commentaires

Poster un nouveau commentaire

Le contenu de ce champ sera maintenu privé et ne sera pas affiché publiquement.