【代码】通过在线服务获取经纬度的海拔高度
【代码】通过在线服务获取经纬度的海拔高度
ytkz一般获取高度数据的方法很简单。打开对应的DEM文件,按照经纬度来查询对应DEM文件的行列号,按照行列号读取DEM数据(即高度)。
以上方法是通用的获取高度的流程。
现在有这样的一个场景,我们需要查询多个地点高度。如果这些点都集中在小范围区域的话,那么我们需要下载的DEM文件大小就小。与此相反,如果这些点分布范围很大,这时候我们需要下载的DEM就非常巨大。
那有没有一种方法:不需要下载DEM直接得到对应经纬度的海拔数据呢?
答案是有的。
USGS 国家地图有一个 REST 服务,可用于查询纬度/经度坐标的海拔。
服务网址: https://apps.nationalmap.gov/epqs/
打开网址如下图所示
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2024/4/15 14:24
# @File : elevation.py
from typing import List
import requests
import urllib
import pandas as pd
def get_elevation(df, lat_column, lon_column):
"""
使用经度和纬度查询服务,将海拔值作为新列添加。
"""
url = r'https://epqs.nationalmap.gov/v1/json?'
elevations = []
for lat, lon in zip(df[lat_column], df[lon_column]):
# 定义 REST 查询参数
params = {
'output': 'json',
'x': lon,
'y': lat,
'units': 'Meters'
}
# 格式化查询字符串并返回查询值
result = requests.get(url, params=params)
# 将查询到的海拔值添加到列表中
elevations.append(result.json()['value'])
# 将海拔值列表添加到数据框作为新列
df['elev_meters'] = elevations
return df
if __name__ == '__main__':
# 已知海拔的坐标
lat = [48.633, 48.733, 45.1947, 45.1962]
lon = [-93.9667, -94.6167, -93.3257, -93.2755]
# 创建数据框
df = pd.DataFrame({
'lat': lat,
'lon': lon
})
# 调用函数获取海拔并打印数据框
get_elevation(df, 'lat', 'lon')
print(df)
ns