使用st_join的st_is_within_distance实现点面关联时能否获取匹配距离值
问题解答
这个需求完全可以实现,st_join本身不会直接返回匹配对的距离值,你可以在现有关联逻辑的基础上补充距离计算步骤即可,完全适配你当前的代码写法。
具体实现步骤
- 先执行你现有的关联逻辑拿到匹配结果
library(sf) combined <- st_join(df_poly, df_points, join = st_is_within_distance, dist = 50, left = TRUE)
- 逐行计算每对匹配要素的实际距离
注意必须加
by_element = TRUE参数,否则会返回全量距离矩阵而非逐行匹配的对应距离,最终结果单位和你的数据投影单位一致,需确保你的数据为单位是英尺的投影坐标系
combined$distance_ft <- as.numeric(st_distance( x = combined$geometry.x, # 关联后多边形的几何列名 y = combined$geometry.y, # 关联后点的几何列名 by_element = TRUE ))
- 按多边形分组后根据距离排序
如果需要对每个多边形匹配到的所有点按距离从近到远排序,可使用dplyr的分组排序逻辑:
library(dplyr) combined_sorted <- combined %>% group_by(poly_id) %>% # 此处替换为你多边形数据框中的唯一标识字段名 arrange(distance_ft, .by_group = TRUE) # 如有需要可额外筛选每个多边形最近的N个点,比如取最近的5个点 # combined_sorted <- combined_sorted %>% slice_head(n = 5)
注意事项
- 不要使用WGS84这类单位为度的地理坐标系,否则阈值设置、距离计算的结果都会不符合英尺的预期,需要提前将数据转换为对应区域的英尺单位投影坐标系。
- 没有匹配到任何点的多边形对应的距离字段会返回NA,排序时会默认排在分组末尾,无需额外处理。
内容的提问来源于stack exchange,提问作者tchoup
相关产品推荐
相关产品推荐

