用折线分割折线
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 的下一个版本之前这样做。它可能应该说明每个段有多少重叠线作为附加输出。
非常感谢您在任何情况下都发起了这些调查:非常有用。
我想用线分割线。 (我想像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 的下一个版本之前这样做。它可能应该说明每个段有多少重叠线作为附加输出。
非常感谢您在任何情况下都发起了这些调查:非常有用。