wing-ops/frontend/src/common/hooks/useMeasureTool.ts
leedano 301df70376 feat(map): 거리·면적 측정 도구 구현
TopBar 퀵메뉴에서 거리/면적 측정 모드 토글, MapView에서 클릭으로
포인트 수집 후 deck.gl 레이어로 결과를 시각화한다.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 17:52:27 +09:00

36 lines
1.1 KiB
TypeScript

import { useCallback } from 'react';
import { useMapStore } from '../store/mapStore';
import { haversineDistance } from '../utils/geo';
const CLOSE_THRESHOLD_M = 200;
export function useMeasureTool() {
const measureMode = useMapStore((s) => s.measureMode);
const measureInProgress = useMapStore((s) => s.measureInProgress);
const addMeasurePoint = useMapStore((s) => s.addMeasurePoint);
const commitAreaMeasurement = useMapStore((s) => s.commitAreaMeasurement);
const handleMeasureClick = useCallback(
(lon: number, lat: number) => {
if (!measureMode) return;
const pt = { lat, lon };
// 면적 모드: 첫 점 근처 클릭 시 다각형 닫기
if (measureMode === 'area' && measureInProgress.length >= 3) {
const first = measureInProgress[0];
const dist = haversineDistance(first, pt);
if (dist < CLOSE_THRESHOLD_M) {
commitAreaMeasurement();
return;
}
}
addMeasurePoint(pt);
},
[measureMode, measureInProgress, addMeasurePoint, commitAreaMeasurement],
);
return { handleMeasureClick, measureMode };
}