Alternatywy dla korzystania z Arcpy

69

Wydaje mi się, że używam pakietu witryny Arcpy ESRI do praktycznie wszystkich procesów geoprzetwarzania Pythona. Trzeba przyznać, że jest to niesamowity zestaw narzędzi, które mogą pomóc w osiągnięciu znacznej kwoty. Chciałbym jednak również tworzyć skrypty geoprzetwarzania poza domeną Arcpy ESRI. Na przykład, jeśli chcę przyciąć raster do wielokąta, zacznę od następującego skryptu z 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")  

Nie jestem pewien, jak miałbym programowo wykonać to samo zadanie bez Arcpy. Moje pytania do poważnych programistów: Jakiej kolekcji narzędzi Python używasz do wykonywania zadań, które użytkownicy ESRI wykonaliby za pomocą pakietu witryny Arcpy? Gdzie mam zacząć?

Aaron
źródło

Odpowiedzi:

45

GDAL to narzędzie do użycia. W rzeczywistości całe połączenie jest jedną linią dla gdal_rasterize:

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

jeśli znasz wartość danych dem

Dla niektórych kontroli Pythona:

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)

gdzie twoje zmienne mogą być ustawione w pythonie

Pełny 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

Właśnie rzuciłem okiem na składnię dla C API, więc moja składnia dla Pythona jest prawdopodobnie trochę zła. Zobacz gdal_alg.h: http://gdal.org/gdal__alg_8h.html


źródło
29

Na tej stronie znajdziesz wiele innych podobnych pytań, które zadają to samo podstawowe pytanie i mają bardzo dobre referencje. Najbardziej podobny (i szczegółowy) to:

Inne obejmują:

RyanDalton
źródło
20

W wielu moich badaniach akademickich pracuję z danymi LiDAR, wykonując analizy powierzchni dla geomorfologii. Szybko przekonałem się, że wykonywanie wielu operacji przy użyciu arcpy było bardzo wolne, szczególnie w przypadku dużych zestawów danych. W rezultacie zacząłem używać:

  • pyshp do manipulowania plikami kształtów i aktualizowania tabel atrybutów
  • numpy do zarządzania rastrami ASCII i wykonywania analiz opartych na jądrze, takich jak obliczenia krzywizny
  • scipy do przeprowadzenia analizy statystycznej wyników i dopasowania krzywej powierzchni
  • matplotlib do drukowania wykresów i innych wyników graficznych, takich jak podstawowe mapy do szybkich wizualizacji

Poleciłbym również książkę Ilościowe modelowanie procesów powierzchniowych Ziemi każdemu, kto chce dowiedzieć się więcej o analizie powierzchni rastrowych. Książka zawiera wspaniałe przykłady kodu w C ++, które są znacznie wydajniejsze niż narzędzia ArcGIS. Algorytmy te mogą być również przeniesione do Pythona bez potrzeby użycia bardziej złożonego niż numpy, chociaż działają znacznie szybciej w C ++.

sgrieve
źródło
16

Dla osób używających ESRI myślę, że GRASS byłoby bardzo podobnym środowiskiem ze środowiskiem Python z graficznym interfejsem użytkownika i zorganizowanym w oddzielnych „zestawach narzędzi” do różnych zadań (zestawy rastrowe, wektorowe, słoneczne itp.). Skrypty mają inne opcje oprócz Pythona, ale właśnie z tego korzystam.

Zdecydowanie sprawdź ten świetny link, który jest aktualny (wierzę): http://grass.osgeo.org/wiki/GRASS_and_Python

EDYCJA: kolejny link dla osób posiadających doświadczenie w ESRI: http://grass.osgeo.org/wiki/GRASS_migration_hints

Popieram także wniosek GDAL. Jest nieoceniony i bez niego zgubiłbym się.

s_a
źródło
1
Nowości w GRASS GIS 7: pyGRASS, patrz ing.unitn.it/~zambelli/projects/pygrass
markusN
16

Myślę, że dotychczasowe odpowiedzi obejmują w zasadzie wszystkie pakiety, o których warto wspomnieć (szczególnie GDAL, OGR, pyshp, NumPy)

Ale jest też GIS i Python Software Laboratory , w którym znajduje się kilka interesujących modułów. Oni są:

  • Fiona : zgrabniejszy interfejs API OGR
  • Rtree : indeks przestrzenny dla Python GIS
  • Foremna : pakiet Pythona do manipulacji i analizy cech w płaszczyźnie kartezjańskiej

Osobiście zacząłem ostatnio bawić się GDAL / OGR i przekonałem się, że są imponujące pod względem szybkości i zasięgu narzędzi analitycznych.

Oto kilka przykładów użycia metod (wziętych z tego doskonałego źródła, które jest bardzo dobrym punktem wyjścia):

# 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()

Zaletą tych narzędzi jest to, że jesteś bardzo elastyczny w ich wdrażaniu. Napisałem na przykład własną klasę, CreateGeometry()aby łatwo tworzyć pliki wektorowe od podstaw. Jeśli jesteś zainteresowany, mogę również zamieścić go tutaj, mimo że uważam, że wykracza to poza zakres pytania.

LarsVegas
źródło
10

Wiem, że twoje pytanie jest zorientowane na Python, ale R ma bogactwo cennych metod analizy statystycznej, z których niektóre można wykorzystać do analizy przestrzennej. @Whuberma tutaj dobrą odpowiedź ilustrującą, jak przypiąć raster do pudełka w dwóch wierszach.

djq
źródło
6
Aby przywrócić go do Pythona, możesz użyć biblioteki RPy . RPy to bardzo prosty, ale solidny interfejs Pythona do języka programowania R. Może zarządzać wszystkimi rodzajami obiektów R i wykonywać dowolne funkcje R (w tym funkcje graficzne). Wszystkie błędy z języka R są konwertowane na wyjątki w języku Python. Dowolny moduł zainstalowany dla systemu R może być używany z poziomu Pythona.
RyanDalton
6

Moje rozwiązanie, szybkie rozwiązanie, polega na użyciu GDAL z Pythonem.

Musisz

importuj podproces

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

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

(Od odpowiedzi tutaj: Obcinanie rastra warstwą wektorową za pomocą GDAL )

Oczywiście powinieneś być w stanie to osiągnąć za pomocą czystego Pythona, ale nie musiałem tego robić. I prawie zawsze mam GDAL! Elastyczność GDAL jest fantastyczna, szczególnie w środowisku Linux. Obsługuje ogromne rastry, można go łączyć ze skryptami Python lub Shell, a do wielu rzeczy należą funkcje. Zobacz także OGR dla narzędzi opartych na wektorze.

Alex Leith
źródło
4

Jeśli nie przeszkadza ci uruchomienie PostGIS, może on wykonać większość przetwarzania danych przestrzennych.

Ściągawka PDF:

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

Integruje się z Pythonem:

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

Dzięki narzędziom wspierającym, takim jak SPIT w Quantum GIS lub pgAdmin, jesteś dobrze przygotowany do skonfigurowania PostGIS. Następnie można użyć Pythona do sterowania operacjami PostGIS na danych przestrzennych.

Ragnvald
źródło
3

Pracowałem nad biblioteką geoprzetwarzania open source o nazwie WhiteboxTools, która może być używana zamiast ArcPy w wielu aplikacjach. Obecnie dostępnych jest prawie 300 narzędzi do przetwarzania danych rastrowych, wektorowych i LiDAR (LAS), choć planowane jest przeniesienie wszystkich ponad 400 narzędzi dostępnych w Whitebox GAT . Chociaż narzędzia zostały opracowane przy użyciu języka programowania Rust (w celu zwiększenia wydajności), każde narzędzie można wywołać z poziomu Pythona, jak w poniższym przykładzie:

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

Więcej szczegółowych informacji można znaleźć podane w instrukcji WhiteboxTools użytkownika . Biblioteka jest samodzielna i nie ma żadnych innych zależności. Wystarczy pobrać mały (<5 Mb) plik znajdujący się tutaj . Pobierany plik zawiera exe WhiteboxTools Z whitebox_tools.py skrypt, który dostarcza API Pythona dla biblioteki (importowanego w górnym wierszu powyższego scenariusza) oraz instrukcję. Istnieje również bardzo podstawowy GUI tkinter (wb_runner.py) do łączenia się z biblioteką.

Zezwolona licencja MIT ma na celu umożliwienie integracji WhiteboxTools jako zaplecza z innymi GIS typu open source; Alexander Bruy opracował wtyczkę QGIS dla zaplecza WhiteboxTools. W razie potrzeby możesz także mieszać i dopasowywać narzędzia WhiteboxTools i ArcPy w jednym skrypcie. Biblioteka jest wciąż nieco eksperymentalna, opracowana na podstawie badań Geomorfometrii i Hydrogeomatics University of Guelpha , i jest obecnie w wersji wcześniejszej niż 1.0, którą należy wziąć pod uwagę podczas użytkowania.

WhiteboxDev
źródło