노승철
2 years ago
10 changed files with 348 additions and 33 deletions
@ -0,0 +1,180 @@
|
||||
import { useEffect, useState } from 'react'; |
||||
import { useSelector } from 'react-redux'; |
||||
|
||||
|
||||
const DronPlan = ({ naver, map }) => { |
||||
const { controlGpList } = useSelector(state => state.controlGpState); |
||||
const { controlGpFltPlanList } = useSelector(state => state.controlGpFltPlanState); |
||||
const { objectId, isClickObject } = useSelector(state => state.controlMapReducer); |
||||
|
||||
const [area, setArea] = useState(); // 비행 구역 관리
|
||||
const [buffer, setBuffer] = useState(); // 버퍼 구역 관리
|
||||
const [controlId, setControlId] = useState(); // 식별번호 저장
|
||||
|
||||
useEffect(() => { |
||||
if (controlGpFltPlanList) { |
||||
init();
|
||||
} |
||||
}, [controlGpFltPlanList]) |
||||
|
||||
useEffect(() => {
|
||||
if (!isClickObject) { |
||||
|
||||
// 관제 종료시 영역 초기화.
|
||||
clear(); |
||||
|
||||
} else { |
||||
setControlId(objectId); |
||||
} |
||||
|
||||
}, [objectId ,isClickObject]); |
||||
|
||||
useEffect(() => { |
||||
// 구역 대상의 드론 데이터가 지도 상에 존재하고 있는지 체크해야 한다. (없을 경우 영역 제거)
|
||||
if(controlId && isClickObject) {
|
||||
if (controlGpList) {
|
||||
const isExist = controlGpList.find(data => data.controlId === controlId) |
||||
|
||||
if(!isExist) { |
||||
clear(); |
||||
} |
||||
}
|
||||
} |
||||
}, [controlGpList]) |
||||
|
||||
|
||||
/* 비행 구역 그리기. */ |
||||
const init = () => { |
||||
if(area) { |
||||
area.setMap(null); |
||||
} |
||||
|
||||
/* 좌표 추출 */ |
||||
const planList = controlGpFltPlanList; |
||||
planList.forEach(plan => { |
||||
|
||||
const areaList = plan.areaList; |
||||
|
||||
// 구역 정보는 계획서당 1개만 존재
|
||||
areaList.forEach(area => { |
||||
const coordList = area.coordList; // 기초 좌표
|
||||
const bufferList = area.bufferCoordList; // 기초 좌표의 버퍼 좌표
|
||||
const bufferZone = area.bufferZone; // 반경 값
|
||||
const areaType = area.areaType; // 도형 타입
|
||||
|
||||
const paths = []; |
||||
coordList.forEach((coord) => { |
||||
const path = new naver.maps.LatLng(coord.lat, coord.lon) |
||||
|
||||
paths.push(path); |
||||
}); |
||||
|
||||
clear(); |
||||
|
||||
if (areaType === 'LINE') { |
||||
polyline(paths, bufferList); |
||||
} |
||||
|
||||
if (areaType === 'POLYGON') { |
||||
polygon(paths); |
||||
} |
||||
|
||||
if (areaType === 'CIRCLE') { |
||||
circle(paths, bufferZone); |
||||
} |
||||
|
||||
}); |
||||
}) |
||||
} |
||||
|
||||
/* Polyline Create */ |
||||
const polyline = (paths, bufferList) => {
|
||||
if (paths && paths.length > 1) { |
||||
const line = new naver.maps.Polyline({ |
||||
strokeLineCap: 'round', |
||||
strokeLineJoin: 'round', |
||||
strokeColor: '#283046', |
||||
strokeWeight: 1, |
||||
strokeOpacity: 0.5, |
||||
path: paths, |
||||
map: map |
||||
}); |
||||
|
||||
setArea(line); |
||||
}
|
||||
|
||||
if (bufferList && bufferList.length > 1) { |
||||
const paths = []; |
||||
bufferList.forEach((buffer) => { |
||||
const path = new naver.maps.LatLng(buffer.lat, buffer.lon) |
||||
|
||||
paths.push(path); |
||||
}); |
||||
|
||||
const lineBuffer = new naver.maps.Polygon({ |
||||
strokeColor: '#283046', |
||||
strokeOpacity: 1, |
||||
fillColor: '#7367F0', |
||||
fillOpacity: 0.1, |
||||
paths: paths, |
||||
map: map |
||||
}); |
||||
|
||||
setBuffer(lineBuffer); |
||||
} |
||||
} |
||||
|
||||
/* Polygon Create */
|
||||
const polygon = (paths) => {
|
||||
if (paths && paths.length > 1) { |
||||
const poly = new naver.maps.Polygon({ |
||||
strokeColor: '#283046', |
||||
strokeOpacity: 1, |
||||
fillColor: '#7367F0', |
||||
fillOpacity: 0.1, |
||||
paths: paths, |
||||
map: map |
||||
}); |
||||
|
||||
setArea(poly); |
||||
}
|
||||
} |
||||
|
||||
/* Circle Create */ |
||||
const circle = (paths, bufferZone) => { |
||||
|
||||
if (paths[0].lat !== 0 && paths[0].lon !== 0) { |
||||
const circle = new naver.maps.Circle({ |
||||
strokeColor: '#283046', |
||||
strokeOpacity: 1,
|
||||
fillColor: '#7367F0', |
||||
fillOpacity: 0.1, |
||||
center: paths[0], |
||||
radius: bufferZone, |
||||
map: map, |
||||
clickable: true |
||||
}); |
||||
|
||||
setArea(circle); |
||||
} |
||||
} |
||||
|
||||
/* 구역 초기화 */ |
||||
const clear = () => { |
||||
|
||||
if(area) { |
||||
area.setMap(null); |
||||
|
||||
setArea(); |
||||
if(buffer) { |
||||
buffer.setMap(null); |
||||
setBuffer(); |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
return null; |
||||
} |
||||
|
||||
export default DronPlan; |
Loading…
Reference in new issue