new release

This commit is contained in:
Kasper D. Fischer 2021-10-17 13:30:12 +02:00
commit d65abe1b08
21 changed files with 252 additions and 226 deletions

49
.gitignore vendored
View File

@ -1,5 +1,44 @@
scripts/events.xml
scripts/geolocation.js
## Visual Studio Code
# Visual Studio Code files
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace
# Local History for Visual Studio Code
.history/
# General
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
## MacOS / OSX
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
## Project Files
wsgi/.idea
www/dlsv
www/event.xml
@ -7,9 +46,7 @@ www/events.xml
www/geolocation.js
www/geolocationTable.js
www/stations.xml
.vscode/settings.json
www/index.html
www/favicon.ico
scripts/*.json
scripts/*.xml

14
scripts/fetchEvents.sh Executable file
View File

@ -0,0 +1,14 @@
#!/bin/bash
# get starting date
# find gdate or date command ( OSX: brew install coreutils)
# the date command on OSX is not compatible to the linux date command
datecmd=$((which gdate || which date )| grep bin)
STIME="${1:-$(${datecmd} -d 6-month-ago +%Y-%m-%d)}"
STIME="${STIME:-$(date +%Y-%m-%d)}"
# get output filename
OUTPUT="${2:--}"
# fetch events
curl -s -o ${OUTPUT} "https://fdsnws.geophysik.ruhr-uni-bochum.de/fdsnws/event/1/query?starttime=${STIME}&minlat=50.0&maxlat=53.0&minlon=4.0&maxlon=10.0&minmag=0.7"

View File

@ -1,4 +0,0 @@
#!/bin/bash
STIME=$1
curl -o events.xml "https://ariadne.geophysik.ruhr-uni-bochum.de/fdsnws/event/1/query?starttime=${STIME}&orderby=time&minlat=50.92&maxlat=52.76&minlon=4.26&maxlon=9.74&minmag=1.1"

View File

@ -1,4 +1,4 @@
#! /usr/bin/env python
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
'''
@ -8,12 +8,12 @@
The output will will be a javascript structure to be included in the
SeisObs map service.
The script should be updated regulary keep the total number of all
The script should be updated regularly keep the total number of all
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://fdsnws.geophysik.ruhr-uni-bochum.de/fdsnws/event/1/query?minlat=50&maxlat=54&minlon=3&maxlon=10&minmag=1" | mkGeolocationTable.py > geolocationTable.js
License
Copyright 2020 Kasper D. Fischer <kasper.fischer@rub.de>
Copyright 2020-2021 Kasper D. Fischer <kasper.fischer@rub.de>
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
@ -27,30 +27,32 @@
You should have received a copy of the GNU General Public License along
with this program. If not, see http://www.gnu.org/licenses/.
$Id$
'''
def mkGeolocationTable(file=''):
# imports
## imports
# XML ElementTree
try:
import xml.etree.cElementTree as ET
except ImportError:
import xml.etree.ElementTree as ET
from sys import stdin
import warnings
from time import sleep
from geopy.geocoders import Photon
import urllib2 as URL
# json
import json as JSON
# constants
namespaces = {'sc3': 'http://geofon.gfz-potsdam.de/ns/seiscomp3-schema/0.7',
'qml': 'http://quakeml.org/xmlns/bed/1.2'}
# sys stdin
from sys import stdin
def simple_warning(message, category, filename, lineno, file=None, line=None):
return 'Warning: %s\n' % (message)
warnings.formatwarning = simple_warning
# geopy
from geopy.geocoders import Photon
from geopy.extra.rate_limiter import RateLimiter
from geopy.exc import GeocoderServiceError
## constants
URL = 'https://photon.komoot.io/reverse?lon={lng:.3f}&lat={lat:.3f}&limit=5'
NAMESPACES = {'sc3': 'http://geofon.gfz-potsdam.de/ns/seiscomp3-schema/0.7',
'qml': 'http://quakeml.org/xmlns/bed/1.2'}
# try loading the file
geolocationTable = {}
@ -61,67 +63,93 @@ def mkGeolocationTable(file=''):
geolocationTable = JSON.loads(jsonfileContent)
except:
geolocationTable = {}
warnings.warn('Could not parse file %s' %file)
logging.warning('Could not parse file %s' %file)
# parse event.xml
DOM = ET.parse(stdin).getroot()
geolocator = Photon()
reverse_geolocate = RateLimiter(geolocator.reverse, min_delay_seconds=1)
# iterate over all events
for event in DOM.iterfind('qml:eventParameters/qml:event', namespaces):
count = 0
for event in DOM.iterfind('qml:eventParameters/qml:event', NAMESPACES):
count += 1
publicID = event.attrib['publicID'].split('/')[2]
lat = event.find('./qml:origin/qml:latitude/qml:value', namespaces).text
lng = event.find('./qml:origin/qml:longitude/qml:value', namespaces).text
evaluationMode = event.find('./qml:origin/qml:evaluationMode', namespaces).text
lat = float(event.find('./qml:origin/qml:latitude/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
if publicID in geolocationTable:
warnings.warn('Skipping cached event %s' %(publicID))
logging.warning('Skipping cached event {id}'.format(id=publicID))
elif evaluationMode == 'automatic':
warnings.warn('Skipping automatic event %s' %(publicID))
logging.warning('Skipping automatic event {id}'.format(id=publicID))
else:
logging.info('Processing event {id}'.format(id=publicID))
try:
location = geolocator.reverse("{lat}, {lng}".format(lat=lat, lng=lng))
except:
warnings.warn('Reverse Geolocation failed. Skipping event.')
sleep(1.1)
locations = reverse_geolocate("{lat:.3f}, {lng:.3f}".format(lat=lat, lng=lng),exactly_one=False,limit=5)
except GeocoderServiceError:
logging.warning('Reverse Geolocation failed. Skipping event.')
continue
place = []
try:
place = location.raw['properties']['city']
except KeyError:
for location in locations:
try:
place = location.raw['properties']['town']
place = location.raw['properties']['city']
except KeyError:
try:
place = location.raw['properties']['village']
place = location.raw['properties']['town']
except KeyError:
try:
place = location.raw['properties']['county']
place = location.raw['properties']['village']
except KeyError:
warnings.warn('Could not extract city for event {0} at {1} N / {2} E (URL: {3})'.format(publicID, lat, lng, url))
warnings.warn('Sucessfully looked up location for event {0}.'.format(publicID))
try:
place = location.raw['properties']['county']
except KeyError:
logging.debug('Could not extract city for event {id} at {lat:.3f} N / {lng:.3f} E (Service: {url}), trying next returned result'
.format(id=publicID, lat=lat, lng=lng, url=URL.format(lat=lat,lng=lng)))
logging.debug(location.raw)
if not place:
logging.critical('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)))
geolocationTable[publicID] = place
sleep(1.1)
# dump json
print 'var geolocationTable = '+JSON.dumps(geolocationTable, sort_keys=True)+';'
print('var geolocationTable = {0};'.format(JSON.dumps(geolocationTable, sort_keys=True)))
logging.info("processed %d events", count)
# __main__
if __name__ == "__main__":
def printline(line):
print line
# use module logging
import logging
# parse arguments
import argparse
versionText = '$Revision$ ($Date$, $Author$)'.replace('$', '').replace(':','')
versionText = 'r20211017 (2021-10-17)'
parser = argparse.ArgumentParser(
description='Reverese geocoding lookup of events in xml format (stdin).',
description='Reverse geocoding lookup of events in xml format (stdin).',
epilog=versionText)
parser.add_argument('-v', '-V', '--version', action='version',
version=versionText)
parser.add_argument('-V', '--version', action='version', version=versionText,
help="show version")
parser.add_argument('-f', '--file', action='store', dest='file',
help='read in JSON file containing old output.')
group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--verbose", action="store_true",
help="increase output verbosity")
group.add_argument("-q", "--quiet", action="store_true",
help="disable output")
group.add_argument("-d", "--debug", action="store_true",
help="show debugging output",
)
cla = parser.parse_args()
# set logging level
if cla.quiet:
logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.ERROR)
elif cla.verbose:
logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.INFO)
elif cla.debug:
logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.DEBUG)
else:
logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.WARN)
# call mkGeolocationTable(...)
mkGeolocationTable(file=cla.file)

View File

@ -4,7 +4,7 @@
**********************************************************************/
/* License
Copyright 2020 Kasper D. Fischer <kasper.fischer@rub.de>
Copyright 2020-2021 Kasper D. Fischer <kasper.fischer@rub.de>
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
@ -19,7 +19,7 @@
You should have received a copy of the GNU General Public License along
with this program. If not, see http://www.gnu.org/licenses/.
$Id$
Version r20211017 (2021-10-17)
*/
/* adding row(s) to a table and format date strings afterwards */

View File

@ -4,7 +4,7 @@
**********************************************************************/
/* License
Copyright 2020 Kasper D. Fischer <kasper.fischer@rub.de>
Copyright 2020-2021 Kasper D. Fischer <kasper.fischer@rub.de>
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
@ -19,7 +19,7 @@
You should have received a copy of the GNU General Public License along
with this program. If not, see http://www.gnu.org/licenses/.
$Id$
Version r20211017 (2021-10-17)
*/
/* adding row(s) to a table and format date strings afterwards */

View File

@ -1,56 +0,0 @@
/*
* L.TileLayer.Grayscale is a regular tilelayer with grayscale makeover.
*/
L.TileLayer.Grayscale = L.TileLayer.extend({
options: {
quotaRed: 21,
quotaGreen: 71,
quotaBlue: 8,
quotaDividerTune: 0,
quotaDivider: function() {
return this.quotaRed + this.quotaGreen + this.quotaBlue + this.quotaDividerTune;
}
},
initialize: function (url, options) {
options = options || {}
options.crossOrigin = true;
L.TileLayer.prototype.initialize.call(this, url, options);
this.on('tileload', function(e) {
this._makeGrayscale(e.tile);
});
},
_createTile: function () {
var tile = L.TileLayer.prototype._createTile.call(this);
tile.crossOrigin = "Anonymous";
return tile;
},
_makeGrayscale: function (img) {
if (img.getAttribute('data-grayscaled'))
return;
img.crossOrigin = '';
var canvas = document.createElement("canvas");
canvas.width = img.width;
canvas.height = img.height;
var ctx = canvas.getContext("2d");
ctx.drawImage(img, 0, 0);
var imgd = ctx.getImageData(0, 0, canvas.width, canvas.height);
var pix = imgd.data;
for (var i = 0, n = pix.length; i < n; i += 4) {
pix[i] = pix[i + 1] = pix[i + 2] = (this.options.quotaRed * pix[i] + this.options.quotaGreen * pix[i + 1] + this.options.quotaBlue * pix[i + 2]) / this.options.quotaDivider();
}
ctx.putImageData(imgd, 0, 0);
img.setAttribute('data-grayscaled', true);
img.src = canvas.toDataURL();
}
});
L.tileLayer.grayscale = function (url, options) {
return new L.TileLayer.Grayscale(url, options);
};

View File

@ -1,20 +1,16 @@
.leaflet-control-easyPrint a {
background:#fff url(print.png) no-repeat 5px;
.leaflet-control-easyPrint-button a {
background:#fff url(external/easyPrint/print.png) no-repeat 5px;
background-size:16px 16px;
display: block;
}
@media print {
html {padding: 0px!important;}
.leaflet-control-easyPrint-button{display: none!important;}
}
#map {
//@media print {
html {padding: 0px!important;}
.leaflet-control-easyPrint-button{display: none!important;}
}
//#map {
width: 1200;
height: 800;
}

View File

@ -1,3 +0,0 @@
/*! sprintf-js v1.1.2 | Copyright (c) 2007-present, Alexandru Mărășteanu <hello@alexei.ro> | BSD-3-Clause */
!function(){"use strict";var g={not_string:/[^s]/,not_bool:/[^t]/,not_type:/[^T]/,not_primitive:/[^v]/,number:/[diefg]/,numeric_arg:/[bcdiefguxX]/,json:/[j]/,not_json:/[^j]/,text:/^[^\x25]+/,modulo:/^\x25{2}/,placeholder:/^\x25(?:([1-9]\d*)\$|\(([^)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijostTuvxX])/,key:/^([a-z_][a-z_\d]*)/i,key_access:/^\.([a-z_][a-z_\d]*)/i,index_access:/^\[(\d+)\]/,sign:/^[+-]/};function y(e){return function(e,t){var r,n,i,s,a,o,p,c,l,u=1,f=e.length,d="";for(n=0;n<f;n++)if("string"==typeof e[n])d+=e[n];else if("object"==typeof e[n]){if((s=e[n]).keys)for(r=t[u],i=0;i<s.keys.length;i++){if(null==r)throw new Error(y('[sprintf] Cannot access property "%s" of undefined value "%s"',s.keys[i],s.keys[i-1]));r=r[s.keys[i]]}else r=s.param_no?t[s.param_no]:t[u++];if(g.not_type.test(s.type)&&g.not_primitive.test(s.type)&&r instanceof Function&&(r=r()),g.numeric_arg.test(s.type)&&"number"!=typeof r&&isNaN(r))throw new TypeError(y("[sprintf] expecting number but found %T",r));switch(g.number.test(s.type)&&(c=0<=r),s.type){case"b":r=parseInt(r,10).toString(2);break;case"c":r=String.fromCharCode(parseInt(r,10));break;case"d":case"i":r=parseInt(r,10);break;case"j":r=JSON.stringify(r,null,s.width?parseInt(s.width):0);break;case"e":r=s.precision?parseFloat(r).toExponential(s.precision):parseFloat(r).toExponential();break;case"f":r=s.precision?parseFloat(r).toFixed(s.precision):parseFloat(r);break;case"g":r=s.precision?String(Number(r.toPrecision(s.precision))):parseFloat(r);break;case"o":r=(parseInt(r,10)>>>0).toString(8);break;case"s":r=String(r),r=s.precision?r.substring(0,s.precision):r;break;case"t":r=String(!!r),r=s.precision?r.substring(0,s.precision):r;break;case"T":r=Object.prototype.toString.call(r).slice(8,-1).toLowerCase(),r=s.precision?r.substring(0,s.precision):r;break;case"u":r=parseInt(r,10)>>>0;break;case"v":r=r.valueOf(),r=s.precision?r.substring(0,s.precision):r;break;case"x":r=(parseInt(r,10)>>>0).toString(16);break;case"X":r=(parseInt(r,10)>>>0).toString(16).toUpperCase()}g.json.test(s.type)?d+=r:(!g.number.test(s.type)||c&&!s.sign?l="":(l=c?"+":"-",r=r.toString().replace(g.sign,"")),o=s.pad_char?"0"===s.pad_char?"0":s.pad_char.charAt(1):" ",p=s.width-(l+r).length,a=s.width&&0<p?o.repeat(p):"",d+=s.align?l+r+a:"0"===o?l+a+r:a+l+r)}return d}(function(e){if(p[e])return p[e];var t,r=e,n=[],i=0;for(;r;){if(null!==(t=g.text.exec(r)))n.push(t[0]);else if(null!==(t=g.modulo.exec(r)))n.push("%");else{if(null===(t=g.placeholder.exec(r)))throw new SyntaxError("[sprintf] unexpected placeholder");if(t[2]){i|=1;var s=[],a=t[2],o=[];if(null===(o=g.key.exec(a)))throw new SyntaxError("[sprintf] failed to parse named argument key");for(s.push(o[1]);""!==(a=a.substring(o[0].length));)if(null!==(o=g.key_access.exec(a)))s.push(o[1]);else{if(null===(o=g.index_access.exec(a)))throw new SyntaxError("[sprintf] failed to parse named argument key");s.push(o[1])}t[2]=s}else i|=2;if(3===i)throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported");n.push({placeholder:t[0],param_no:t[1],keys:t[2],sign:t[3],pad_char:t[4],align:t[5],width:t[6],precision:t[7],type:t[8]})}r=r.substring(t[0].length)}return p[e]=n}(e),arguments)}function e(e,t){return y.apply(null,[e].concat(t||[]))}var p=Object.create(null);"undefined"!=typeof exports&&(exports.sprintf=y,exports.vsprintf=e),"undefined"!=typeof window&&(window.sprintf=y,window.vsprintf=e,"function"==typeof define&&define.amd&&define(function(){return{sprintf:y,vsprintf:e}}))}();
//# sourceMappingURL=sprintf.min.js.map

File diff suppressed because one or more lines are too long

View File

@ -13,16 +13,15 @@
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery.tablesorter/2.31.3/css/jquery.tablesorter.pager.min.css" integrity="sha512-TWYBryfpFn3IugX13ZCIYHNK3/2sZk3dyXMKp3chZL+0wRuwFr1hDqZR9Qd5SONzn+Lja10hercP2Xjuzz5O3g==" crossorigin="anonymous" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.6.0/leaflet.css" integrity="sha512-xwE/Az9zrjBIphAcBb3F6JVqxf46+CDLwfLMHloNu6KEQCAWi6HcDUbeOfBIptF7tcCzusKFjFw2yuvEpDL9wQ==" crossorigin="anonymous" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet-dvf/0.3.1/css/dvf.min.css" integrity="sha512-Ts/IYE5D8PaMBUDHcf6O57lOiV923cai3sEXo0WjhakpTxlwodQQJx1YA2t1mDUKO6fIXEngkKFLQNMXK/kBZg==" crossorigin="anonymous" />
<link type="text/css" rel="stylesheet" href="https://api.mqcdn.com/sdk/mapquest-js/v1.3.2/mapquest.css"/>
<link rel="stylesheet" href="external/easyPrint/easyPrint.css"/>
<!-- jQuery & jQueryUI -->
<script src="https://code.jquery.com/jquery-3.5.1.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js" integrity="sha256-VazP97ZCwtekAsvgPBSUwPFKdrwD3unUfSGVYrahUqU=" crossorigin="anonymous"></script>
<!-- Localtime & sprintf -->
<!-- Localtime, sprintf, showdown -->
<script type="text/javascript" src="external/jquery.localtime-0.9.1.min.js"></script> <!-- current 2020-07-15 -->
<script type="text/javascript" src="external/sprintf.min.js"></script> <!-- version 1.1.2 downloaded 2020-07-15 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/sprintf/1.1.2/sprintf.min.js" integrity="sha512-pmG0OkYtZVB2EqETE5HPsEaok7sNZFfStp5rNdpHv0tGQjbt1z8Qjzhtx88/4wsttOtDwq5DZGJyKyzEe7ribg==" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/showdown/1.9.1/showdown.min.js" integrity="sha512-L03kznCrNOfVxOUovR6ESfCz9Gfny7gihUX/huVbQB9zjODtYpxaVtIaAkpetoiyV2eqWbvxMH9fiSv5enX7bw==" crossorigin="anonymous"></script>
<!-- Tablesorter -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.tablesorter/2.31.3/js/jquery.tablesorter.min.js" integrity="sha512-qzgd5cYSZcosqpzpn7zF2ZId8f/8CHmFKZ8j7mU4OUXTNRd5g+ZHBPsgKEwoqxCtdQvExE5LprwwPAgoicguNg==" crossorigin="anonymous"></script>
@ -33,10 +32,9 @@
<!-- Leaflet -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.6.0/leaflet.js" integrity="sha512-gZwIG9x3wUXg2hdXF6+rVkLF/0Vi9U8D2Ntg4Ga5I5BZpVkVxlJWbSQtXPSiUTtC0TjtGOmxa1AJPuV0CPthew==" crossorigin="anonymous"></script>
<!-- <script type="text/javascript" src="external/TileLayer.Grayscale.js"></script> --> <! version of 2017-11-01 downloaded 2020-07-15 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet-dvf/0.3.1/leaflet-dvf.markers.min.js" integrity="sha512-R/iucaxFnDFUTdZRxUvxzc+sypDQhqnxInBmNjgGE0RaiMl/ektVB1wFS/L0xDZmLFPpEGR0Kw3GEBgtQNFHyg==" crossorigin="anonymous"></script>
<script src="external/jQuery.print.min.js"></script>
<script src="external/easyPrint/bundle.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet-providers/1.10.1/leaflet-providers.min.js" integrity="sha512-Ifxj89Ujg72gC/psKB9ystryRYiopmDud2EmNTKC9kz192aQwDKVK1FzWsyPc37tgU0UmRQlNnBM++ZnwIXJ9Q==" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/leaflet.browser.print@1.0.5/dist/leaflet.browser.print.min.js" integrity="sha256-1MQvHEnVXSKwR+XIVswRSBla/B5ohkp5+HJtritIkgE=" crossorigin="anonymous"></script>
<!-- Map, Events & Stations -->
<script type="text/javascript" src="misc.js"></script>
@ -156,20 +154,19 @@
<p class="table-caption">Download als <a id="stations-csv-link" href="link" download="stations.csv">CSV-Datei</a>.</p>
</div>
<!-- More -->
<div class="tab" id="moretab"><!--include virtual="more.html.de" --></div>
<div class="tab more_de" id="moretab">
<p>Text wird geladen ...</p>
</div>
<!-- Info -->
<div class="tab" id="infotab">
<div id="infoaccordion">
<h3 class="aheader">Navigation / Links</h3>
<!--#include virtual="info.inc.de" -->
<div class="info_de"><p>Text wird geladen ...</p></div>
<h3 class="aheader">Copyright / Lizenz</h3>
<!--#include virtual="copyright.inc.de" -->
<div class="copyright_de"><p>Text wird geladen ...</p></div>
<h3 class="aheader">Impressum</h3>
<!--#include virtual="impressum.inc.de" -->
<div>
</div>
</div>
<div class="imprint_de"><p>Text wird geladen ...</p></div>
</div>
</div>
</div>
<!-- Logo -->

View File

@ -13,16 +13,15 @@
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery.tablesorter/2.31.3/css/jquery.tablesorter.pager.min.css" integrity="sha512-TWYBryfpFn3IugX13ZCIYHNK3/2sZk3dyXMKp3chZL+0wRuwFr1hDqZR9Qd5SONzn+Lja10hercP2Xjuzz5O3g==" crossorigin="anonymous" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.6.0/leaflet.css" integrity="sha512-xwE/Az9zrjBIphAcBb3F6JVqxf46+CDLwfLMHloNu6KEQCAWi6HcDUbeOfBIptF7tcCzusKFjFw2yuvEpDL9wQ==" crossorigin="anonymous" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet-dvf/0.3.1/css/dvf.min.css" integrity="sha512-Ts/IYE5D8PaMBUDHcf6O57lOiV923cai3sEXo0WjhakpTxlwodQQJx1YA2t1mDUKO6fIXEngkKFLQNMXK/kBZg==" crossorigin="anonymous" />
<link type="text/css" rel="stylesheet" href="https://api.mqcdn.com/sdk/mapquest-js/v1.3.2/mapquest.css"/>
<link rel="stylesheet" href="external/easyPrint/easyPrint.css"/>
<!-- jQuery & jQueryUI -->
<script src="https://code.jquery.com/jquery-3.5.1.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js" integrity="sha256-VazP97ZCwtekAsvgPBSUwPFKdrwD3unUfSGVYrahUqU=" crossorigin="anonymous"></script>
<!-- Localtime & sprintf -->
<!-- Localtime, sprintf, showdown -->
<script type="text/javascript" src="external/jquery.localtime-0.9.1.min.js"></script> <!-- current 2020-07-15 -->
<script type="text/javascript" src="external/sprintf.min.js"></script> <!-- version 1.1.2 downloaded 2020-07-15 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/sprintf/1.1.2/sprintf.min.js" integrity="sha512-pmG0OkYtZVB2EqETE5HPsEaok7sNZFfStp5rNdpHv0tGQjbt1z8Qjzhtx88/4wsttOtDwq5DZGJyKyzEe7ribg==" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/showdown/1.9.1/showdown.min.js" integrity="sha512-L03kznCrNOfVxOUovR6ESfCz9Gfny7gihUX/huVbQB9zjODtYpxaVtIaAkpetoiyV2eqWbvxMH9fiSv5enX7bw==" crossorigin="anonymous"></script>
<!-- Tablesorter -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.tablesorter/2.31.3/js/jquery.tablesorter.min.js" integrity="sha512-qzgd5cYSZcosqpzpn7zF2ZId8f/8CHmFKZ8j7mU4OUXTNRd5g+ZHBPsgKEwoqxCtdQvExE5LprwwPAgoicguNg==" crossorigin="anonymous"></script>
@ -33,10 +32,9 @@
<!-- Leaflet -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.6.0/leaflet.js" integrity="sha512-gZwIG9x3wUXg2hdXF6+rVkLF/0Vi9U8D2Ntg4Ga5I5BZpVkVxlJWbSQtXPSiUTtC0TjtGOmxa1AJPuV0CPthew==" crossorigin="anonymous"></script>
<!-- <script type="text/javascript" src="external/TileLayer.Grayscale.js"></script> --> <! version of 2017-11-01 downloaded 2020-07-15 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet-dvf/0.3.1/leaflet-dvf.markers.min.js" integrity="sha512-R/iucaxFnDFUTdZRxUvxzc+sypDQhqnxInBmNjgGE0RaiMl/ektVB1wFS/L0xDZmLFPpEGR0Kw3GEBgtQNFHyg==" crossorigin="anonymous"></script>
<script src="external/jQuery.print.min.js"></script>
<script src="external/easyPrint/bundle.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet-providers/1.10.1/leaflet-providers.min.js" integrity="sha512-Ifxj89Ujg72gC/psKB9ystryRYiopmDud2EmNTKC9kz192aQwDKVK1FzWsyPc37tgU0UmRQlNnBM++ZnwIXJ9Q==" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/leaflet.browser.print@1.0.5/dist/leaflet.browser.print.min.js" integrity="sha256-1MQvHEnVXSKwR+XIVswRSBla/B5ohkp5+HJtritIkgE=" crossorigin="anonymous"></script>
<!-- Map, Events & Stations -->
<script type="text/javascript" src="misc.js"></script>
@ -156,20 +154,19 @@
<p class="table-caption">Download as <a id="stations-csv-link" href="link" download="stations.csv">CSV file</a>.</p>
</div>
<!-- More -->
<div class="tab" id="moretab"><!--include virtual="more.html.de" --></div>
<div class="tab more_en" id="moretab">
<p>Text loading ...</p>
</div>
<!-- Info -->
<div class="tab" id="infotab">
<div id="infoaccordion">
<h3 class="aheader">Navigation / Links</h3>
<!--#include virtual="info.inc.de" -->
<h3 class="aheader">Copyright / License</h3>
<!--#include virtual="copyright.inc.de" -->
<div class="info_en"><p>Text loading ...</p></div>
<h3 class="aheader">Copyright / Lizenz</h3>
<div class="copyright_en"><p>Text loading ...</p></div>
<h3 class="aheader">Imprint</h3>
<!--#include virtual="impressum.inc.de" -->
<div>
</div>
</div>
<div class="imprint_en"><p>Text loading ...</p></div>
</div>
</div>
</div>
<!-- Logo -->

View File

@ -18,4 +18,5 @@
<ul>
<li>Homepage der <a class="extern" target="_blank" href="http://www.rag.de">RAG</a></li>
<li><a class="extern" target="_blank" href="http://www.bid.rag.de">Bürgerinformationssystem</a> der RAG</li>
</ul>
</div>

View File

@ -4,7 +4,7 @@
**********************************************************************/
/* License
Copyright 2020 Kasper D. Fischer <kasper.fischer@rub.de>
Copyright 2020-2021 Kasper D. Fischer <kasper.fischer@rub.de>
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
@ -19,7 +19,7 @@
You should have received a copy of the GNU General Public License along
with this program. If not, see https://www.gnu.org/licenses/.
$Id$
Version r20211017 (2021-10-17)
*/
/* add station marker */
@ -140,39 +140,27 @@ function initMapLink() {
$(document).ready(function() {
// create a map in the "map" div, set the view to a given place and zoom
map = L.map('map', { zoomControl: false, worldCopyJump: true }).setView(config['map']['centerDefault'], config['map']['zoomDefault']);
// create baselayer
switch ( config['map']['baselayer'] ) {
case 'esrigray': // add ESRI Grayscale World Map (neither city nor road names)
map = L.map('map', { zoomControl: false, worldCopyJump: true }).setView(config['map']['centerDefault'], config['map']['zoomDefault']);
L.tileLayer('//server.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Base/MapServer/tile/{z}/{y}/{x}',
{
attribution: 'Tiles &copy; Esri &mdash; Esri, DeLorme, NAVTEQ',
maxZoom: 16
}).addTo(map);
L.tileLayer.provider('Esri.WorldGrayCanvas').addTo(map);
break;
case 'aerial': // add ESRI WordImagery tile layer
map = L.map('map', { zoomControl: false, worldCopyJump: true }).setView(config['map']['centerDefault'], config['map']['zoomDefault']);
L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',
{
attribution: 'Tiles &copy; Esri &mdash; Source: Esri, i-cubed, USDA, USGS, AEX, GeoEye, Getmapping, Aerogrid, IGN, IGP, UPR-EGP, and the GIS User Community'
}).addTo(map);
L.tileLayer.provider('Esri.WorldImagery').addTo(map);
break;
case 'opentopo': // add OpenTopoMap tile layer https://opentopomap.org/
map = L.map('map', { zoomControl: false, worldCopyJump: true }).setView(config['map']['centerDefault'], config['map']['zoomDefault']);
L.tileLayer('https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png',
{
attribution: 'Kartendaten: &copy; <a href="https://openstreetmap.org">OpenStreetMap</a> contributors, SRTM | Kartendarstellung: &copy; <a href="http://opentopomap.org/">OpenTopoMap</a> (<a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>)'
}).addTo(map);
case 'opentopo': // add OpenTopoMap tile layer
L.tileLayer.provider('OpenTopoMap').addTo(map);
break;
case 'osmde': // add OpenStreetMap.DE tile layer, default
null;
default:
map = L.map('map', { zoomControl: false, worldCopyJump: true }).setView(config['map']['centerDefault'], config['map']['zoomDefault']);
L.tileLayer('https://{s}.tile.openstreetmap.de/tiles/osmde/{z}/{x}/{y}.png',
{
attribution: '&copy; <a href="https://openstreetmap.org">OpenStreetMap</a> contributors, <a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>',
}).addTo(map);
L.tileLayer.provider('OpenStreetMap.DE').addTo(map);
break;
case 'mapnik': // add OpenStreetMap.Mapni tile layer
L.tileLayer.provider('OpenStreetMap.Mapnik').addTo(map);
break;
default: // use OpenStreetMap.DE as default
L.tileLayer.provider(config['map']['baselayer']).addTo(map);
};
// add controls
@ -218,5 +206,8 @@ $(document).ready(function() {
});
// print icon
L.easyPrint().addTo(map);
L.control.browserPrint({
title: 'print map',
position: 'topright',
}).addTo(map);
});

View File

@ -4,7 +4,7 @@
**********************************************************************/
/* License
Copyright 2020 Kasper D. Fischer <kasper.fischer@rub.de>
Copyright 2020-2021 Kasper D. Fischer <kasper.fischer@rub.de>
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
@ -19,7 +19,7 @@
You should have received a copy of the GNU General Public License along
with this program. If not, see https://www.gnu.org/licenses/.
$Id$
Version r20211017 (2021-10-17)
*/
/* add station marker */
@ -140,39 +140,27 @@ function initMapLink() {
$(document).ready(function() {
// create a map in the "map" div, set the view to a given place and zoom
map = L.map('map', { zoomControl: false, worldCopyJump: true }).setView(config['map']['centerDefault'], config['map']['zoomDefault']);
// create baselayer
switch ( config['map']['baselayer'] ) {
case 'esrigray': // add ESRI Grayscale World Map (neither city nor road names)
map = L.map('map', { zoomControl: false, worldCopyJump: true }).setView(config['map']['centerDefault'], config['map']['zoomDefault']);
L.tileLayer('//server.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Base/MapServer/tile/{z}/{y}/{x}',
{
attribution: 'Tiles &copy; Esri &mdash; Esri, DeLorme, NAVTEQ',
maxZoom: 16
}).addTo(map);
L.tileLayer.provider('Esri.WorldGrayCanvas').addTo(map);
break;
case 'aerial': // add ESRI WordImagery tile layer
map = L.map('map', { zoomControl: false, worldCopyJump: true }).setView(config['map']['centerDefault'], config['map']['zoomDefault']);
L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',
{
attribution: 'Tiles &copy; Esri &mdash; Source: Esri, i-cubed, USDA, USGS, AEX, GeoEye, Getmapping, Aerogrid, IGN, IGP, UPR-EGP, and the GIS User Community'
}).addTo(map);
L.tileLayer.provider('Esri.WorldImagery').addTo(map);
break;
case 'opentopo': // add OpenTopoMap tile layer https://opentopomap.org/
map = L.map('map', { zoomControl: false, worldCopyJump: true }).setView(config['map']['centerDefault'], config['map']['zoomDefault']);
L.tileLayer('https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png',
{
attribution: 'Kartendaten: &copy; <a href="https://openstreetmap.org">OpenStreetMap</a> contributors, SRTM | Kartendarstellung: &copy; <a href="http://opentopomap.org/">OpenTopoMap</a> (<a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>)'
}).addTo(map);
case 'opentopo': // add OpenTopoMap tile layer
L.tileLayer.provider('OpenTopoMap').addTo(map);
break;
case 'osmde': // add OpenStreetMap.DE tile layer, default
null;
default:
map = L.map('map', { zoomControl: false, worldCopyJump: true }).setView(config['map']['centerDefault'], config['map']['zoomDefault']);
L.tileLayer('https://{s}.tile.openstreetmap.de/tiles/osmde/{z}/{x}/{y}.png',
{
attribution: '&copy; <a href="https://openstreetmap.org">OpenStreetMap</a> contributors, <a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>',
}).addTo(map);
L.tileLayer.provider('OpenStreetMap.DE').addTo(map);
break;
case 'mapnik': // add OpenStreetMap.Mapni tile layer
L.tileLayer.provider('OpenStreetMap.Mapnik').addTo(map);
break;
default: // use OpenStreetMap.DE as default
L.tileLayer.provider(config['map']['baselayer']).addTo(map);
};
// add controls
@ -218,5 +206,8 @@ $(document).ready(function() {
});
// print icon
L.easyPrint().addTo(map);
L.control.browserPrint({
title: 'print map',
position: 'topright',
}).addTo(map);
});

View File

@ -4,7 +4,7 @@
**********************************************************************/
/* License
Copyright 2020 Kasper D. Fischer <kasper.fischer@rub.de>
Copyright 2020-2021 Kasper D. Fischer <kasper.fischer@rub.de>
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
@ -19,7 +19,7 @@
You should have received a copy of the GNU General Public License along
with this program. If not, see http://www.gnu.org/licenses/.
$Id$
Version r20211017 (2021-10-17)
*/
/* calculate marker radius from magnitude
@ -113,6 +113,7 @@ var config = {
centerDefault: [51.85, 7.0],
timespan: 180,
latlngDelta: 0.1,
baselayer: 'OpenStreetMap.DE',
},
station: {
markerColor: 'darkgreen',
@ -136,7 +137,7 @@ var config = {
},
tab: {
active: 0,
disabled: [2],
// disabled: [2],
max: 4,
},
};
@ -222,4 +223,24 @@ $(document).ready(function() {
}).on("ajaxStop", function() {
$("#spinner").hide();
});
// load more tab content
$.get("more_de.md", function( data ) {
var converter = new showdown.Converter();
$('.more_de').html(converter.makeHtml(data));
});
$.get("more_en.md", function( data ) {
var converter = new showdown.Converter();
$('.more_en').html(converter.makeHtml(data));
});
// load info tab content
$.get("info.inc.de", function( data ) {
$('.info_de, .info_en').html(data);
});
$.get("copyright.inc.de", function( data ) {
$('.copyright_de, .copyright_en').html(data);
});
$.get("impressum.inc.de", function( data ) {
$('.imprint_de, .imprint_en').html(data);
});
});

View File

@ -1 +0,0 @@
Das seismologische Netz der Ruhr-Universität besteht aus 13 Stationen. Zwei breitbandige Stationen (BUG und IBBN) sind gleichzeitig Bestandteil des Deutschen Seismologischen Regionalnetzes (GRSN). Sie befinden sich in der Nähe der Ruhr-Universität in einem stillgelegten Stollen der Zeche Klosterbusch bzw. bei Ibbenbüren. Weitere Außenstationen gibt es bei Rheinberg (BRHE) und Hünxe (ZERL, westliches Ruhrgebiet), bei Haltern (BAVN, nörldiches Ruhrgebiet) und Hamm (HMES, östliches Ruhrgebiet). In Ibbenbüren ergänzen die kurzperiodischen Stationen IBBE und IBBS das Stationsnetz. Im Bereich der Ruhr-Universität werden weiterhin 5 kurzperiodische Stationen (BTEZ, BSHA, BKLB, BHOF, BULI) betrieben, die zur Ortung von Ereignissen im Ruhrgebiet verwendet werden. Das von den Seismometern registrierte Messsignal wird an den Stationen digitalisiert und kontinuierlich an die Auswertezentrale an der Ruhr-Universität Bochum übertragen.

9
www/more_de.md Normal file
View File

@ -0,0 +1,9 @@
# Seismologisches Observatorium
## Stationsnetz
Das seismologische Observatorium der Ruhr-Universität Bochum betreibt mehrere seismologische Stationen im Ruhrgebiet, im Raum Ibbenbüren und im Alpenvorland. Zwei breitbandige Stationen (BUG und IBBN) sind gleichzeitig Bestandteil des Deutschen Seismologischen Regionalnetzes (GRSN). Sie befinden sich in der Nähe der Ruhr-Universität in einem stillgelegten Stollen der Zeche Klosterbusch bzw. bei Ibbenbüren.
## Seismologische Netzwerke
### RuhrNet (RN)
### FloodRisk (YD)
### AlpArray (Z3)

9
www/more_en.md Normal file
View File

@ -0,0 +1,9 @@
# Seismological Observatory
## Station Network
The seismological observatory of the Ruhr-University Bochum (Germany) maintains several seismolocical stations in the Ruhr area, around Ibbenbueren and in the foreland of the Alps. Two broadband stations (BUG and IBBN) are also part of the German Regional Seismological Network (GRSN). These are located near the Ruhr-University in an abandoned coal mine and near the city of Ibbenbueren.
## Seismological Networks
### RuhrNet (RN)
### FloodRisk (YD)
### AlpArray (Z3)

View File

@ -4,7 +4,7 @@
**********************************************************************/
/* License
Copyright 2020 Kasper D. Fischer <kasper.fischer@rub.de>
Copyright 2020-2021 Kasper D. Fischer <kasper.fischer@rub.de>
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
@ -19,7 +19,7 @@
You should have received a copy of the GNU General Public License along
with this program. If not, see http://www.gnu.org/licenses/.
$Id$
Version r20211017 (2021-10-17)
*/
/* Load the stations using ajax */

View File

@ -4,7 +4,7 @@
**********************************************************************/
/* License
Copyright 2020 Kasper D. Fischer <kasper.fischer@rub.de>
Copyright 2020-2021 Kasper D. Fischer <kasper.fischer@rub.de>
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
@ -19,7 +19,7 @@
You should have received a copy of the GNU General Public License along
with this program. If not, see http://www.gnu.org/licenses/.
$Id$
Version r20211017 (2021-10-17)
*/
/* Load the stations using ajax */