You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中计算不同类别经纬度点的平均距离?

在R中按类别计算坐标点间平均距离的实现方案

完全不需要更换语言,R本身具备成熟的空间数据处理工具链,且你已经在用ggmap做可视化,继续用R能保持工作流连贯,100条数据的计算量完全不成问题。

下面分两种常见的空间分布对比场景给出实现方法:

场景1:计算每个类别内所有点的两两平均距离

这个指标反映类别内点的整体分散程度,值越大说明点分布越稀疏。

实现步骤:

  • 用geosphere包计算球面距离(经纬度是球面坐标,不能直接用欧氏距离)
  • 用dplyr和tidyr做分组与两两配对处理

代码示例:

# 加载所需包
library(geosphere)
library(dplyr)
library(tidyr)

# 构造示例数据(替换成你的真实数据)
set.seed(123)
df <- data.frame(
  long = runif(100, 116, 117),
  lat = runif(100, 39, 40),
  category = sample(c("杂货店", "加油站"), 100, replace = TRUE)
)

# 按类别计算两两平均距离
pairwise_avg_dist <- df %>%
  group_by(category) %>%
  # 生成组内所有点的两两配对(避免重复计算,只保留id1 < id2的组合)
  expand(id1 = row_number(), id2 = row_number()) %>%
  filter(id1 < id2) %>%
  # 关联两次原始数据,得到配对点的经纬度
  left_join(df, by = c("category", "id1" = "row_number()")) %>%
  rename(long1 = long, lat1 = lat) %>%
  left_join(df, by = c("category", "id2" = "row_number()")) %>%
  rename(long2 = long, lat2 = lat) %>%
  # 计算两点间球面距离(单位:米,可改用distVincentySphere等函数)
  mutate(distance = distHaversine(cbind(long1, lat1), cbind(long2, lat2))) %>%
  # 分组求平均距离
  group_by(category) %>%
  summarise(avg_pairwise_distance_m = mean(distance, na.rm = TRUE))

print(pairwise_avg_dist)

场景2:计算每个类别内点到类别中心的平均距离

这个指标反映点围绕类别中心的分散程度,适合对比不同类别聚集的紧凑度。

代码示例:

# 计算每个类别的中心坐标(平均经纬度)
category_centers <- df %>%
  group_by(category) %>%
  summarise(center_long = mean(long), center_lat = mean(lat))

# 计算点到中心的平均距离
center_avg_dist <- df %>%
  left_join(category_centers, by = "category") %>%
  mutate(distance_to_center = distHaversine(cbind(long, lat), cbind(center_long, center_lat))) %>%
  group_by(category) %>%
  summarise(avg_distance_to_center_m = mean(distance_to_center, na.rm = TRUE))

print(center_avg_dist)

关键说明:

  • distHaversine是geosphere包中常用的球面距离计算函数,结果单位为米;如果需要更高精度,可改用distVincentyEllipsoid(基于椭球面计算)。
  • 两种指标可结合使用,更全面地对比不同类别的空间分布特征。

内容的提问来源于stack exchange,提问作者H Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 08:52:18