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

R语言通过循环为dataframe新增两坐标间驾车距离列

分组批量计算起终点驾车距离实现方案

前置准备

  • 安装并加载dplyr、ggmapdistance两个包,提前申请谷歌地图API密钥并完成注册,这是调用驾车路线计算接口的必需前提
  • 不需要写冗余的显式for循环,用分组按行处理的逻辑更简洁,出错概率更低
# 加载依赖包
library(dplyr)
library(ggmapdistance)

# 替换为你自己申请的谷歌地图API密钥
register_google(key = "你的API密钥")

# 构造和你给出结构完全一致的测试数据
df <- data.frame(
  group = c(1,1,2,2,3,3),
  point = c("from", "to", "from", "to", "from", "to"),
  lat = c(42.8138364, 42.30167, 42.3317772, 42.8138364, 42.3317772, 42.0788833),
  lon = c(-70.8915412, -71.1288836, -72.65411784, -70.8915412, -72.6541784, -72.0414925)
)

# 核心计算逻辑
df <- df %>%
  group_by(group) %>%
  mutate(
    # 注意:ggmapdistance接口要求坐标顺序为*经度在前,纬度在后*,顺序写反会导致结果完全错误
    from_loc = paste(lon[point == "from"], lat[point == "from"], sep = ","),
    to_loc = paste(lon[point == "to"], lat[point == "to"], sep = ","),
    distance = ifelse(
      point == "from",
      NA_real_,
      # 调用接口计算驾车距离,output选simple直接返回结构化数值
      mapdist(from = from_loc[1], to = to_loc[1], mode = "driving", output = "simple")$km
    )
  ) %>%
  # 删除临时生成的中间坐标列
  select(-from_loc, -to_loc) %>%
  ungroup()

常见问题说明

  • 上述代码返回的距离单位是公里,如果需要米为单位,把代码里的$km替换为$m即可;需要步行、公交等其他出行方式,修改mode参数的取值即可
  • 免费谷歌API有调用频次限制,如果你的分组数量超过100组,建议在距离计算逻辑里加一行Sys.sleep(0.5),每次调用接口间隔0.5秒,避免触发限流被封禁
  • 最终输出的distance列会自动给from点所在行填充NA,to点所在行填充实际计算的驾车路线距离,完全匹配你需要的输出结构
  • 如果更习惯用循环写法,只需遍历所有唯一的group值,每次提取对应组的from、to坐标计算距离,再把结果赋值到对应组的to行即可,逻辑和分组处理完全一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 17:01:04