Skip to Content

Nous adressons toutes nos pensées à la famille de notre ami Jérôme !

http://www.forumsig.org/showthread.php/43488-Disparition-de-Phoenix

Python et les shapefiles (suite) ou le module le plus simple à utiliser (un seul fichier, sans dépendance)

Niveau Intermédiaire
Logiciels utilisés Python
Python Shapefile Library (pyshp) (1)
Python Shapefile Library (pyshp) (2)
Plateforme Windows | Mac | Linux | FreeBSD

Il y a déjà bien longtemps que « Python et les shapefiles » est paru et depuis lors est sorti le module le plus simple à utiliser pour traiter les shapefiles : un simple fichier .py écrit en Python pur, sans aucune dépendance.

En novembre 2010,  Joel Lawhead sortait son module « Python Shapefile Library » (geospatialpython.com/2010/11/introducing-python-shapefile-library.html). Cette bibliothèque se contente de lire, de créer et / ou de modifier des fichiers shapefiles (géométrie et attributs) sans s'occuper d'autres choses (à l'inverse des autres comme ogr). Son but est d'avoir un fichier très simple à utiliser

"This library simply reads and writes shapefiles with no support for geometry calculations or the other eight or nine other supporting and undocumented shapefile formats including indexes and projection files which have been added since the specification was published in 1998."

exemples de lecture et de création d'un shapefile  :

lecture d'un shapefile

  1. import shapefile
  2.  
  3. # lecture d'un shapefile
  4. r = shapefile.Reader("cal")
  5.  
  6. # géométries
  7. shapes = r.shapes()
  8. len(shapes)
  9. 69
  10.  
  11. #type
  12. shapes[1].shapeType
  13. 5 # 5 = polygone, voir tableau de correspondance dans Wikipedia
  14.  
  15. shapes[1].bbox
  16. [166041.29064712161, 117797.22518872152, 166350.53212677286, 118171.99778449099]
  17. shapes[3].parts # pour les multi...
  18.  
  19. # un des points constituant le polygone 2
  20. shapes[2].points[1]
  21. [167406.88755870616, 117732.11791073898]
  22.  
  23. # champs
  24. champs = r.fields
  25. print champs
  26. [('DeletionFlag', 'C', 1, 0),['FORMATION_', 'N', 11, 0],['SYMBOL', 'N', 11, 0]]
  27.  
  28. # attributs du 2e élément
  29. print r.record(2)
  30. ['CRI',154]
  31.  
  32. # géométrie (index) et attributs en même temps
  33. shapeRec = r.shapeRecord(2)
  34. >>> shapeRec.record[1:3]
  35. [2580.3201100000001,'CRI', 154]
  36. # index, attributs

création de shapefile

  1. import shapefile
  2.  
  3. # utilisation de la classe writer
  4. w = shapefile.Writer(shapefile.POLYGON)
  5.  
  6. # géométrie
  7. w.poly([[[1,5],[5,5],[5,1],[3,3],[1,1]]])
  8.  
  9. # définition des champs
  10. w.field('premier','C','40')
  11. w.field('second','C','40')
  12.  
  13. # enregistrement des attributs
  14. w.record('un','deux')
  15.  
  16. # création du shapefile (.shp, .shx, .dbf)
  17. w.save('polygone')
  18.  
  19.  
  20. # ou
  21. w = shapefile.Writer(shapefile.POINT)
  22. w.point(1,1)
  23. w.point(3,1)
  24.  
  25. w = shapefile.Writer(shapefile.POLYLINE)
  26. w.line(parts=[[[1,5],[5,5],[5,1],[3,3],[1,1]]])

Principes

Le module (un seul fichier) se compose d'une classe Reader, d'une classe Writer, et d'une classe Editor qui, comme son nom l'indique, vous permet de modifier le shapefile.

Il est basé sur le module struct de la distibution standard, déjà vu dans  « Python et les shapefiles » où la procédure pour décoder les fichiers .shp et .dbf  a été abordée. De ce fait, il est portable et utilisable localement (sans devoir nécessairement être placé dans site-packages).

Il fonctionne donc aussi avec toutes les autres implémentations de Python comme Jython (voir   « Python: géospatial, dialectes (standard, pour ESRI, pour FME, pour GvSIG etc.) »). Il existe aussi une implémentation pour les versions 3.x de Python. 

Pour aller plus loin

Il permet de faire beaucoup d'autres choses :

création de shapefile 3D

  1. import shapefile
  2.  
  3. w = shapefile.Writer(shapeType=shapefile.POLYGONZ)
  4.  
  5. #x,y,z et pour type=15, voir la documentation sur les shapefiles)
  6. w.poly([[[-89.0, 33, 12], [-90, 31, 11], [-91, 30, 12]]], shapeType=15)
  7.  
  8. w.field("nom")
  9. w.record("test")
  10. w.save("MonpolyZ")

fusion (merge) de fichiers shapefiles situés dans un répertoire

  1. import glob
  2. import shapefile
  3.  
  4. # choix des fichiers à traiter dans le répertoire
  5. files = glob.glob("*.shp")
  6. w = shapefile.Writer()
  7. r = shapefile.Reader()
  8. # extraction et créations des éléments
  9. for f in files:
  10. r = shapefile.Reader(f)
  11. w._shapes.extend(r.shapes())
  12. w.records.extend(r.records())
  13. w.fields = list(r.fields)
  14.  
  15. # création du fichier
  16. w.save("fusionné")

extraction d'éléments en fonction des attributs d'un shapefile

  1. import shapefile
  2.  
  3. # lecture du shapefile original
  4. r = shapefile.Reader("montest")
  5.  
  6. # création du shapefile résultant
  7. w = shapefile.Writer(shapeType=shapefile.POLYGON)
  8.  
  9. # copie de fichiers du Reader au Writer
  10. w.fields = list(r.fields)
  11.  
  12. # sélection des éléments
  13.  
  14. selection = []
  15. for rec in enumerate(r.records()):
  16. if rec[1][1].startswith("portail"):
  17. selection.append(rec)
  18.  
  19. # Ajout dans le nouveau fichier
  20. for rec in selection:
  21. w._shapes.append(r.shape(rec[0]))
  22. w.records.append(rec[1])
  23.  
  24. # création du fichier
  25. w.save("test_portail")

ajout et suppression d'éléments

  1. # ajout de points
  2. e = shapefile.Editor(shapefile="mespoints.shp")
  3. e.point(0,0,10,2)
  4. e.record("Appended","mespoints")
  5. e.save('mespoints')
  6.  
  7. supression du premier objet d'un shapefile
  8. e = shapefile.Editor(shapefile="meslignes")
  9. e.delete(0)
  10. e.save('meslignes')

modification de valeurs d' attributs

  1. import shapefile
  2.  
  3. e = shapefile.Editor("monshape")
  4.  
  5. #lecture de la 3e ligne, colonne 5
  6. valeur = e.records[3][5]
  7. # (il est possible de contrôler le type)
  8. type(valeur)
  9. <type 'str'>
  10.  
  11. # modification
  12. valeur_mod = "coucou"
  13.  
  14. # enregistrement du changement
  15. e.records[3][5] = valeur_mod
  16.  
  17. e.save("monshape")

Joel Lawhead sur son blog   geospatialpython.com/ montre aussi comment

  • modifier le type de shapefiles (polygone vers lignes et points, par exemple)
  • créer d'un fichier .prj associé
Site officiel : Python et les Shapefiles
Site officiel : Python Shapefile Library (documentation)
Site officiel : Shapefile (Wikipedia)


Creative Commons License
licence Creative Commons Paternité-Pas d'Utilisation Commerciale-Partage des Conditions Initiales à l'Identique Commerciale 2.0 France

Commentaires

Poster un nouveau commentaire

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