Exemples de scripts Python pour le géotraitement de fichiers de formes sans utiliser arcpy

33

J'aimerais utiliser un script Python non basé sur arcpy pour interroger un fichier de formes par attributs, créer un nouveau calque à partir d'une sélection, calculer les zones d'un polygone et convertir des polygones en points.

Quelqu'un a-t-il des exemples de code d'utilisation d'autres modules ou bibliothèques Python? Je suis capable de le faire facilement en utilisant arcpy mais je voulais explorer d'autres options.

sherpas
la source
geopandas est votre ami pour les fichiers vectoriels. Rasterio pour raster.
RutgerH

Réponses:

54

C'est étrange, comme si les gens découvraient soudain le pouvoir de Python (sans ArcPy, qui n'est qu'un module parmi d'autres), voir par exemple la question Visualiser le fichier de formes en Python :

  • le traitement géospatial en Python a une très longue histoire, beaucoup plus ancienne qu'Arcpy (ou arcgisscripting) -> pas de "imiter" les capacités d'ArcPy ici, comme le dit Paul, la plupart étaient déjà présentes avant ArcPy.
  • la référence pour les modules Python est l' indice de package Python ( Pypi ) et une section est dédiée: Sujet :: Scientifique / Ingénierie :: SIG
  • vous pouvez faire n'importe quoi avec ces modules et c'est souvent plus facile et plus rapide que ArcPy car c'est du pur Python (pas de curseurs ...).
  • Shapely est l’un de ces modules permettant de traiter les géométries géospatiales -> calculer les superficies d’un polygone et convertir des polygones en points ..
  • si vous voulez traiter des couches vectorielles, il y a osgeo / ogr , Fiona ou Pyshp (et autres, moins utilisés) -> interroger un fichier de formes par attributs, créer un nouveau calque à partir de la sélection, calculer les zones d'un polygone, convertir des polygones en points
  • pour le traitement des rasters, la norme est osgeo / gdal
  • pour l'analyse spatiale, il y a Pysal
  • pour la 3D, vous pouvez utiliser d'autres modules scientifiques tels que numpy ou scipy (algorithmes 3D, grilles, mais aussi statistiques, géostatistique, 2D ou 3D)
  • Et je ne parle pas de mapnik , matplotlib / basemap , GeoDjango et ...

Vous pouvez combiner tous (Pysal avec galbe, ...) et les mélanger avec les autres modules scientifiques.

Ainsi, pour des exemples de scripts Python, recherchez Pyshp Fiona, ogr, gdal ou galbé dans gis.stackexchange ou sur Internet (nombreux exemples, et pas seulement en anglais).)
L'un d'eux en français (les scripts et les figures sont universels!):
- Python: utilisation de couches vectorielles et matricielles dans une perspective géologique, sans logiciel SIG,
autre en anglais:
- SIG avec Python, Shapely et Fiona
et en espagnol
- Détermination des superficies de polygones irréguliers à l'aide des coordonnées des sommets
de gis.stackexchange
- Profil d'altitude de 10 km de chaque côté d'une ligne
- Mise à jour des attributs avec Pyshp
- Comment créer un fichier de formes 3D à partir d'un raster?
- Script Python pour obtenir la différence d'altitude entre deux points
- etc

Le script présenté par Aaron s’écrit plus simplement avec Fiona qui n’utilise que les dictionnaires Python:

import fiona
with fiona.open('sites.shp', 'r') as input:
    with open('hw1a.txt', 'w') as output:
       for pt in input:
           id = pt['properties']['id']
           cover = pt['properties']['cover']
           x = str(point['geometry']['coordinates'][0])
           y = str(point['geometry']['coordinates'][21])
           output.write(id + ' ' + x + ' ' + y+ ' ' + cover + '\n')

et si vous utilisez galbé en plus:

from shapely.geometry import shape
with fiona.open('sites.shp', 'r') as input:
    with open('hw1a.txt', 'w') as output:
       for pt in input:
           id = pt['properties']['id']
           cover = pt['properties']['cover']
           x = str(shape(pt['geometry']).x)
           y = str(shape(pt['geometry']).y)
           output.write(id + ' ' + x + ' ' + y+ ' ' + cover + '\n')

Il y a aussi deux livres:

Développement géospatial en python d’Eric Westra.

entrez la description de l'image ici

Apprendre l'analyse géospatiale avec Python de Joel Lawhead

entrez la description de l'image ici

Python est également utilisé comme langage de script dans d'autres applications SIG telles que QGIS (Quantum GIS), GRASS GIS, gvSIG ou OpenJump ou des modélisateurs 3D comme Paraview (et Blender également!). Et vous pouvez utiliser la majorité des modules géospatiaux dans toutes ces applications (voir Visualisation des données QGIS avec Blender ).

17 revs
la source
Qu'est-ce que c'est que ce truc Python dont vous parlez;)
Nathan W
Fiona semble générer une erreur de DLL sous Windows.
multigoodverse
Comment avez-vous installé Fiona? pas de problème pour moi
gene
19

Je recommande vivement le site USU Geoprocessing with Python utilisant un SIG Open Source pour vous aider à démarrer. Ils utilisent principalement la bibliothèque GDAL / OGR tout au long des exercices. L'installation de GDAL / OGR peut être un peu difficile, cette entrée de blog peut vous être utile: Installation de GDAL (et OGR) pour Python sous Windows . Consultez également Alternatives à l’utilisation d’Arcpy sur GIS.SE.

L'exemple de script de géotraitement opensource suivant (du site USU) permet d'extraire des données d'attributs et de les écrire dans un fichier texte:

# import modules
import ogr, os, sys

# set the working directory
os.chdir('f:/data/classes/python/data')

# open the output text file for writing
file = open('hw1a.txt', 'w')

# get the shapefile driver
driver = ogr.GetDriverByName('ESRI Shapefile')

# open the data source
datasource = driver.Open('sites.shp', 0)
if datasource is None:
  print 'Could not open file'
  sys.exit(1)

# get the data layer
layer = datasource.GetLayer()

# loop through the features in the layer
feature = layer.GetNextFeature()
while feature:

  # get the attributes
  id = feature.GetFieldAsString('id')
  cover = feature.GetFieldAsString('cover')

  # get the x,y coordinates for the point
  geom = feature.GetGeometryRef()
  x = str(geom.GetX())
  y = str(geom.GetY())

  # write info out to the text file
  file.write(id + ' ' + x + ' ' + y + ' ' + cover + '\n')

  # destroy the feature and get a new one
  feature.Destroy()
  feature = layer.GetNextFeature()

# close the data source and text file
datasource.Destroy()
file.close()
Aaron
la source
4
.Destroyest un nom de méthode génial: p
Jason
5

Vous pourriez être intéressé par GDAL / OGR .

GDAL est utilisé pour le traitement des rasters, tandis que OGR est utilisé pour les vecteurs. Les deux sont des bibliothèques open source.

Si vous souhaitez supprimer certaines dépendances sur ArcPy, vous pouvez reproduire certaines fonctionnalités en lisant les informations dans un tableau et en exécutant vos propres calculs en pur Python.

Je l'ai fait récemment en sélectionnant des points dans un polygone, comme on le voit ici . Il utilise l'algorithme de diffusion de rayons pour déterminer si un point se trouve dans un polygone, en fonction des coordonnées des sommets du polygone.

Paul
la source
1
s'il vous plaît inclure suffisamment d'essence de la solution peut être saisi et compris avant d'aller visiter et lire la page. Avec le temps, cette page ne sera probablement pas à cette adresse, ce qui rendra cette réponse peu utile. :)
Matt Wilkie
1

Je n'ai jamais utilisé cela personnellement, mais d'autres personnes au bureau aiment utiliser galbé: https://pypi.python.org/pypi/Shapely

Jason
la source
Avez-vous une chance de poster des exemples de codes en utilisant galbé?
Sherpas
5
Les réponses par lien ne sont pas utiles à long terme, car elles deviennent inévitablement brisées. Veuillez inclure suffisamment d'informations sur la destination pour a) que sa nouvelle maison puisse être redécouverte et b) que l'essence de la solution puisse être appréhendée et comprise avant de vous rendre sur place et de lire la page.
matt wilkie