在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
相关产品推荐
相关产品推荐

