Saltar al contenido

R/GIS: encuentre la distancia ortogonal entre una ubicación y la línea más cercana

Si hallas algún problema con tu código o trabajo, recuerda probar siempre en un entorno de testing antes aplicar el código al proyecto final.

Solución:

Si entiendo correctamente, puedes hacer esto simplemente con gDistance en el rgeos paquete.

Leer en las líneas como SpatialLines/DataFrame y puntos como SpatialPoints/DataFrame y luego recorra cada punto calculando la distancia cada vez:

require(rgeos)
## untested code
shortest.dists <- numeric(nrow(sp.pts))
for (i in seq_len(nrow(sp.pts)) 
    shortest.dists[i] <- gDistance(sp.pts[i,], sp.lns)

Aquí sp.pts es el objeto Puntos espaciales, y sp.lns es el objeto Líneas espaciales.

Debe hacer un bucle para que solo compare una sola coordenada en sp.pts con la totalidad de todas las geometrías de líneas en sp.lnsde lo contrario, obtiene la distancia de un valor agregado en todos los puntos.

Dado que sus datos están en latitud/longitud, debe transformar tanto las líneas como los puntos en una proyección adecuada ya que la gDistance función asume la distancia cartesiana.

MÁS DISCUSIÓN Y EJEMPLO (editar)

Sería bueno obtener el punto más cercano en la línea o líneas en lugar de solo la distancia, pero esto abre otra opción, que es si necesita el punto más cercano. coordinar a lo largo de una línea, o un real intersección con un segmento de línea que está más cerca que cualquier vértice existente. Si sus vértices son lo suficientemente densos como para que la diferencia no importe, entonces use spDistsN1 en el sp paquete. Tendría que extraer todas las coordenadas de cada línea en el conjunto (no difícil, pero un poco feo) y luego recorrer cada punto de interés calculando la distancia a los vértices de la línea; luego puede encontrar cuál es el más corto y seleccionar esa coordenada del conjunto de vértices, para que puedas tener la distancia y la coordenada fácilmente. Tampoco hay necesidad de proyectar ya que la función puede usar distancias elipsoidales con longlat = TRUE argumento.

library(maptools)

## simple global data set, which we coerce to Lines
data(wrld_simpl)

wrld_lines <- as(wrld_simpl, "SpatialLinesDataFrame")

## get every coordinate as a simple matrix (scary but quick)
wrld_coords <- do.call("rbind", lapply([email protected], function(x1) do.call("rbind", lapply([email protected], function(x2) [email protected][-nrow([email protected]), ]))))

Compruébalo de forma interactiva, tendrás que modificar esto para guardar las coordenadas o distancias mínimas. Esto trazará las líneas y esperará a que haga clic en cualquier parte del gráfico, luego dibujará una línea desde su clic hasta el punto más cercano. vértice en una línea

## no out of bounds clicking . . .
par(mar = c(0, 0, 0, 0), xaxs = "i", yaxs = "i") 

plot(wrld_lines, asp = "")

n <- 5

for (i in seq_len(n)) 
xy <- matrix(unlist(locator(1)), ncol = 2)
    all.dists <- spDistsN1(wrld_coords, xy, longlat = TRUE)
    min.index <- which.min(all.dists)
    points(xy, pch = "X")
lines(rbind(xy, wrld_coords[min.index, , drop = FALSE]), col = "green", lwd = 2)

Él geosphere El paquete tiene la función dist2line que hace esto para datos lon/lat. Puede utilizar matrices o objetos espaciales*.

line <- rbind(c(-180,-20), c(-150,-10), c(-140,55), c(10, 0), c(-140,-60))
pnts <- rbind(c(-170,0), c(-75,0), c(-70,-10), c(-80,20), c(-100,-50), 
         c(-100,-60), c(-100,-40), c(-100,-20), c(-100,-10), c(-100,0))
d <- dist2Line(pnts, line)
d 

Ilustración de los resultados

plot( makeLine(line), type='l')
points(line)
points(pnts, col='blue', pch=20)
points(d[,2], d[,3], col='red', pch='x')
for (i in 1:nrow(d)) lines(gcIntermediate(pnts[i,], d[i,2:3], 10), lwd=2)

Te mostramos reseñas y valoraciones

Te invitamos a añadir valor a nuestro contenido tributando tu veteranía en las ilustraciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *