lab_weather/geocoder/tomtom.py

128 lines
3.3 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/python
# coding: utf8
from __future__ import absolute_import
import logging
from geocoder.location import BBox
from geocoder.base import OneResult, MultipleResultsQuery
from geocoder.keys import tomtom_key
class TomtomResult(OneResult):
def __init__(self, json_content):
self._address = json_content['address']
super(TomtomResult, self).__init__(json_content)
@property
def lat(self):
return self.raw.get('position', {}).get('lat')
@property
def lng(self):
return self.raw.get('position', {}).get('lon')
@property
def geohash(self):
return self.raw.get('id')
@property
def quality(self):
return self.raw.get('type')
@property
def bbox(self):
viewport = self.raw.get('viewport', {})
if viewport:
bbox = {
'south': viewport.get('btmRightPoint')['lon'],
'west': viewport.get('btmRightPoint')['lat'],
'north': viewport.get('topLeftPoint')['lon'],
'east': viewport.get('topLeftPoint')['lat'],
}
return BBox.factory(bbox).as_dict
@property
def address(self):
return self._address.get('freeformAddress')
@property
def housenumber(self):
return self._address.get('streetNumber')
@property
def street(self):
return self._address.get('streetName')
@property
def road(self):
return self.street
@property
def city(self):
return self._address.get('municipality')
@property
def state(self):
return self._address.get('countrySubdivisionName', self._address.get('countrySubdivision'))
@property
def country(self):
return self._address.get('countryCode')
@property
def postal(self):
return self._address.get('postalCode')
class TomtomQuery(MultipleResultsQuery):
"""
Geocoding API
=============
The Geocoding API gives developers access to TomToms first class geocoding service.
Developers may call this service through either a single or batch geocoding request.
This service supports global coverage, with house number level matching in over 50 countries,
and address point matching where available.
API Reference
-------------
https://developer.tomtom.com/tomtom-maps-apis-developers
"""
provider = 'tomtom'
method = 'geocode'
_URL = 'https://api.tomtom.com/search/2/geocode/{0}.json'
_RESULT_CLASS = TomtomResult
_KEY = tomtom_key
def _build_params(self, location, provider_key, **kwargs):
return {
'key': provider_key,
'limit': kwargs.get('maxRows', 1),
'countrySet': kwargs.get('countrySet'),
'lon': kwargs.get('lon'),
'lat': kwargs.get('lat'),
'radius': kwargs.get('radius')
}
def _before_initialize(self, location, **kwargs):
self.url = self.url.format(location)
def _adapt_results(self, json_response):
return json_response['results']
def _catch_errors(self, json_response):
if 'Developer Inactive' in str(json_response):
self.error = 'API Key not valid'
self.status_code = 401
return self.error
if __name__ == '__main__':
logging.basicConfig(level=logging.INFO)
g = TomtomQuery('1552 Payette dr., Ottawa')
g.debug()