如何用R语言sf包查找点数据框对应的最近多边形要素?
在sf包中查找点对应的最近多边形要素
嗨,我之前也碰到过这个问题——用st_join加st_is_within_distance确实会返回所有在距离内的要素,但我们只想要最近的那个对吧?不用再依赖rgeos的gDistance了,sf包本身就有好用的工具,给你分享两种实用的方法:
方法一:用st_nearest_feature直接匹配(最简洁)
st_nearest_feature是sf专门用来找每个要素最近的另一个要素的函数,返回的是目标要素的索引,非常适合你的场景。步骤很简单:
- 首先确保你的点数据框(比如
points_sf)和多边形数据框(比如polygons_sf)CRS完全一致,不一致的话先用st_transform转换:
# 检查CRS是否匹配 st_crs(points_sf) == st_crs(polygons_sf) # 如果不匹配,转换点数据的CRS以对齐多边形 points_sf <- st_transform(points_sf, st_crs(polygons_sf))
- 用
st_nearest_feature获取每个点对应的最近多边形的索引:
nearest_poly_idx <- st_nearest_feature(points_sf, polygons_sf)
- 根据索引提取对应的多边形数据,再和点数据合并:
# 提取每个点对应的最近多边形 nearest_polygons <- polygons_sf[nearest_poly_idx, ] # 合并点与最近多边形的属性(保留双方所有字段) points_with_nearest_poly <- cbind(points_sf, nearest_polygons)
这个方法效率很高,不管数据集大小都适用,而且完全是sf原生操作,不用转sp对象,代码更流畅。
方法二:结合st_distance获取最近要素+距离值
如果除了最近多边形,你还想知道每个点到最近多边形的精确距离,可以用这个方法:
# 计算每个点到所有多边形的距离矩阵 distance_matrix <- st_distance(points_sf, polygons_sf) # 找到每个点对应的最小距离的多边形索引 nearest_poly_idx <- apply(distance_matrix, 1, which.min) # 提取最近多边形并合并距离值 nearest_polygons <- polygons_sf[nearest_poly_idx, ] points_with_nearest_poly <- cbind(points_sf, nearest_polygons) points_with_nearest_poly$distance_to_nearest_poly <- apply(distance_matrix, 1, min)
这个方法的好处是能同时拿到距离值,但如果你的多边形数量特别多,距离矩阵可能会占用较多内存,大数据集还是优先用第一种方法。
对比之前的rgeos方法
之前用rgeos的gDistance需要先把sf转成sp对象,现在用sf的原生函数直接操作,不仅省去了对象转换的麻烦,代码更简洁,而且sf的函数在并行处理和性能上也有优化,适配现代空间数据处理的需求。
内容的提问来源于stack exchange,提问作者mweber




