# 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: ```bash # 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" ```