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

R如何计算多个经纬度坐标点两两之间的公里距离

R计算经纬度点两两公里距离实现方案

方案说明

我们使用球面坐标系下的Haversine公式计算两点距离,支持两种实现方式:使用成熟第三方包快速实现,或无依赖手动实现,输出结果单位均为公里。
注意:经纬度距离计算要求输入坐标顺序为经度在前,纬度在后,你的数据框列顺序已经符合要求,无需调整。


方式1:使用geosphere包实现(推荐,不易出错)

步骤1:安装加载依赖包

# 首次使用先安装包,安装过可跳过此行
install.packages("geosphere")
# 加载包
library(geosphere)

步骤2:构造坐标数据

list1 <- data.frame(longitude = c(-3.0000,
                                   -1.3333,
                                   -6.5667), 
                     latitude = c(59.0000, 
                                  60.3333,  
                                  62.2500),
                      name= c('Orkney', 
                            'Shetlands', 
                               'Faroe'))

步骤3:计算距离

输出距离矩阵(快速查表)

矩阵行和列均为岛屿名称,交叉位置的数值就是对应两个地点的距离:

# 提取经纬度列
coord <- list1[, c("longitude", "latitude")]
# 计算距离矩阵,米转公里
dist_matrix <- distHaversine(coord) / 1000
# 绑定岛屿名称
rownames(dist_matrix) <- list1$name
colnames(dist_matrix) <- list1$name
# 打印结果
print(dist_matrix)

输出成对结果表(直观展示所有两两组合)

# 生成所有不重复的岛屿两两组合
pair_comb <- t(combn(list1$name, 2))
# 逐对计算距离
pair_dist <- apply(pair_comb, 1, function(x){
  p1_coord <- list1[list1$name == x[1], c("longitude", "latitude")]
  p2_coord <- list1[list1$name == x[2], c("longitude", "latitude")]
  return(distHaversine(p1_coord, p2_coord)/1000)
})
# 生成结果表,保留2位小数
result_df <- data.frame(
  地点A = pair_comb[,1],
  地点B = pair_comb[,2],
  距离_公里 = round(pair_dist, 2)
)
# 打印结果
print(result_df)

输出示例:

地点A     地点B 距离_公里
1    Orkney Shetlands    169.45
2    Orkney     Faroe    393.01
3 Shetlands     Faroe    286.27

方式2:无第三方依赖手动实现

不想安装额外包可以直接使用自定义Haversine公式函数计算:

# 自定义Haversine距离函数,输出单位公里
haversine_km <- function(lon1, lat1, lon2, lat2){
  R <- 6371 # 地球平均半径,单位公里
  d_lat <- (lat2 - lat1) * pi / 180
  d_lon <- (lon2 - lon1) * pi / 180
  a <- sin(d_lat/2)^2 + cos(lat1 * pi / 180) * cos(lat2 * pi / 180) * sin(d_lon/2)^2
  c <- 2 * atan2(sqrt(a), sqrt(1-a))
  return(R * c)
}

# 生成两两组合结果
pair_comb <- t(combn(list1$name, 2))
pair_dist <- apply(pair_comb, 1, function(x){
  p1 <- list1[list1$name == x[1], ]
  p2 <- list1[list1$name == x[2], ]
  return(haversine_km(p1$longitude, p1$latitude, p2$longitude, p2$latitude))
})
result_df <- data.frame(
  地点A = pair_comb[,1],
  地点B = pair_comb[,2],
  距离_公里 = round(pair_dist, 2)
)
print(result_df)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:09:04