Source code for pyrocko.client.usgs
# http://pyrocko.org - GPLv3
#
# The Pyrocko Developers, 21st Century
# ---|P------/S----------~Lg----------
'''
Client to get earthquake catalog information from
`USGS <https://earthquake.usgs.gov/>`_.
'''
import time
import json
import logging
from urllib.error import HTTPError
from pyrocko import util, model
from pyrocko.util import urlopen_ssl_check
from .base_catalog import EarthquakeCatalog, NotFound
logger = logging.getLogger('pyrocko.client.usgs')
km = 1000.
[docs]
class USGS(EarthquakeCatalog):
'''
Client to get earthquake catalog information from
`USGS <https://earthquake.usgs.gov/>`_.
'''
def __init__(self, catalog=None):
self.catalog = catalog
self.events = {}
def flush(self):
self.events = {}
def iter_event_names(
self,
time_range=None,
magmin=0.,
magmax=10.,
latmin=-90.,
latmax=90.,
lonmin=-180.,
lonmax=180.):
yearbeg, monbeg, daybeg = time.gmtime(time_range[0])[:3]
yearend, monend, dayend = time.gmtime(time_range[1])[:3]
p = []
a = p.append
a('format=geojson')
if self.catalog is not None:
a('catalog=%s' % self.catalog.lower())
a('starttime=%s' % util.time_to_str(
time_range[0], format='%Y-%m-%dT%H:%M:%S'))
a('endtime=%s' % util.time_to_str(
time_range[1], format='%Y-%m-%dT%H:%M:%S'))
if latmin != -90.:
a('minlatitude=%g' % latmin)
if latmax != 90.:
a('maxlatitude=%g' % latmax)
if lonmin != -180.:
a('minlongitude=%g' % lonmin)
if lonmax != 180.:
a('maxlongitude=%g' % lonmax)
if magmin != 0.:
a('minmagnitude=%g' % magmin)
if magmax != 10.:
a('maxmagnitude=%g' % magmax)
events = self._parse_events_page(self._query(p))
for ev in events:
self.events[ev.name] = ev
for ev in events:
if time_range[0] <= ev.time and ev.time <= time_range[1]:
yield ev.name
def _query(self, p):
url = 'https://earthquake.usgs.gov/fdsnws/event/1/query?' + '&'.join(p)
logger.debug('Opening URL: %s' % url)
try:
page = urlopen_ssl_check(url).read()
except HTTPError as e:
if e.code == 404:
raise NotFound(url)
raise
logger.debug('Received page (%i bytes)' % len(page))
return json.loads(page.decode('utf-8'))
def _parse_events_page(self, doc):
return [self._feature_to_event(feat) for feat in doc['features']]
def _feature_to_event(self, feat):
props = feat['properties']
geo = feat['geometry']
lon, lat, depth = [float(x) for x in geo['coordinates']]
t = util.str_to_time('1970-01-01 00:00:00') + props['time'] * 0.001
if props['mag'] is not None:
mag = float(props['mag'])
else:
mag = None
if props['place'] is not None:
region = props['place'].encode('ascii', 'replace').decode()
else:
region = None
extras = {}
if props.get('updated') is not None:
extras['catalog_time_modified'] = props['updated'] * 0.001
return model.Event(
lat=lat,
lon=lon,
time=t,
name=str(feat['id']),
depth=depth*1000.,
magnitude=mag,
magnitude_type=props.get('magType') or None,
region=region,
catalog=str(props['net'].upper()),
extras=extras)
[docs]
def get_event(self, name):
'''
Get event by USGS event ID.
Any of the IDs associated with an event can be used. The returned
event has the preferred ID as its name.
'''
if name not in self.events:
ev = self._feature_to_event(
self._query(['format=geojson', 'eventid=%s' % name]))
self.events[ev.name] = ev
self.events[name] = ev
return self.events[name]