Alternativen zur Verwendung von Arcpy


69

Ich verwende das Arcpy-Site-Paket von ESRI für praktisch alle meine Python-Geoverarbeitungsvorgänge. Es ist ESRI zu verdanken, dass dies eine unglaubliche Sammlung von Tools ist, die dabei helfen können, viel zu erreichen. Ich möchte jedoch auch Geoverarbeitungsskripte außerhalb der ESRI Arcpy-Domäne erstellen. Wenn ich beispielsweise ein Raster in ein Polygon schneiden möchte, beginne ich mit dem folgenden Skript von ESRI :

# Import system modules
import arcpy
from arcpy import env
from arcpy.sa import *

# Set environment settings
env.workspace = "C:/sapyexamples/data"

# Set local variables
inRaster = "elevation"
inMaskData = "mask.shp"

# Check out the ArcGIS Spatial Analyst extension license
arcpy.CheckOutExtension("Spatial")

# Execute ExtractByMask
outExtractByMask = ExtractByMask(inRaster, inMaskData)

# Save the output 
outExtractByMask.save("C:/sapyexamples/output/extractmask")  

Ich bin nicht sicher, wie ich die gleiche Aufgabe ohne Arcpy programmgesteuert ausführen würde. Meine Fragen an die ernsthaften Programmierer: Welche Sammlung von Python-Tools verwenden Sie, um Aufgaben auszuführen, die ESRI-Benutzer mit dem Arcpy-Site-Paket ausführen würden? Wo soll ich anfangen?


Antworten:


45

GDAL ist das zu verwendende Tool. Tatsächlich ist der gesamte Aufruf eine Zeile für gdal_rasterize:

gdal_rasterize -l mask -i -burn -9999 mask.shp elevation.tif

wenn du den no data wert des dem kennst

Für einige Python-Steuerung:

lyr = 'mask'
shp = 'mask.shp'
dem = 'elevation.tif'
ndv = -9999
p = os.Popen('gdal_rasterize -l %s -i -burn %d %s %s' % (lyr,ndv,shp,dem)

wo Ihre Variablen in Python gesetzt werden könnten

Für volle Python:

from osgeo import gdal, ogr
from osgeo.gdalconst import *
shp = ogr.Open('mask.shp')
lyr = shp.GetLayer('mask')
dem = gdal.Open('elevation.tif', GA_Update)
ndv = dem.GetRasterBand(1).GetNoDataValue()
gdal.RasterizeLayer(dem, 1, lyr, None, ndv) # other options, such as transformer func, creation options...
dem = None

Ich habe gerade einen kurzen Blick auf die Syntax für die C-API geworfen, daher ist meine Syntax für Python wahrscheinlich ein wenig veraltet. Siehe gdal_alg.h: http://gdal.org/gdal__alg_8h.html


29


20

In vielen meiner akademischen Forschungen arbeite ich mit LiDAR-Daten und analysiere Oberflächen für die Geomorphologie. Ich stellte schnell fest, dass die Ausführung vieler Operationen mit Arcpy sehr langsam war, insbesondere bei großen Datenmengen. Als Ergebnis begann ich mit:

  • pyshp zum Manipulieren von Shapefiles und Aktualisieren von Attributtabellen
  • numpy , um ASCII-Raster zu verwalten und kernelbasierte Analysen wie z. B. Krümmungsberechnungen durchzuführen
  • Mit scipy können Sie statistische Analysen der Ergebnisse und Kurvenanpassungen für Flächen durchführen
  • matplotlib zum Plotten von Diagrammen und anderen grafischen Ergebnissen, z. B. Grundkarten für eine schnelle Visualisierung

Ich würde das Buch " Quantitative Modellierung von Erdoberflächenprozessen" auch jedem empfehlen, der mehr über die Analyse von Rasteroberflächen erfahren möchte. Das Buch enthält hervorragende Codebeispiele in C ++, die wesentlich effizienter sind als die ArcGIS-Tools. Diese Algorithmen können auch nach Python portiert werden, ohne dass etwas Komplexeres als Numpy erforderlich ist, obwohl sie in C ++ viel schneller ausgeführt werden.


16

Für Leute, die ESRI verwenden, ist GRASS meiner Meinung nach eine sehr ähnliche Umgebung mit einer GUI-Python-Umgebung, die in separaten "Toolkits" für verschiedene Aufgaben (Raster, Vektor, Solar-Toolkits usw.) organisiert ist. Das Scripting hat neben Python noch andere Optionen, aber so benutze ich es.

Schauen Sie sich auf jeden Fall diesen tollen Link an, der aktuell ist (glaube ich): http://grass.osgeo.org/wiki/GRASS_and_Python

BEARBEITEN: Ein weiterer Link für Personen mit Hintergrundinformationen in ESRI: http://grass.osgeo.org/wiki/GRASS_migration_hints

Ich unterstütze auch den Antrag von GDAL. Es ist von unschätzbarem Wert und ich würde ohne es verloren gehen.


1
Neu in GRASS GIS 7: pyGRASS, siehe ing.unitn.it/~zambelli/projects/pygrass
markusN


16

Ich denke, die bisher gegebenen Antworten decken grundsätzlich alle erwähnenswerten Pakete ab (insbesondere GDAL, OGR, pyshp, NumPy).

Es gibt aber auch das GIS- und Python-Softwarelabor , das eine Reihe interessanter Module beherbergt. Sie sind:

  • Fiona : OGRs übersichtlichere API
  • Rtree : räumlicher Index für Python GIS
  • Formschön : Python-Paket zur Manipulation und Analyse von Features in der kartesischen Ebene

Persönlich habe ich in letzter Zeit angefangen, mit GDAL / OGR herumzuspielen und fand sie sehr beeindruckend in Bezug auf Geschwindigkeit und Abdeckung der Analysewerkzeuge.

Hier einige Beispiele zur Verwendung der Methoden (entnommen aus dieser hervorragenden Quelle, die ein sehr guter Ausgangspunkt ist):

# To select by attribute:
.SetAttributeFilter("soil = 'clay'")

# To select by location, either:
.SetSpatialFilter(<geom>)   

# or
.SetSpatialFilterRect(<minx>, <miny>, <maxx>, <maxy>)

# DataSource objects have a method `ExecuteSQL(<SQL>)`
.ExecuteSQL("SELECT* FROM sites WHERE soil = 'clay' ORDER BY id DESC")


# Plus all the well known tools, like:

# intersect
poly2.Intersect(<geom_1>)

# disjoint?
<geom>.Disjoint(geom_1)

# touches (on the edge?)
<geom>.Touches(geom_1)

# cross each other?
<geom>.Crosses(geom_1)

# within?
<geom>.Within(geom_1)

#contains?
<geom>.Contains(ptB)

# overlaps?
<geom>.Overlaps(geom_1)

## geoprecessing
<geom>.Union(<geom_1>)
<geom>.Intersection(<geom_1>)
<geom>.Difference(<geom_1>)
<geom>.SymmetricDifference(<geom_1>)

# Buffer (returns a new geometry)
<geom>.Buffer(<distance>)

# Are the geometries equal?
<geom1>.Equal(<geom2>)

# Returns the shortest distance between the two geometries
<geom1>.Distance(<geom2>)

# Returns the geometry's extent as a list (minx, maxx, miny, maxy)
<geom>.GetEnvelope()

Das Schöne an diesen Tools ist, dass Sie bei der Implementierung sehr flexibel sind. Ich habe zum Beispiel meine eigene Klasse geschrieben CreateGeometry(), um Vektordateien einfach von Grund auf neu zu erstellen. Wenn Ihr Interesse besteht, kann ich es auch hier posten, obwohl ich denke, dass es den Rahmen der Frage sprengt.


10

Ich weiß, dass Ihre Frage Python-zentriert ist, aber R verfügt über eine Fülle wertstatistischer Analysemethoden, von denen einige für die räumliche Analyse verwendet werden können. @WhuberHier finden Sie eine gute Antwort , um zu veranschaulichen, wie ein Raster in zwei Zeilen auf eine Box geschnitten wird.


6
Um es wieder zu Python zu bringen, können Sie die RPy-Bibliothek verwenden . RPy ist eine sehr einfache und dennoch robuste Python-Schnittstelle zur Programmiersprache R. Es kann alle Arten von R-Objekten verwalten und beliebige R-Funktionen (einschließlich der Grafikfunktionen) ausführen. Alle Fehler aus der R-Sprache werden in Python-Ausnahmen konvertiert. Jedes für das R-System installierte Modul kann in Python verwendet werden.
RyanDalton

6

Meine Lösung, die schnelle Lösung, besteht darin, GDAL mit Python zu verwenden.

Du musst

Unterprozess importieren

Befehl = "gdalwarp -of GTiff -cutline clipArea.shp -cl area_of_interest -crop_to_cutline inData.asc outData.tiff"

subprocess.call (['C: \ Temp \ abc \ Notepad.exe'])

(Aus der Antwort hier: Raster mit Vektorebene mit GDAL beschneiden )

Natürlich sollten Sie in der Lage sein, dies mit reinem Python zu erreichen, aber ich musste es nicht tun. Und ich habe fast immer GDAL in der Nähe! Die Flexibilität von GDAL ist fantastisch, insbesondere in einer Linux-Umgebung. Es verarbeitet riesige Raster, kann mit Python- oder Shell-Skripten verknüpft werden und es gibt Funktionen für viele Dinge. Siehe auch OGR für vektorbasierte Werkzeuge.


4

Wenn es Ihnen nichts ausmacht, PostGIS auszuführen, kann es die meisten räumlichen Daten für Sie verarbeiten.

PDF-Spickzettel:

http://www.postgis.us/downloads/postgis20_cheatsheet.pdf

Es integriert sich in Python:

https://publicwiki.deltares.nl/display/OET/Accessing+PostgreSQL+PostGIS+with+Python

Mit unterstützenden Tools wie SPIT in Quantum GIS oder pgAdmin sind Sie gut gerüstet, um PostGIS einzurichten. Anschließend können Sie mit Python die PostGIS-Vorgänge für Ihre Geodaten steuern.


3

Ich habe an einer Open-Source- Geoverarbeitungsbibliothek namens WhiteboxTools gearbeitet , die in vielen Anwendungen anstelle von ArcPy verwendet werden kann. Derzeit stehen fast 300 Tools für die Verarbeitung von Raster-, Vektor- und LiDAR-Daten (LAS) zur Verfügung. Es ist jedoch geplant, alle über 400 in Whitebox GAT verfügbaren Tools zu portieren . Obwohl die Tools mit der Programmiersprache Rust (aus Effizienzgründen) entwickelt wurden, kann jedes Tool von Python aus aufgerufen werden, wie im folgenden Beispiel dargestellt:

from whitebox_tools import WhiteboxTools

wbt = WhiteboxTools()

# Set the working directory. This is the path to the folder containing the data,
# i.e. files sent to tools as input/output parameters. You don't need to set
# the working directory if you specify full path names as tool parameters.
wbt.work_dir = "/path/to/data/"

# The most convenient way to run a tool is to use its associated method, e.g.:
wbt.elev_percentile("DEM.tif", "output.tif", 15, 15)

# You may also provide an optional custom callback for processing output from the
# tool. If you don't provide a callback, and verbose is set to True, tool output
# will simply be printed to the standard output.
def my_callback(value):
    if user_selected_cancel_btn: # Assumes a 'Cancel' button on a GUI
        print('Cancelling operation...')
        wbt.cancel_op = True
    else:
        print(value)

wbt.breach_depressions('DEM.flt', 'DEM_breached.flt', callback=my_callback)

# List all available tools in WhiteboxTools
print(wbt.list_tools())

# Lists tools with 'lidar' or 'LAS' in tool name or description.
print(wbt.list_tools(['lidar', 'LAS']))

# Print the help for a specific tool.
print(wbt.tool_help("ElevPercentile"))

# Want to read the source code for a tool?
# 'view_code' opens a browser and navigates to a tool's  
# source code in the WhiteboxTools GitHub repository
wbt.view_code('watershed')

Weitere Informationen finden Sie im WhiteboxTools-Benutzerhandbuch . Die Bibliothek ist eigenständig und weist keine weiteren Abhängigkeiten auf. Sie müssen lediglich die kleine Datei (<5 MB) herunterladen, die sich hier befindet . Die Download-Datei enthält die WhiteboxTools-Exe, das Skript whitebox_tools.py , das die Python-API für die Bibliothek (die in der obersten Zeile des obigen Skripts importiert wird) sowie das Benutzerhandbuch. Es gibt auch eine sehr einfache tkinter-GUI (wb_runner.py) für die Anbindung an die Bibliothek.

Die zulässige MIT-Lizenz soll die Integration von WhiteboxTools als Back-End in andere Open-Source-GIS ermöglichen. Alexander Bruy hat ein QGIS-Plugin für das WhiteboxTools- Backend entwickelt . Sie können bei Bedarf auch Tools von WhiteboxTools und ArcPy in einem einzigen Skript mischen und abgleichen. Die Bibliothek ist noch ein wenig experimentell und wurde von der Geomorphometrie- und Hydrogeomatik-Forschungsgruppe der Universität Guelph entwickelt. Derzeit liegt eine Version vor Version 1.0 vor, die bei der Verwendung berücksichtigt werden sollte.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.