Alternativas a usar Arcpy

68

Parece que uso el paquete de sitio Arcpy de ESRI para prácticamente todo mi geoprocesamiento de Python. Para crédito de ESRI, estas son un increíble conjunto de herramientas que pueden ayudar a lograr mucho. Sin embargo, también me gustaría crear scripts de geoprocesamiento fuera del dominio Arcpy de ESRI. 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 programáticamente sin Arcpy. Mis preguntas para los programadores serios: ¿Qué colección de herramientas de Python utiliza para realizar las tareas que los usuarios de ESRI cumplirían con el paquete del sitio de Arcpy? ¿Dónde comienzo?

    
pregunta Aaron 28.09.2012 - 18:26

11 respuestas

42

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 conoces el valor sin datos de la dem

Para algunos controles 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 de python probablemente esté un poco apagada. Ver gdal_alg.h: enlace

    
respondido por el user10353 05.10.2012 - 23:45
19

Un buen punto de partida sería la Biblioteca de abstracción de datos geoespaciales . En realidad, se compone de dos bibliotecas: GDAL para manipular datos ráster geoespaciales y OGR para manipular datos vectoriales geoespaciales, pero la gente generalmente lo llama GDAL.

Hay un geoprocesamiento con Python utilizando el SIG de código abierto en la Universidad Estatal de Utah. Es posible que también quieras verlo.

    
respondido por el R.K. 28.09.2012 - 18:49
19

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 con arcpy era muy lento, especialmente en grandes conjuntos de datos. Como resultado comencé a usar:

  • pyshp para manipular shapefiles y actualizar tablas de atributos
  • numpy para administrar rásteres ASCII y realizar análisis basados en el kernel, como cálculos de curvatura
  • scipy para realizar un análisis estadístico de los resultados y realizar el ajuste 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 cualquier persona que quiera aprender más sobre el análisis de superficies ráster. El libro viene con excelentes ejemplos de código en C ++, que son mucho más eficientes que las herramientas de 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 ++.

    
respondido por el sgrieve 01.10.2012 - 09:47
15

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

Definitivamente echa un vistazo a este gran enlace que está actualizado (creo): enlace

EDITAR: otro enlace para aquellos con antecedentes en ESRI: enlace

También secundo el movimiento de GDAL. Es invaluable y estaría perdido sin él.

    
respondido por el s_a 28.09.2012 - 18:57
15

Creo que las respuestas dadas hasta ahora cubren básicamente todo el paquete que vale la pena mencionar (especialmente GDAL, OGR, pyshp, NumPy)

Pero también está el GIS and Python Software Laboratory , que alberga un par de módulos interesantes. Ellos son:

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

Últimamente, empecé a jugar con GDAL / OGR y los encontré muy impresionantes en lo que respecta a la velocidad y la cobertura de las herramientas de análisis.

Aquí hay 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 la forma de 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á fuera del alcance de la pregunta.

    
respondido por el LarsVegas 05.10.2012 - 10:57
10

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

    
respondido por el djq 28.09.2012 - 18:58
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 \ a b c \ Notepad.exe'])

(De la respuesta aquí: Recorte de ráster con capa vectorial usando GDAL )

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

    
respondido por el Alex Leith 01.10.2012 - 09:35
4

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

hoja de trucos PDF:

enlace

Se integra con python:

enlace

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.

    
respondido por el ragnvald 03.10.2012 - 23:20
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 casi 300 herramientas disponibles para procesar datos raster, vectoriales y LiDAR (LAS), aunque el plan es finalmente portar 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')

Puede encontrar información más detallada en el manual del usuario de WhiteboxTools . La biblioteca es independiente y no tiene otras dependencias. 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 de MIT permisiva está pensada para permitir que WhiteboxTools se integre como back-end con otros GIS 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 todavía es un tanto experimental, desarrollada a partir del Grupo de Investigación en Geomorfometría e Hidrogeomática de la Universidad de Guelph , y actualmente está versión pre-1.0, que debe tenerse en cuenta en el uso.

    
respondido por el WhiteboxDev 29.03.2018 - 15:38
1

Usando Python para recortar un ráster a un shapefile sin ArcPy: enlace

    
respondido por el GeospatialPython.com 28.08.2013 - 05:24

Lea otras preguntas en las etiquetas