#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. Пожалуйста, отметьте «Правильно», если считаете, что это правильный ответ!