Alternativas al uso de Arcpy

69

Parece que uso el paquete de sitio Arcpy de ESRI para prácticamente todo mi geoprocesamiento en python. Para crédito de ESRI, estas son un conjunto increíble de herramientas que pueden ayudar a lograr mucho. Sin embargo, también me gustaría crear scripts de geoprocesamiento fuera del dominio ESRI Arcpy. Por ejemplo, si quiero recortar un ráster a un polígono, comenzaría con el siguiente script de 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")  

No estoy seguro de cómo realizaría la misma tarea mediante programación sin Arcpy. Mis preguntas para los programadores serios: ¿Qué colección de herramientas de Python utilizas para realizar las tareas que los usuarios de ESRI realizarían con el paquete del sitio Arcpy? ¿Dónde empiezo?

Aaron
fuente

Respuestas:

45

GDAL es la herramienta a utilizar. De hecho, toda la llamada es una línea para gdal_rasterize:

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

si supieras el valor sin datos de la dem

Para algún control de Python:

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)

donde sus variables podrían establecerse en python

Para python completo:

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

Acabo de echar un vistazo rápido a la sintaxis de la API de C, por lo que mi sintaxis para python probablemente esté un poco apagada. Ver gdal_alg.h: http://gdal.org/gdal__alg_8h.html


fuente
29

Encontrará otras preguntas similares en este sitio que hacen la misma pregunta básica y tienen muy buenas referencias. El más similar (y detallado) es:

Otros incluyen:

RyanDalton
fuente
20

En gran parte de mi investigación académica trabajo con datos LiDAR haciendo análisis de superficie para geomorfología. Rápidamente descubrí que realizar muchas operaciones usando arcpy era muy lento, especialmente en grandes conjuntos de datos. Como resultado comencé a usar:

  • pyshp para manipular archivos shape y actualizar tablas de atributos
  • numpy para administrar rásteres ASCII y realizar análisis basados ​​en el núcleo, como cálculos de curvatura
  • Scipy para realizar análisis estadísticos de resultados y realizar ajustes de curvas para superficies
  • matplotlib para trazar gráficos y otros resultados gráficos, como mapas básicos para visualizaciones rápidas

También recomendaría el libro, Modelado cuantitativo de los procesos de la superficie de la tierra a cualquiera que quiera aprender más sobre el análisis de las superficies ráster. El libro viene con excelentes ejemplos de código en C ++, que son mucho más eficientes que las herramientas ArcGIS. Estos algoritmos también se pueden portar a Python sin necesitar nada más complejo que numpy, aunque se ejecutan mucho más rápido en C ++.

sgrieve
fuente
16

Para las personas que usan ESRI, creo que GRASS sería un entorno muy similar con un entorno de Python GUI y organizado en 'kits de herramientas' separados para diferentes tareas (ráster, vector, kits de herramientas solares, etc.). El script tiene otras opciones además de Python, pero así es como lo uso.

Definitivamente revise este gran enlace que está actualizado (creo): http://grass.osgeo.org/wiki/GRASS_and_Python

EDITAR: otro enlace para aquellos con experiencia en ESRI: http://grass.osgeo.org/wiki/GRASS_migration_hints

También secundo la moción de GDAL. Es invaluable y estaría perdido sin él.

s_a
fuente
1
Nuevo en GRASS GIS 7: pyGRASS, ver ing.unitn.it/~zambelli/projects/pygrass
markusN
16

Creo que las respuestas dadas hasta ahora cubren básicamente todos los paquetes que vale la pena mencionar (especialmente GDAL, OGR, pyshp, NumPy)

Pero también está el Laboratorio de Software SIG y Python , que alberga un par de módulos interesantes. Son:

  • Fiona : la API más ordenada de OGR
  • Rtree : índice espacial para Python GIS
  • Shapely : paquete Python para la manipulación y análisis de características en el plano cartesiano

Personalmente, comencé a jugar con GDAL / OGR últimamente y los encontré muy impresionantes con respecto a la velocidad y la cobertura de las herramientas de análisis.

Aquí algunos ejemplos de cómo usar los métodos (tomados de esta excelente fuente, que es un muy buen punto de partida):

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

Lo bueno de estas herramientas es que eres muy flexible en cómo implementarlas. Escribí, por ejemplo, mi propia clase CreateGeometry()para crear fácilmente archivos vectoriales desde cero. Si está interesado, también puedo publicarlo aquí, aunque creo que está más allá del alcance de la pregunta.

LarsVegas
fuente
10

Sé que su pregunta está centrada en Python, pero R tiene una gran cantidad de métodos de análisis estadísticos de valor, algunos de los cuales pueden usarse para el análisis espacial. @Whubertiene una buena respuesta aquí que ilustra cómo recortar un ráster a un cuadro en dos líneas.

djq
fuente
66
Para devolverlo a Python, puede usar la biblioteca RPy . RPy es una interfaz Python muy simple pero robusta para el lenguaje de programación R. Puede gestionar todo tipo de objetos R y puede ejecutar funciones R arbitrarias (incluidas las funciones gráficas). Todos los errores del lenguaje R se convierten en excepciones de Python. Cualquier módulo instalado para el sistema R se puede usar desde Python.
RyanDalton
6

Mi solución, la solución rápida, es usar GDAL con Python.

Necesitas

subproceso de importación

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

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

(De la respuesta aquí: Recorte de trama con capa vectorial usando GDAL )

Por supuesto, deberías poder lograr esto usando Python puro, pero no he necesitado hacerlo. ¡Y casi siempre tengo GDAL alrededor! La flexibilidad de GDAL es fantástica, especialmente en un entorno Linux. Maneja grandes rásteres, se puede vincular con scripts Python o Shell y hay funciones para muchas cosas. Ver también OGR para herramientas basadas en vectores.

Alex Leith
fuente
4

Si no le importa ejecutar PostGIS, puede hacer la mayoría del procesamiento de datos espaciales por usted.

Hoja de trucos PDF:

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

Se integra con python:

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

Con herramientas de soporte como SPIT dentro de Quantum GIS o pgAdmin, está bien equipado para configurar PostGIS. Luego puede usar Python para controlar las operaciones de PostGIS en sus datos espaciales.

ragnvald
fuente
3

He estado trabajando en una biblioteca de geoprocesamiento de código abierto llamada WhiteboxTools que se puede usar en lugar de ArcPy en muchas aplicaciones. Actualmente hay cerca de 300 herramientas disponibles para procesar datos ráster, vectoriales y LiDAR (LAS), aunque el plan es eventualmente transferir todas las más de 400 herramientas disponibles en Whitebox GAT . Aunque las herramientas se desarrollan utilizando el lenguaje de programación Rust (por eficiencia), cada herramienta se puede llamar desde Python, como en el siguiente ejemplo:

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

Se puede encontrar información más detallada en el manual del usuario de WhiteboxTools . La biblioteca es independiente y no tiene ninguna otra dependencia. Simplemente necesita descargar el archivo pequeño (<5Mb) ubicado aquí . El archivo de descarga contiene el archivo WhiteboxTools exe, el script whitebox_tools.py , que proporciona la API de Python para la biblioteca (importada en la línea superior del script anterior) y el manual del usuario. También hay una GUI tkinter muy básica (wb_runner.py) para interactuar con la biblioteca.

La licencia permisiva de MIT está diseñada para permitir que WhiteboxTools se integre como un back-end con otros SIG de código abierto; Alexander Bruy ha desarrollado un complemento QGIS para el back-end de WhiteboxTools. También puede mezclar y combinar herramientas de WhiteboxTools y ArcPy en un solo script según sea necesario. La biblioteca aún es algo experimental, desarrollada por el Grupo de Investigación en Geomorfometría e Hidrogeomática de la Universidad de Guelph , y actualmente es una versión anterior a la 1.0, que debe tenerse en cuenta en el uso.

WhiteboxDev
fuente