You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中为sf几何图形实现高效高精度的距离计算函数(替代GLM/GAM)

高效生成高精度空间距离预测函数(支持多几何类型)

背景

我拥有一组代表道路的sf几何图形(核心为LINESTRING类型,同时需要适配POLYGON、POINT等通用几何类型)。目前已实现一个距离计算函数:通过sf::st_line_sample提取候选几何上的采样点,结合道路几何调用st_nearest_feature生成点到道路的LINESTRING集合,最终基于候选几何到最近道路的距离完成加权操作。

现有方法的痛点

直接计算的方式耗时过长。尝试过替代方案:在道路几何的包围盒上生成规则网格点,计算这些点到道路的真实距离后,用广义可加模型(GAM)预测其他点的距离。但该方案存在两难问题:

  • 若平滑参数k值设置较低,预测曲面过度平滑,误差较大
  • 若k值设置较高,模型训练耗时接近直接计算真实距离,失去预测提速的意义

核心需求

希望构建一个函数f(x, y, geom) = d,其中:

  • x为经度,y为纬度
  • geom为目标几何图形
  • d为点到目标几何的距离

要求满足:

  • 高精度:预测曲面不能过度平滑,需保留道路几何的细节特征
  • 高效率:计算速度显著优于直接距离计算
  • 非离散优先:Signed Distance Function(符号距离函数)看似可行,但尽可能避免采用离散化解决方案

当前实现代码

以下GAM实现的函数可运行,但通用性不足:

distance_calc = 
  function(target_geom, points_to_weight, sample_size){
    library(mgcv)
    points = sf::st_sample(sf::st_bbox(target_geom) |> sf::st_as_sfc(), sample_size, type = "regular") |> sf::st_as_sf()
    
    dists = sf::st_coordinates(points) |> as.data.frame()
    dists$dist = sf::st_nearest_points(points, target_geom |> sf::st_combine()) |> sf::st_length() |> as.numeric()
    
    model = gam(dist ~ s(X,Y, k = 100), data = dists, method = "REML")
    out = points_to_weight
    out$prediction = predict(model, points_to_weight) |> as.numeric()
    out
  }

内容的提问来源于stack exchange,提问作者sploopst

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 04:42:50