Browse Source

관제과 비행구역 데이터블록 표출

master
이준희 2 months ago
parent
commit
a54d24978c
  1. 88
      src/containers/flight/ControlApprovalsContainer.js

88
src/containers/flight/ControlApprovalsContainer.js

@ -40,6 +40,7 @@ import {
FiCornerUpLeft FiCornerUpLeft
} from 'react-icons/fi'; } from 'react-icons/fi';
import { X } from 'react-feather'; import { X } from 'react-feather';
import mapboxgl from 'mapbox-gl';
export default function ControlApprovalsContainer({ mode }) { export default function ControlApprovalsContainer({ mode }) {
const dispatch = useDispatch(); const dispatch = useDispatch();
@ -67,8 +68,6 @@ export default function ControlApprovalsContainer({ mode }) {
// 시군구 // 시군구
const [district, setDistrict] = useState('전체'); const [district, setDistrict] = useState('전체');
// 미니맵 레이어
const [previewLayer, setPreviewLayer] = useState();
const { map, mapType } = useSelector(state => state.mapState); const { map, mapType } = useSelector(state => state.mapState);
@ -80,7 +79,11 @@ export default function ControlApprovalsContainer({ mode }) {
const savedRightMenuRef = useRef(null); const savedRightMenuRef = useRef(null);
const [clientX, setClientX] = useState(0); const [clientX, setClientX] = useState(0);
const previewGeo2 = { // 비행구역 데이터블록
const [dataBlocks, setDataBlocks] = useState([]);
// 비행구역 (관제과) 레이어
const controlLayer = {
type: 'FeatureCollection', type: 'FeatureCollection',
features: [] features: []
}; };
@ -98,7 +101,7 @@ export default function ControlApprovalsContainer({ mode }) {
useEffect(() => { useEffect(() => {
if (areaCoordList.length !== 0) { if (areaCoordList.length !== 0) {
handlerPreviewDraw(); handlerAreaDraw();
} }
}, [areaCoordList]); }, [areaCoordList]);
@ -289,22 +292,19 @@ export default function ControlApprovalsContainer({ mode }) {
const handlerMapInit = () => { const handlerMapInit = () => {
let mapInstance = mode === 'container' ? map : window.opener._mapbox; let mapInstance = mode === 'container' ? map : window.opener._mapbox;
if (mapInstance.getSource('preview')) { if (mapInstance.getSource('controlLayer')) {
} else { } else {
mapInstance.addSource('preview', { mapInstance.addSource('controlLayer', {
type: 'geojson', type: 'geojson',
data: previewGeo2 data: controlLayer
}); });
mapInstance.addLayer(flightlayerWayPoint('preview')); mapInstance.addLayer(flightlayerWayPoint('controlLayer'));
mapInstance.addLayer(flightlayerBuffer('preview')); mapInstance.addLayer(flightlayerBuffer('controlLayer'));
mapInstance.addLayer(flightlayerPolygon('preview')); mapInstance.addLayer(flightlayerPolygon('controlLayer'));
mapInstance.addLayer(flightlayerPolyline('preview')); mapInstance.addLayer(flightlayerPolyline('controlLayer'));
} }
dispatch(clientSetIsMapLoading(true)); dispatch(clientSetIsMapLoading(true));
const preview = mapInstance.getSource('preview');
if (preview) setPreviewLayer(preview);
setIsMapLoading(true); setIsMapLoading(true);
@ -313,13 +313,13 @@ export default function ControlApprovalsContainer({ mode }) {
dispatch(clientMapInit(mapInstance)); dispatch(clientMapInit(mapInstance));
}; };
const handlerPreviewDraw = () => { // 비행구역 생성 및 화면 포커스
const handlerAreaDraw = () => {
if (areaCoordList.length > 0) { if (areaCoordList.length > 0) {
const areas = areaCoordList[0]; const areas = areaCoordList[0];
controlLayer.features = [];
previewGeo2.features = [];
let fitZoomPaths = []; let fitZoomPaths = [];
const radius = areas.bufferZone; const radius = areas.bufferZone;
const circleCoords = handlerGetCircleCoord( const circleCoords = handlerGetCircleCoord(
[areas.lon, areas.lat], [areas.lon, areas.lat],
@ -330,16 +330,56 @@ export default function ControlApprovalsContainer({ mode }) {
circle.properties.center = [areas.lon, areas.lat]; circle.properties.center = [areas.lon, areas.lat];
circle.geometry.coordinates = circleCoords; circle.geometry.coordinates = circleCoords;
previewGeo2.features.push(circle); controlLayer.features.push(circle);
mapObject?.setCenter(circle.properties.center);
fitZoomPaths = circleCoords[0]; fitZoomPaths = circleCoords[0];
handlerFitBounds(mapObject, fitZoomPaths, 400, 'CIRCLE', 'flight'); handlerFitBounds(mapObject, fitZoomPaths, 400, 'CIRCLE', 'flight');
// mapObject.setPaintProperty('waypoint', 'circle-radius', 10); handlerInfoWindow(areas);
mapObject?.getSource('preview').setData(previewGeo2); 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 = `
<div class="tooltip-box">
<div class="tooltip-ti">
<span>${area?.applyNo}</span>
</div>
<div class="tooltip-txt">
<div class="tooltip-txt-list">
<span>비행구역 ${area?.zoneNo} / 주소- / ${divCd}</span>
</div>
</div>
</div>
`;
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]);
} }
}; };

Loading…
Cancel
Save