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

Python如何通过经纬度获取全球或瑞典地区的海拔数据

问题说明

现有可运行代码仅适配美国地区海拔查询,调用USGS EPQS接口时,查询非美国区域会返回-1000000,当前需要获取瑞典地区的海拔数据,使用的样例数据如下:

import pandas as pd
lat = [57.728905, 57.728874, 57.728916, 57.728836, 57.728848]
lon = [11.949309, 11.949407, 11.949470, 11.949342, 11.949178]

# 构造数据框
df = pd.DataFrame({'lat': lat, 'lon': lon})

原始仅适配美国的代码如下:

import requests
import urllib.parse
import urllib3

def make_remote_request(url: str, params: dict):
   """
   发起远程请求,失败自动重试
   """
   count = 1
   while True:
       try:
           response = requests.get((url + urllib.parse.urlencode(params)))
       except (OSError, urllib3.exceptions.ProtocolError) as error:
           print('\n')
           print('*' * 20, '发生错误', '*' * 20)
           print(f'尝试次数: {count}')
           print(f'请求URL: {url}')
           print(error)
           print('\n')
           count += 1
           continue
       break
   return response

def elevation_function(x):
   url = 'https://nationalmap.gov/epqs/pqs.php?'
   params = {'x': x[1],
             'y': x[0],
             'units': 'Meters',
             'output': 'json'}
   result = make_remote_request(url, params)
   return result.json()['USGS_Elevation_Point_Query_Service']['Elevation_Query']['Elevation']

原始代码调用方式:

df['elevation'] = df.apply(elevation_function, axis=1)

# 输出结果
print(df)
解决方法

USGS的EPQS接口仅覆盖美国本土及附属领土,没有开放全球海拔数据查询能力。要查询瑞典等全球区域的海拔,可替换为基于SRTM全球高程数据集的公开查询接口,修改后的代码如下:

import requests
import pandas as pd
import time

# 样例数据
lat = [57.728905, 57.728874, 57.728916, 57.728836, 57.728848]
lon = [11.949309, 11.949407, 11.949470, 11.949342, 11.949178]
df = pd.DataFrame({'lat': lat, 'lon': lon})

def get_global_elevation(df):
    # 构造批量查询参数
    locations = [{"latitude": row['lat'], "longitude": row['lon']} for _, row in df.iterrows()]
    url = "https://api.open-elevation.com/api/v1/lookup"
    headers = {"Accept": "application/json", "Content-Type": "application/json"}
    
    count = 1
    while True:
        try:
            # 接口限制请求频率,加1秒延时避免被拦截
            time.sleep(1)
            response = requests.post(url, json={"locations": locations}, headers=headers)
            response.raise_for_status()
        except Exception as e:
            print(f'第{count}次请求失败,错误信息:{e}')
            count += 1
            continue
        break
    
    # 提取海拔结果
    elevation_list = [res['elevation'] for res in response.json()['results']]
    return elevation_list

# 调用函数获取海拔
df['elevation'] = get_global_elevation(df)
print(df)
注意事项
  • 公开高程查询接口单请求最多支持查询100个点位,数据量较大时请拆分请求,每次请求间隔1秒避免触发限流
  • 如果需要更高精度的瑞典区域海拔数据,可以调用瑞典本地地理测绘部门的公开高程接口,适配性和精度会更优

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 15:00:04