Ein frei kopierbares Lehrmittel von eduskript.org

Erdbeben weltweit — eine Live-Karte aus echten Daten

Jeden Tag bebt die Erde tausendfach. Die meisten Beben sind so schwach, dass kein Mensch sie spürt — aber sie werden trotzdem von Seismometern auf der ganzen Welt aufgezeichnet. Die United States Geological Survey (USGS) stellt diese Daten kostenlos und in Echtzeit als API zur Verfügung. In dieser Lektion bauen wir Schritt für Schritt eine Weltkarte aller stärkeren Beben der letzten Woche — und entdecken dabei ein Muster, das den Geologen den Namen Pazifischer Feuerring wert war.

Lernziele
  • Eine HTTP-Anfrage an eine echte API stellen
  • Eine GeoJSON-Antwort verstehen und durchsuchen
  • Daten mit einer List Comprehension filtern
  • Eine geographische Verteilung mit matplotlib plotten
  • Eine zweite Datendimension über die Punktgrösse kodieren
  • Mehrere GeoJSON-Quellen als Layer übereinander zu einer Karte kombinieren

Schritt 1 — Daten holen

Die USGS liefert die Beben als GeoJSON über eine offene URL. Weder Account noch API-Key nötig. Wir nehmen den 7-Tage-Feed — das ist eine sinnvolle Datenmenge: gross genug, um globale Muster zu sehen, klein genug, um zügig zu laden.

Im Browser läuft Python (Pyodide), und requests funktioniert dort nicht — dafür gibt es pyfetch, das die Browser-eigene fetch-Funktion benutzt.

Loading editor...
Was bedeutet await?

pyfetch ist eine asynchrone Funktion — sie braucht ein paar Millisekunden, bis die Antwort vom Server da ist. Mit await warten wir höflich, statt das Programm einzufrieren. Im Browser-Python kannst du await direkt auf oberster Ebene benutzen — in einem normalen Python-Skript ginge das nur innerhalb einer async def.


Schritt 2 — Die Datenstruktur verstehen

GeoJSON ist ein verschachteltes JSON-Format für Geo-Daten. Jedes Beben ist ein Feature mit zwei Teilen:

  • properties — alles über das Beben (Magnitude, Ort, Zeit, Link)
  • geometry.coordinateswo es passiert ist: [longitude, latitude, tiefe_in_km]

Pack ein einzelnes Beben aus und sieh dir die Werte an.

Loading editor...
Reihenfolge der Koordinaten

Achtung: GeoJSON speichert Koordinaten als [lon, lat] — also Länge zuerst. Das ist Konvention; viele andere APIs liefern [lat, lon]. Verwechselt man die beiden, landet ein Beben aus Japan plötzlich mitten in Afrika.


Schritt 3 — Nur die starken Beben behalten

Die meisten Einträge im 7-Tage-Feed haben Magnituden unter 2 — die spürt niemand. Uns interessieren Beben ab Magnitude 4: ab dieser Stärke ist die globale Erfassung gleichmässig (kleinere Beben werden in dichter überwachten Regionen wie Kalifornien überrepräsentiert). Mit einer List Comprehension lassen sich die schwachen Beben in einer Zeile aussortieren.

Loading editor...
None-Werte

Manchmal liefert die USGS eine mag von None (z. B. bei sehr schwachen Beben, deren Magnitude noch nicht berechnet wurde). Direkt mit >= zu vergleichen würde einen TypeError werfen. Deshalb zuerst is not None prüfen — Python wertet die Bedingung von links nach rechts aus und überspringt den Vergleich, wenn der erste Teil bereits falsch ist.


Schritt 4 — Die erste Karte

Jetzt wird's visuell. Wir sammeln alle Längen- und Breitengrade in zwei Listen und werfen sie in einen scatter-Plot. matplotlib wird automatisch geladen, sobald wir es importieren.

Loading editor...
Beobachtung

Schau dir das Bild an. Die Punkte verteilen sich nicht zufällig über die Welt. Sie bilden Linien und Cluster. Was glaubst du, warum?


Schritt 5 — Magnitude als Bubble-Grösse

Bisher sind alle Punkte gleich gross — egal ob Magnitude 4 oder 7. Aber ein M7-Beben setzt rund 1000-mal mehr Energie frei als ein M4-Beben. Diese Stärke wollen wir sichtbar machen, indem wir die Punktgrösse an die Magnitude koppeln.

Loading editor...
Warum quadrieren?

Der Parameter s in scatter ist die Fläche des Punktes, nicht der Radius. Wenn du s = m benutzt, wirken Magnitude-7-Beben kaum grösser als Magnitude-4. Mit s = m² skaliert die Fläche stärker, und die wenigen grossen Beben fallen sofort ins Auge — genauso wie sie es im echten Leben tun.


Schritt 6 — Eine richtige Weltkarte als Hintergrund

Bisher schweben unsere Punkte im leeren Raum — man sieht zwar die Muster, aber nicht wo genau auf der Erde sie liegen. Wir laden jetzt die Umrisse aller Landmassen als GeoJSON und zeichnen sie als beigefarbene Polygone in den Hintergrund.

Land-Polygone sind komplexer als Beben-Punkte. Eine Polygon-Geometrie hat eine Aussenlinie (und eventuell innere Löcher). Eine MultiPolygon-Geometrie ist eine Liste von Polygonen — Russland zum Beispiel besteht aus zig Inseln und dem Festland.

Loading editor...
Reihenfolge ist wichtig

matplotlib zeichnet alles, was du nacheinander aufrufst, von unten nach oben. Würden wir die Landflächen nach den Bebenpunkten zeichnen, würden sie die Punkte überdecken. Genau wie Schichten in Photoshop.


Schritt 7 — Plattengrenzen einzeichnen

Die letzte Zutat: die Linien, an denen sich die tektonischen Platten der Erde berühren. Diese Geometrie ist seit den 2000er Jahren als offener Datensatz verfügbar (Bird, 2003) und liegt als GeoJSON auf GitHub. Wir laden sie genauso wie zuvor und zeichnen sie als dritten Layer zwischen Land und Beben.

Loading editor...
Aha-Moment

Fast alle Punkte liegen direkt auf den dunklen Linien. Der Pazifik ist von einem fast geschlossenen Ring aus Beben und Plattengrenzen umrahmt — der Pazifische Feuerring. Plattentektonik ist nicht eine Theorie, die jemand sich ausgedacht hat: sie zeichnet sich selbst in den Daten. Und die grössten Bubbles — die seltenen, energiereichen Beben — sitzen meistens genau auf den aktivsten Grenzen.


Aufgaben

  1. Schwellwert verschieben: Ändere den Filter auf mag >= 2.5 und schau, wie sich das Bild verdichtet. Beachte: in dicht überwachten Regionen wie Kalifornien siehst du jetzt sehr viel mehr — das ist ein Erfassungseffekt, kein geologischer Effekt.
  2. Tiefe Beben isolieren: Filtere die Beben zusätzlich nach tiefe > 300 km (f["geometry"]["coordinates"][2] > 300) und plotte nur diese. Sie kommen fast ausschliesslich an einer ganz bestimmten Art von Plattengrenze vor. Welche?
  3. Längerer Zeitraum: Tausch die URL gegen ..._month.geojson (statt _week.geojson). Wie ändert sich das Bild mit ~4× mehr Daten?
  4. Bonus — Gutenberg-Richter: Histogrammiere die Magnituden mit plt.hist(mags, bins=30). Du wirst sehen: viel mehr kleine als grosse Beben. Diese Verteilung folgt dem Gutenberg-Richter-Gesetz — einem berühmten Potenzgesetz aus der Seismologie. Plotte die y-Achse logarithmisch (plt.yscale("log")), und du bekommst eine fast perfekte Gerade.

Datenquellen