Wing Fleet Dashboard
## ENC 베이스맵 (features/encMap/) - gcnautical 타일 서버 연동 (nautical.json 49개 레이어, 73개 S-52 스프라이트) - 설정 패널: 12개 레이어 토글, 영역 색상 3종, 수심 색상 5단계 - 배경색 밝기 기반 선박 라벨 색상 자동 전환 (labelColor.ts) - useMapStyleSettings에 ENC 가드 추가 (스타일 간섭 방지) - useBaseMapToggle 초기 로드 스킵 (useMapInit과 중복 setStyle 방지) ## 선박 표시 개선 - Globe 원형 halo/outline 제거 — 아이콘 본체만 표시 - Globe 아이콘 스케일 1.3배, 줌아웃 최소 크기 보장 (minzoom 2) - SDF icon-halo로 테두리 적용 (성능 영향 없음) - 기타 AIS 투명도 상향 (0.28→0.6 ~ 1.0) - 선박명 영문 우선 표시 (shipNameRoman > shipNameCn) ## 오버레이 제어 수정 - 연결선/범위/선단 토글 off 시 인터랙티브 오버레이도 비활성 - Globe pair/fc/fleet 레이어: || active 제거 → 토글 우선 - 강조 링/알람 링: shipData→shipLayerData (클러스터링 연동) ## 기본값 변경 - 경고 필터 5개: 초기 false - 연결선/범위/선단: 초기 false - 사진 파란 원 아이콘: Globe+Mercator 모두 제거 ## 폰트 정리 - Open Sans 폴백 전면 제거 → Noto Sans 단독 - ENC 스타일 fetch 시 text-font 패치 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .claude | ||
| .gitea/workflows | ||
| .githooks | ||
| apps | ||
| data/raw/zones | ||
| docs | ||
| legacy | ||
| packages/ui | ||
| scripts | ||
| .editorconfig | ||
| .gitignore | ||
| .node-version | ||
| .npmrc | ||
| .prettierrc | ||
| CLAUDE.md | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
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 receivedapps/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=...)
- frontend hook:
- 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
- default (no MapTiler key): local raster style + OpenSeaMap seamark overlay:
- Deck.gl layers rendered into MapLibre WebGL context (single context via
MapboxOverlay):- ships
IconLayer, zonesGeoJsonLayer, optional 3D densityHexagonLayer - map widget:
apps/web/src/widgets/map3d/Map3D.tsx
- ships
- Zone polygons converted to WGS84 GeoJSON:
- input:
data/raw/zones/*.json - build:
pnpm prepare:data->apps/web/public/data/zones/zones.wgs84.geojson
- input:
- 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
- legacy sources:
Quick Start
pnpm installpnpm prepare:datapnpm dev:web- (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 viaWEB_PORT=.... - API (Fastify):
http://127.0.0.1:5174(default). Change viaPORT=....and matchAPI_PORT=....for the web proxy.
Vite proxy (dev):
/snp-api/*->http://211.208.115.83:8041(override viaVITE_SNP_API_TARGET=...)
MapTiler (Optional, Bathymetry Vector Map)
To enable a dark-mode basemap + bathymetry (MapTiler Ocean tiles):
- Create a free MapTiler Cloud account and get an API key
- 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"