目标线串和其他线串集合之间的最小面积?

Minimum area between target linestring and a collection of other linestrings?

提问人:sploopst 提问时间:10/25/2023 最后编辑:sploopst 更新时间:10/25/2023 访问量:48

问:

我有一个问题,我想为一组目标线串提取两个分数,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 之间的最小区域,可以总结为更完整的第二个分数。

有谁知道计算这个的好方法吗?提前致谢。

Diagram of problem with potential solution

下面用于生成静态和目标线串的示例代码。

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)

r 地理 距离 空间 面积

评论

1赞 margusl 10/25/2023
你能提供一个小型的可重复数据集吗?S 的距离栅格和沿 T 要素的栅格提取是否适用于您的应用程序,或者由于区域覆盖范围和分辨率要求而不实用?
1赞 sploopst 10/25/2023
在:)上方添加了数据集生成器脚本
0赞 sploopst 10/25/2023
此外,关于栅格,我宁愿不使用离散/分配的解决方案来解决此问题。我越接近连续解决方案越好。

答: 暂无答案