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

如何通过OSM获取城市GPS坐标?API地址失效求助

修复后的OpenStreetMap地理编码R函数

你遇到的核心问题是原API使用了HTTP协议,而当前Nominatim API已强制要求HTTPS,同时缺少必要请求头会被服务器拒绝。以下是修复并优化后的函数,支持城市名称和邮政编码查询:

mygeocode <- function(addresses) {
  nominatim_osm <- function(address = NULL) {
    # 检查输入是否为空
    if (is.null(address) || address == "") {
      return(c(lon = NA, lat = NA))
    }
    
    # 规范编码地址参数
    encoded_addr <- URLencode(address, reserved = TRUE)
    
    # 构建HTTPS请求URL,添加必要参数
    url <- sprintf("https://nominatim.openstreetmap.org/search?q=%s&format=json&addressdetails=0&limit=1", encoded_addr)
    
    tryCatch({
      # 添加User-Agent请求头,Nominatim要求必须提供
      response <- httr::GET(url, httr::user_agent("MyGeocodeApp/1.0 (contact@example.com)"))
      
      # 检查请求是否成功
      if (httr::http_error(response)) {
        warning(sprintf("请求失败,状态码: %s", httr::status_code(response)))
        return(c(lon = NA, lat = NA))
      }
      
      d <- jsonlite::fromJSON(httr::content(response, "text"))
      
      if (length(d) == 0) {
        return(c(lon = NA, lat = NA))
      }
      
      return(c(lon = as.numeric(d$lon), lat = as.numeric(d$lat)))
      
    }, error = function(e) {
      warning(sprintf("查询出错: %s", e$message))
      return(c(lon = NA, lat = NA))
    })
  }
  
  # 批量处理输入地址
  results <- t(sapply(addresses, nominatim_osm))
  colnames(results) <- c("lon", "lat")
  return(as.data.frame(results))
}

关键修改说明

  • 协议升级:将原HTTP地址替换为HTTPS,符合当前Nominatim API的访问要求
  • 请求头添加:新增User-Agent字段,这是Nominatim API的强制要求,避免被服务器拦截(请替换为你的应用信息)
  • 地址编码优化:使用URLencode替代手动替换,更规范处理特殊字符
  • 错误处理增强:新增HTTP状态码检查和更清晰的错误提示,返回NA而非空数据框,保证结果结构一致
  • 返回格式优化:最终返回数据框格式,比矩阵更便于后续数据处理

使用示例

# 查询城市坐标
mygeocode(c("Paris", "London"))

# 查询邮政编码对应的坐标
mygeocode(c("75001", "SW1A 1AA"))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 16:27:35