Я хочу случайным образом выбрать отрезки дороги из дорожной сети.Я думал, что это не будет слишком сложно, но я никуда не денусь.Идея состоит в том, чтобы отобрать отрезки дорог (линий) из сети линий.Я хочу, чтобы эти отрезки были определенной длины, и я хочу, чтобы эти отрезки выбирались случайным образом из сети.Я нашел способы сегментировать SpatialLines на сегменты заданной длины ЗДЕСЬ , но это не позволяет делать это случайным образом и не позволяет объединять сегменты разных линий.Я мог бы использовать spsample из пакета sp для размещения точек на равных расстояниях вдоль линий.Тогда я смогу случайным образом выбрать точку в качестве начальной.Теоретически я думаю, что можно добавить соседние точки к линии, но я не уверен, как это сделать, и не знаю, как мне поступить со случайным выбором направления, когда дорога разделяется (2 пересекающиеся линии),
Вот некоторые данные.
data <- data.frame(
x = c(1,2,3,3,3,3,1,2,3),
y = c(1,2,2,3,4,5,4,4,4),
id = c(rep("A",6), rep("B",3))
)
#with Kyle Walker's functions I convert the points to lines
#https://rpubs.com/walkerke/points_to_line
library(sp)
library(maptools)
points_to_line <- function(data, long, lat, id_field = NULL, sort_field = NULL) {
# Convert to SpatialPointsDataFrame
coordinates(data) <- c(long, lat)
# If there is a sort field...
if (!is.null(sort_field)) {
if (!is.null(id_field)) {
data <- data[order(data[[id_field]], data[[sort_field]]), ]
} else {
data <- data[order(data[[sort_field]]), ]
}
}
# If there is only one path...
if (is.null(id_field)) {
lines <- SpatialLines(list(Lines(list(Line(data)), "id")))
return(lines)
# Now, if we have multiple lines...
} else if (!is.null(id_field)) {
# Split into a list by ID field
paths <- sp::split(data, data[[id_field]])
sp_lines <- SpatialLines(list(Lines(list(Line(paths[[1]])), "line1")))
# I like for loops, what can I say...
for (p in 2:length(paths)) {
id <- paste0("line", as.character(p))
l <- SpatialLines(list(Lines(list(Line(paths[[p]])), id)))
sp_lines <- spRbind(sp_lines, l)
}
return(sp_lines)
}
}
lines <- points_to_line(data = data,
long = "x",
lat = "y",
id_field = "id")
#plot it
ori.plot <- plot(lines, col = rep(c(1, 2), length.out = length(lines)), axes = T, main="original",
ylim=c(0,5), xlim=c(0,5))
Это дает мне график с двумя простыми линиями.
Я хотел бы, чтобы результаты могли быть такими:
или
или
Я могу разбить его на сегменты заданной длины, как указано выше, что дает что-то вроде этого (length = 0.3):
Но эти сегменты ограничены одной линией и не начинаются в случайных точках.
Есть идеи?