Ciencia Sísmica Tecnología

Trabajar con datos de GeoShake en ObsPy: guía práctica

6 min lectura Por GeoShake Team
Forma de onda sísmica en una pantalla oscura junto a un sensor desenfocado — leer datos de movimiento del suelo de GeoShake con ObsPy

GeoShake publica sus datos sísmicos abiertamente bajo CC BY 4.0 — sin cuenta, sin clave de API, sin formulario de solicitud. Si usas ObsPy, puedes estar leyendo movimiento del suelo de la red en unos treinta segundos.

Esta guía muestra exactamente cómo hacerlo, con comandos reales y su salida real. También dice claramente para qué no sirven estos datos, porque eso importa más que la parte del tutorial.


Qué hay disponible

Servicio Endpoint Qué obtienes
FDSN station https://api.geoshake.org/fdsnws/station/1/ Metadatos de estación (red, código, ubicación)
FDSN event https://api.geoshake.org/fdsnws/event/1/ Catálogo de eventos detectados
SeedLink seedlink.geoshake.org:18000 Flujo en vivo de movimiento del suelo a 1 Hz
Descarga SAC api.geoshake.org/api/stations/…/sac Ráfagas de forma de onda de eventos (~110 Hz)

Todo es anónimo y sin autenticación. La licencia es CC BY 4.0 — úsalo comercialmente, úsalo en un artículo, solo acredita a la red.


Metadatos de estación

from obspy.clients.fdsn import Client

client = Client("https://api.geoshake.org", timeout=40)
inventory = client.get_stations(network="GW", level="station")
print(inventory)

Salida real:

Inventory created at 2026-08-04T21:03:40.034000Z
	Created by: GeoShake
	Sending institution: GeoShake (GeoShake Community Seismic Network)
	Contains:
		Networks (1):
			GW
		Stations (9):
			GW.GEO274YU (GEO-274YU)
			GW.GEO2TRS8 (GEO-2TRS8)
			GW.GEOA73T7 (GEO-A73T7)
			GW.GEOBH2JN (GEO-BH2JN)
			GW.GEODQZFV (GEO-DQZFV)
			GW.GEOFVYSA (GEO-FVYSA)
			GW.GEOQA2HF (GEO-QA2HF)
			GW.GEOT7ND5 (GEO-T7ND5)
			GW.GEOT9ZBK (GEO-T9ZBK)
		Channels (0):

Fíjate en Channels (0). No es un error — mira Qué no son estos datos más abajo.

El filtrado geográfico funciona como esperarías:

inv = client.get_stations(
    network="GW", minlatitude=40, maxlatitude=42, level="station"
)
print(len(inv[0]), "estaciones")     # -> 6 estaciones

Catálogo de eventos

catalog = client.get_events()
print(catalog)
4 Event(s) in Catalog:
2026-07-02T09:42:24.533000Z | +36.824,  +30.257 | 4.7  MMI | automatic
2026-07-02T13:18:54.640000Z | +36.574,  +31.007 | 2.5  MMI | automatic
2026-07-10T10:10:36.932000Z | +36.574,  +31.057 | 2.1  MMI | automatic
2026-07-12T09:26:49.467000Z | +37.272,  +31.105 | 4.5  MMI | automatic

Aquí hay dos cosas que conviene leer con atención. El tipo de magnitud es MMI — una clase de intensidad de sacudida derivada de la red, no una magnitud de momento. Y cada evento está marcado como automatic: ningún sismólogo los ha revisado. Un evento entra en el catálogo cuando tres o más estaciones se disparan y superan una prueba de moveout consistente con una única fuente propagándose a unos 6 km/s.

El catálogo es pequeño porque la red es joven. Crecerá.


Cada estación publica de forma continua una envolvente de actividad a 1 Hz en el canal LNZ.

from obspy.clients.seedlink.basic_client import Client as SeedLinkClient
from obspy import UTCDateTime

sl = SeedLinkClient("seedlink.geoshake.org", port=18000, timeout=30)
print(sl.get_info(level="station"))
[('GW', 'BH2JN'), ('GW', 'FVYSA'), ('GW', 'QA2HF')]

Pidiendo los últimos tres minutos:

end = UTCDateTime()
stream = sl.get_waveforms("GW", "BH2JN", "00", "LNZ", end - 180, end)
print(stream)
4 Trace(s) in Stream:
GW.BH2JN.00.LNZ | 2026-08-04T21:02:06Z - 2026-08-04T21:02:12Z | 1.0 Hz, 7 samples
GW.BH2JN.00.LNZ | 2026-08-04T21:02:14Z - 2026-08-04T21:03:11Z | 1.0 Hz, 58 samples
GW.BH2JN.00.LNZ | 2026-08-04T21:03:13Z - 2026-08-04T21:04:10Z | 1.0 Hz, 58 samples
GW.BH2JN.00.LNZ | 2026-08-04T21:04:12Z - 2026-08-04T21:05:06Z | 1.0 Hz, 58 samples

Los huecos entre trazas son reales. Las estaciones están alojadas en conexiones domésticas, y cuando se pierde un paquete se pierde un segundo o dos. Usa stream.merge(method=1) si necesitas una traza continua.

El mismo servidor funciona con jAmaSeis, lo que lo hace utilizable en el aula: apúntalo a seedlink.geoshake.org:18000 y los alumnos ven una estación en vivo.


Formas de onda de eventos

Los eventos disparados se guardan como ráfagas cortas de alta frecuencia y se sirven como SAC:

import urllib.request
from obspy import read

url = ("https://api.geoshake.org/api/stations/"
       "GEO-BH2JN/waveforms/85/sac?comp=mag")
urllib.request.urlretrieve(url, "event.sac")

st = read("event.sac")
tr = st[0]
print(tr)
print(f"pico {abs(tr.data).max():.4f} m/s^2")
GW.BH2JN..MAG | 2026-07-15T19:30:52.279000Z - 2026-07-15T19:30:58.619796Z | 109.1 Hz, 693 samples
pico 0.2447 m/s^2

Las coordenadas de la estación viajan en la cabecera SAC (stla, stlo), así que ObsPy tiene lo necesario para calcular distancias. Los componentes disponibles son x, y, z y mag (magnitud vectorial). La ventana va desde unos 2,3 s antes del disparo hasta 4 s después — el historial previo al evento viene de un búfer circular en el dispositivo.


Qué no son estos datos

Esta sección importa más que todo lo anterior.

Los sensores no están calibrados. Las estaciones GeoShake son acelerómetros MEMS de gama de consumo. No se publica respuesta instrumental, y por eso los metadatos de estación se detienen a nivel de estación y Channels vuelve vacío. Las amplitudes son indicativas, no trazables metrológicamente. Si tu análisis necesita una función de transferencia conocida, este no es el conjunto de datos adecuado.

El código de red es provisional. Publicamos bajo GW, y GW no está registrado en la FDSN. Cambiamos a él tras descubrir que nuestro código anterior, GS, pertenece al Servicio Geológico de Estados Unidos — una colisión de nombres que habría contaminado cualquier archivo compartido. El registro está previsto cuando la red sea lo bastante grande como para merecer un código permanente. Hasta entonces, trata GW como un identificador local y no lo fusiones en un archivo compartido asumiendo permanencia.

Las detecciones son automáticas y no revisadas. Existen falsos positivos. Un camión, un portazo y un terremoto pequeño pueden disparar una estación; la asociación multiestación filtra la mayor parte de eso, no todo.

La cobertura es desigual y joven. Nueve estaciones, la mayoría agrupadas. El registro continuo más antiguo empieza el 2026-07-11.

Dos asperezas con las que te encontrarás. ObsPy avisa de que nuestros servicios no anuncian starttime, endtime, location (station) ni mindepth, maxdepth, orderby (event). El servicio de estación acepta starttime sin error pero lo ignora — recibirás todas las estaciones en lugar de un conjunto filtrado, sin ninguna queja. Filtra del lado del cliente por ahora. Además, SeedLink transporta actualmente tres estaciones mientras que el servicio FDSN lista nueve; las estaciones más nuevas todavía no emiten.

Nada de esto hace inútiles los datos. Los hace específicos: cobertura densa, barata y de baja fidelidad que complementa a las redes profesionales en lugar de competir con ellas.


Cita

Si estos datos acaban en algo que publiques, cítalos por favor:

DOI: 10.5281/zenodo.21313786

Nos encantaría saberlo — escríbenos.


El firmware también es abierto

Si quieres saber exactamente cómo se hace una detección en lugar de confiar en el catálogo, el firmware es público bajo GPL-3.0, junto con la implementación de referencia en TypeScript contra la que se verifica su procesamiento de señal. El dispositivo comprueba que su código C coincide con esa referencia en cada arranque y se niega a iniciar en silencio si no coincide.

Esa es la parte que más nos gustaría que un sismólogo desmontara: github.com/GeoShake/geoshake

La documentación completa de la API, incluidos endpoints no cubiertos aquí, está en api.geoshake.org/developer.

Para ser claros sobre el alcance: el firmware, los diseños de la carcasa y los datos son abiertos. El diseño del PCB y el backend en la nube son propietarios — así que el dispositivo en su conjunto no es hardware de código abierto, y no lo describimos así.

¿Listo para unirte a la red?

Obtén el sensor GeoShake T1 y comienza a detectar terremotos en casa.

GeoShake T1

Comparte este artículo: