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

求助:如何批量通过API获取城市经纬度(附R初始调用代码)

批量获取城市经纬度:R/Python 实现方案

R 实现方案

基于你提供的基础代码,我们可以用purrr包实现批量处理,同时加入请求延迟避免API限流,最终输出包含城市、纬度、经度的表格。

完整代码

library(httr2)
library(purrr)
library(dplyr)
library(jsonlite)

# 配置API密钥
API_KEY <- "你的RapidAPI密钥"
API_HOST <- "geocoding-by-api-ninjas.p.rapidapi.com"

# 待处理的城市列表
cities <- c("New York", "London", "Tokyo", "Beijing")

# 定义单个城市的经纬度获取函数
get_geo_data <- function(city) {
  # 构造请求
  req <- request("https://geocoding-by-api-ninjas.p.rapidapi.com/") %>%
    req_url_path("v1/geocoding") %>%
    req_url_query(name = city) %>%
    req_headers(
      'X-RapidAPI-Key' = API_KEY,
      'X-RapidAPI-Host' = API_HOST
    )
  
  # 发送请求并解析结果
  resp <- req %>% req_perform()
  json_data <- resp %>% resp_body_json()
  
  # 提取需要的字段,处理无结果的情况
  if(length(json_data) == 0) {
    return(tibble(city = city, latitude = NA, longitude = NA))
  } else {
    return(tibble(
      city = city,
      latitude = json_data[[1]]$latitude,
      longitude = json_data[[1]]$longitude
    ))
  }
}

# 批量处理:加入延迟(每秒1次请求,避免限流)
geo_results <- map_dfr(cities, function(city) {
  Sys.sleep(1)
  get_geo_data(city)
})

# 输出结果
print(geo_results)

关键说明

  • 用map_dfr批量遍历城市列表,自动将结果合并为DataFrame
  • 加入Sys.sleep(1)控制请求频率,避免触发API限流机制
  • 增加了无结果的容错处理,返回NA值
  • 使用dplyr和tibble简化数据整理流程

Python 实现方案

如果偏好Python,可以用requests库结合pandas实现同样的功能:

完整代码

import requests
import pandas as pd
import time

# 配置API密钥
API_KEY = "你的RapidAPI密钥"
API_HOST = "geocoding-by-api-ninjas.p.rapidapi.com"
BASE_URL = "https://geocoding-by-api-ninjas.p.rapidapi.com/v1/geocoding"

# 待处理的城市列表
cities = ["New York", "London", "Tokyo", "Beijing"]

# 定义请求头
headers = {
    "X-RapidAPI-Key": API_KEY,
    "X-RapidAPI-Host": API_HOST
}

# 存储结果的列表
geo_data = []

# 批量处理
for city in cities:
    params = {"name": city}
    try:
        response = requests.get(BASE_URL, headers=headers, params=params)
        response.raise_for_status()  # 检查请求是否成功
        data = response.json()
        
        if data:
            geo_data.append({
                "city": city,
                "latitude": data[0]["latitude"],
                "longitude": data[0]["longitude"]
            })
        else:
            geo_data.append({
                "city": city,
                "latitude": None,
                "longitude": None
            })
    except Exception as e:
        print(f"获取{city}数据失败: {str(e)}")
        geo_data.append({
            "city": city,
            "latitude": None,
            "longitude": None
        })
    time.sleep(1)  # 延迟1秒避免限流

# 转换为DataFrame并输出
df = pd.DataFrame(geo_data)
print(df)

关键说明

  • 用requests.get发送请求,结合params传递城市参数
  • 加入异常处理,捕获请求失败的情况
  • 使用time.sleep(1)控制请求频率
  • 最终结果转换为pandas.DataFrame,方便后续分析或导出表格

内容的提问来源于stack exchange,提问作者Vanda Klčová

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 01:10:28