y la tabla de capturas. Traslado todo lo relacionado a Geocoding a un servicio independiente del capturer. Replanteo totalmente el parseo del html, creando un objeto nuevo.
94 lines
3 KiB
Python
94 lines
3 KiB
Python
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
|
|
|