【问题标题】:Split polyline with polyline用折线分割折线
【发布时间】:2017-03-04 09:13:32
【问题描述】:

我想用线分割线。 (我想做QGIS算法“用线分割线)

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

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

但该函数返回 SpatialLines 类。

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

我该怎么办?

【问题讨论】:

    标签: r split polyline sp


    【解决方案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(灰色)的第三行是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 的下一个版本之前这样做。它可能应该说明每个段有多少重叠线作为附加输出。

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

    【讨论】:

    • 感谢您的帮助。
    • 惊讶于包作者看到并回答了我的问题。谢谢您的帮助。结果,解决了问题。
    • 很高兴听到@ogawa。如果您认为这是正确的答案,请标记“正确”!
    猜你喜欢
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 2011-09-04
    相关资源
    最近更新 更多