Source code for altitudo.altitudo
# -*- coding: utf-8 -*-
"""Main module."""
import requests
import warnings
from altitudo import __version__
[docs]def altitudo(lat, lon, feet=False, session=None, timeout=30):
"""
Fetch the elevation at the given geo coordinate
Parameters
lat: float/iterable - of floats Latitude
lon: float/iterable - of floats Longitude
feet: bool - To return the elevation in feet instead of meters.
session: requests.Session() - object if special session is needed. (proxies, ect)
timeout: int -
Returns:
float/list of floats
"""
session = requests.Session() if session is None else session
session.headers.update({'ALTITUDO_VERSION': __version__})
try:
lat, lon = iter(lat), iter(lon)
single = False
except TypeError:
single = True
lat, lon = [lat], [lon]
elevations = []
points = ''
current_count = 0
for latitude, longitude in zip(lat, lon):
points += '({},{})'.format(latitude, longitude)
current_count += 1
if current_count == 50:
elevations.extend(_get_elevations(points, session, timeout))
points = ''
current_count = 0
if points:
elevations.extend(_get_elevations(points, session, timeout))
# Return a list of dicts containing points and associated elevation
# if more than one coordinate is given, otherwise return the elevation
# value itself, as user already knows the coordinates
if feet:
[elevation.update({'elevation': _convert_to_feet(elevation['elevation'])})
for elevation in elevations]
return elevations if not single else elevations[0]['elevation']
def _convert_to_feet(meters):
return meters * 3.28084
def _get_elevations(points, sess, timeout):
"""
points: string of tuples, representing lat and lons. ie. '(1.23,2.34),(1.2,4.5)'
sess: request.Session() to make the requests
Returns:
list of the points and the elevations given
"""
url = 'https://elevation-api.io/api/elevation?points={}'.format(points)
resp = sess.get(url, timeout=timeout)
if resp.ok:
json = resp.json()
msg = json.get('message')
if msg:
warnings.warn(msg, category=UserWarning)
return json.get('elevations', [])
else:
raise IOError(
'Unable to fetch elevation(s)! Got error code {} from server w/ content: {}'
.format(resp.status_code, resp.content)
)