Wing Fleet Dashboard
Go to file
2026-02-15 15:36:29 +09:00
apps fix: resolve globe ship circle-radius expression and ensure ship layers top 2026-02-15 15:36:29 +09:00
data/raw/zones chore: initial commit 2026-02-15 11:22:38 +09:00
legacy chore: initial commit 2026-02-15 11:22:38 +09:00
scripts chore: initial commit 2026-02-15 11:22:38 +09:00
.gitignore chore: initial commit 2026-02-15 11:22:38 +09:00
package.json chore: initial commit 2026-02-15 11:22:38 +09:00
pnpm-lock.yaml chore: initial commit 2026-02-15 11:22:38 +09:00
pnpm-workspace.yaml chore: initial commit 2026-02-15 11:22:38 +09:00
README.md chore: initial commit 2026-02-15 11:22:38 +09:00

WING Fleet Dashboard (Prototype to Project)

This repo started as a single HTML prototype and is being refactored into a structured React + TypeScript project.

Layout

  • legacy/: original single-file HTML prototype (reference)
  • data/raw/zones/: raw GeoJSON zone polygons as received
  • apps/web/: React + TS frontend (MapLibre GL JS + Deck.gl, single WebGL context)
  • apps/api/: optional API server (proxy/stub)
  • scripts/: data preparation scripts (e.g. zone reprojection)

What Works Now (GIS Demo)

  • Live AIS polling (initial 10 minutes, then every 1 minute / last 2 minutes incremental) with MMSI upsert store:
    • frontend hook: apps/web/src/features/aisPolling/useAisTargetPolling.ts
    • API proxy (CORS safe): apps/api/src/index.ts (GET /api/ais-target/search?minutes=...&bbox=...)
  • MapLibre basemap:
    • default (no MapTiler key): local raster style + OpenSeaMap seamark overlay: apps/web/public/map/styles/osm-seamark.json
    • optional (recommended): MapTiler dataviz-dark + Ocean (bathymetry) vector overlays, plus OpenSeaMap seamark raster overlay
  • Deck.gl layers rendered into MapLibre WebGL context (single context via MapboxOverlay):
    • ships IconLayer, zones GeoJsonLayer, optional 3D density HexagonLayer
    • map widget: apps/web/src/widgets/map3d/Map3D.tsx
  • Zone polygons converted to WGS84 GeoJSON:
    • input: data/raw/zones/*.json
    • build: pnpm prepare:data -> apps/web/public/data/zones/zones.wgs84.geojson
  • Legacy CN-permit overlay (name/callsign/mmsi match; ring + color by 업종):
    • legacy sources: legacy/*.xlsx, legacy/*.jsx
    • build: pnpm prepare:data -> apps/web/public/data/legacy/chinese-permitted.v1.json

Quick Start

  1. pnpm install
  2. pnpm prepare:data
  3. pnpm dev:web
  4. (optional) pnpm dev:api # only needed when you start adding DB-backed/local APIs

API server (optional): pnpm dev:api (defaults to http://127.0.0.1:5174)

Ports (dev):

  • Web (Vite): http://127.0.0.1:5175 (default, strict). Change via WEB_PORT=....
  • API (Fastify): http://127.0.0.1:5174 (default). Change via PORT=.... and match API_PORT=.... for the web proxy.

Vite proxy (dev):

  • /snp-api/* -> http://211.208.115.83:8041 (override via VITE_SNP_API_TARGET=...)

MapTiler (Optional, Bathymetry Vector Map)

To enable a dark-mode basemap + bathymetry (MapTiler Ocean tiles):

  1. Create a free MapTiler Cloud account and get an API key
  2. Set env vars for the web app:
# enables MapTiler style + ocean bathymetry layers in MapLibre
VITE_MAPTILER_KEY="YOUR_KEY"

# optional: change basemap style id (default: dataviz-dark)
VITE_MAPTILER_BASE_MAP_ID="dataviz-dark"