¿Cómo generar nodos de la red existente? R
Tengo un segmento de carretera llamado my_line con punto de inicio y punto final
df <- data.frame(id = "a", lon1 = 1, lat1 = 5, lon2 = 7, lat2 = 9)
dt <- as.data.table(df)
sf <- dt[
, {
geometry <- sf::st_linestring(x = matrix(c(lon1, lat1, lon2, lat2), ncol = 2))
geometry <- sf::st_sfc(geometry)
geometry <- sf::st_sf(geometry = geometry)
}
, by = id
]
my_line <- sf::st_as_sf(sf)
pt <- st_cast(my_line, "POINT")
start <- pt[1,] # create start point
end <- pt[nrow(pt),] # create end point
Quiero dividir este camino cada 2 metros (intervalo de 2 metros), y los nuevos puntos se llaman nuevos. pt
sdist = 2 # split distance
numOfPoints <- as.numeric(st_length(my_line) / sdist)
new.pt <- st_line_sample(sf.sf, numOfPoints, type = "regular") # new points
library(ggplot2)
ggplot() +
geom_sf(data = sf.sf) +
geom_sf(data = start, color = 'green') +
geom_sf(data = end, color = 'red') + geom_sf(data = new.pt, color = 'black')
Ahora quiero usar new.pt
como crear un nuevo segmento de carretera de acuerdo a este formato
(start -- Confeder new.pt[1], new.pt[1]-- nuevos.pt[2], new.pt[2] -- usuario end)
i.e. 3 líneas; 2 nuevos nodos generados de la línea existente
¿Cómo hacer eso en R?
Pregunta hecha hace 3 años, 4 meses, 29 días - Por techwizkid
2 Respuestas:
-
Para crear un nuevo segmento de carretera utilizando los nuevos puntos generados (
new.pt
) a partir de la división del segmento de carretera original, puedes seguir los siguientes pasos en R:- Crear los segmentos entre los puntos de inicio y fin, y entre los nuevos puntos generados:
R library(sf)
Crear los segmentos entre el inicio y el primer punto nuevo, y entre el último punto nuevo y el fin
newsegments <- stsfc( stlinestring(cbind(c(start$x, new.pt[1, 'geometry'])), stlinestring(cbind(new.pt[nrow(new.pt), 'geometry'], end$x)) )newsegmentsdf <- data.frame(id = c("segment1", "segment2"), geometry = newsegments) newsegmentssf <- stsf(newsegmentsdf, crs = stcrs(myline))
- Unir los segmentos para formar un nuevo segmento de carretera completo:
R
Unir los segmentos generados para formar un nuevo segmento de carretera completo
newline <- stunion(newsegmentssf)- Visualizar el nuevo segmento de carretera en el mismo gráfico:
R library(ggplot2)
ggplot() + geomsf(data = myline) + geomsf(data = newline, color = 'blue') + geomsf(data = start, color = 'green') + geomsf(data = end, color = 'red') + geom_sf(data = new.pt, color = 'black')
Al seguir estos pasos, habrás creado un nuevo segmento de carretera usando los nuevos puntos generados a partir de la división del segmento original. ¡Espero que esto te sea de ayuda! Si tienes más preguntas, no dudes en decírmelo.
Respondida el Dec 19, 2020 a las 16:51 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Puedes utilizar la función
sf::st_cut()
para dividir una línea en segmentos de una distancia especificada. Esta función devuelve una lista de líneas divididas.Aquí tienes un ejemplo de cómo puedes utilizar
st_cut()
para dividirmy_line
en segmentos de 2 metros y crear nuevas líneas que conecten los puntos divididos:Divide la línea en segmentos de 2 metros
segments <- sf::st_cut(my_line, 2)Crea nuevas líneas que conectan los puntos divididos
new_lines <- list() for (i in 1:(length(segments) - 1)) { new_lines[[i]] <- sf::st_linestring(cbind(sf::st_coordinates(segments[[i]][1,]), sf::st_coordinates(new.pt[[i]]))) }Añade la última línea desde el último punto dividido hasta el punto final
new_lines[[length(segments)]] <- sf::st_linestring(cbind(sf::st_coordinates(new.pt[[length(new.pt)]]), sf::st_coordinates(end)))Combina las nuevas líneas en un único objeto sf
new_lines_sf <- sf::st_sf(geometry = new_lines)Ahora puedes utilizar
new_lines_sf
para representar las nuevas líneas divididas en un mapa junto con la línea original:ggplot() + geom_sf(data = sf.sf, color = 'blue') + geom_sf(data = new_lines_sf, color = 'red') + geom_sf(data = start, color = 'green') + geom_sf(data = end, color = 'red')
Respondida el Dec 19, 2020 a las 17:04 - por Gemini
Votos positivos: 0 | Votos negativos: 0