用折线分割折线

Split polyline with polyline

我想用线分割线。 (我想像QGIS算法一样“用线分割线”)

函数 "gsection" 在 stplanr 的包中执行此操作。

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

但是函数 return SpatialLines class.

我想要获取 SpatialLiensdataframe class,并保留 "ID" 等

我该怎么办?

尽管将 gsection() 打包成 stplanr(原始代码由 Barry Rowlingson 编写),但我不得不提醒自己它做了什么。它主要在我的工作中用作 overline() 的辅助函数,但我决定导出它以防它是 use/interest 给其他人的。很高兴看到它!

该函数不 return 数据是有原因的:各个路段有不同数量的重叠路线。

但是,能够查询分段所来自的数据是很有用的,所以让我们通过一些代码,以您的可重现示例为基础,看看发生了什么:

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()也会返回匹配项(查看结果内部了解我的意思):

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 次,不是很有用!

假设您对 第一个 实际共享长度的行匹配感到满意,您可以使用 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 的下一个版本之前这样做。它可能应该说明每个段有多少重叠线作为附加输出。

非常感谢您在任何情况下都发起了这些调查:非常有用。