我想用线分割线。 (我想像QGIS算法“用线条分割线”
在stplanr
包中的“gsection”执行此操作。
library(stplanr)
data(routes_fast)
result <- gsection(routes_fast)
class(result)
但该函数返回SpatialLines类。
我想获得SpatialLiensdataframe类,并保留“ID”等。
我该怎么办?
答案 0 :(得分:1)
我不得不提醒自己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
中的第3行(灰色)是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_data
从触及每个线段的线条中的数据中获得第一个匹配的行 - 在这种情况下,只需要routes_fast@data[3,]
重复3次,不是很有用!
假设您对实际共享长度的行的第一个匹配感到满意,您可以使用minDimension
中的(未记录的)over()
参数,如{vignette("over")
中所述。 1}}:
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 的下一个版本之前执行此操作。它应该说明每个段有多少重叠行作为附加输出。
非常感谢你在任何情况下煽动这些调查:非常有用。