Me pregunto si hay una manera de encontrar la extensión de límite mínima para un ráster con un valor particular. Recorté un ráster de una imagen global y la extensión se establece como la extensión global con una gran cantidad de área NoData. Me gustaría eliminar el área NoData de este ráster y retener solo el área que contiene los píxeles del valor particular. ¿Cómo puedo hacer esto?
Aquí está mi ejemplo: me gustaría extraer el valor = 1 (área azul) y usar la extensión del área azul en lugar del mundo entero para su posterior procesamiento.
arcgis-desktop
raster
extents
Visto
fuente
fuente
Respuestas:
SI he entendido la pregunta correctamente, parece que quiere saber el cuadro delimitador mínimo de los valores que no son nulos. Tal vez pueda convertir el ráster en polígonos, seleccione los polígonos que le interesan y luego vuelva a convertirlos en un ráster. Luego puede ver los valores de las propiedades que deberían darle el cuadro de límite mínimo.
fuente
El truco es calcular los límites de los datos que tienen valores. Quizás la forma más rápida, más natural y más general de obtenerlos es con resúmenes zonales: al usar todas las celdas que no son NoData para la zona, el mínimo zonal y el máximo de las cuadrículas que contienen las coordenadas X e Y proporcionarán la extensión completa.
ESRI sigue cambiando las formas en que se pueden hacer estos cálculos; por ejemplo, las expresiones incorporadas para las cuadrículas de coordenadas se eliminaron con ArcGIS 8 y parece que no han regresado. Solo por diversión, aquí hay un conjunto de cálculos rápidos y simples que harán el trabajo sin importar qué.
Convierta la cuadrícula en una sola zona al igualarla consigo misma, como en
"Mi cuadrícula" == "Mi cuadrícula"
Cree una cuadrícula de índice de columna mediante la acumulación de flujo de una cuadrícula constante con valor 1. (Los índices comenzarán con 0.) Si lo desea, multiplíquelo por el tamaño de celda y agregue la coordenada x del origen para obtener una cuadrícula de coordenadas x " X "(se muestra a continuación).
Del mismo modo, cree una cuadrícula de índice de fila ( y luego una cuadrícula de coordenadas y "Y") mediante la acumulación de flujo de una cuadrícula constante con valor 64.
Use la cuadrícula de zona del paso (1) a calcular el mínimo zonal y el máximo de "X" e "Y" : ahora tiene la extensión deseada.
(La extensión, como se muestra en las dos tablas de estadísticas zonales, se representa con un contorno rectangular en esta figura. La cuadrícula "I" es la cuadrícula de zona obtenida en el paso (1)).
Para ir más allá, necesitará extraer estos cuatro números de sus tablas de salida y usarlos para limitar la extensión del análisis. La copia de la cuadrícula original, con la extensión de análisis restringida en su lugar, completa la tarea.
fuente
Aquí hay una versión del método @whubers para ArcGIS 10.1+ como una caja de herramientas de Python (.pyt).
fuente
He ideado una solución basada en gdal y numpy. Rompe la matriz ráster en filas y columnas y suelta cualquier fila / columna vacía. En esta implementación, "vacío" es cualquier cosa menor que 1, y solo se tienen en cuenta los rásteres de banda única.
(Me doy cuenta mientras escribo que este enfoque de línea de exploración solo es adecuado para imágenes con "collares" de nodata. Si sus datos son islas en mares de nulos, el espacio entre islas también se eliminará, aplastando todo y arruinando totalmente la georreferenciación .)
Las partes del negocio (necesita desarrollarse, no funcionará como está):
En un guión completo:
El script está en mi código oculto en Github, si el enlace va 404 cazar un poco; Estas carpetas están maduras para alguna reorganización.
fuente
MemoryError
Source raster (geo units): Origin (top left): 2519950.0001220703, 5520150.00012207 Pixel size (x,-y): 100.0, -100.0 Columns, rows : 42000, 43200 Traceback (most recent call last): File "D:/11202067_COACCH/local_checkout/crop_raster.py", line 72, in <module> cropped_raster, cropped_transform = main(src_raster) File "D:/11202067_COACCH/local_checkout/crop_raster.py", line 22, in main data = np.array(raster.ReadAsArray()) MemoryError
A pesar de todo su poder analítico, ArcGIS carece de manipulaciones ráster básicas que puede encontrar con editores de imágenes de escritorio tradicionales como GIMP . Espera que desee utilizar la misma extensión de análisis para su ráster de salida que su ráster de entrada, a menos que anule manualmente la configuración del entorno de Extensión de salida . Dado que esto es exactamente lo que está buscando encontrar, no establecer, la forma de hacer las cosas de ArcGIS se interpone en el camino.
A pesar de mis mejores esfuerzos, y sin recurrir a la programación, no pude encontrar la manera de obtener el alcance de su subconjunto deseado de la imagen (sin la conversión de trama a vector que es un desperdicio computacional).
En cambio, usé GIMP para seleccionar el área azul usando la herramienta Seleccionar por color y luego invertí la selección, presioné Eliminar para eliminar el resto de los píxeles, volví a invertir la selección, recorté la imagen a la selección y finalmente la volví a exportar a PNG. GIMP lo guardó como una imagen de profundidad de 1 bit. El resultado está abajo:
Por supuesto, debido a que su imagen de muestra carecía de un componente de referencia espacial, y GIMP no es consciente del espacio, la imagen de salida es casi tan útil como su entrada de muestra. Deberá georreferenciarlo para que sea útil en un análisis espacial.
fuente
Aquí hay una posibilidad usando SAGA GIS: http://permalink.gmane.org/gmane.comp.gis.gdal.devel/33021
Otra posibilidad usando solo las herramientas de ArcGIS GP sería construir un TIN a partir de su ráster usando Raster to TIN , calcular su límite usando el dominio TIN y recortar su ráster por el límite (o su envoltura usando Feature Envelope to Polygon ).
fuente