我不得不提醒自己 gsection() 做了什么,尽管它被打包成 stplanr(原始代码是由 Barry Rowlingson 编写的)。它主要在我的工作中用作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()eturns 匹配,即使线条接触但没有任何共享距离(查看结果内部以了解我的意思):
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_dataeturns 从接触每个段的行中的数据中返回第一个匹配行 - 在这种情况下,这只是 routes_fast@data[3,]epeated 3 次,不是很有用!
假设您对实际共享长度的第一个行匹配感到满意,您可以使用over() 的(未记录的)minDimension 参数,如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 的下一个版本之前这样做。它可能应该说明每个段有多少重叠线作为附加输出。
非常感谢您在任何情况下发起这些调查:非常有用。