提问人:sploopst 提问时间:10/25/2023 最后编辑:sploopst 更新时间:10/25/2023 访问量:48
目标线串和其他线串集合之间的最小面积?
Minimum area between target linestring and a collection of other linestrings?
问:
我有一个问题,我想为一组目标线串提取两个分数,T:1.T的欧几里得距离,2.与第二组静态线串特征的平均“接近度”,S。
目前,我正在 SF 中使用沿 T 的采样点和 S 中的所有特征之间的ST_NEAREST_POINTS进行一组距离采样。这在点和特征之间提供了一组最短的线串,我可以用ST_LENGTH和平均值来测量这些线串,以产生“接近度”的近似度量。
不幸的是,由于 T 和 S 相对较大,因此速度很慢。我当时在想一种比一吨点样本更快的方法是找到 T 和 S 之间的区域,但我在弄清楚如何实现这一点时遇到了一些麻烦。例如,我可以将 T 的起点和终点投射到 ST_NEAREST_POINTS 中,以找到 POLYGON 的边界,然后该边界可以通过 ST_AREA,但是当 S 到 T 中最接近的要素沿 T 的长度变化时,问题就出现了。我附上了一张图片来说明这个问题的(粗略)解决方案,其中红色边缘是 T 的成员,黑色边缘代表 S,灰色区域代表 T 和 S 之间的最小区域,可以总结为更完整的第二个分数。
有谁知道计算这个的好方法吗?提前致谢。
下面用于生成静态和目标线串的示例代码。
static_lines = matrix(runif(20, -100, 100),ncol = 2) |>
as.data.frame() |>
sf::st_as_sf(coords = c("V1", "V2"))
#random walks
static_lines =
do.call(c, apply(static_lines, MARGIN = 1, FUN = function(x){
for(i in 1:20){
if(i == 1){line = x |> sf::st_as_sfc()}
last = line |> sf::st_cast("POINT")
last = last[length(last)]
line = c(line |> sf::st_cast("POINT"),
sf::st_sample(sf::st_difference(sf::st_buffer(last, 20),sf::st_buffer(line,5)), 1)) |>
sf::st_combine() |>
sf::st_cast("LINESTRING")
}
line
}))
target_lines = matrix(runif(20, -100, 100),ncol = 2) |>
as.data.frame() |>
sf::st_as_sf(coords = c("V1", "V2"))
#single step random-walk
target_lines =
do.call(c, apply(target_lines, MARGIN = 1, FUN = function(x){
line = x |> sf::st_as_sfc()
last = line |> sf::st_cast("POINT")
last = last[length(last)]
line = c(line |> sf::st_cast("POINT"),
sf::st_sample(sf::st_difference(sf::st_buffer(last, 20),sf::st_buffer(line,5)), 1)) |>
sf::st_combine() |>
sf::st_cast("LINESTRING")
line
}))
#plot
plot(static_lines)
plot(target_lines, add = T, col = "red", lwd = 3)
答: 暂无答案
评论