Разделить ломаную линию с помощью полилинии

#r #split #polyline #sp

#r #разделить #полилиния #sp

Вопрос:

Я хочу разделить строку с помощью line. (Я хочу сделать как алгоритм QGIS «разделить строки с помощью lines)

функция «gsection» в пакете stplanr делает это.

 library(stplanr)
data(routes_fast)
result <- gsection(routes_fast)
class(result)
  

Но функция возвращает класс SpatialLines.

Я хочу получить класс SpatialLiensdataframe и сохранить «ID» и т.д.

Что я должен делать?

Ответ №1:

Мне пришлось напомнить себе, что gsection() получается, несмотря на упаковку этого в stplanr (исходный код был написан Барри Роулингсоном). Он используется в основном в моей работе в качестве вспомогательной функции для overline() , но я решил экспортировать его на случай, если он будет полезен / интересен другим. Приятно это видеть!

Функция не возвращает данные по определенной причине: отдельные сегменты имеют разное количество перекрывающихся маршрутов.

Однако полезно иметь возможность запрашивать данные, из которых берутся сегменты, поэтому давайте поработаем с некоторым кодом, основываясь на вашем воспроизводимом примере, чтобы увидеть, что происходит:


library(stplanr)

 ## Loading required package: sp
  


length(routes_fast) # too many to visualise segments

 ## [1] 42
  


r = routes_fast[3:4,] # take 2 lines to see what's going on
s = gsection(r) # split into overlapping sections
class(r) # has data, as you say

 ## [1] "SpatialLinesDataFrame"
## attr(,"package")
## [1] "sp"
  


class(s) # does not have data!

 ## [1] "SpatialLines"
## attr(,"package")
## [1] "sp"
  


length(r) # 2 lines, as expected

 ## [1] 2
  


length(s) # 3 segments with same number of overlaps

 ## [1] 3
  

Как вы можете видеть из вывода приведенного выше фрагмента кода, сегментов больше, чем маршрутов. Так что, каждому сегменту наверняка может быть выделен свой собственный маршрут? Нет.

Это проиллюстрировано ниже. Третья строка из результирующих сегментов s (окрашена серым цветом) является результатом перекрытия обеих строк в r . Итак, какие значения данных вы ожидаете, что они будут иметь?


library(tmap) # for awesome plotting abilities
qtm(routes_fast[3:4,], line.lwd = 20, line.alpha = 0.3)
qtm(routes_fast[3,], line.lwd = 5)
qtm(s[1,], line.col = "white")
qtm(s[2,], line.col = "black")
qtm(s[3,], line.col = "grey", line.lwd = 2)

линии

Существуют разные способы ответить на этот вопрос. По умолчанию sp::over() используется первое перекрытие. Но это не то, что мы хотим, поскольку over() возвращает совпадение, даже если линии соприкасаются, но не имеют общего расстояния (загляните в результаты, чтобы понять, что я имею в виду):


result_data = over(x = s, y = r)
result_data

 ##      plan        start           finish length time waypoint
## 1 fastest Gledhow Lane Harehills Avenue   2241  475       43
## 2 fastest Gledhow Lane Harehills Avenue   2241  475       43
## 3 fastest Gledhow Lane Harehills Avenue   2241  475       43
  


result_list = over(x = s, y = r, returnList = T)

result_data возвращает первую совпадающую строку из данных в строках, соприкасающихся с каждым сегментом — в данном случае это просто routes_fast@data[3,] повторяется 3 раза, не очень полезно!

Предполагая, что вас устраивает первое совпадение строк, которые фактически имеют общую длину, вы могли бы использовать (недокументированный) minDimension аргумент over() , описанный в vignette("over") :


over(x = s, y = r, minDimension = 1)

 ##      plan        start           finish length time waypoint
## 1 fastest Gledhow Lane Harehills Avenue   2241  475       43
## 2 fastest Gledhow Lane      Ekota Place   1864  270       37
## 3 fastest Gledhow Lane Harehills Avenue   2241  475       43
  

Я думаю, что добавление аргумента return_data к функции было бы полезным, и планирую сделать это до следующего выпуска stplanr. Вероятно, следует что-то сказать о том, сколько перекрывающихся строк имеет каждый сегмент в качестве дополнительного вывода.

В любом случае, большое спасибо за то, что вы инициировали эти исследования: очень полезно.

Комментарии:

1. Спасибо за вашу помощь.

2. Удивлен, что автор пакета посмотрел и ответил на мой вопрос. Спасибо за вашу помощь. в результате проблема решена.

3. Рад слышать @ogawa. Пожалуйста, отметьте «Правильно», если считаете, что это правильный ответ!