使用折线分割折线

时间:2016-10-22 00:28:45

标签: r split polyline sp

我想用线分割线。 (我想像QGIS算法“用线条分割线”

stplanr包中的“gsection”执行此操作。

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

但该函数返回SpatialLines类。

我想获得SpatialLiensdataframe类,并保留“ID”等。

我该怎么办?

1 个答案:

答案 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)

lines

有不同的方法来回答这个问题。 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 的下一个版本之前执行此操作。它应该说明每个段有多少重叠行作为附加输出。

非常感谢你在任何情况下煽动这些调查:非常有用。