Added option to read in old lookups.

This commit is contained in:
Kasper D. Fischer 2014-06-01 13:56:56 +00:00
parent 9617cc5fa3
commit 2eca635f6d
Notes: subgit 2018-03-07 17:59:00 +01:00
r679 www/trunk

View File

@ -2,84 +2,119 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
''' '''
Script to lookup city names of events with Nominatim service Script to lookup city names of events with Nominatim service
The input should be an valid quakeML file passed to stdin. The input should be an valid quakeML file passed to stdin.
The output will will be a javascript structure to be included in the The output will will be a javascript structure to be included in the
SeisObs map service. SeisObs map service.
The script should be updated regulary keep the total number of all The script should be updated regulary keep the total number of all
AJAX calls to the Nominatim service small, e. g. : AJAX calls to the Nominatim service small, e. g. :
curl -s "https://ariadne.geophysik.ruhr-uni-bochum.de/fdsnws/event/1/query?minlat=50&maxlat=54&minlon=3&maxlon=10&minmag=1" | mkGeolocationTable.py > geolocationTable.js curl -s "https://ariadne.geophysik.ruhr-uni-bochum.de/fdsnws/event/1/query?minlat=50&maxlat=54&minlon=3&maxlon=10&minmag=1" | mkGeolocationTable.py > geolocationTable.js
License License
Copyright 2014 Kasper D. Fischer <kasper.fischer@rub.de> Copyright 2014 Kasper D. Fischer <kasper.fischer@rub.de>
This program is free software: you can redistribute it and/or modify it This program is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free under the terms of the GNU General Public License as published by the Free
Software Foundation, either version 3 of the License, or (at your option) Software Foundation, either version 3 of the License, or (at your option)
any later version. any later version.
This program is distributed in the hope that it will be useful, but This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details. for more details.
You should have received a copy of the GNU General Public License along You should have received a copy of the GNU General Public License along
with this program. If not, see http://www.gnu.org/licenses/. with this program. If not, see http://www.gnu.org/licenses/.
$Id$ $Id$
''' '''
# imports def mkGeolocationTable(file=''):
try: # imports
import xml.etree.cElementTree as ET try:
except ImportError: import xml.etree.cElementTree as ET
import xml.etree.ElementTree as ET except ImportError:
from sys import stdin import xml.etree.ElementTree as ET
import warnings from sys import stdin
import urllib2 as URL import warnings
import json as JSON import urllib2 as URL
import json as JSON
# constants # constants
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'}
# initialise variables def simple_warning(message, category, filename, lineno, file=None, line=None):
geolocationTable = {}; return 'Warning: %s\n' % (message)
warnings.formatwarning = simple_warning
def simple_warning(message, category, filename, lineno, file=None, line=None): # try loading the file
return 'Warning: %s\n' % (message) if file :
warnings.formatwarning = simple_warning try:
jsonfile = open(file)
jsonfileContent = jsonfile.read().split('=')[1].replace(';', '')
geolocationTable = JSON.loads(jsonfileContent)
except:
geolocationTable = {}
warnings.warn('Could not parse file %s' %file)
# parse event.xml # parse event.xml
DOM = ET.parse(stdin).getroot() DOM = ET.parse(stdin).getroot()
# 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 = event.find('./qml:origin/qml:latitude/qml:value', namespaces).text
lng = event.find('./qml:origin/qml:longitude/qml:value', namespaces).text lng = event.find('./qml:origin/qml:longitude/qml:value', namespaces).text
url = 'https://open.mapquestapi.com/nominatim/v1/reverse.php?lat={0}&lon={1}&zoom=10&format=json'.format(lat, lng) evaluationMode = event.find('./qml:origin/qml:evaluationMode', namespaces).text
# send and evaluate nominatim request
response = URL.urlopen(url) if publicID in geolocationTable:
if ( response.msg == 'OK' ): warnings.warn('Skipping cached event %s' %(publicID))
data = JSON.loads(response.read()) elif evaluationMode == 'automatic':
try: warnings.warn('Skipping automatic event %s' %(publicID))
try: else:
city = data['address']['city'] #warnings.warn('Processing event %s' %publicID)
except: # send and evaluate nominatim request
warnings.warn('Using county instead of city for event {0} at {1} N / {2} E (URL: {3})'.format(publicID, lat, lng, url)) url = 'https://open.mapquestapi.com/nominatim/v1/reverse.php?lat={0}&lon={1}&zoom=10&format=json'.format(lat, lng)
city = data['address']['county'] response = URL.urlopen(url)
country = data['address']['country'] if ( response.msg == 'OK' ):
countryCode = data['address']['country_code'].upper() data = JSON.loads(response.read())
value = city try:
if ( countryCode != 'DE' ): try:
value = '{0} ({1})'.format(value, countryCode) city = data['address']['city']
geolocationTable[publicID] = value except:
except: warnings.warn('Using county instead of city for event {0} at {1} N / {2} E (URL: {3})'.format(publicID, lat, lng, url))
warnings.warn('Could not extract city for event {0} at {1} N / {2} E (URL: {3})'.format(publicID, lat, lng, url)) city = data['address']['county']
else: countryCode = data['address']['country_code'].upper()
warnings.warn('Request {0} failed'.format(url)) if ( countryCode == 'DE' ):
# dump json geolocationTable[publicID] = city.encode('utf-8')
print 'var geolocationTable = '+JSON.dumps(geolocationTable)+';' 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
print 'var geolocationTable = '+JSON.dumps(geolocationTable, sort_keys=True)+';'
# __main__
if __name__ == "__main__":
def printline(line):
print line
# parse arguments
import argparse
versionText = '$Revision$ ($Date$, $Author$)'.replace('$', '').replace(':','')
parser = argparse.ArgumentParser(
description='Reverese geocoding lookup of events in xml format (stdin).',
epilog=versionText)
parser.add_argument('-v', '-V', '--version', action='version',
version=versionText)
parser.add_argument('-f', '--file', action='store', dest='file',
help='read in JSON file containing old output.')
cla = parser.parse_args()
# call mkGeolocationTable(...)
mkGeolocationTable(file=cla.file)