earthquake_browser.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. """Earthquakes of magnitude 2.5+ in the past 30 days
  2. areas are proportional to energy release
  3. [hover mouse to get more info]"""
  4. import pandas
  5. from vedo import *
  6. num = 50 # nr of earthquakes to be visualized at once
  7. path = download("https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_month.csv", force=True)
  8. usecols = ['time', 'place', 'latitude', 'longitude', 'depth', 'mag']
  9. data = pandas.read_csv(path, usecols=usecols)[usecols][::-1].reset_index(drop=True) # reverse list
  10. pic = Image(dataurl + "images/eo_base_2020_clean_3600x1800.png")
  11. pic.pickable(False).level(185).window(120) # add some contrast to the original image
  12. scale = [pic.shape[0]/2, pic.shape[1]/2, 1]
  13. comment = Text2D(__doc__, bg='green9', alpha=0.7, font='Ubuntu')
  14. centers = []
  15. for i, d in progressbar(data.iterrows()):
  16. M = d['mag'] # earthquake estimated magnitude
  17. E = np.sqrt(np.exp(5.24+1.44*M) * scale[0])/10000 # empirical formula for sqrt(energy_release(M))
  18. rgb = color_map(E, name='Reds', vmin=0, vmax=7) # map energy to color
  19. lat = np.deg2rad(d['latitude'])
  20. lon = np.deg2rad(d['longitude'])
  21. ce = GeoCircle(lat, lon, E/50).scale(scale).z(num/M)
  22. ce.color(rgb, 0.7).force_opaque().use_bounds(False)
  23. ce.time = i
  24. ce.info = '\n'.join(str(d).split('\n')[:-1]) # remove of the last line in string d
  25. if i < len(data) - num:
  26. ce.off() # switch off older ones: make circles invisible
  27. centers.append(ce)
  28. def sliderfunc(widget, event):
  29. val = widget.value # get the slider current value
  30. widget.title = f"{data['time'][int(val)][:10]}"
  31. for ce in centers:
  32. isinside = abs(val-ce.time) < num # switch on if inside of time window
  33. ce.on() if isinside else ce.off()
  34. plt = Plotter(size=(2200,1100), title="vedo - Earthquake Browser").parallel_projection(True)
  35. plt.add_slider(sliderfunc, 0, len(centers)-1, value=len(centers)-1, show_value=False)
  36. plt.add_hover_legend(use_info=True, alpha=1, c='white', bg='red2', s=1)
  37. plt.show(pic, centers, comment, zoom="tightest", mode='image').close()