如何统计R数据框中每个经纬度点位250米半径范围内的其他点位数量
R实现统计经纬度点位250米范围内其他点位数量
实现思路
- 基于经纬度计算两点间球面距离,默认适配WGS84坐标系,距离单位统一为米
- 生成所有点位两两之间的距离矩阵
- 对每个点位,排除自身后统计距离≤250米的点位总数
实现代码
首先安装必要依赖包(已安装可跳过):install.packages(c("tidyverse", "geosphere"))
完整运行代码:
# 加载依赖包 library(tidyverse) library(geosphere) # 构造示例数据框 df <- tribble(~ id, ~ lon, ~ lat, 1, -56.2112038, -34.8358207, 2, -55.96403429999999, -34.7260945, 3, -56.155449, -34.9030824, 4, -55.2711453, -34.8665964, 5, -56.210083, -34.865306, 6, -56.0575984, -34.8775368, 7, -54.9485448, -34.9260087, 8, -56.146228, -34.907991, 9, -56.1953583, -34.8643363, 10, -56.1821508, -34.8697975, 11, -56.1498662, -34.8849854, 12, -56.1469807, -34.9119864, 13, -56.155763, -34.9154153, 14, -56.09861610000001, -34.8896448, 15, -56.15526680000001, -34.9189892, 16, -56.0582918, -34.8873091, 17, -54.9529404, -34.9221666, 19, -106.6971588, -35.1366719, 20, -56.1616095, -34.8937622) # 提取经纬度矩阵(注意输入顺序必须是经度在前,纬度在后) coords <- as.matrix(df[, c("lon", "lat")]) # 计算所有点位两两之间的距离(输出单位为米) dist_matrix <- distVincentySphere(coords) # 统计每个点位250米范围内除自身外的其他点位数量,写入新列 df$neighbor_count <- apply(dist_matrix, 1, function(x) sum(x <= 250) - 1)
说明
distVincentySphere是高精度球面距离计算函数,适配短距离场景的精度需求- 距离矩阵对角线元素为点位与自身的距离(值为0),因此统计后减1排除自身
- 若处理点位量级超过1万,建议改用空间索引方法提升计算效率,避免生成大尺寸距离矩阵
内容的提问来源于stack exchange,提问作者Paula
相关产品推荐
相关产品推荐

