Получить высоту от координат широты и долготы с помощью простого скрипта Python - PullRequest
0 голосов
/ 12 октября 2019

У меня есть скрипт на Python, который я получил из этого вопроса , который будет извлечен из службы запросов точки повышения USGS. Тем не менее, он сохраняет время ожидания и выгоняет меня через, казалось бы, случайное количество времени и до того, как мой запрос завершится. Мне нужен другой метод для получения данных высот, заданных широтными координатами.

Вот мой текущий запрос:

# ========= pull elev from usgs server ======

# USGS 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 df
df = pd.DataFrame({
    'lat': lat,
    'lon': lon
})

def elevation_function(df, lat_column, long_column):
    elevations = []
    counter = 0
    start = time.time()
    for lat, lon in zip(df[lat_column], df[long_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'])
        counter += 1
        print('Proportion of job complete: {}'.format(round(counter/df.shape[0],3)))
        end = time.time()
        print(str(round(end - start)) + " seconds into job\n")
    df['elev'] = elevations
    return elevations

start = time.time()
count = 0
for i in range(100):
    count += 1
    elevations = elevation_function(df, lat_column='lat', long_column='lon')
end = time.time()

print(str(round(end - start)))

1 Ответ

1 голос
/ 13 октября 2019

Оптимизируйте функцию и добавьте обработку ошибок:

  • * Необходимо написать 1004 * для работы с pandas.DataFrame.apply
    • Использование applyaxis=1 автоматически выполняет итерацию по каждой строке координат

Новые функции:

  • make_remote_request будет продолжать выполнять запрос до тех пор, покаполучает response.
  • Измените исключение, чтобы оно соответствовало исключению, возвращаемому сервером (например, except (OSError, urllib3.exceptions.ProtocolError) as error)
  • При необходимости, import time и добавьте time.sleep(5) перед continue висключение, чтобы хорошо играть с удаленным сервером.
def make_remote_request(url: str, params: dict) -> json:
    """
    Makes the remote request
    Continues making attempts until it succeeds
    """

    count = 1
    while True:
        try:
            response = requests.get((url + urllib.parse.urlencode(params)))
        except (OSError, urllib3.exceptions.ProtocolError) as error:
            print('\n')
            print('*' * 20, 'Error Occured', '*' * 20)
            print(f'Number of tries: {count}')
            print(f'URL: {url}')
            print(error)
            print('\n')
            count += 1
            continue
        break

    return response


def eleveation_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']

Реализовать функцию

import requests
import urllib
import urllib3
import pandas as pd

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

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

     lat      lon
 48.6330 -93.9667
 48.7330 -94.6167
 45.1947 -93.3257
 45.1962 -93.2755

# apply the function
df['elevations'] = df.apply(eleveation_function, axis=1)

     lat      lon  elevations
 48.6330 -93.9667      341.14
 48.7330 -94.6167      328.80
 45.1947 -93.3257      262.68
 45.1962 -93.2755      272.64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...