def geolocate(address, try_all=True): try: # see https://astral.readthedocs.io/en/latest/#cities a = lookup(address, database()) return a.latitude, a.longitude except: pass # use online geocoder location_data = geocoder.geonames(address, method='details', key='jarbas') if not location_data.ok: location_data = geocoder.geocodefarm(address) if not location_data.ok: location_data = geocoder.osm(address) if try_all: # more are just making it slow if not location_data.ok: location_data = geocoder.google(address) if not location_data.ok: location_data = geocoder.arcgis(address) if not location_data.ok: location_data = geocoder.bing(address) if not location_data.ok: location_data = geocoder.canadapost(address) if not location_data.ok: location_data = geocoder.yandex(address) if not location_data.ok: location_data = geocoder.tgos(address) if location_data.ok: location_data = location_data.json lat = location_data.get("lat") lon = location_data.get("lng") return lat, lon raise ValueError
def geolocate(address, service="geocodefarm"): data = {} if service == "geocodefarm": location_data = geocoder.geocodefarm(address) elif service == "osm": location_data = geocoder.osm(address) elif service == "google": location_data = geocoder.google(address) elif service == "arcis": location_data = geocoder.arcgis(address) elif service == "bing": location_data = geocoder.bing(address) elif service == "canadapost": location_data = geocoder.canadapost(address) elif service == "yandex": location_data = geocoder.yandex(address) elif service == "tgos": location_data = geocoder.tgos(address) else: raise ValueError("Unknown geocoder service") if location_data.ok: location_data = location_data.json data["country"] = location_data.get("country") data["country_code"] = location_data.get("country_code") data["region"] = location_data.get("region") data["address"] = location_data.get("address") data["state"] = location_data.get("state") data["confidence"] = location_data.get("confidence") data["lat"] = location_data.get("lat") data["lon"] = location_data.get("lng") data["city"] = location_data.get("city") data["postal"] = location_data.get("postal") data["timezone"] = location_data.get("timezone_short") else: return None location = { "city": { "name": data["city"], "state": { "name": data["state"], "country": { "code": data["country_code"], "name": data["country"] } } }, "coordinate": { "latitude": data["lat"], "longitude": data["lon"] }, "timezone": { "name": data["timezone"] } } return location
def geolocate(self, address, try_all=True): if address in self.geocache: return self.geocache[address] try: # should be installed from default skills from astral.geocoder import database, lookup # see https://astral.readthedocs.io/en/latest/#cities a = lookup(address, database()) self.geocache[address] = (a.latitude, a.longitude) return a.latitude, a.longitude except: pass # use online geocoder location_data = geocoder.osm(address) if not location_data.ok: location_data = geocoder.geocodefarm(address) if try_all: # more are just making it slow if not location_data.ok: location_data = geocoder.google(address) if not location_data.ok: location_data = geocoder.arcgis(address) if not location_data.ok: location_data = geocoder.bing(address) if not location_data.ok: location_data = geocoder.canadapost(address) if not location_data.ok: location_data = geocoder.yandex(address) if not location_data.ok: location_data = geocoder.tgos(address) if location_data.ok: location_data = location_data.json lat = location_data.get("lat") lon = location_data.get("lng") self.geocache[address] = (lat, lon) return lat, lon raise ValueError
def tgos_by_geocoder(address): g = geocoder.tgos(address) #g.debug() if g.ok: return (g.lat, g.lng) return False
def test_tgos(): g = geocoder.tgos(taiwan) assert g.ok g = geocoder.tgos(taiwan, language='en') assert g.ok