10 votos

¿Obtener una imagen rasterizada como matriz en Python con ArcGIS Desktop?

Cuando empecé a trabajar con Python y ArcGIS 9.3, supuse que habría una forma sencilla de introducir una imagen rasterizada en una matriz de Python para poder manipularla antes de volver a almacenarla como otra imagen rasterizada. Sin embargo, parece que no puedo encontrar cómo hacer esto.

Si es posible, ¿cómo?

10voto

Jon Galloway Puntos 28243

0 votos

Gracias. Lamentablemente, estoy en ArcGIS 9.3 en este momento - ¿sabes si hay alguna manera de hacer esto en 9.3?

6voto

akdom Puntos 6724

No creo que esto sea posible con ArcGIS <= 9.3.1

Utilizo el código abierto API GDAL para tareas como ésta.

0 votos

Muy bien. He utilizado los programas de utilidad GDAL en el pasado, pero nunca pensé en utilizarlos para hacer esto.

3 votos

Estoy de acuerdo, el módulo gdal Python permite leer fácilmente un raster y volcar los datos a un array Numpy. Chris Garrard tiene un curso sobre el uso de OpenSource Python en GIS, cubre este tema. Puedes encontrarlo en: gis.usu.edu/~chrisg/python/2008

2voto

saint_groceon Puntos 2696

¿Acceso a ArcObjects desde Python? discute la integración de arcobjects con python.

Tal vez el código en esta muestra podría ser adaptado para que pueda ser llamado desde python.

No estoy seguro de si hay una forma de pasar un array byref a python. Si la hay, entonces IPixelBlock.PixelDatabyRef valdría la pena intentarlo.

1voto

Jon Galloway Puntos 28243

No estoy seguro de que puedas manipular el raster píxel por píxel, pero puedes usar los objetos de geoprocesamiento en conjunción con la API de python.

Puedes usar cualquier caja de herramientas para ese tipo de manipulación. Un ejemplo de script sería:

#import arcgisscripting

gp = arcgisscripting.create(9.3)

gp.AddToolbox("SA") # addint spatial analyst toolbox

rasterA = @"C:\rasterA.tif"
rasterB = @"C:\rasterB.tif"

rasterC = @"C:\rasterC.tif" # this raster does not yet exist
rasterD = @"C:\rasterD.tif" # this raster does not yet exist

gp.Minus_SA(rasterA,rasterB,rasterC)

gp.Times_SA(rasterA,rasterB,rasterD)

# lets try to use more complex functions

# lets build and expression first

expression1 = "slope( " + rasterC + ")"
expression2 = "(" + rasterC " + " rasterD + ") - " + rasterA 

gp.SingleOutputMapAlgebra_SA(expression1,@"C:\result_exp1.tif")
gp.SingleOutputMapAlgebra_SA(expression2,@"C:\result_exp2.tif")

A continuación se presenta un seguimiento de su pregunta . Todavía no es posible. No estoy seguro de la versión 10.0.

0 votos

Gracias, es muy útil. Sin embargo, lo ideal sería poder iterar a través de la matriz ráster haciendo varias cosas en ella. ¡Yo habría pensado que habría una manera en ArcGIS para hacer esto, pero tal vez no!

0 votos

Robintw, por lo que he mirado en la referencia, no hay manera de obtener un píxel específico de un raster. No estoy seguro de si en ArcPy (disponible a partir de la v10) puede obtener estas células individuales, ya que se extendió la API de python con un montón de nuevas funcionalidades.

0voto

mleykamp Puntos 491

La forma más fácil sería convertir el raster a netCDF y luego abrirlo y recorrer la cuadrícula. Hice prácticamente lo mismo para un proyecto que implicaba convertir los rásteres en datos de características basados en los datos asignados a las celdas del ráster. Estuve mirando esto durante años, y llegué a la conclusión de que recorrer los datos de la cuadrícula sería más fácil desde netCDF.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X