geocoder.py
797 Bytes
import geopy
import shelve
import time
class CachedGeocoder:
def __init__(self, source="Nominatim", geocache="geocache.db"):
self.geocoder = getattr(geopy.geocoders, source)()
self.cache = shelve.open(geocache, writeback=True)
self.timestamp = time.time() + 1.5
def geocode(self, address):
if address not in self.cache:
time.sleep(max(0, 1 - (time.time() - self.timestamp)))
self.timestamp = time.time()
self.cache[address] = self.geocoder.geocode(
query=address,
timeout=5,
language='en_US', # urgh
addressdetails=True, # only works with Nominatim /!.
)
return self.cache[address]
def close(self):
self.cache.close()