#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import urllib.request
import json
def get_elevation(lat, lng, sensor=False):
"""
Returns the elevation of a specific location on earth using the Google
Maps API.
@param lat (float): The latitude of the location in degrees. Latitudes can
take any value between -90 and 90.
@param lng (float): The longitude of the location in degrees. Longitudes
can take any value between -180 and 180.
@param sensor (boolean): This parameter is required by the Google maps API
and indicates whether the application that requests the elevation data is
using a sensor (such as a GPS device). Default value is 'False'.
@return: A tuple (elevation, lat, lng, status):
* elevation (float): The requested elevation in meters. If the location is
on the sea floor the returned elevation has a negative value.
* lat, lng (float): The latitude and longitude of the location (for testing
purposes: must be equal to the input values).
* status (str): Error code:
"OK": the API request was successful.
"INVALID_REQUEST": the API request was malformed.
"OVER_QUERY_LIMIT": the requester has exceeded quota.
"REQUEST_DENIED": the API did not complete the request, likely because
of an invalid 'sensor' parameter.
"UNKNOWN_ERROR": other error
* If the error code 'status' is not 'OK' then all other members of the
returned tuple are set to 'None'.
@note: More information about the Google elevation API and its usage limits
can be found in https://developers.google.com/maps/documentation/elevation/.
@example:
>>> round(get_elevation(-38.407, -25.297)[0], 2) == -3843.86
True
>>> round(get_elevation(37.32522, -104.98470)[0], 2) == 2934.24
True
"""
## build the url for the API call
ELEVATION_BASE_URL = 'http://maps.google.com/maps/api/elevation/json'
URL_PARAMS = "locations=%.7f,%.7f&sensor=%s" % (lat, lng, "true" if sensor else "false")
url = ELEVATION_BASE_URL + "?" + URL_PARAMS
## make the call (ie. read the contents of the generated url) and decode the
## result (note: the result is in json format).
with urllib.request.urlopen(url) as f:
response = json.loads(f.read().decode())
status = response["status"]
if status == "OK":
result = response["results"][0]
elevation = float(result["elevation"])
lat = float(result["location"]["lat"])
lng = float(result["location"]["lng"])
else:
elevation = lat = lng = None
return (elevation, lat, lng, status)
if __name__ == "__main__":
import doctest
doctest.testmod()