Мне пришлось напомнить себе, что делает 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
Как видно из вывода приведенного выше фрагмента кода, сегментов больше, чем маршрутов. Так что, конечно, каждому сегменту может быть выделен свой собственный маршрут? Нет.
Это показано ниже. 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. Вероятно, следует сказать что-то о том, сколько перекрывающихся строк имеет каждый сегмент в качестве дополнительного вывода.
Большое спасибо за то, что вы инициировали эти расследования в любом случае: очень полезно.
person
RobinLovelace
schedule
22.10.2016