generated from mwc/lab_weather
181 lines
4.7 KiB
Python
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()
|