Source code for omgeo.services.mapquest

from .base import GeocodeService
import json
import logging
from omgeo.places import Candidate

try:
    # python 3
    from urllib.parse import unquote
except ImportError:
    # python 2
    from urllib import unquote

logger = logging.getLogger(__name__)


[docs]class MapQuest(GeocodeService): """ Class to geocode using MapQuest licensed services. """ _endpoint = 'http://www.mapquestapi.com/geocoding/v1/address' def _geocode(self, pq): def get_appended_location(location, **kwargs): """Add key/value pair to given dict only if value is not empty string.""" for kw in kwargs: if kwargs[kw] != '': location = dict(location, **{kw: kwargs[kw]}) return location location = {} location = get_appended_location(location, street=pq.query) if location == {}: location = get_appended_location(location, street=pq.address) location = get_appended_location(location, city=pq.city, county=pq.subregion, state=pq.state, postalCode=pq.postal, country=pq.country) json_ = dict(location=location) json_ = json.dumps(json_) logger.debug('MQ json: %s', json_) query = dict(key=unquote(self._settings['api_key']), json=json_) if pq.viewbox is not None: query = dict(query, viewbox=pq.viewbox.to_mapquest_str()) response_obj = self._get_json_obj(self._endpoint, query) logger.debug('MQ RESPONSE: %s', response_obj) returned_candidates = [] # this will be the list returned for r in response_obj['results'][0]['locations']: c = Candidate() c.locator = r['geocodeQuality'] c.confidence = r['geocodeQualityCode'] # http://www.mapquestapi.com/geocoding/geocodequality.html match_addr_elements = ['street', 'adminArea5', 'adminArea3', 'adminArea2', 'postalCode'] # similar to ESRI c.match_addr = ', '.join([r[k] for k in match_addr_elements if k in r]) c.x = r['latLng']['lng'] c.y = r['latLng']['lat'] c.wkid = 4326 c.geoservice = self.__class__.__name__ returned_candidates.append(c) return returned_candidates
class MapQuestSSL(MapQuest): _endpoint = 'https://www.mapquestapi.com/geocoding/v1/address'