Python Script-Beispiele für die Geoverarbeitung von Shapefiles ohne Verwendung von Arcpy

33

Ich möchte ein Python-Skript verwenden, das nicht auf arcpy basiert, um beispielsweise ein Shapefile nach Attributen abzufragen, eine neue Ebene aus der Auswahl zu erstellen, Flächen eines Polygons zu berechnen und Polygone in Punkte umzuwandeln.

Hat jemand Codebeispiele für die Verwendung anderer Python-Module oder -Bibliotheken? Ich bin in der Lage, dies leicht mit arcpy zu tun, aber ich wollte andere Optionen erkunden.

Sherpas
quelle
geopandas ist dein Freund für Vektordateien. Rasterio für Raster.
RutgerH

Antworten:

54

Das ist seltsam, als ob die Leute plötzlich die Leistungsfähigkeit von Python entdeckten (ohne ArcPy, das unter anderem nur ein Python-Modul ist), siehe zum Beispiel die Frage Shapefile in Python visualisieren :

  • Die geospatiale Verarbeitung in Python hat eine sehr lange Geschichte und ist viel älter als Arcpy (oder Arcgisscripting). > Die Fähigkeiten von ArcPy werden hier nicht "nachgeahmt", wie Paul sagt, die meisten waren bereits vor ArcPy vorhanden.
  • Die Referenz für die Python-Module ist der Python Package Index ( Pypi ), und es gibt einen eigenen Abschnitt: Topic :: Scientific / Engineering :: GIS
  • Mit diesen Modulen können Sie alles machen, und es ist oft einfacher und schneller als ArcPy, da es sich um reines Python handelt (keine Cursor ...).
  • Shapely ist eines dieser Module zur Bearbeitung von Geodatengeometrien -> Flächen eines Polygons berechnen und Polygone in Punkte umwandeln.
  • Wenn Sie Vektorebenen bearbeiten möchten, gibt es osgeo / ogr , Fiona oder Pyshp (und andere, weniger verwendete) -> Fragen Sie ein Shapefile nach Attributen ab, erstellen Sie eine neue Ebene aus der Auswahl, berechnen Sie Flächen eines Polygons, konvertieren Sie Polygone in Punkte
  • für die verarbeitung von rastern ist der standard osgeo / gdal
  • Für die räumliche Analyse gibt es Pysal
  • Für 3D können Sie andere wissenschaftliche Module wie Numpy oder Scipy verwenden (3D-Algorithmen, Gitter, aber auch Statistiken, Geostatistik, 2D oder 3D).
  • Und ich spreche nicht über Mapnik , Matplotlib / Basiskarte , Geodjango und ...

Sie können alle (Pysal mit Shapely, ...) kombinieren und mit den anderen wissenschaftlichen Modulen mischen.

Suchen Sie daher für Python-Skript-Beispiele nach Pyshp Fiona, ogr, gdal oder shapely in gis.stackexchange oder im Internet (viele Beispiele, nicht nur in Englisch).)
Eines davon in Französisch (die Skripte und Abbildungen sind universell!):
- Python: Verwenden von Vektor- und Rasterebenen in einer geologischen Perspektive, ohne GIS-Software und
eine andere in Englisch:
- GIS mit Python, Shapely und Fiona
und in Spanisch
- Bestimmen von Bereichen unregelmäßiger Polygone mithilfe der Koordinaten der Scheitelpunkte
in gis.stackexchange
- Höhenprofil 10 km pro Seite einer Linie
- Aktualisieren von Attributen mit Pyshp
- Wie erstelle ich ein 3D-Shapefile aus einem Raster?
- Python-Skript zum Ermitteln des Höhenunterschieds zwischen zwei Punkten
- usw

Das von Aaron vorgestellte Skript kann einfacher mit Fiona geschrieben werden, das nur Python-Wörterbücher verwendet:

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')

und wenn du formschön dazu verwendest:

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')

Es gibt auch zwei Bücher:

Python Geospatial Development von Eric Westra.

Bildbeschreibung hier eingeben

Lernen der Geodatenanalyse mit Python von Joel Lawhead

Bildbeschreibung hier eingeben

Python wird auch als Skriptsprache in anderen GIS-Anwendungen wie QGIS (Quantum GIS), GRASS GIS, gvSIG oder OpenJump oder 3D-Modellierern wie Paraview (und Blender auch!) Verwendet . In all diesen Anwendungen können Sie die meisten Geodatenmodule verwenden (siehe Visualisierung von QGIS-Daten mit Blender ).

17 Umdrehungen
quelle
Was ist das für ein Python Zeug von dem du sprichst;)
Nathan W
Fiona scheint einen DLL-Fehler unter Windows zu verursachen.
Multigoodverse
Wie haben Sie Fiona installiert? Für mich kein Problem
Gen
19

Ich empfehle die USU-Site Geoverarbeitung mit Python unter Verwendung von Open Source GIS , um Ihnen den Einstieg zu erleichtern. Sie verwenden in erster Linie die GDAL / OGR-Bibliothek während der Übungen. Die Installation von GDAL / OGR kann eine Herausforderung sein. Daher kann dieser Blogeintrag hilfreich für Sie sein: Installieren von GDAL (und OGR) für Python unter Windows . Schauen Sie sich auch Alternativen zur Verwendung von Arcpy unter GIS.SE an.

Mit dem folgenden OpenSource-Geoverarbeitungsskriptbeispiel (von der USU-Site) werden Attributdaten extrahiert und in eine Textdatei geschrieben:

# 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
quelle
4
.Destroyist eine wunderbare Methode Name: p
Jason
5

Möglicherweise interessieren Sie sich für GDAL / OGR .

GDAL wird zum Verarbeiten von Rastern verwendet, während OGR für Vektoren verwendet wird. Beide sind Open Source-Bibliotheken.

Wenn Sie Abhängigkeiten von ArcPy entfernen möchten, können Sie einige Funktionen nachahmen, indem Sie die Informationen in ein Array lesen und Ihre eigenen Berechnungen in reinem Python ausführen.

Ich habe dies kürzlich mit der Auswahl von Punkten in einem Polygon gemacht, wie hier gezeigt . Mithilfe des Ray Casting-Algorithmus wird anhand der Koordinaten der Eckpunkte des Polygons bestimmt, ob ein Punkt innerhalb eines Polygons liegt.

Paul
quelle
1
Bitte fügen Sie genug von der Essenz der Lösung hinzu, um sie zu erfassen und zu verstehen, bevor Sie die Seite besuchen und lesen. Mit der Zeit wird diese Seite wahrscheinlich nicht an dieser Adresse sein, was diese Antwort nicht sehr nützlich macht. :)
Matt Wilkie
1

Ich habe das noch nie persönlich benutzt, aber andere im Büro verwenden es gerne formschön: https://pypi.python.org/pypi/Shapely

Jason
quelle
Gibt es eine Möglichkeit, mit shapely einige Beispielcodes zu veröffentlichen?
Sherpas
5
Nur-Link-Antworten sind auf lange Sicht nicht hilfreich, da sie unweigerlich kaputt gehen. Bitte geben Sie genügend Informationen über das Ziel an, damit a) das neue Zuhause wiederentdeckt werden kann und b) das Wesentliche der Lösung erfasst und verstanden werden kann, bevor Sie die Seite besuchen und lesen.
Matt Wilkie