mirror of
https://github.com/koala73/worldmonitor.git
synced 2026-04-25 17:14:57 +02:00
* feat(natural): add tropical cyclone tracking from NHC and GDACS Integrate NHC ArcGIS REST API (15 storm slots across AT/EP/CP basins) and GDACS TC field extraction to provide real-time tropical cyclone data with forecast tracks, uncertainty cones, and historical track paths. - Proto: add optional TC fields (storm_id, wind_kt, pressure_mb, etc.) plus ForecastPoint, PastTrackPoint, CoordRing messages - Server/seed: NHC two-pass query (forecast points then detail layers), GDACS wind/pressure parsing, Saffir-Simpson classification, dedup strategy (NHC > GDACS > EONET), pressureMb validation (850-1050), advisory date with Number.isFinite guard - Globe: dashed red forecast track, per-segment wind-colored past track, semi-transparent orange forecast cone polygon - Popup: TC details panel with color-coded category badge, wind/pressure - Frontend mapper: forward all TC fields, convert CoordRing to number[][][] * fix(natural): improve GDACS dedup, NHC classification, and TC popup i18n - GDACS dedup now checks name + geographic proximity instead of name-only - NHC classification uses stormtype field for subtropical/post-tropical - TC popup labels use t() for localization instead of hardcoded English * feat(map): add cyclone-specific deck.gl layers for 2D map - Storm center ScatterplotLayer with Saffir-Simpson wind coloring - Past track PathLayer with per-segment wind-speed color ramp - Forecast track PathLayer with dashed line via PathStyleExtension - Cone PolygonLayer for forecast uncertainty visualization - Tooltip and click routing for all new storm layer IDs * fix(map): remove click routing for synthetic storm track/cone layers Track and cone layers carry lightweight objects without full NaturalEvent fields. Clicking them would pass incomplete data to the popup renderer. Only storm-centers-layer (which holds the full NaturalEvent) routes to the natEvent popup. Tracks and cones remain tooltip-only. * fix(map): attach parent NaturalEvent to synthetic storm layers for clicks Synthetic track/cone objects now carry _event reference to the parent NaturalEvent. Click handler unwraps _event before passing to popup, so clicking any storm element opens the full TC popup.
204 lines
7.0 KiB
YAML
204 lines
7.0 KiB
YAML
openapi: 3.1.0
|
|
info:
|
|
title: NaturalService API
|
|
version: 1.0.0
|
|
paths:
|
|
/api/natural/v1/list-natural-events:
|
|
get:
|
|
tags:
|
|
- NaturalService
|
|
summary: ListNaturalEvents
|
|
operationId: ListNaturalEvents
|
|
parameters:
|
|
- name: days
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: integer
|
|
format: int32
|
|
responses:
|
|
"200":
|
|
description: Successful response
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ListNaturalEventsResponse'
|
|
"400":
|
|
description: Validation error
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ValidationError'
|
|
default:
|
|
description: Error response
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/Error'
|
|
components:
|
|
schemas:
|
|
Error:
|
|
type: object
|
|
properties:
|
|
message:
|
|
type: string
|
|
description: Error message (e.g., 'user not found', 'database connection failed')
|
|
description: Error is returned when a handler encounters an error. It contains a simple error message that the developer can customize.
|
|
FieldViolation:
|
|
type: object
|
|
properties:
|
|
field:
|
|
type: string
|
|
description: The field path that failed validation (e.g., 'user.email' for nested fields). For header validation, this will be the header name (e.g., 'X-API-Key')
|
|
description:
|
|
type: string
|
|
description: Human-readable description of the validation violation (e.g., 'must be a valid email address', 'required field missing')
|
|
required:
|
|
- field
|
|
- description
|
|
description: FieldViolation describes a single validation error for a specific field.
|
|
ValidationError:
|
|
type: object
|
|
properties:
|
|
violations:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/FieldViolation'
|
|
description: List of validation violations
|
|
required:
|
|
- violations
|
|
description: ValidationError is returned when request validation fails. It contains a list of field violations describing what went wrong.
|
|
ListNaturalEventsRequest:
|
|
type: object
|
|
properties:
|
|
days:
|
|
type: integer
|
|
format: int32
|
|
ListNaturalEventsResponse:
|
|
type: object
|
|
properties:
|
|
events:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/NaturalEvent'
|
|
NaturalEvent:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: string
|
|
title:
|
|
type: string
|
|
description:
|
|
type: string
|
|
category:
|
|
type: string
|
|
categoryTitle:
|
|
type: string
|
|
lat:
|
|
type: number
|
|
format: double
|
|
lon:
|
|
type: number
|
|
format: double
|
|
date:
|
|
type: integer
|
|
format: int64
|
|
description: 'Warning: Values > 2^53 may lose precision in JavaScript'
|
|
magnitude:
|
|
type: number
|
|
format: double
|
|
magnitudeUnit:
|
|
type: string
|
|
sourceUrl:
|
|
type: string
|
|
sourceName:
|
|
type: string
|
|
closed:
|
|
type: boolean
|
|
stormId:
|
|
type: string
|
|
description: Optional tropical cyclone fields (populated for severeStorms from GDACS TC / NHC)
|
|
stormName:
|
|
type: string
|
|
basin:
|
|
type: string
|
|
stormCategory:
|
|
type: integer
|
|
format: int32
|
|
classification:
|
|
type: string
|
|
windKt:
|
|
type: integer
|
|
format: int32
|
|
pressureMb:
|
|
type: integer
|
|
format: int32
|
|
movementDir:
|
|
type: integer
|
|
format: int32
|
|
movementSpeedKt:
|
|
type: integer
|
|
format: int32
|
|
forecastTrack:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/ForecastPoint'
|
|
conePolygon:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/CoordRing'
|
|
pastTrack:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/PastTrackPoint'
|
|
ForecastPoint:
|
|
type: object
|
|
properties:
|
|
lat:
|
|
type: number
|
|
format: double
|
|
lon:
|
|
type: number
|
|
format: double
|
|
hour:
|
|
type: integer
|
|
format: int32
|
|
windKt:
|
|
type: integer
|
|
format: int32
|
|
category:
|
|
type: integer
|
|
format: int32
|
|
CoordRing:
|
|
type: object
|
|
properties:
|
|
points:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/Coordinate'
|
|
Coordinate:
|
|
type: object
|
|
properties:
|
|
lon:
|
|
type: number
|
|
format: double
|
|
lat:
|
|
type: number
|
|
format: double
|
|
PastTrackPoint:
|
|
type: object
|
|
properties:
|
|
lat:
|
|
type: number
|
|
format: double
|
|
lon:
|
|
type: number
|
|
format: double
|
|
windKt:
|
|
type: integer
|
|
format: int32
|
|
timestamp:
|
|
type: integer
|
|
format: int64
|
|
description: 'Warning: Values > 2^53 may lose precision in JavaScript'
|