From a54d24978c91409151e3726159bf31a73b95240e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?junh=5Feee=28=EC=9D=B4=EC=A4=80=ED=9D=AC=29?= Date: Wed, 17 Jul 2024 10:54:52 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B4=80=EC=A0=9C=EA=B3=BC=20=EB=B9=84?= =?UTF-8?q?=ED=96=89=EA=B5=AC=EC=97=AD=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B8=94=EB=A1=9D=20=ED=91=9C=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flight/ControlApprovalsContainer.js | 88 ++++++++++++++----- 1 file changed, 64 insertions(+), 24 deletions(-) diff --git a/src/containers/flight/ControlApprovalsContainer.js b/src/containers/flight/ControlApprovalsContainer.js index 9178d922..a08732cd 100644 --- a/src/containers/flight/ControlApprovalsContainer.js +++ b/src/containers/flight/ControlApprovalsContainer.js @@ -40,6 +40,7 @@ import { FiCornerUpLeft } from 'react-icons/fi'; import { X } from 'react-feather'; +import mapboxgl from 'mapbox-gl'; export default function ControlApprovalsContainer({ mode }) { const dispatch = useDispatch(); @@ -67,8 +68,6 @@ export default function ControlApprovalsContainer({ mode }) { // 시군구 const [district, setDistrict] = useState('전체'); - // 미니맵 레이어 - const [previewLayer, setPreviewLayer] = useState(); const { map, mapType } = useSelector(state => state.mapState); @@ -80,7 +79,11 @@ export default function ControlApprovalsContainer({ mode }) { const savedRightMenuRef = useRef(null); const [clientX, setClientX] = useState(0); - const previewGeo2 = { + // 비행구역 데이터블록 + const [dataBlocks, setDataBlocks] = useState([]); + + // 비행구역 (관제과) 레이어 + const controlLayer = { type: 'FeatureCollection', features: [] }; @@ -98,7 +101,7 @@ export default function ControlApprovalsContainer({ mode }) { useEffect(() => { if (areaCoordList.length !== 0) { - handlerPreviewDraw(); + handlerAreaDraw(); } }, [areaCoordList]); @@ -289,22 +292,19 @@ export default function ControlApprovalsContainer({ mode }) { const handlerMapInit = () => { let mapInstance = mode === 'container' ? map : window.opener._mapbox; - if (mapInstance.getSource('preview')) { + if (mapInstance.getSource('controlLayer')) { } else { - mapInstance.addSource('preview', { + mapInstance.addSource('controlLayer', { type: 'geojson', - data: previewGeo2 + data: controlLayer }); - mapInstance.addLayer(flightlayerWayPoint('preview')); - mapInstance.addLayer(flightlayerBuffer('preview')); - mapInstance.addLayer(flightlayerPolygon('preview')); - mapInstance.addLayer(flightlayerPolyline('preview')); + mapInstance.addLayer(flightlayerWayPoint('controlLayer')); + mapInstance.addLayer(flightlayerBuffer('controlLayer')); + mapInstance.addLayer(flightlayerPolygon('controlLayer')); + mapInstance.addLayer(flightlayerPolyline('controlLayer')); } dispatch(clientSetIsMapLoading(true)); - const preview = mapInstance.getSource('preview'); - - if (preview) setPreviewLayer(preview); setIsMapLoading(true); @@ -313,13 +313,13 @@ export default function ControlApprovalsContainer({ mode }) { dispatch(clientMapInit(mapInstance)); }; - const handlerPreviewDraw = () => { + // 비행구역 생성 및 화면 포커스 + const handlerAreaDraw = () => { if (areaCoordList.length > 0) { const areas = areaCoordList[0]; - - previewGeo2.features = []; - + controlLayer.features = []; let fitZoomPaths = []; + const radius = areas.bufferZone; const circleCoords = handlerGetCircleCoord( [areas.lon, areas.lat], @@ -330,16 +330,56 @@ export default function ControlApprovalsContainer({ mode }) { circle.properties.center = [areas.lon, areas.lat]; circle.geometry.coordinates = circleCoords; - previewGeo2.features.push(circle); - - mapObject?.setCenter(circle.properties.center); + controlLayer.features.push(circle); fitZoomPaths = circleCoords[0]; - handlerFitBounds(mapObject, fitZoomPaths, 400, 'CIRCLE', 'flight'); - // mapObject.setPaintProperty('waypoint', 'circle-radius', 10); - mapObject?.getSource('preview').setData(previewGeo2); + handlerInfoWindow(areas); + mapObject?.getSource('controlLayer').setData(controlLayer); + } + }; + + // 데이터블록 표출 이벤트 + const handlerInfoWindow = area => { + if (dataBlocks.length > 0) { + dataBlocks?.map(block => { + block.remove(); + }); + } + + const divCd = + area.fltElevMax === 120 + ? '원추' + : area.fltElevMax > 45 && area.fltElevMax < 100 + ? '수평' + : '-'; + + const content = ` +
+
+ ${area?.applyNo} +
+
+
+ 비행구역 ${area?.zoneNo} / 주소- / ${divCd} +
+
+
+ `; + + if (mapObject) { + const dataBlock = new mapboxgl.Popup({ + offset: [0, 0], + closeButton: false, + closeOnClick: false, + closeOnMove: false + }) + .setLngLat({ lng: area?.lon, lat: area?.lat }) + .setHTML(content) + .addTo(mapObject); + + setDataBlocks(prev => [...prev, dataBlock]); } };