generated from mwc/lab_weather
137 lines
3.3 KiB
Python
137 lines
3.3 KiB
Python
#!/usr/bin/python
|
|
# coding: utf8
|
|
|
|
from __future__ import absolute_import
|
|
|
|
import logging
|
|
|
|
from geocoder.location import BBox
|
|
from geocoder.base import OneResult, MultipleResultsQuery
|
|
|
|
|
|
class KomootResult(OneResult):
|
|
|
|
def __init__(self, json_content):
|
|
# create safe shortcuts
|
|
self._geometry = json_content.get('geometry', {})
|
|
self._properties = json_content.get('properties', {})
|
|
|
|
# proceed with super.__init__
|
|
super(KomootResult, self).__init__(json_content)
|
|
|
|
@property
|
|
def lat(self):
|
|
return self._geometry['coordinates'][1]
|
|
|
|
@property
|
|
def lng(self):
|
|
return self._geometry['coordinates'][0]
|
|
|
|
@property
|
|
def bbox(self):
|
|
extent = self._properties.get('extent')
|
|
if extent and all(extent):
|
|
west = extent[0]
|
|
north = extent[1]
|
|
east = extent[2]
|
|
south = extent[3]
|
|
return BBox.factory([south, west, north, east]).as_dict
|
|
|
|
@property
|
|
def address(self):
|
|
# Ontario, Canada
|
|
address = ', '.join([self.state, self.country])
|
|
|
|
# 453 Booth street, Ottawa ON, Canada
|
|
if self.housenumber:
|
|
middle = ', '.join([self.street, self.city])
|
|
address = ' '.join([self.housenumber, middle, address])
|
|
|
|
# 453 Booth street, Ottawa ON, Canada
|
|
elif self.street:
|
|
middle = ', '.join([self.street, self.city])
|
|
address = ' '.join([middle, address])
|
|
|
|
# Ottawa ON, Canada
|
|
elif self.city:
|
|
address = ' '.join([self.city, address])
|
|
|
|
return address
|
|
|
|
@property
|
|
def country(self):
|
|
return self._properties.get('country', '')
|
|
|
|
@property
|
|
def state(self):
|
|
if self.osm_value == 'state':
|
|
return self._properties.get('name', '')
|
|
return self._properties.get('state', '')
|
|
|
|
@property
|
|
def city(self):
|
|
if self.osm_value == 'city':
|
|
return self._properties.get('name', '')
|
|
return self._properties.get('city', '')
|
|
|
|
@property
|
|
def street(self):
|
|
return self._properties.get('street', '')
|
|
|
|
@property
|
|
def housenumber(self):
|
|
return self._properties.get('housenumber', '')
|
|
|
|
@property
|
|
def postal(self):
|
|
return self._properties.get('postcode', '')
|
|
|
|
@property
|
|
def osm_id(self):
|
|
return self._properties.get('osm_id', '')
|
|
|
|
@property
|
|
def osm_value(self):
|
|
return self._properties.get('osm_value', '')
|
|
|
|
@property
|
|
def osm_key(self):
|
|
return self._properties.get('osm_key', '')
|
|
|
|
@property
|
|
def osm_type(self):
|
|
return self._properties.get('osm_type', '')
|
|
|
|
|
|
class KomootQuery(MultipleResultsQuery):
|
|
"""
|
|
Komoot REST API
|
|
=======================
|
|
|
|
API Reference
|
|
-------------
|
|
http://photon.komoot.de
|
|
"""
|
|
provider = 'komoot'
|
|
method = 'geocode'
|
|
|
|
_URL = 'http://photon.komoot.de/api'
|
|
_RESULT_CLASS = KomootResult
|
|
_KEY_MANDATORY = False
|
|
|
|
def _build_params(self, location, provider_key, **kwargs):
|
|
return {
|
|
'q': location,
|
|
'limit': kwargs.get('maxRows', 1),
|
|
'lang': 'en',
|
|
}
|
|
|
|
def _adapt_results(self, json_response):
|
|
return json_response['features']
|
|
|
|
|
|
if __name__ == '__main__':
|
|
logging.basicConfig(level=logging.INFO)
|
|
g = KomootQuery('Ottawa Ontario', maxRows=3)
|
|
g.debug()
|