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

