4 votos

Buffer de Punto o Polígono con Información de Raster

La intención de este trabajo es definir un buffer alrededor de un punto o polígono basado en la información de un raster. Por ejemplo, si un polígono representa una ciudad y el ráster define el tiempo que tarda en pasar por esa celda (en horas para simplificar). Me gustaría construir un buffer alrededor de esta ciudad definiendo el rango máximo que sumaría 24 horas. Cualquier celda puede moverse hacia cualquier otra celda siempre que se mueva hacia el origen (El valor de la celda origen es no incluido en la suma).

Esto permitirá la creación de topes no uniformes basados en la información del entorno en lugar de establecer un tope arbitrario alrededor de un polígono.

set.seed(8354)
r <-raster(matrix(ncol=5,nrow=5,abs(round(rnorm(25,5,5),0))))
e <- extent(c(0,5,0,5))
extent(r) <- e
plot(r)
points(2.5,2.5,cex=3,pch=19)

A continuación, las imágenes muestran la trama inicial y la trama "tamponada" hacia fuera con valores iguales a 10. La intención es moverse hacia afuera desde la celda central en las 8 direcciones, sumando los valores a medida que se avanza. Cuando se alcanza el valor 10, el buffer se ajusta a esa extensión, si el valor supera el 10, la celda actual limita la extensión.

Un reto que ya veo es el de contar en diagonal, en un caso el valor puede ser menor que 10 y en otro mayor, no estoy muy seguro de cómo evitarlo todavía.

He estado buscando a través de la gdistance documentación así como accCost como se ve aquí . El transition La función parece ser el punto de colapso. Gran parte de eso se debe a mi falta de comprensión de lo que esta función está haciendo (voy a seguir mi lectura). He estado usando la suma en el argumento transitionFunction.

Valores en la trama original

Initial Raster

Suma hacia afuera que define la extensión del buffer

Buffered Raster

0 votos

No está nada claro cómo se supone que el proceso propuesto va a producir topes "no uniformes". ¿Podría ilustrar lo que tiene en mente?

0 votos

¿Cómo ha conseguido incluir casillas como la de la fila superior, a cuatro columnas de la izquierda, cuando no se puede llegar a ella desde uno de los ocho puntos cardinales? ¿Con qué dirección cardinal lo has asociado y en qué te basas?

0 votos

Y aquí es donde estoy viendo que tengo un defecto fundamental. Tendría que mover el origen a la siguiente capa hacia fuera y recalcular usando los valores sumados de la primera pasada. Esto parece convertirse en una tarea limitante desde el punto de vista computacional bajo mi esquema actual, ya que tendría que haber un "nuevo" raster para cada celda para lograr el resultado deseado. Seguiré reflexionando y volveré con nuevas mejoras.

3voto

sgwill Puntos 2444

Utilizando una matriz de vecindad con adjacent le da los números de las celdas alrededor de una celda determinada, por lo que podría extraer valores de vecindades crecientes hasta alcanzar un umbral.

Función para construir una matriz de vecindad para centrarse en un punto dado.

##' @param n size of neighbourhood matrix 3,5,7,...
nmatrix <- function(n) {
   ## n must be odd and > 1
   m <- matrix(1, n, n)
   m[ceiling(length(m) / 2)] <- 0
   m
}
## neighbours summing to 10 for a given point
sum0 <- 0
start0 <- 3
while(sum0 < 10) {
  ## extract all values in neighbourhood, including centre
  cells <- adjacent(r, cellFromXY(r, pt), directions = nmatrix(start0), include = TRUE)[,"to"]
  adjvalues <- r[cells]
  ## test sum of values 
  ## (could randomize order here or set a specific order for testing)
  # print(cumsum(adjvalues))
  sum0 <- sum(adjvalues)
  ## increment size of neighbourhood
  start0 <- start0 + 2
}

Una vez que ese bucle while está hecho tienes todos los adjvalues de cells por lo que se pueden utilizar para construir cualquier geometría que se necesite, tal vez por rasterToPolygons en una versión enmascarada de la trama.

Esto es un poco derrochador dado que las celdas se someten a múltiples pruebas, pero si tus barrios suelen ser pequeños no creo que eso sea un gran problema.

El adjacent se vectoriza en cells por lo que se podría probar en varios puntos, pero eso lo complicaría y la eficiencia ganada quizás no valdría la pena.

0 votos

Una respuesta excelente y que responde a la pregunta que había planteado. He hecho una edición para incluir la noción de que estoy buscando viajar linealmente desde el punto, lo que hace las cosas un poco más difíciles. Es un buen punto de partida, ¡gracias!

1 votos

Puedes modificar el argumento "direcciones" para obtener exactamente las celdas que quieres en relación al centro, creo que eso puede cubrir la modificación "lineal" que quieres?

0 votos

Trabajaré con él durante el próximo tiempo y te lo haré saber. Gracias por su ayuda en este problema.

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