import requests class GeocodingCache: cache_max_size = 1000 def __init__(self): self.geocoded_addresses = [] def address_in_cache(self, address): """ Comprueba si la direccion ya esta en la cache """ for geocoded_address in self.geocoded_addresses: if geocoded_address['address'] == address: return True return False def get_coordinates(self, address): """ Recupera los datos asociados a la direccion """ for geocoded_address in self.geocoded_addresses: if geocoded_address['address'] == address: return geocoded_address['latitude'], \ geocoded_address['longitude'], \ geocoded_address['precision'] return None def add_address(self, address, latitude, longitude, precision): """ AƱade la direccion a la cache y le hace sitio si es necesario """ if len(self.geocoded_addresses) >= cache_max_size: self.geocoded_addresses.pop() self.geocoded_addresses.insert(0, {'address': address, 'latitude': latitude, 'longitude': longitude, 'precision': precision}) class GeocodingTask: url = 'https://maps.googleapis.com/maps/api/geocode/json' request_parameters = {'region': 'es', 'key': 'AIzaSyCnKj0WnsxVZcaoxeAYkuRw3cKRNGiISYA'} geocoding_status_success = ['OK'] geocoding_status_surrender = ['ZERO_RESULTS'] geocoding_status_retry = ['OVER_QUERY_LIMIT', 'REQUEST_DENIED', 'INVALID_REQUEST', 'UNKNOWN_ERROR'] def __init__(self, address): request_paremeters['address'] = address def geocode(self): """ Lanza la peticion de gecoding al servicio de google """ self.response = requests.get(url, request_parameters) self.response_json = self.response.json() def get_request_status(self): """ Devuelve el status HTTP de la request """ return self.response.status_code def success_surrender_retry(self): """ Devuelve el estado del resultado desde el punto de vista de Google """ if self.response_json['status'] in geocoding_status_success: return "Success" elif self.response_json['status'] in geocoding_status_surrender: return "Surrender" else: return "Retry" def get_results(self): """ Extrae los resultados del JSON de respuesta y los devuelve """ results = {'latitude': self.response_json['results'][0]['geometry']['location']['lat'], 'longitude': self.response_json['results'][0]['geometry']['location']['lon'], 'precision': self.response_json['results'][0]['geometry']['location_type']} return results