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
import shapefile # lecture d'un shapefile r = shapefile.Reader("cal") # géométries shapes = r.shapes() len(shapes) 69 #type shapes[1].shapeType 5 # 5 = polygone, voir tableau de correspondance dans Wikipedia shapes[1].bbox [166041.29064712161, 117797.22518872152, 166350.53212677286, 118171.99778449099] shapes[3].parts # pour les multi... # un des points constituant le polygone 2 shapes[2].points[1] [167406.88755870616, 117732.11791073898] # champs champs = r.fields print champs [('DeletionFlag', 'C', 1, 0),['FORMATION_', 'N', 11, 0],['SYMBOL', 'N', 11, 0]] # attributs du 2e élément print r.record(2) ['CRI',154] # géométrie (index) et attributs en même temps shapeRec = r.shapeRecord(2) >>> shapeRec.record[1:3] [2580.3201100000001,'CRI', 154] # index, attributs
- 4954 lectures
création de shapefile
import shapefile # utilisation de la classe writer w = shapefile.Writer(shapefile.POLYGON) # géométrie w.poly([[[1,5],[5,5],[5,1],[3,3],[1,1]]]) # définition des champs w.field('premier','C','40') w.field('second','C','40') # enregistrement des attributs w.record('un','deux') # création du shapefile (.shp, .shx, .dbf) w.save('polygone') # ou w = shapefile.Writer(shapefile.POINT) w.point(1,1) w.point(3,1) w = shapefile.Writer(shapefile.POLYLINE) w.line(parts=[[[1,5],[5,5],[5,1],[3,3],[1,1]]])
- 5185 lectures
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
import shapefile w = shapefile.Writer(shapeType=shapefile.POLYGONZ) #x,y,z et pour type=15, voir la documentation sur les shapefiles) w.poly([[[-89.0, 33, 12], [-90, 31, 11], [-91, 30, 12]]], shapeType=15) w.field("nom") w.record("test") w.save("MonpolyZ")
- 6323 lectures
fusion (merge) de fichiers shapefiles situés dans un répertoire
import glob import shapefile # choix des fichiers à traiter dans le répertoire files = glob.glob("*.shp") w = shapefile.Writer() r = shapefile.Reader() # extraction et créations des éléments for f in files: r = shapefile.Reader(f) w._shapes.extend(r.shapes()) w.records.extend(r.records()) w.fields = list(r.fields) # création du fichier w.save("fusionné")
- 4646 lectures
extraction d'éléments en fonction des attributs d'un shapefile
import shapefile # lecture du shapefile original r = shapefile.Reader("montest") # création du shapefile résultant w = shapefile.Writer(shapeType=shapefile.POLYGON) # copie de fichiers du Reader au Writer w.fields = list(r.fields) # sélection des éléments selection = [] for rec in enumerate(r.records()): if rec[1][1].startswith("portail"): selection.append(rec) # Ajout dans le nouveau fichier for rec in selection: w._shapes.append(r.shape(rec[0])) w.records.append(rec[1]) # création du fichier w.save("test_portail")
- 4306 lectures
ajout et suppression d'éléments
# ajout de points e = shapefile.Editor(shapefile="mespoints.shp") e.point(0,0,10,2) e.record("Appended","mespoints") e.save('mespoints') supression du premier objet d'un shapefile e = shapefile.Editor(shapefile="meslignes") e.delete(0) e.save('meslignes')
- 3921 lectures
modification de valeurs d' attributs
import shapefile e = shapefile.Editor("monshape") #lecture de la 3e ligne, colonne 5 valeur = e.records[3][5] # (il est possible de contrôler le type) type(valeur) <type 'str'> # modification valeur_mod = "coucou" # enregistrement du changement e.records[3][5] = valeur_mod e.save("monshape")
- 3439 lectures
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 Shapefile Library (documentation)
Site officiel : Shapefile (Wikipedia)
licence Creative Commons Paternité-Pas d'Utilisation Commerciale-Partage des Conditions Initiales à l'Identique Commerciale 2.0 France
Commentaires
Poster un nouveau commentaire