OSINT Monitor Layer + Erdbeben in Katastrophen zusammengefuehrt

MONITOR LAYER (neu):
- Neuer Top-Layer "OSINT Monitor" im Panel
- Zeigt geoparsete Standorte aus Monitor-Lagen auf dem Globus
- Farbkodiert: rot=Hauptgeschehen, orange=Reaktionen, blau=Beteiligte
- Labels mit Ortsname + Artikelanzahl bei Zoom
- 2min Refresh, GeoJSON vom Monitor Public API

KATASTROPHEN (erweitert):
- Erdbeben-Layer in Katastrophen integriert (kein separater Toggle mehr)
- Laedt NASA EONET + USGS parallel
- Erdbeben als farbige Punkte (rot=frisch, gelb=alt) mit M-Label
- Katastrophen-Toggle zeigt jetzt alles: Waldbraende, Vulkane,
  Stuerme, Fluten UND Erdbeben
Dieser Commit ist enthalten in:
Claude Dev
2026-03-24 13:11:34 +01:00
Ursprung 07574d3c8f
Commit 68387f89fd
7 geänderte Dateien mit 237 neuen und 23 gelöschten Zeilen

46
src/data_monitor.py Normale Datei
Datei anzeigen

@@ -0,0 +1,46 @@
"""Monitor-Feed: OSINT-Daten aus dem AegisSight Monitor."""
import logging
import os
import time
import httpx
from fastapi import APIRouter, Query
logger = logging.getLogger("globe.monitor")
router = APIRouter()
_MONITOR_URL = os.getenv("MONITOR_API_URL", "https://monitor.aegis-sight.de/api/public")
_MONITOR_KEY = os.getenv("MONITOR_API_KEY", "")
_cache: dict[str, tuple] = {}
@router.get("/monitor-feed")
async def get_monitor_feed(incident_id: int = Query(None)):
"""Holt OSINT-Daten vom AegisSight Monitor."""
cache_key = f"monitor:{incident_id or 'all'}"
if cache_key in _cache and time.time() - _cache[cache_key][0] < 120:
return _cache[cache_key][1]
params = {}
if incident_id:
params["incident_id"] = incident_id
try:
async with httpx.AsyncClient(timeout=15) as client:
r = await client.get(
f"{_MONITOR_URL}/globe-feed",
params=params,
headers={"X-API-Key": _MONITOR_KEY},
)
r.raise_for_status()
data = r.json()
_cache[cache_key] = (time.time(), data)
logger.info(f"Monitor-Feed: {len(data.get('features', []))} Locations, "
f"{len(data.get('incidents', []))} Lagen")
return data
except Exception as e:
logger.warning(f"Monitor-Feed Fehler: {e}")
if cache_key in _cache:
return _cache[cache_key][1]
return {"type": "FeatureCollection", "features": [], "incidents": []}

Datei anzeigen

@@ -33,6 +33,7 @@ from data_quakes import router as quakes_router
from data_gdelt import router as gdelt_router
from data_satellites import router as satellites_router
from data_disasters import router as disasters_router
from data_monitor import router as monitor_router
# Alle Daten-APIs hinter Auth
app.include_router(flights_router, prefix="/api", dependencies=[Depends(get_current_user)])
@@ -41,6 +42,7 @@ app.include_router(quakes_router, prefix="/api", dependencies=[Depends(get_curre
app.include_router(gdelt_router, prefix="/api", dependencies=[Depends(get_current_user)])
app.include_router(satellites_router, prefix="/api", dependencies=[Depends(get_current_user)])
app.include_router(disasters_router, prefix="/api", dependencies=[Depends(get_current_user)])
app.include_router(monitor_router, prefix="/api", dependencies=[Depends(get_current_user)])
# --- Static files ---
static_dir = Path(__file__).parent.parent / "static"