- FontScaleContext + FontScalePanel: 시설/선박/분석/지역 4그룹 × 0.5~2.0 범위 - LAYERS 패널 하단 슬라이더 UI, localStorage 영속화 - Korea static 14개 + Iran 4개 + 분석 3개 + KoreaMap 5개 TextLayer 적용 - MapLibre 선박 라벨/국가명 실시간 반영 - 모든 useMemo deps + updateTriggers에 fontScale 포함
89 lines
2.6 KiB
TypeScript
89 lines
2.6 KiB
TypeScript
import { useMemo } from 'react';
|
|
import type { Layer } from '@deck.gl/core';
|
|
import type { PowerFacility } from '../services/infra';
|
|
import type { HazardType } from '../data/hazardFacilities';
|
|
import { useFontScale } from './useFontScale';
|
|
|
|
// Re-export types for consumers
|
|
export type { StaticPickedObject, StaticLayerKind, StaticPickInfo } from './layers/types';
|
|
|
|
import { createPortLayers } from './layers/createPortLayers';
|
|
import { createNavigationLayers } from './layers/createNavigationLayers';
|
|
import { createMilitaryLayers } from './layers/createMilitaryLayers';
|
|
import { createFacilityLayers } from './layers/createFacilityLayers';
|
|
|
|
interface StaticLayerConfig {
|
|
ports: boolean;
|
|
coastGuard: boolean;
|
|
windFarm: boolean;
|
|
militaryBases: boolean;
|
|
govBuildings: boolean;
|
|
airports: boolean;
|
|
navWarning: boolean;
|
|
nkLaunch: boolean;
|
|
nkMissile: boolean;
|
|
piracy: boolean;
|
|
infra: boolean;
|
|
infraFacilities: PowerFacility[];
|
|
hazardTypes: HazardType[];
|
|
cnPower: boolean;
|
|
cnMilitary: boolean;
|
|
jpPower: boolean;
|
|
jpMilitary: boolean;
|
|
onPick: (info: import('./layers/types').StaticPickInfo) => void;
|
|
sizeScale?: number;
|
|
}
|
|
|
|
export function useStaticDeckLayers(config: StaticLayerConfig): Layer[] {
|
|
const { fontScale } = useFontScale();
|
|
return useMemo(() => {
|
|
const fc = { sc: config.sizeScale ?? 1.0, fs: fontScale.facility, onPick: config.onPick };
|
|
|
|
return [
|
|
...createPortLayers({ ports: config.ports, windFarm: config.windFarm }, fc),
|
|
...createNavigationLayers({
|
|
coastGuard: config.coastGuard,
|
|
airports: config.airports,
|
|
navWarning: config.navWarning,
|
|
piracy: config.piracy,
|
|
}, fc),
|
|
...createMilitaryLayers({
|
|
militaryBases: config.militaryBases,
|
|
govBuildings: config.govBuildings,
|
|
nkLaunch: config.nkLaunch,
|
|
nkMissile: config.nkMissile,
|
|
}, fc),
|
|
...createFacilityLayers({
|
|
infra: config.infra,
|
|
infraFacilities: config.infraFacilities,
|
|
hazardTypes: config.hazardTypes,
|
|
cnPower: config.cnPower,
|
|
cnMilitary: config.cnMilitary,
|
|
jpPower: config.jpPower,
|
|
jpMilitary: config.jpMilitary,
|
|
}, fc),
|
|
];
|
|
}, [
|
|
config.ports,
|
|
config.windFarm,
|
|
config.coastGuard,
|
|
config.airports,
|
|
config.navWarning,
|
|
config.piracy,
|
|
config.militaryBases,
|
|
config.govBuildings,
|
|
config.nkLaunch,
|
|
config.nkMissile,
|
|
config.infra,
|
|
config.infraFacilities,
|
|
config.hazardTypes,
|
|
config.cnPower,
|
|
config.cnMilitary,
|
|
config.jpPower,
|
|
config.jpMilitary,
|
|
config.onPick,
|
|
config.sizeScale,
|
|
fontScale.facility,
|
|
]);
|
|
}
|