File: earthquake_browser.py

package info (click to toggle)
vedo 2025.5.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 10,404 kB
  • sloc: python: 64,792; javascript: 1,932; xml: 437; sh: 139; makefile: 6
file content (43 lines) | stat: -rw-r--r-- 2,174 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
"""Earthquakes of magnitude 2.5+ in the past 30 days
areas are proportional to energy release
[hover mouse to get more info]"""
import pandas
from vedo import *

num = 50  # nr of earthquakes to be visualized at once
path = download("https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_month.csv", force=True)
usecols = ['time', 'place', 'latitude', 'longitude', 'depth', 'mag']
data = pandas.read_csv(path, usecols=usecols)[usecols][::-1].reset_index(drop=True) # reverse list

pic = Image(dataurl + "images/eo_base_2020_clean_3600x1800.png")
pic.pickable(False).level(185).window(120)  # add some contrast to the original image
scale = [pic.shape[0]/2, pic.shape[1]/2, 1]
comment = Text2D(__doc__, bg='green9', alpha=0.7, font='Ubuntu')

centers = []
for i, d in progressbar(data.iterrows()):
    M = d['mag']                                       # earthquake estimated magnitude
    E = np.sqrt(np.exp(5.24+1.44*M) * scale[0])/10000  # empirical formula for sqrt(energy_release(M))
    rgb = color_map(E, name='Reds', vmin=0, vmax=7)    # map energy to color
    lat = np.deg2rad(d['latitude'])
    lon = np.deg2rad(d['longitude'])
    ce = GeoCircle(lat, lon, E/50).scale(scale).z(num/M)
    ce.color(rgb, 0.7).force_opaque().use_bounds(False)
    ce.time = i
    ce.info = '\n'.join(str(d).split('\n')[:-1])       # remove of the last line in string d
    if i < len(data) - num: 
        ce.off()                                       # switch off older ones: make circles invisible
    centers.append(ce)


def sliderfunc(widget, event):
    val = widget.value                                 # get the slider current value
    widget.title = f"{data['time'][int(val)][:10]}"
    for ce in centers:
        isinside = abs(val-ce.time) < num              # switch on if inside of time window
        ce.on() if isinside else ce.off()

plt = Plotter(size=(2200,1100), title="vedo - Earthquake Browser").parallel_projection(True)
plt.add_slider(sliderfunc, 0, len(centers)-1, value=len(centers)-1, show_value=False)
plt.add_hover_legend(use_info=True, alpha=1, c='white', bg='red2', s=1)
plt.show(pic, centers, comment, zoom="tightest", mode='image').close()