커밋 그래프

80 커밋

작성자 SHA1 메시지 날짜
86a0b2276f fix(web): vessel-track 안정화 반영
- Mercator/Globe track-replay 레이어 충돌 및 setProps 레이스 해결
- track DTO 좌표/시간 정규화 + stale query 응답 무시
- 조회 직후 표시 안정화 및 기본 100x 자동재생 적용
- Global Track Replay 패널 초기 위치 조정 + 헤더 드래그 지원
- liveRenderer batch rendering + trackReplay store 기반 구조 반영

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 22:43:08 +09:00
c09211d5ed chore: develop 병합으로 충돌 해결
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 22:21:15 +09:00
6acf2045b2 chore: vessel-track 브랜치 병합 (squash)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 22:12:48 +09:00
cb6493b8a1 feat(weather): 기상 타일 오버레이 + 수역별 날씨 패널
MapTiler Weather SDK 6종 기상 타일 오버레이:
- 바람/기온/강수/기압/레이더/구름 라디오 토글
- 3시간 단위 step 스냅 타임라인 + 드래그 실시간 seek
- 색상 범례, 배속 제어, 투명도 조절
- ServiceWorker 타일 캐시 (cache-first, 최대 2000장)
- SDK 시간 단위(epoch 초) 정합성 보장

Open-Meteo 수역별 기상 패널:
- 4개 수역 centroid 기반 해양/기상 데이터 5분 폴링
- 파고/풍속/수온/너울 카드 UI + 경고 하이라이트

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 21:45:07 +09:00
69775c90a2 feat(map): 항적조회 + SVG 캐시 + fitBounds
- 대상선박 우클릭 컨텍스트 메뉴로 항적 조회 (6h~5d)
- Mercator: PathLayer(고정) + TripsLayer(애니메이션) + ScatterplotLayer(포인트)
- Globe: MapLibre 네이티브 line + arrow + circle 레이어
- rAF 직접 overlay 조작으로 React 재렌더링 방지
- SVG 아이콘 data URL 캐시로 네트워크 재요청 방지
- 항적 조회 시 자동 fitBounds (전체 항적 뷰포트 맞춤)
- API 프록시 /api/ais-target/:mmsi/track 엔드포인트 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 18:19:01 +09:00
c423b59244 Merge remote-tracking branch 'origin/develop' into feature/dual-rendering
# Conflicts:
#	apps/web/src/pages/dashboard/DashboardPage.tsx
2026-02-16 16:25:38 +09:00
c03dee0ade fix(map): globe 노란벽 해결 + 심해색 복구
- deck-globe 렌더 파이프라인 비활성화로 노란벽 해소
- 베이스 수색 원복 (#14606e/#114f5c)
- globe 필터 로직 제거 (불필요)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 16:04:58 +09:00
1fd9f3da82 fix(map): fill 단일화 + globe 배경색 심해색 통일
- fill 3-tier 제거 → 단일 레이어(전체 depth) 복원
- setSky: sky/horizon/fog를 심해색(#010610)으로 설정
- 캔버스/map-area 배경: #010610 (타일 gap seam 비가시화)
- 타일 경계 gap으로 배경이 비칠 때 색상 차이를 제거

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 15:34:49 +09:00
3a001ca9b6 fix(map): fill 3-tier LOD로 타일 seam 해결
- 심해 fill 폴리곤이 globe 타일 경계에서 seam 아티팩트 발생
- bathymetry-fill: z3-7 (depth >= -2000, 천해만)
- bathymetry-fill-medium: z7-9 (depth >= -4000)
- bathymetry-fill-deep: z9+ (전체 depth)
- applyDepthGradient: 3개 fill 레이어 모두 적용

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 15:28:23 +09:00
2095503e50 fix(map): 심해 등심선 복원 + 전체 depth LOD
- shallowFilter 제거: 전체 depth 범위 렌더링 복원
- bathyFillColor: -8000m, -4000m 색상 stop 복원
- DEPTHS_MEDIUM: -4000m 추가 (z7-9)
- DEPTHS_DETAIL: -4000m, -8000m 추가 (z9+)
- 줌 기반 LOD가 vertex 제어 담당 (depth 필터 불필요)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 15:21:46 +09:00
f50c227fd4 fix(map): globe 모드 수역 fill/text 복구
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 15:15:45 +09:00
b022e4bc36 perf(map): 줌 기반 LOD + 심해 등심선 제거
- applyLandLayerLOD: 베이스맵 육지 레이어에 minzoom 적용
  (landcover z9, transportation z8, building z14 등)
- 수심 3-tier LOD: coarse(z3-7), medium(z7-9), detail(z9+)
- shallowFilter: depth >= -2000, 심해 feature GPU 미전달
- applyDepthGradient ascending order 에러 수정
- vertex 경고 passthrough (디버깅용 유지)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 15:15:31 +09:00
d5700ba587 fix(map): zone 간소화를 projectionBusy 앞으로 이동
소스 데이터 간소화가 projectionBusy 가드 뒤에 있어서
globe 전환 시 원본 데이터(2100+ vertex)로 tessellation 진행 →
73,000+ vertex 폭증. setData를 가드 앞으로 이동하고
useMemo로 간소화 데이터 캐싱.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 13:59:21 +09:00
7bec1ae86d fix(map): globe 수역 line vertex 초과 해결
zones-line도 globe tessellation에서 73,300+ vertex로 폭증.
globe 모드에서 수역 소스 데이터를 ring당 60점으로 서브샘플링.
원본 2100+ vertex → ~240 vertex → globe tessellation 후 65535 이내.
mercator 모드에서는 원본 데이터 유지.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 13:44:26 +09:00
99d714582b fix(map): globe 모드 zones-fill 숨김 + 라벨 가드
- globe tessellation에서 수역 fill polygon vertex 65535 초과
  (해안선 2100 vertex → globe에서 108890+로 폭증) → 노란 막대
- globe 모드에서 zones-fill visibility: none으로 설정
- guardedSetVisibility 적용으로 수역 라벨 사라짐 방지

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 13:38:37 +09:00
95d9ea8aef fix(map): 라벨 사라짐 + easing 경고 + vertex 경고 수정
- guardedSetVisibility 도입: 현재 값과 동일하면 setLayoutProperty
  호출 생략하여 style._changed 트리거 방지 → symbol 재배치로 인한
  text-allow-overlap:false 라벨 사라짐 현상 해결
- useGlobeShips 기존 레이어 else 블록의 중복 expression 재설정 제거
  (data-driven 표현식은 addLayer 시 1회 설정으로 충분)
- _render 래퍼에서 globe scrollZoom easing 경고 억제
- fleet-circles-ml-fill 레이어 완전 제거 (vertex 65535 초과 원인)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 13:34:42 +09:00
91df90b528 perf(map): Globe/Mercator 양방향 동시 렌더링
- overlay 파괴/재생성 대신 layers 비움으로 전환
- globe ship 레이어 visibility 즉시 토글 (projectionBusy 우회)
- fleet circles fill vertex 초과 수정 (steps 72→36/24)
- globe scrollZoom easing 경고 수정
- projection 비영속화 (항상 mercator 시작)
- globe 레이어 준비 전까지 3D 토글 비활성화

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 13:08:54 +09:00
d88c89403d perf(map): globe 선박 렌더링 사전계산 최적화
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 12:26:42 +09:00
39d9cc9db1 feat(ais): 초기 로드를 chnprmship API로 전환
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 12:23:18 +09:00
16ebf3abca feat: 사용자 설정 영속화 + 지도 뷰 저장
usePersistedState hook으로 대시보드 상태를
localStorage에 자동 저장. 지도 뷰(중심/줌/방위)도
60초 주기 + 언마운트 시 저장하여 새로고침 복원.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 12:18:39 +09:00
cc807bb5f6 feat: KST 타임스탬프 포맷 유틸 적용
shared/lib/datetime.ts에 KST 고정 포맷 함수 추가.
AIS 정보, 선박 목록, 대시보드 등의 날짜 표시를
로컬 포맷에서 KST 명시적 포맷으로 통일.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 12:12:43 +09:00
20db4cb0cf style(auth): 로그인 페이지 UI 조정
- 로고: WING → GC WING + demo 라벨
- 하단: GC Surveillance → GC SI Team

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 08:47:50 +09:00
79b21c7d44 feat(auth): Google OAuth 로그인 구현
- shared/auth 모듈: AuthProvider, ProtectedRoute, useAuth, authApi
- 페이지: LoginPage(Google OAuth), PendingPage, DeniedPage
- WING_PERMIT 역할 기반 접근 제어
- Topbar에 사용자 이름 + 로그아웃 버튼 추가
- App.tsx에 react-router 라우팅 + AuthProvider 래핑
- DEV 모드 Mock 로그인 지원 (김개발)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 08:44:25 +09:00
3acda7432e refactor(map): UI 개선 — 3D 명칭, 수심 줌, 레거시 비활성
- "지구본" → "3D" 명칭 변경, 헤더 우측으로 이동
- 레거시 베이스맵 비활성 (주석처리)
- 수심 minzoom 통일: fill 3, borders 5, major 3
- NavigationControl 통합, 기어 버튼 겹침 수정
- constants.ts 미사용 BATHY_ZOOM_RANGES 제거

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 07:04:31 +09:00
d2178a6134 fix(map): 육지색 적용에서 수역/선박 등 커스텀 레이어 제외
zones, ships, pair, fc, fleet, predict, deck-globe 레이어를
applyLandColor에서 제외하여 수역 표시 복원

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 06:27:48 +09:00
1a3dd82eb4 fix(map): 지도 설정 패널 개선
- 육지색 적용 범위 확대 (background + 전체 fill 레이어)
- UI 가독성 개선: 라벨 10px, 색상 대비 강화
- 수심 구간 '자동채우기' 토글 추가 (최소/최대 기준 보간)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 06:23:55 +09:00
650888adb7 feat(map): 지도 설정 패널 + 수심 범례 구현
- 나침반/줌 컨트롤 분리, 기어 버튼으로 설정 패널 토글
- 설정 항목: 레이블 언어, 육지/물/수심 색상, 수심 폰트 크기/색상
- 런타임 map.setPaintProperty/setLayoutProperty로 즉시 적용
- 수심 색상 범례 (좌하단 그라데이션 바 + 눈금)
- 초기화 버튼으로 디폴트 복원

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 06:17:20 +09:00
4c257a2883 fix(map): 수심 레이블이 한글 변환에 의해 덮어쓰이는 버그 수정
applyKoreanLabels를 injectOceanBathymetryLayers보다 먼저 호출하여
수심 text-field가 보존되도록 순서 변경

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 05:57:22 +09:00
289f1bebc0 feat(map): 수심 레이블 개선 + 한글 지명 적용
- 수심 레이블: minzoom 10→7, 텍스트 크기 확대, halo 가독성 개선
- 해저 지형명: minzoom 8→6, 텍스트 크기 확대
- MapTiler 베이스맵 한글 지명 적용 (name:ko fallback)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 05:47:16 +09:00
f5ef24c02f perf(map): 해저케이블 렌더링 최적화
- GeoJSON source tolerance:1, buffer:64 (저줌 vertex 단순화)
- hitarea/casing/glow 레이어 minzoom:3 (저줌 렌더 제외)
- ensureGeoJsonSource에 source options 파라미터 추가
- NativeSourceConfig에 options 필드 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 05:28:44 +09:00
a16ccc9a01 feat(map): 통합 레이어 모듈 구현
- useNativeMapLayers 범용 hook 생성
  - source/layer 생성, visibility, cleanup 자동화
  - projectionBusy/isStyleLoaded 가드 내장
  - Globe 레이어 순서 관리 내장
  - beforeLayer 후보 배열 지원
- useSubcablesLayer를 useNativeMapLayers로 전환
- React Compiler ref 접근 규칙 준수 (useEffect 내 할당)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 05:21:53 +09:00
fb1334ce45 fix(map): 해저케이블 호버/프로젝션 버그
- useEffect 3개 분리 (레이어생성/호버/이벤트)
- hoveredCableId를 레이어 생성 deps에서 분리하여 깜박임 제거
- 이벤트 바인딩에 retry 로직 추가 (프로젝션 전환 후)
- paint 기본값을 상수로 추출하여 일관성 보장

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 02:36:20 +09:00
7eff97afd4 fix(map): 해저케이블 시인성 개선
- MapLibre 중첩 interpolate 표현식 에러 수정
- 6레이어 구조: hitarea, casing, line, glow, points, label
- 호버 시 flat value 사용 (case 내 interpolate 제거)
- Globe/Mercator 양쪽 프로젝션 레이어 순서 지원
- 진한 색상, 굵은 라인, 포인트 마커로 시인성 향상

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 02:28:11 +09:00
ca5560aff2 feat(map): 해저케이블 레이어 및 정보 패널 구현
- subcable entity 생성 (타입 정의 + 데이터 로딩 hook)
- MapLibre 레이어: 케이블 라인 + 호버 하이라이트 + 라벨
- 지도 표시 설정에 해저케이블 토글 추가
- 클릭 시 우측 정보 패널 (길이, 개통, 운영사, landing points)
- Map3D + DashboardPage 통합

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 02:17:58 +09:00
621a5037c2 chore(data): vendor submarine cable geojson/details 2026-02-16 02:17:55 +09:00
3ba6c02ba0 feat(map): 선박 외곽선 대비 및 줌 스케일링 개선 2026-02-16 01:10:45 +09:00
864fc44d0e refactor(map): Map3D.tsx hooks 추출 완료 (4558줄 → 510줄) 2026-02-16 00:41:11 +09:00
324c6267f0 refactor(map): Map3D 모듈 분리 및 버그 수정 2026-02-15 23:57:38 +09:00
918b80e06a chore: 팀 프로젝트 워크플로우 세팅
- pnpm → npm 전환 (워크스페이스 유지)
- .claude/ 팀 규칙(5), 스킬(4), 설정, hooks 스크립트(3) 추가
- .githooks/ commit-msg, post-checkout, pre-commit 추가
- Nexus npm 프록시 설정 (.npmrc — URL만, 인증 제외)
- .editorconfig, .prettierrc, .node-version(24) 추가
- CLAUDE.md 프로젝트 설명서 생성
- Map3D.tsx 미사용 함수 제거 (getDeckShipAngle)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 22:18:40 +09:00
d01240a737 fix(map): align ship icon headings for COG convention 2026-02-15 21:52:04 +09:00
a8aa916076 fix(map): align prediction vectors with ship course + improve contrast 2026-02-15 19:41:15 +09:00
11aff67a04 feat(map): add prediction vectors and ship labels toggles 2026-02-15 19:15:20 +09:00
0899223c75 fix(map): keep bathymetry visible when overzooming 2026-02-15 18:55:57 +09:00
dc702728be tweak(map): increase bathymetry depth label size 2026-02-15 18:51:29 +09:00
15d5d5ad23 fix(globe): gate bathymetry fill by zoom to avoid ocean tearing 2026-02-15 18:47:52 +09:00
3497b8c7e2 feat(dashboard): alarms filter + legend/palette sync + map polish 2026-02-15 18:42:49 +09:00
30e6e584ee refactor(map3d): isolate ship hover overlay for icon flicker reduction 2026-02-15 16:35:05 +09:00
54d33a8670 fix(map3d): restore mercator static/overlay split and stabilize globe deck rendering 2026-02-15 16:28:04 +09:00
6ff5ae383f fix: restore globe ship icon color while keeping symbol layer stable 2026-02-15 16:14:03 +09:00
86d36d25e3 fix: reduce globe symbol paint variability to avoid bucket mismatch 2026-02-15 16:12:36 +09:00