lab_weather/geocoder/bing.py

181 lines
4.7 KiB
Python

#!/usr/bin/python
# coding: utf8
from __future__ import absolute_import
from geocoder.base import OneResult, MultipleResultsQuery
from geocoder.keys import bing_key
import re
class BingResult(OneResult):
def __init__(self, json_content):
# create safe shortcuts
self._point = json_content.get('point', {})
self._address = json_content.get('address', {})
# proceed with super.__init__
super(BingResult, self).__init__(json_content)
@property
def lat(self):
coord = self._point['coordinates']
if coord:
return coord[0]
@property
def lng(self):
coord = self._point['coordinates']
if coord:
return coord[1]
@property
def address(self):
return self._address.get('formattedAddress')
@property
def housenumber(self):
if self.street:
expression = r'\d+'
pattern = re.compile(expression)
match = pattern.search(self.street, re.UNICODE)
if match:
return match.group(0)
@property
def street(self):
return self._address.get('addressLine')
@property
def neighborhood(self):
return self._address.get('neighborhood')
@property
def city(self):
return self._address.get('locality')
@property
def state(self):
return self._address.get('adminDistrict')
@property
def country(self):
return self._address.get('countryRegion')
@property
def quality(self):
return self.raw.get('entityType')
@property
def accuracy(self):
return self.raw.get('calculationMethod')
@property
def postal(self):
return self._address.get('postalCode')
@property
def bbox(self):
_bbox = self.raw.get('bbox')
if _bbox:
south = _bbox[0]
north = _bbox[2]
west = _bbox[1]
east = _bbox[3]
return self._get_bbox(south, west, north, east)
class BingQuery(MultipleResultsQuery):
"""
Bing Maps REST Services
=======================
The Bing™ Maps REST Services Application Programming Interface (API)
provides a Representational State Transfer (REST) interface to
perform tasks such as creating a static map with pushpins, geocoding
an address, retrieving imagery metadata, or creating a route.
API Reference
-------------
http://msdn.microsoft.com/en-us/library/ff701714.aspx
Get Bing key
------------
https://www.bingmapsportal.com/
"""
provider = 'bing'
method = 'geocode'
_URL = 'http://dev.virtualearth.net/REST/v1/Locations'
_RESULT_CLASS = BingResult
_KEY = bing_key
def _build_headers(self, provider_key, **kwargs):
return {
'Referer': "http://addxy.com/",
'User-agent': 'Mozilla/5.0'
}
def _build_params(self, location, provider_key, **kwargs):
return {
'q': location,
'o': 'json',
'inclnb': 1,
'key': provider_key,
'maxResults': kwargs.get('maxRows', 1)
}
def _catch_errors(self, json_response):
status = json_response['statusDescription']
if not status == 'OK':
self.error = status
return self.error
def _adapt_results(self, json_response):
# extract the array of JSON objects
sets = json_response['resourceSets']
if sets:
return sets[0]['resources']
return []
class BingQueryDetail(MultipleResultsQuery):
provider = 'bing'
method = 'details'
_URL = 'http://dev.virtualearth.net/REST/v1/Locations'
_RESULT_CLASS = BingResult
_KEY = bing_key
def _build_params(self, location, provider_key, **kwargs):
return {
'adminDistrict': kwargs.get('adminDistrict'),
'countryRegion': kwargs.get('countryRegion'),
'locality': kwargs.get('locality'),
'postalCode': kwargs.get('countryRegion'),
'addressLine': kwargs.get('addressLine', location),
'o': 'json',
'inclnb': 1,
'key': provider_key,
'maxResults': kwargs.get('maxRows', 1)
}
def _catch_errors(self, json_response):
status = json_response['statusDescription']
if not status == 'OK':
self.error = status
return self.error
def _adapt_results(self, json_response):
# extract the array of JSON objects
sets = json_response['resourceSets']
if sets:
return sets[0]['resources']
return []
if __name__ == '__main__':
g = BingQuery('453 Booth Street, Ottawa Ontario')
g.debug()