Wing Fleet Dashboard
Go to file
htlee 81fb4a2bca feat(shipIcon): 선종별 SVG 아이콘 시스템 도입 + 대상 선박 브리딩 링
gc-wing-simple의 SVG 기반 선종별 아이콘 시스템을 도입하여 기타 AIS 선박을
8종 선종별 색상+형태(이동:화살표/정지:원형)로 구분하고, 대상 선박에는
legacy code 색상 + 브리딩 링 강조 효과를 적용한다.

- shipKind.ts: 선종별 SVG 생성기 + 아이콘 스펙 사전 생성
- Mercator: 기타 AIS 20px SVG IconLayer, 대상 선박 26px SVG IconLayer
- Globe: signalKindCode 기반 색상, 대상 선박 1.3x 크기
- 브리딩 rAF: 시안(선택)/주황(강조) 링, 2000ms 주기
- 범례: "기타 AIS(선종)" 7항목으로 변경
- shipIconCache.ts, SHIP_ICON_MAPPING 삭제

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 10:14:33 +09:00
.claude chore: CLAUDE_BOT_TOKEN 갱신 2026-03-06 08:02:27 +09:00
.gitea/workflows feat(auth): Google OAuth 로그인 구현 2026-02-16 08:44:25 +09:00
.githooks fix(hook): commit-msg 정규식 통일 (template-common v1.2.0) 2026-02-18 21:16:43 +09:00
apps feat(shipIcon): 선종별 SVG 아이콘 시스템 도입 + 대상 선박 브리딩 링 2026-03-08 10:14:33 +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
packages/ui fix(sidebar): 검색 복원, 경고 필터, 내부 스크롤 수정 (#25) 2026-02-17 08:12:14 +09:00
scripts chore(data): vendor submarine cable geojson/details 2026-02-16 02:17:55 +09:00
.editorconfig chore: 팀 프로젝트 워크플로우 세팅 2026-02-15 22:18:40 +09:00
.gitignore chore: 팀 프로젝트 워크플로우 세팅 2026-02-15 22:18:40 +09:00
.node-version chore: 팀 프로젝트 워크플로우 세팅 2026-02-15 22:18:40 +09:00
.npmrc chore: 팀 프로젝트 워크플로우 세팅 2026-02-15 22:18:40 +09:00
.prettierrc chore: 팀 프로젝트 워크플로우 세팅 2026-02-15 22:18:40 +09:00
CLAUDE.md chore: vessel-track 브랜치 병합 (squash) 2026-02-16 22:12:48 +09:00
package-lock.json chore: Tailwind CSS v4 + @wing/ui 패키지 인프라 구축 2026-02-17 06:10:04 +09:00
package.json chore: Tailwind CSS v4 + @wing/ui 패키지 인프라 구축 2026-02-17 06:10:04 +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"