¿Encontrar el valor de celda ráster más cercano basado en el punto vectorial?


9

Tengo dos capas en ArcGIS: una es un punto vectorial y la otra es una capa ráster. Quiero agregar el valor de la cuadrícula de datos ráster al punto vectorial. El problema es que el punto vectorial está lejos de cualquier cuadrícula ráster existente con valor, por lo que el comando "Muestra" no devuelve ningún valor para ese punto vectorial.

Entonces mi pregunta es: ¿cómo puedo encontrar la celda ráster más cercana dado un punto vectorial y extraer el valor de la celda?

En realidad, hay dos cosas que debo hacer:

  1. Identificar el delineador dentro de un guardabosques (por lo general, a 1-2 celdas de mi ráster existente)
  2. Asigne un valor del ráster más cercano a ellos, si están en un rango

Editado: tengo alrededor de 3000 puntos vectoriales y mi problema es este: ingrese la descripción de la imagen aquí

Necesito agregar el valor ráster basado en ubicaciones a los puntos vectoriales. Utilicé la herramienta "Muestra" y funciona bien para la mayoría de los puntos.

Sin embargo, hay una situación como esta ingrese la descripción de la imagen aquí

El punto derecho puede obtener el valor del ráster ("Muestra" funciona) pero el punto izquierdo no puede debido a problemas de alineación.

De ráster a polígono no funciona porque recibo un mensaje de error de que no puedo convertirlos en vectores porque están fuera del dominio. También tengo puntos como esteingrese la descripción de la imagen aquí

Esos puntos superiores no deberían obtener ningún valor porque están demasiado lejos del ráster.

Pensé en alguna manera de evitar:

Paso 1. Haz la "muestra" primero

Paso 2. Seleccione el valor nulo después de las operaciones de "muestra"

Paso 3. construir zonas de amortiguamiento (dentro de 1 grado decimal) en base a los puntos nulos

Paso 4. usa estadísticas zonales? ? u otras herramientas para recorrer todas las celdas ráster en el búfer, encontrar la más cercana, extraer su valor y colocarlo en el punto vectorial.

Estoy atrapado en el paso 4. No sé qué herramienta en ArcSDK puedo usar para lograr esta función.

O bien ... ¿Tienes una mejor idea para lidiar con eso?

Tengo 20 capas ráster como esta y me gustaría hacerlo automáticamente (usando el generador de modelos y el arcobject).


@whuber: Tu método suena muy inteligente. Mi pregunta es que estoy manejando datos a escala global y ¿cómo puedo determinar el x0 y x1 para el ráster delineado?
Visto

Inspeccione sus propiedades después de agregarlo al proyecto.
whuber

1
Las estadísticas zonales son un callejón sin salida. Según su edición, existe una solución directa simple: expanda el ráster ligeramente alrededor de su límite y muestree el ráster expandido. Hay muchas formas de hacer esto, pero todas requieren una pequeña facilidad con los cálculos ráster. Una de las más simples es ampliar la extensión del análisis, calcular una media focal y (usando 'con') pegar sus valores en la zona límite de NoData. Esto asigna una media de valores ráster cercanos a cada ubicación de muestra fuera del ráster.
whuber

@whuber Hay otro problema es que no sé dónde están los outliners. Así que en realidad hay 2 procedimientos en mi proceso: identificar los delineadores y asignarles valores.
Visto

¿Qué es un "outliner"? Si se trata de un punto no cubierto por un valor ráster, no puede evitar encontrarlos: estos serán los puntos que no recibirán ningún valor cuando aplique la Sampleherramienta.
Whuber

Respuestas:


8

Un contorno de trama ocupa un rectángulo delimitado en la parte inferior izquierda por el origen, que tiene coordenadas (por ejemplo) (x0, y0), y en la parte superior derecha por (x1, y1): estas son propiedades fácilmente descubiertas de cualquier trama. Puede usar esta información para mover cualquier punto fuera de la extensión del ráster al punto más cercano en el límite del ráster y extraer los valores del ráster en las nuevas ubicaciones.

Tareas como esta a menudo se resuelven fácilmente considerando dimensiones más bajas . La extensión de un ráster unidimensional es solo un intervalo de números, digamos de x0 a x1> x0, convencionalmente escrito [x0, x1]. Suponga que desea encontrar el punto más cercano en este intervalo a un número dado x. Hay tres casos: x <x0 (x está a la izquierda), x0 <= x <= x1 (x está en el intervalo) y x1 <x (x está a la derecha). Claramente, los puntos más cercanos son x0, x y x1, respectivamente. Una fórmula para este resultado es

x -> min (max (x, x0), x1),

como puede ver al contemplar cada uno de los tres casos por separado.

Como la extensión de un ráster es el producto cartesiano de dos intervalos, [x0, x1] * [y0, y1], la misma fórmula funciona en dos dimensiones. Simplemente aplíquelo a cada intervalo. Por lo tanto, las coordenadas del punto proyectado se pueden calcular (en una calculadora de campo, por ejemplo) como

(x, y) -> (min (max (x, x0), x1), min (max (y, y0), y1).

Aquí está esta fórmula en acción con 100 puntos colocados aleatoriamente alrededor y dentro de la extensión de una cuadrícula:

Figura

Las líneas discontinuas asocian visualmente puntos fuera de la extensión a las ubicaciones donde se moverán.

Cree una capa de puntos a partir de estas coordenadas calculadas y aplique la Sampleherramienta para extraer los valores ráster. Unir los resultados a la capa de puntos original.

Como cuestión práctica , para evitar problemas con el redondeo de coma flotante que podrían evitar que los nuevos puntos se encuentren dentro de la extensión de la cuadrícula, sería aconsejable hacer que x0 e y0 sean un poco más grandes que el verdadero origen (puede agregarles la mitad del tamaño de la celda) y, de manera similar, haga x1 e y1 un poco más pequeños.

En resumen , el flujo de trabajo consiste en calcular dos campos (las nuevas coordenadas) en la tabla de la capa de puntos original, crear una capa de eventos de puntos a partir de esas nuevas coordenadas, ejecutar la Sampleherramienta y realizar una unión a la base de datos (no una unión espacial).


Cuando tiene muchos más puntos vectoriales que celdas en el ráster , debe preferir la solución dada por @celenius (quien propone convertir el ráster en puntos y usar una unión espacial). Sin embargo, normalmente, los rásteres tienen muchas celdas, de millones a miles de millones, y la conversión a puntos lleva tanto tiempo y disco que debe abordarse con precaución.

Alternativamente, podría acelerar la solución de Celenius utilizando un cálculo de trama para hacer una cuadrícula entera con valores solo a lo largo de su límite. Convertir eso en una capa de puntos es rápido y fácil porque tendrá pocos puntos. Llamemos a esto la "capa límite". Muestree la cuadrícula en los puntos de la capa límite, copiando así los valores de la cuadrícula en la tabla de atributos de la capa límite. Después de ejecutar Samplecon la capa de puntos original, elimine todos los puntos donde se obtuvo con éxito una muestra. Unir espacialmente la capa límite a los puntos restantes para completar el proceso de muestreo.

(Una forma de hacer una cuadrícula con valores solo a lo largo de su límite es aplicar una operación de vecindario focal que falla a lo largo del límite: los ejemplos incluyen encontrar pendientes, sombreado, estadísticas focales de vecindario 3 x 3. Esto crea una cuadrícula con una celda anillo grueso de NoData alrededor de su borde. El uso de IsNull y SetNull para detectar celdas NoData y convertir entre NoData y celdas de datos produce una cuadrícula llena de valores NoData excepto alrededor del límite).


En resumen, el flujo de trabajo consiste en calcular dos campos (las nuevas coordenadas) en la tabla de la capa de puntos original, crear una capa de eventos de puntos a partir de esas nuevas coordenadas, ejecutar la herramienta Muestra y realizar una unión a la base de datos (no una unión espacial). ¿Podrías explicar cómo hacer esto? (Puedes ver mis fotos para mi problema). ¡Gracias!
Visto

Tengo alrededor del 15% de puntos tengo este problema. ¿Cómo puedes determinar x0 y x1 para cada punto?
Visto

1
@Seen los x0, y0, x1, y1 son para las cuadrículas. Las coordenadas de punto (x, y) se pueden calcular en la Calculadora de campo como se describe en la ayuda de ArcGIS o en varios hilos en este sitio. Hay elementos de menú para hacer una capa de puntos XY y unir bases de datos: estas son operaciones básicas estándar.
whuber

4

Puede convertir el ráster en puntos ( ref ), y luego hacer una unión espacial en los puntos (desde los rásteres) al punto.

(Acabo de enterarme de que los puntos se pueden unir espacialmente aquí ayer )


1
+1 para un enfoque inteligente. Para cuadrículas grandes, donde esto se vuelve impracticable, convierta solo las celdas límite de la trama en puntos. (
Describo

Tengo miles de celdas de cada capa ráster y tengo 20 capas así ... así que convertirlas en puntos vectoriales lleva mucho tiempo ...
Visto

Además, cuando intento hacer un ráster en un polígono, recibo un mensaje de error como ERROR 000864 Ráster de entrada: la entrada no está dentro del dominio definido. ERROR 000863: No válido tipo de datos GP
Visto

¿Recibe un error al convertir el ráster en puntos?
djq

@celenius Funciona pero tomó mucho tiempo.
Visto

1

Puede convertir la capa ráster en un polígono con la herramienta Ráster a polígono y ejecutar la unión espacial (haga clic con el botón derecho en la capa de puntos y seleccione Uniones y relaciones - Unir, en el primer menú desplegable seleccione la opción de unión espacial y seleccione la más cercana a la opción en el botón readio), o use la herramienta Near.


¿Cómo utiliza el resultado de la unión espacial para extraer el valor ráster apropiado?
whuber

@whuber, dentro del cuadro de diálogo Unir datos cuando selecciona la opción "está más cerca", la combinación espacial selecciona la entidad poligonal más cercana (resultado de la herramienta Ráster a polígono) y agrega esta información de atributo a la entidad de punto. ¿Es esto lo que preguntabas? Mi respuesta inicial fue publicada antes de su edición. Supongo que la trama de Seen puede haber sido demasiado grande para convertirla en polígono.
artwork21

La idea no es encontrar la trama más cercana. Realmente, lo que se quiere es una forma de extrapolar los valores de un ráster más allá de su extensión original. La pregunta propone un enfoque vecino más cercano: en cualquier punto cercano que no esté en el ráster, encuentre la celda más cercana en el ráster y use el valor de esa celda.
Whuber

Al volver a leer su último comentario, parece que podría estar proponiendo convertir el ráster no en "un polígono" sino en una capa de polígono con un polígono para cada celda (o conjunto de celdas contiguas). Si es así, podría tener éxito con rásteres muy pequeños, pero ¿por qué propone esto, que es una operación compleja y costosa (y funciona solo para cuadrículas de enteros), en lugar de la solución similar pero más eficiente que @celenius ofreció anteriormente? ¿Qué ventajas ofrece su solución?
whuber

@whuber, la capa de polígono es correcta. Sí, el método celenius costaría menos memoria.
artwork21
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.