make reverse geolocation lookup more stableand removed unused modules
This commit is contained in:
parent
9faf11d0df
commit
9167804f1e
@ -39,12 +39,13 @@ def mkGeolocationTable(file=''):
|
|||||||
import xml.etree.ElementTree as ET
|
import xml.etree.ElementTree as ET
|
||||||
from sys import stdin
|
from sys import stdin
|
||||||
import warnings
|
import warnings
|
||||||
from time import sleep
|
|
||||||
from geopy.geocoders import Photon
|
from geopy.geocoders import Photon
|
||||||
import urllib2 as URL
|
from geopy.extra.rate_limiter import RateLimiter
|
||||||
|
from geopy.exc import GeocoderServiceError
|
||||||
import json as JSON
|
import json as JSON
|
||||||
|
|
||||||
# constants
|
# constants
|
||||||
|
url = 'https://photon.komoot.io/reverse?lon={lng:.3f}&lat={lat:.3f}'
|
||||||
namespaces = {'sc3': 'http://geofon.gfz-potsdam.de/ns/seiscomp3-schema/0.7',
|
namespaces = {'sc3': 'http://geofon.gfz-potsdam.de/ns/seiscomp3-schema/0.7',
|
||||||
'qml': 'http://quakeml.org/xmlns/bed/1.2'}
|
'qml': 'http://quakeml.org/xmlns/bed/1.2'}
|
||||||
|
|
||||||
@ -66,12 +67,13 @@ def mkGeolocationTable(file=''):
|
|||||||
# parse event.xml
|
# parse event.xml
|
||||||
DOM = ET.parse(stdin).getroot()
|
DOM = ET.parse(stdin).getroot()
|
||||||
geolocator = Photon()
|
geolocator = Photon()
|
||||||
|
reverse_geolocate = RateLimiter(geolocator.reverse, min_delay_seconds=1)
|
||||||
|
|
||||||
# iterate over all events
|
# iterate over all events
|
||||||
for event in DOM.iterfind('qml:eventParameters/qml:event', namespaces):
|
for event in DOM.iterfind('qml:eventParameters/qml:event', namespaces):
|
||||||
publicID = event.attrib['publicID'].split('/')[2]
|
publicID = event.attrib['publicID'].split('/')[2]
|
||||||
lat = event.find('./qml:origin/qml:latitude/qml:value', namespaces).text
|
lat = float(event.find('./qml:origin/qml:latitude/qml:value', namespaces).text)
|
||||||
lng = event.find('./qml:origin/qml:longitude/qml:value', namespaces).text
|
lng = float(event.find('./qml:origin/qml:longitude/qml:value', namespaces).text)
|
||||||
evaluationMode = event.find('./qml:origin/qml:evaluationMode', namespaces).text
|
evaluationMode = event.find('./qml:origin/qml:evaluationMode', namespaces).text
|
||||||
|
|
||||||
if publicID in geolocationTable:
|
if publicID in geolocationTable:
|
||||||
@ -80,60 +82,29 @@ def mkGeolocationTable(file=''):
|
|||||||
warnings.warn('Skipping automatic event %s' %(publicID))
|
warnings.warn('Skipping automatic event %s' %(publicID))
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
location = geolocator.reverse("{lat}, {lng}".format(lat=lat, lng=lng))
|
locations = reverse_geolocate("{lat:.3f}, {lng:.3f}".format(lat=lat, lng=lng),exactly_one=False,limit=5)
|
||||||
except:
|
except GeocoderServiceError:
|
||||||
warnings.warn('Reverse Geolocation failed. Skipping event.')
|
warnings.warn('Reverse Geolocation failed. Skipping event.')
|
||||||
continue
|
continue
|
||||||
place = []
|
place = []
|
||||||
try:
|
for location in locations:
|
||||||
place = location.raw['properties']['city']
|
|
||||||
except KeyError:
|
|
||||||
try:
|
try:
|
||||||
place = location.raw['properties']['town']
|
place = location.raw['properties']['city']
|
||||||
except KeyError:
|
except KeyError:
|
||||||
try:
|
try:
|
||||||
place = location.raw['properties']['village']
|
place = location.raw['properties']['town']
|
||||||
except KeyError:
|
except KeyError:
|
||||||
try:
|
try:
|
||||||
place = location.raw['properties']['county']
|
place = location.raw['properties']['village']
|
||||||
except KeyError:
|
except KeyError:
|
||||||
warnings.warn('Could not extract city for event {0} at {1} N / {2} E (URL: {3})'.format(publicID, lat, lng, url))
|
|
||||||
geolocationTable[publicID] = place
|
|
||||||
sleep(1.1)
|
|
||||||
|
|
||||||
'''
|
|
||||||
#warnings.warn('Processing event %s' %publicID)
|
|
||||||
# send and evaluate nominatim request
|
|
||||||
url = 'https://open.mapquestapi.com/nominatim/v1/reverse.php?key=oE512xGQxeH1n2cueacJ6xzRv7qFlCib&lat={0}&lon={1}&zoom=10&format=json'.format(lat, lng)
|
|
||||||
response = URL.urlopen(url)
|
|
||||||
if ( response.msg == 'OK' ):
|
|
||||||
data = JSON.loads(response.read())
|
|
||||||
city = []
|
|
||||||
try:
|
|
||||||
try:
|
|
||||||
city = data['address']['city']
|
|
||||||
except:
|
|
||||||
warnings.warn('Request {3} for event {0} at {1} N / {2} E did not provide city attribute\n\t(Response: {4})'.format(publicID, lat, lng, url, data))
|
|
||||||
try:
|
|
||||||
city = data['address']['town']
|
|
||||||
warnings.warn('Using attribute town ({1}) for event {0}'.format(publicID, city))
|
|
||||||
except:
|
|
||||||
try:
|
try:
|
||||||
city = data['address']['county']
|
place = location.raw['properties']['county']
|
||||||
warnings.warn('Using attribute county ({1}) for event {0}'.format(publicID, city))
|
except KeyError:
|
||||||
except:
|
pass
|
||||||
warnings.warn('Skipping event')
|
if not place:
|
||||||
continue
|
warnings.warn('Could not extract city for event {id} at {lat:.3f} N / {lng:.3f} E (Service: {url})'.format(id=publicID, lat=lat, lng=lng, url=url.format(lat=lat,lng=lng)))
|
||||||
countryCode = data['address']['country_code'].upper()
|
geolocationTable[publicID] = place
|
||||||
if ( countryCode == 'DE' ):
|
|
||||||
geolocationTable[publicID] = city.encode('utf-8')
|
|
||||||
else:
|
|
||||||
geolocationTable[publicID] = '{0} ({1})'.format(city.encode('utf-8'), countryCode)
|
|
||||||
except:
|
|
||||||
warnings.warn('Could not extract city for event {0} at {1} N / {2} E (URL: {3})'.format(publicID, lat, lng, url))
|
|
||||||
else:
|
|
||||||
warnings.warn('Request {0} failed'.format(url))
|
|
||||||
'''
|
|
||||||
# dump json
|
# dump json
|
||||||
print('var geolocationTable = {0};'.format(JSON.dumps(geolocationTable, sort_keys=True)))
|
print('var geolocationTable = {0};'.format(JSON.dumps(geolocationTable, sort_keys=True)))
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user