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.lns
de 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.