Soy realmente nuevo en Python y me gustaría saber si hay un método rápido para obtener valores de celda de un ráster píxel por píxel y las coordenadas (mapa XY del centro de cada píxel) usando Python en ArcGIS 10.
Para describir esto más, necesito obtener el mapa X, el mapa Y y el valor de celda del primer píxel y asignar esos tres valores a tres variables y repetir este paso para el resto de los otros píxeles (recorrer todo el ráster).
Creo que necesito describir más mi pregunta. El problema es que necesito obtener la ubicación XY de un píxel del primer ráster y obtener los valores de celda de varios otros rásteres correspondientes a esa ubicación XY. Este proceso debe recorrer cada píxel del primer ráster sin crear ningún archivo de forma de punto intermedio, ya que realmente requerirá mucho tiempo ya que tengo que manejar un ráster con casi 8 mil millones de píxeles. Además, necesito hacer esto usando Python en ArcGIS 10.
@ James: Muchas gracias por su sugerencia. Sí, esto funcionaría para un ráster, pero también necesito recopilar los valores de celda para varios otros rásteres. El problema es que, después de obtener la coordenada X e Y del primer píxel del primer ráster, necesito obtener el valor de celda del segundo ráster correspondiente a esa ubicación X, Y del primer ráster, luego el tercer ráster y así sucesivamente. Entonces, creo que al recorrer el primer ráster, obtener la ubicación X e Y de un píxel y obtener los valores de celda del otro ráster correspondiente a esa ubicación debe hacerse simultáneamente, pero no estoy seguro. Esto se puede hacer convirtiendo el primer ráster en un archivo de forma de punto y realizando Extraer múltiples valores para la función de punto en ArcGIS 10 pero I '
@hmfly: Gracias, sí, este método (RastertoNumpyarray) funcionará si puedo obtener la coordenada de un valor conocido de fila y columna de la matriz.
@whuber: no quiero realizar ningún cálculo, todo lo que necesito hacer es escribir las coordenadas XY y los valores de las celdas en un archivo de texto y eso es todo
fuente
Respuestas:
Siguiendo la idea de @ Dango, creé y probé (en pequeños rásteres con la misma extensión y tamaño de celda) el siguiente código:
Según el código @hmfly, puede tener acceso a los valores deseados:
Desafortunadamente, hay un 'pero': el código es correcto para los arreglos NumPy que pueden ser manejados por la memoria del sistema. Para mi sistema (8 GB), la matriz más grande era de aproximadamente 9000,9000.
Como mi experiencia no me permite proporcionar más ayuda, puede considerar algunas sugerencias sobre cómo tratar con matrices grandes: /programming/1053928/python-numpy-very-large-matrices
arcpy.RasterToNumPyArray
El método permite especificar el subconjunto de ráster convertido a matriz NumPy ( página de ayuda de ArcGIS10 ), lo que puede ser útil al fragmentar grandes conjuntos de datos en submatrices.fuente
Si solo desea obtener los valores de píxeles (fila, columna), puede escribir un script arcpy como este:
Pero, si desea obtener la coordenada del píxel, NumPyArray no puede ayudarlo. Puede convertir el ráster en punto mediante la herramienta RasterToPoint, y luego puede obtener la coordenada por Shape archivada.
fuente
El método más simple para generar coordenadas y valores de celda en un archivo de texto en ArcGIS 10 es la función de muestra , sin necesidad de código y especialmente sin necesidad de recorrer cada celda. En ArcGIS <= 9.3x calculadora ráster, solía ser tan simple como lo
outfile.csv = sample(someraster)
que generaría un archivo de texto de todos los valores y coordenadas (no nulos) de las celdas (en formato z, x, y). En ArcGIS 10, parece que el argumento "in_location_data" ahora es obligatorio, por lo que debe usar la sintaxisSample(someraster, someraster, outcsvfile)
.Editar: También puede especificar varios rásteres:
Sample([someraster, anotherraster, etc], someraster, outcsvfile)
. Si esto funcionaría en 8 mil millones de células, no tengo ni idea ...Editar: Tenga en cuenta que no he probado esto en ArcGIS 10, pero he usado la función de muestra durante años en <= 9.3 (y estación de trabajo).
Editar: ahora lo he probado en ArcGIS 10 y no se enviará a un archivo de texto. La herramienta cambia la extensión del archivo a ".dbf" automáticamente. Sin embargo ... el siguiente código de Python funciona ya que las declaraciones de álgebra de mapas SOMA y MOMA todavía son compatibles con ArcGIS 10:
fuente
Una forma de hacerlo sería utilizar la herramienta Raster_To_Point seguida de la herramienta Add_XY_Coordinates . Terminará con un archivo de forma donde cada fila de la tabla de atributos representa un píxel de su ráster con columnas para X_Coord , Y_Coord y Cell_Value . Luego puede recorrer esta tabla con un cursor (o exportarla a algo como Excel si lo prefiere).
Si solo tiene que procesar un ráster, probablemente no valga la pena crear scripts, solo use las herramientas de ArcToolbox. Si necesita hacer esto para muchos rásteres, puede intentar algo como esto:
[ Nota: no tengo ArcGIS 10 y no estoy familiarizado con ArcPy, así que este es solo un esbozo muy aproximado. No ha sido probado y seguramente necesitará ajustes para que funcione.]
Luego puede recorrer las tablas de atributos de shapefile usando un cursor de búsqueda o (posiblemente más simple) usando dbfpy . Esto le permitirá leer los datos de su ráster (ahora almacenados en una tabla .dbf de shapefile) en variables de Python.
fuente
Tal vez podría crear un archivo mundial para el ráster, convertir el ráster en una matriz numpy. luego, si realiza un bucle sobre la matriz, obtendrá los valores de celda y si actualiza cada vez más la x, y del archivo mundial, también tendrá las coordenadas para cada valor de celda. Espero que sea útil.
fuente
El código de Marcin funcionó bien, excepto que un problema en las funciones rasCentrX y rasCentrY estaba causando que las coordenadas de salida aparecieran en una resolución diferente (como observó Grazia). Mi solución fue cambiar
a
y
a
Usé el código para convertir una cuadrícula ESRI a un archivo CSV. Esto se logró eliminando la referencia a inRaster2, luego usando un csv.writer para generar las coordenadas y los valores:
Tampoco encontré que la transposición era necesaria en
tan convertido que a
fuente
Feo pero altamente efectivo:
fuente
Una solución simple que utiliza paquetes python de código abierto:
Fiona es útil, ya que puede abrir un archivo de formas, recorrer las características y (como lo he hecho) agregarlas a un
dict
objeto. De hecho, el Fiona enfeature
sí es como undict
también, por lo que es fácil acceder a las propiedades. Si mis puntos tuvieran algún atributo, aparecerían en este dict junto con las coordenadas, id, etc.Rasterio es útil porque es fácil de leer en la trama como una matriz numpy, un tipo de datos ligero y rápido. También tenemos acceso a una
dict
de las propiedades de rásteraffine
, que incluye todos los datos que necesitamos para convertir las coordenadas ráster x, y en filas de matriz, coordenadas col. Vea la excelente explicación de @perrygeo aquí .Terminamos con un
pt_data
tipodict
que tiene datos para cada punto y el extraídoraster_value
. También podríamos reescribir fácilmente el archivo de forma con los datos extraídos si quisiéramos.fuente