如何在R中基于sf多边形对象计算最近邻?
在R的sf对象中计算邮政编码多边形的最近邻指标
要在sf对象上实现最近邻计算,推荐结合spdep包(空间依赖分析工具,与sf兼容良好),以下是两种常用方法:
方法1:基于质心的k近邻计算(高效推荐)
多边形的最近邻计算通常以质心作为要素的代表位置,这种方法计算效率高,适合大数据量:
# 加载空间依赖分析包 library(spdep) # 计算邮政编码多边形的质心 GER_centroids <- st_centroid(GER_postcode_subsample) # 计算k=4的最近邻(返回每个要素的近邻索引与对应距离) knn_result <- knearneigh(st_coordinates(GER_centroids), k = 4) # 查看每个要素的4个最近邻索引 knn_result$nn # 查看每个要素到最近邻的距离 knn_result$dist # 可选:转换为邻接列表/空间权重矩阵,用于后续空间分析(如Moran's I) knn_nb <- knn2nb(knn_result) knn_weights <- nb2listw(knn_nb)
方法2:基于多边形边界的精确最近邻计算(精度优先)
如果需要基于多边形实际边界的最短距离计算(而非质心),可以使用sf的st_distance函数,但这种方法计算量较大,适合小样本数据:
# 计算所有多边形两两之间的边界距离矩阵 dist_matrix <- st_distance(GER_postcode_subsample) # 定义需要的近邻数量 k <- 4 # 对每个多边形,筛选出除自身外距离最小的k个要素的索引 knn_indices <- apply(dist_matrix, 1, function(x) order(x)[2:(k+1)]) # 查看结果:每列对应一个多边形的k个最近邻索引 knn_indices
说明
spdep的knearneigh函数与sp包中的用法逻辑一致,但支持直接传入sf对象的坐标矩阵(通过st_coordinates提取);- 质心计算是空间分析中处理面要素的常规操作,平衡了精度与计算效率;
- 若需进一步分析空间关联,
knn2nb和nb2listw可以将近邻结果转换为空间权重矩阵,支持后续的空间自相关分析。
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

