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
相关产品推荐
相关产品推荐

