feat: 보고서 지도캡처 + 드론/CCTV/확산예측 UI 기능 개선 #91
@ -299,23 +299,6 @@ export function pointInPolygon(
|
||||
return inside
|
||||
}
|
||||
|
||||
/** 다각형 면적 (km²) — Shoelace formula, 구면 보정 포함 */
|
||||
export function polygonAreaKm2(polygon: { lat: number; lon: number }[]): number {
|
||||
if (polygon.length < 3) return 0
|
||||
const n = polygon.length
|
||||
const latCenter = polygon.reduce((s, p) => s + p.lat, 0) / n
|
||||
const cosLat = Math.cos(latCenter * DEG2RAD)
|
||||
let area = 0
|
||||
for (let i = 0; i < n; i++) {
|
||||
const j = (i + 1) % n
|
||||
const x1 = polygon[i].lon * cosLat * EARTH_RADIUS * DEG2RAD / 1000
|
||||
const y1 = polygon[i].lat * EARTH_RADIUS * DEG2RAD / 1000
|
||||
const x2 = polygon[j].lon * cosLat * EARTH_RADIUS * DEG2RAD / 1000
|
||||
const y2 = polygon[j].lat * EARTH_RADIUS * DEG2RAD / 1000
|
||||
area += x1 * y2 - x2 * y1
|
||||
}
|
||||
return Math.abs(area) / 2
|
||||
}
|
||||
|
||||
/** 원 면적 (km²) */
|
||||
export function circleAreaKm2(radiusM: number): number {
|
||||
|
||||
@ -207,9 +207,10 @@ export function OilSpillView() {
|
||||
useEffect(() => {
|
||||
if (activeSubTab === 'analysis' && oilTrajectory.length === 0 && !selectedAnalysis) {
|
||||
const models = Array.from(selectedModels.size > 0 ? selectedModels : new Set<PredictionModel>(['OpenDrift']))
|
||||
const demoTrajectory = generateDemoTrajectory(incidentCoord, models, predictionTime)
|
||||
const coord = incidentCoord ?? { lat: 37.39, lon: 126.64 }
|
||||
const demoTrajectory = generateDemoTrajectory(coord, models, predictionTime)
|
||||
setOilTrajectory(demoTrajectory)
|
||||
const demoBooms = generateAIBoomLines(demoTrajectory, incidentCoord, algorithmSettings)
|
||||
const demoBooms = generateAIBoomLines(demoTrajectory, coord, algorithmSettings)
|
||||
setBoomLines(demoBooms)
|
||||
setSensitiveResources(DEMO_SENSITIVE_RESOURCES)
|
||||
}
|
||||
|
||||
불러오는 중...
Reference in New Issue
Block a user