Militaerschiff-Datenbank mit Bildern + Klassifizierung
Neue Datei milship_db.py: - MMSI-Laenderzuordnung (200+ Laendercodes) - Schiffsklassen-Datenbank (Nimitz, Arleigh-Burke, Gorshkov, Type 052D, Queen Elizabeth, F125, Charles de Gaulle) - Bilder aus Wikimedia Commons (frei lizenziert) - Klassifizierung nach MMSI-Prefix + Schiffsname Klick auf Militaerschiff zeigt: - Foto der Schiffsklasse (wenn verfuegbar) - Klassenname und Schiffstyp - Herkunftsland (aus MMSI) - MMSI, SOG, COG, Heading API: GET /api/ships/military liefert alle Militaerschiffe mit Klassifizierung und Bild-URLs.
Dieser Commit ist enthalten in:
@@ -7,6 +7,7 @@ import time
|
||||
|
||||
import websockets
|
||||
from fastapi import APIRouter
|
||||
from milship_db import get_country_from_mmsi, classify_military_ship
|
||||
|
||||
logger = logging.getLogger("globe.ships")
|
||||
router = APIRouter()
|
||||
@@ -135,6 +136,25 @@ async def get_ships():
|
||||
ships_out.append(ship)
|
||||
return {"ships": ships_out, "total": len(ships_out), "connected": _connected}
|
||||
|
||||
@router.get("/ships/military")
|
||||
async def get_military_ships():
|
||||
"""Alle Militaerschiffe mit Klassifizierung und Bildern."""
|
||||
mil_ships = []
|
||||
for s in _store.values():
|
||||
if s.get("ship_type") == 35 or (isinstance(s.get("ship_type"), int) and 30 <= s["ship_type"] <= 39):
|
||||
info = classify_military_ship(s.get("mmsi"), s.get("name",""))
|
||||
mil_ships.append({
|
||||
"mmsi": s["mmsi"],
|
||||
"name": s.get("name", ""),
|
||||
"lat": s["lat"], "lon": s["lon"],
|
||||
"sog": s["sog"], "cog": s["cog"],
|
||||
"country": info["country"],
|
||||
"ship_class": info["class"],
|
||||
"ship_type_detail": info["type"],
|
||||
"image": info["image"],
|
||||
})
|
||||
return {"ships": mil_ships, "total": len(mil_ships)}
|
||||
|
||||
@router.get("/ships/dark")
|
||||
async def get_dark_ships():
|
||||
dark = _detect_dark_ships()
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren