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

如何用R的geonames包为数据表每行调用API生成国家代码列

逐行调用geonames API获取国家代码的解决方案

问题根源

GNcountryCode()不支持直接传入经纬度向量做批量处理,会将所有坐标合并为单个请求,导致无法得到每行对应的国家代码。

可行解决方法

方法1:For循环逐行处理(新手友好)

这种方式逻辑清晰,容易调试,还能方便地添加请求延迟避免触发API限制:

# 先确认已设置geonames用户名(你手动调用成功应该已经配置过)
options(geonamesUsername = "你的注册用户名")

# 初始化存储国家代码的列
loc2$country <- NA_character_

# 遍历每一行调用API
for (row_idx in seq(nrow(loc2))) {
  # 获取当前行的经纬度
  current_lon <- loc2$lon[row_idx]
  current_lat <- loc2$lat[row_idx]
  
  # 调用API
  api_result <- GNcountryCode(current_lon, current_lat)
  # 提取国家代码存入对应行
  loc2$country[row_idx] <- api_result$countryCode
  
  # 添加延迟,适配每小时1000次的API限制(0.5秒延迟足够留余量)
  Sys.sleep(0.5)
}

方法2:函数式编程处理(更简洁)

如果习惯用R的函数式风格,可以用lapply或purrr包的工具来处理:

Base R的lapply实现:

options(geonamesUsername = "你的注册用户名")

loc2$country <- lapply(seq(nrow(loc2)), function(row_idx) {
  res <- GNcountryCode(loc2$lon[row_idx], loc2$lat[row_idx])
  Sys.sleep(0.5)
  res$countryCode
}) %>% unlist()

purrr包的map2实现(专门处理成对向量):

先安装并加载purrr:

install.packages("purrr")
library(purrr)

options(geonamesUsername = "你的注册用户名")

loc2$country <- map2(loc2$lon, loc2$lat, function(lon, lat) {
  res <- GNcountryCode(lon, lat)
  Sys.sleep(0.5)
  res$countryCode
}) %>% unlist()

额外优化:错误处理

如果遇到无效经纬度或API请求失败,添加tryCatch可以避免程序中断:

for (row_idx in seq(nrow(loc2))) {
  tryCatch({
    current_lon <- loc2$lon[row_idx]
    current_lat <- loc2$lat[row_idx]
    api_result <- GNcountryCode(current_lon, current_lat)
    loc2$country[row_idx] <- api_result$countryCode
  }, error = function(e) {
    loc2$country[row_idx] <- NA
    message(paste("行", row_idx, "处理失败:", e$message))
  })
  Sys.sleep(0.5)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 10:05:08