Source code for omgeo.services.pelias
from .base import GeocodeService
import logging
from omgeo.places import Candidate
from omgeo.preprocessors import ReplaceRangeWithNumber
from posixpath import join as posixjoin
try:
# python 3
from urllib.parse import urljoin
except ImportError:
# python 2
from urlparse import urljoin
logger = logging.getLogger(__name__)
[docs]class Pelias(GeocodeService):
"""
Class to geocode using `Pelias search service
<https://pelias.io/>`_.
Settings used by the Pelias GeocodeService object include:
* api_key -- The API key used to access search service.
"""
_wkid = 4326
# 766-68 Any St. -> 766 Any St.
DEFAULT_PREPROCESSORS = [ReplaceRangeWithNumber()]
DEFAULT_POSTPROCESSORS = []
def __init__(self, preprocessors=None, postprocessors=None, settings=None):
if 'api_version' in settings:
self._api_version = 'v' + str(settings['api_version'])
else:
self._api_version = 'v1'
if 'instance_url' in settings:
self._base_url = settings['instance_url']
else:
self._base_url = 'https://api.geocode.earth/'
self._default_endpoint = urljoin(self._base_url,
posixjoin(self._api_version, 'search'))
self._key_endpoint = urljoin(self._base_url,
posixjoin(self._api_version, 'place'))
self._endpoint = self._default_endpoint
preprocessors = Pelias.DEFAULT_PREPROCESSORS if preprocessors is None else preprocessors
postprocessors = Pelias.DEFAULT_POSTPROCESSORS if postprocessors is None else postprocessors
GeocodeService.__init__(self, preprocessors, postprocessors, settings)
def _geocode(self, pq):
query = {'text': pq.query}
if pq.country:
query = dict(query, **{'boundary.country': pq.country})
if pq.viewbox is not None:
box = pq.viewbox.to_pelias_dict()
query = dict(query, **box)
if hasattr(pq, 'key'):
# Swap to the place endpoint and return a single result.
self._endpoint = self._key_endpoint
query = {'ids': pq.key}
if 'api_key' in self._settings:
query['api_key'] = self._settings['api_key']
response_obj = self._get_json_obj(self._endpoint, query)
returned_candidates = [] # this will be the list returned
features_in_response = response_obj['features']
for r in features_in_response:
properties = r['properties']
geometry = r['geometry']
score = 100 * float(properties['confidence']) if 'confidence' in properties else 0
locality = properties['locality'] if 'locality' in properties else ''
region = properties['region'] if 'region' in properties else ''
label = properties['label'] if 'label' in properties else ''
layer = properties['layer'] if 'layer' in properties else ''
c = Candidate()
c.locator = layer
c.match_addr = label
c.match_region = region
c.match_city = locality
c.locator_type = layer
c.x = float(geometry['coordinates'][0])
c.y = float(geometry['coordinates'][1])
c.score = score
c.wkid = self._wkid
c.geoservice = self.__class__.__name__
returned_candidates.append(c)
return returned_candidates