【代码】通过在线服务获取经纬度的海拔高度

一般获取高度数据的方法很简单。打开对应的DEM文件,按照经纬度来查询对应DEM文件的行列号,按照行列号读取DEM数据(即高度)。

以上方法是通用的获取高度的流程。

现在有这样的一个场景,我们需要查询多个地点高度。如果这些点都集中在小范围区域的话,那么我们需要下载的DEM文件大小就小。与此相反,如果这些点分布范围很大,这时候我们需要下载的DEM就非常巨大。

那有没有一种方法:不需要下载DEM直接得到对应经纬度的海拔数据呢?

答案是有的。

USGS 国家地图有一个 REST 服务,可用于查询纬度/经度坐标的海拔。

服务网址: https://apps.nationalmap.gov/epqs/

打开网址如下图所示

image-20240415144348677

#!/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