5 votos

Obtención de la elevación para múltiples coordenadas lat-long en Python

He visto la respuesta a Información de elevación para múltiples coordenadas de lat. y long. y me gustaría poder hacer esto con un script de python en su lugar. No puedo usar la API de Google porque tengo 8000 puntos. Los tengo como parte de un archivo .csv que importo en pandas como un dataframe.

algo así como:

elevation_list = []

def elevation_function(df):
    for lat,long in zip(df.lat,df.lon):
          elevation_i = some_call_to_file(lat,long)
          elevation_list.append(elevation_i)

Mis coordenadas abarcan la mitad occidental de los Estados Unidos, así que no estoy seguro de que la función pueda ser tan sencilla. He descargado todos los tiffs de resolución SRTM90M de esta increíble persona

5voto

Barry Brown Puntos 9774

No sé si es la forma más sencilla, pero ahorra la recopilación de datos de elevación. El USGS-National Map tiene un servicio REST que se puede utilizar para consultar la elevación para coords lat/lon.

Servicio url: https://nationalmap.gov/epqs/

Puede utilizar la biblioteca de peticiones de Python y formatear su cadena de consulta de acuerdo con los parámetros del servicio. Necesita sus coordenadas de entrada en NAD83 (lat/lon).

import requests
import urllib
import pandas as pd

# USGS Elevation Point Query Service
url = r'https://nationalmap.gov/epqs/pqs.php?'

# coordinates with known elevation 
lat = [48.633, 48.733, 45.1947, 45.1962]
lon = [-93.9667, -94.6167, -93.3257, -93.2755]

# create data frame
df = pd.DataFrame({
    'lat': lat,
    'lon': lon
})

def elevation_function(df, lat_column, lon_column):
    """Query service using lat, lon. add the elevation values as a new column."""
    elevations = []
    for lat, lon in zip(df[lat_column], df[lon_column]):

        # define rest query params
        params = {
            'output': 'json',
            'x': lon,
            'y': lat,
            'units': 'Meters'
        }

        # format query string and return query value
        result = requests.get((url + urllib.parse.urlencode(params)))
        elevations.append(result.json()['USGS_Elevation_Point_Query_Service']['Elevation_Query']['Elevation'])

    df['elev_meters'] = elevations

elevation_function(df, 'lat', 'lon')
df.head()

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X