lab_weather/geocoder/mapquest.py

126 lines
3.0 KiB
Python

#!/usr/bin/python
# coding: utf8
from __future__ import absolute_import
from geocoder.base import OneResult, MultipleResultsQuery
from geocoder.keys import mapquest_key
from geocoder.location import BBox
class MapquestResult(OneResult):
@property
def lat(self):
return self.raw.get('latLng', {}).get('lat')
@property
def lng(self):
return self.raw.get('latLng', {}).get('lng')
@property
def street(self):
return self.raw.get('street')
@property
def address(self):
if self.street:
return self.street
elif self.city:
return self.city
elif self.country:
return self.country
@property
def quality(self):
return self.raw.get('geocodeQuality')
@property
def postal(self):
return self.raw.get('postalCode')
@property
def neighborhood(self):
return self.raw.get('adminArea6')
@property
def city(self):
return self.raw.get('adminArea5')
@property
def county(self):
return self.raw.get('adminArea4')
@property
def state(self):
return self.raw.get('adminArea3')
@property
def country(self):
return self.raw.get('adminArea1')
class MapquestQuery(MultipleResultsQuery):
"""
MapQuest
========
The geocoding service enables you to take an address and get the
associated latitude and longitude. You can also use any latitude
and longitude pair and get the associated address. Three types of
geocoding are offered: address, reverse, and batch.
API Reference
-------------
http://www.mapquestapi.com/geocoding/
"""
provider = 'mapquest'
method = 'geocode'
_URL = 'http://www.mapquestapi.com/geocoding/v1/address'
_RESULT_CLASS = MapquestResult
_KEY = mapquest_key
def _build_headers(self, provider_key, **kwargs):
return {
'referer': 'http://www.mapquestapi.com/geocoding/',
'host': 'www.mapquestapi.com',
}
def _build_params(self, location, provider_key, **kwargs):
params = {
'key': provider_key,
'location': location,
'maxResults': kwargs.get("maxRows", 1),
'outFormat': 'json',
}
bbox = kwargs.get('bbox')
if bbox:
bbox = BBox(bbox=bbox)
params['boundingBox'] = u'{north},{west},{south},{east}'.format(
west=bbox.west,
east=bbox.east,
south=bbox.south,
north=bbox.north
)
return params
def _catch_errors(self, json_response):
if b'The AppKey submitted with this request is invalid' in json_response:
self.error = 'MapQuest API Key invalid'
return self.error
def _adapt_results(self, json_response):
results = json_response.get('results', [])
if results:
return results[0]['locations']
return []
if __name__ == '__main__':
g = MapquestQuery('Ottawa', maxRows=3)
g.debug()