Browse Source

Merge branch 'master' of http://gitea.palntour.com/pav/pav-home

pull/2/head
노승철 2 years ago
parent
commit
afc35200a9
  1. 1
      src/components/basis/flight/plan/FlightPlanAreaDetailForm.js
  2. 2
      src/components/map/naver/NaverMap.js
  3. 97
      src/components/map/naver/draw/FlightPlanDraw.js
  4. 64
      src/components/map/naver/dron/DronMarker.js
  5. 73
      src/containers/basis/dron/BasisIdntfContainer.js
  6. 23
      src/modules/control/gp/sagas/controlGpSaga.ts
  7. 2
      src/modules/control/map/reducers/controlMapReducer.ts

1
src/components/basis/flight/plan/FlightPlanAreaDetailForm.js

@ -177,6 +177,7 @@ const FlightPlanAreaDetailForm = ({ handleSave, handleClose, handleChange, handl
className='mr-1'
color='primary'
onClick={e => handleSave()}
disabled={!coordList[0].lat ? true : false }
>
등록
</Button.Ripple>

2
src/components/map/naver/NaverMap.js

@ -39,7 +39,7 @@ export const NaverCustomMap = () => {
center: new naver.maps.LatLng(36.56793936069445, 127.85101412107547),
zoom: 10,
zoomControl: true,
mapTypeId: naver.maps.MapTypeId.NORMAL,
mapTypeId: naver.maps.MapTypeId.HYBRID,
zoomControlOptions: {
position: naver.maps.Position.TOP_LEFT,

97
src/components/map/naver/draw/FlightPlanDraw.js

@ -2,6 +2,7 @@ import $ from 'jquery';
import { useEffect, useState } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import * as Actions from '../../../../modules/basis/flight/actions/basisFlightAction';
import { InfoModal } from '../../../modal/InfoModal';
export const FlightPlanDraw = props => {
const dispatch = useDispatch();
@ -20,10 +21,16 @@ export const FlightPlanDraw = props => {
const [areaDetail, setAreaDetail] = useState();
const [alertModal, setAlertModal] = useState({
isOpen: false,
title: '',
desc: ''
})
const naver = props.naver;
const map = props.map;
let mode = props.mode;
let areaInfo;
let lastDistance;
@ -188,6 +195,12 @@ export const FlightPlanDraw = props => {
setPolyline(polyline);
setAreaInfo(polypaths);
} else {
setAlertModal({
isOpen: true,
title: '우회 여부 확인',
desc: '좌표를 두 개 점으로 이어주세요.'
})
polyline.setMap(null);
polyline = '';
}
@ -204,7 +217,7 @@ export const FlightPlanDraw = props => {
lastDistance = guideline.getDistance();
guideline.getPath().push(polygonpaths[0]);
var distance = guideline.getDistance();
addMileStone(polygonpaths[0], fromMetersToText(distance - lastDistance));
// addMileStone(polygonpaths[0], fromMetersToText(distance - lastDistance));
setMarker(distanceMarker);
distanceMarker.forEach(c => c.setMap(null))
@ -254,7 +267,8 @@ export const FlightPlanDraw = props => {
polyline.getPath().push(coord);
var distance = polyline.getDistance();
addMileStone(coord, fromMetersToText(distance - lastDistance));
// addMileStone(coord, fromMetersToText(distance - lastDistance));
addMileStone(polyline.getPath()._array, fromMetersToText(distance - lastDistance));
lastDistance = distance;
}
}
@ -303,8 +317,13 @@ export const FlightPlanDraw = props => {
polygon.getPath().push(coord);
guideline.getPath().push(coord);
// console.log(polygon.getPath()._array, 'polygon')
// console.log(guideline.getPath()._array.length, 'guide')
// console.log(polygon.getPath()._array.length)
var distance = guideline.getDistance();
addMileStone(coord, fromMetersToText(distance - lastDistance));
// addMileStone(coord, fromMetersToText(distance - lastDistance));
addMileStone(guideline.getPath()._array, fromMetersToText(distance - lastDistance));
lastDistance = distance;
}
}
@ -638,7 +657,7 @@ export const FlightPlanDraw = props => {
position: paths[i],
icon: {
content: '<div style="display:inline-block;padding:5px;text-align:center;background-color:#fff;border:1px solid #000;font-size:13px;color:#737373;"><span>'+ 'Start' +'</span></div>',
anchor: new naver.maps.Point(-5, -5)
anchor: new naver.maps.Point(45, 35)
}, map: map
})
)
@ -648,9 +667,14 @@ export const FlightPlanDraw = props => {
let text = fromMetersToText(r);
let dis1 = paths[i-1]
let dis2 = paths[i]
let midPoint = new naver.maps.LatLng((dis1.y + dis2.y)/2, (dis1.x + dis2.x)/2);
distanceMarker.push(
new naver.maps.Marker({
position: paths[i],
// position: paths[i],
position: midPoint,
icon: {
content: '<div style="display:inline-block;padding:5px;text-align:center;background-color:#fff;border:1px solid #000;font-size:13px;color:#737373;"><span>'+ text +'</span></div>',
anchor: new naver.maps.Point(-5, -5)
@ -705,48 +729,58 @@ export const FlightPlanDraw = props => {
}
for(let i = 0; i < paths.length+1; i++) {
//start
if(i == 0) {
distanceMarker.push(
new naver.maps.Marker({
position: paths[i],
position: paths[0],
icon: {
content: '<div style="display:inline-block;padding:5px;text-align:center;background-color:#fff;border:1px solid #000;font-size:13px;color:#737373;"><span>'+ 'Start' +'</span></div>',
anchor: new naver.maps.Point(-5, -5)
content: '<div style="display:inline-block;padding:5px;text-align:center;background-color:#fff;border:1px solid #000;font-size:13px;color:#ff0000;"><span>'+ 'Start' +'</span></div>',
anchor: new naver.maps.Point(45, 35)
},
map: map
})
)
//첫좌표이자 마지막 좌표
} else if(i == paths.length) {
var proj = map.getProjection(),
r = proj.getDistance(paths[0], paths[i-1]);
let text = fromMetersToText(r);
let dis1 = paths[0]
let dis2 = paths[i-1]
let midPoint = new naver.maps.LatLng((dis1.y + dis2.y)/2, (dis1.x + dis2.x)/2);
distanceMarker.push(
new naver.maps.Marker({
position: paths[0],
// position: paths[0],
position: midPoint,
icon: {
content: '<div style="display:inline-block;padding:5px;text-align:center;background-color:#fff;border:1px solid #000;font-size:13px;color:#737373;"><span>'+ text +'</span></div>',
anchor: new naver.maps.Point(45, 35)
anchor: new naver.maps.Point(0, 35)
},
map: map
})
)
} else if(i == paths.length-1) {
// let tt = new naver.maps.EPSG3857.getDistance(paths[i], paths[])
//그 외 나머지
} else {
var proj = map.getProjection(),
r = proj.getDistance(paths[i-1], paths[i]);
let text = fromMetersToText(r);
let dis1 = paths[i-1]
let dis2 = paths[i]
let midPoint = new naver.maps.LatLng((dis1.y + dis2.y)/2, (dis1.x + dis2.x)/2);
distanceMarker.push(
new naver.maps.Marker({
position: paths[i],
// position: paths[i],
position: midPoint,
icon: {
content: '<div style="display:inline-block;padding:5px;text-align:center;background-color:#fff;border:1px solid #000;font-size:13px;color:#737373;"><span>'+ text +'</span></div>',
anchor: new naver.maps.Point(-5, -5)
anchor: new naver.maps.Point(20, 35)
},
map: map
})
@ -801,17 +835,25 @@ export const FlightPlanDraw = props => {
//div로 보여주기
const addMileStone = (coord, text) => {
let content;
let midPoint;
let anchor;
if(text == 'Start') {
content = '<div style="display:inline-block;padding:5px;text-align:center;background-color:#fff;border:1px solid #000;font-size:14px;color:#ff0000;"><span>'+ text +'</span></div>'
content = '<div style="display:inline-block;padding:5px;text-align:center;background-color:#fff;border:1px solid #000;font-size:13px;color:#ff0000;"><span>'+ text +'</span></div>'
midPoint = coord
anchor = new naver.maps.Point(45, 35)
} else {
content = '<div style="display:inline-block;padding:5px;text-align:center;background-color:#fff;border:1px solid #000;font-size:13px;color:#ff0000;"><span>'+ text +'</span></div>'
let dis1 = coord[coord.length-2];
let dis2 = coord[coord.length-1];
midPoint = new naver.maps.LatLng((dis1.y + dis2.y)/2, (dis1.x + dis2.x)/2);
anchor = new naver.maps.Point(20, 35)
}
var marker = new naver.maps.Marker({
position: coord,
position: midPoint,
icon: {
content: content,
anchor: new naver.maps.Point(-5, -5)
anchor: anchor
},
// map: map
});
@ -832,14 +874,19 @@ export const FlightPlanDraw = props => {
var km = 1000,
text = meters;
text = parseFloat(meters.toFixed(1)) + 'm';
if(meters >= km) {
text = parseFloat((meters / km).toFixed(1)) + 'km';
} else {
text = parseFloat(meters.toFixed(1)) + 'm';
}
// if(meters >= km) {
// text = parseFloat((meters / km).toFixed(1)) + 'km';
// } else {
// text = parseFloat(meters.toFixed(1)) + 'm';
// }
return text;
}
return null;
return(
<InfoModal modal={alertModal} setModal={setAlertModal} />
)
};

64
src/components/map/naver/dron/DronMarker.js

@ -45,7 +45,7 @@ export const DronMarker = props => {
hideProgressBar: true,
position: toast.POSITION.BOTTOM_RIGHT,
onClick: props => {
if(marker) handlerDronClick(marker);
if(marker) handlerDronClick(marker);
}
}
)
@ -91,8 +91,13 @@ export const DronMarker = props => {
title: id,
id: id,
controlId: controlId,
icon: {
url: DronIcon,
icon: {
// content: [
// '<div>dddd</div>',
// ].join(''),
url: DronIcon,
// size: new naver.maps.Size(50, 50),
origin: new naver.maps.Point(0, 0),
anchor: new naver.maps.Point(15, 15),
}
@ -104,16 +109,17 @@ export const DronMarker = props => {
handlerDronClick(marker);
});
// drone 정보 창
// markerInfoWindow(marker);
setArrMarkers(m => [...m, marker]);
};
const handlerDronClick = marker => {
const idntfNum = marker.id;
const contorlId = marker.controlId;
const contorlId = marker.controlId;
// 클릭한 식별번호 정보를 가진 그룹 추출
// const group = controlGroupAuthInfo.find(group => group.idntfNum === idntfNum);
//히스토리 불러오기
dispatch(objectClickAction(contorlId));
dispatch(controlGpDtlAction.request(contorlId));
dispatch(controlGpFlightPlanAction.request(idntfNum));
@ -163,10 +169,10 @@ export const DronMarker = props => {
if (isExists) {
moveMarkers(isExists, position);
} else {
addMarkers(position, item.objectId, item.controlId);
addMarkers(position, item.objectId, item.controlId);
}
} else {
addMarkers(position, item.objectId, item.controlId);
addMarkers(position, item.objectId, item.controlId);
}
});
}
@ -176,43 +182,5 @@ export const DronMarker = props => {
setArrMarkers(arrData);
};
const markerInfoWindow = (marker) => {
controlGpList.forEach(gps => {
const contents = [
`<div class="tooltip-box">`,
` <div class="tooltip-ti">`,
` <span>${marker.id}</span>`,
` </div>`,
` <div class="tooltip-txt">`,
` <div class="tooltip-txt-list">`,
` <span>${gps.speed}${gps.speedType}</span>`,
` </div>`,
` <div class="tooltip-txt-list">`,
` <span>${gps.elev}${gps.elevType}</span>`,
` </div>`,
` <div class="tooltip-txt-list">`,
` <span>${gps.heading}</span>`,
` </div>`,
` </div>`,
`</div>`
].join('');
const info = new naver.maps.InfoWindow({
id: marker.id,
content: contents,
backgroundColor: '#283046', //박스안쪽영역 컬러
anchorSize: new props.naver.maps.Size(30, -10),
anchorSkew: false,
anchorColor: '#283046',
pixelOffset: new props.naver.maps.Point(20, -20)
});
console.log(info);
info.open(props.map, marker);
});
}
return null;
};

73
src/containers/basis/dron/BasisIdntfContainer.js

@ -3,7 +3,7 @@ import { useDispatch, useSelector } from 'react-redux';
import { Card, CardBody, Col, Row } from 'reactstrap';
import { BasisIdntfForm } from '../../../components/basis/dron/BasisIdntform';
import * as Actions from '../../../modules/basis/dron/actions/basisDronAction';
import { ErrorModal } from '../../../components/modal/ErrorModal';
export const BasisIdntfContainer = props => {
const { listIdntf, idntfCount, detail, isRefreshIdntf } = useSelector(
state => state.dronState
@ -18,6 +18,12 @@ export const BasisIdntfContainer = props => {
hpno:'',
isSave: false
});
//모달 관련 설정
const [modal, setModal] = useState({
isOpen: false,
title: '',
desc: ''
});
const [idntDataList, setIdntfDataList] = useState([]);
@ -50,16 +56,60 @@ export const BasisIdntfContainer = props => {
dispatch(Actions.IDNTF_LIST.request(props.id));
};
const handlerCreate = async data => {
const handlerCreate = async () => {
console.log('idntDataList>>>', idntDataList);
let saveArr = idntDataList.filter(item => item.isSave === false);
dispatch(
Actions.IDNTF_CREATE.request({
arcrftSno: detail?.arcrftSno,
data: saveArr
})
);
if (saveArr.length > 0) {
let checking = true;
saveArr.forEach(idntf => {
if (!idntf.idntfNum && idntf.idntfNum === '') {
setModal({
isOpen: true,
title: '필수값 입력 오류',
desc: '식별번호를 입력해주세요.'
});
checking = false;
return false;
}
if(!idntf.ownerNm && idntf.ownerNm === '') {
setModal({
isOpen: true,
title: '필수값 입력 오류',
desc: '소유자명을 입력해주세요.'
});
checking = false;
return false;
}
if(!idntf.hpno && idntf.hpno === '') {
setModal({
isOpen: true,
title: '필수값 입력 오류',
desc: '연락처를 입력해주세요.'
});
checking = false;
return false;
}
});
if (!checking) return false;
dispatch(
Actions.IDNTF_CREATE.request({
arcrftSno: detail?.arcrftSno,
data: saveArr
})
);
} else {
setModal({
isOpen: true,
title: '필수값 입력 오류',
desc: '식별장치 정보를 입력해주세요.'
});
return false;
}
};
const handlerDelete = async data => {
@ -104,6 +154,8 @@ export const BasisIdntfContainer = props => {
</Col>
</Row>
) : (
<Row>
<Col>
<BasisIdntfForm
data={idntDataList}
count={idntDataList?.length}
@ -113,5 +165,8 @@ export const BasisIdntfContainer = props => {
handlerSave={handlerCreate}
handlerDelete={handlerDelete}
/>
<ErrorModal modal={modal} setModal={setModal} />
</Col>
</Row>
);
};

23
src/modules/control/gp/sagas/controlGpSaga.ts

@ -34,6 +34,8 @@ function* getControlGpSaga(
}
});
}
console.log('gps ', gpsData);
yield put(
Actions.controlGpAction.success({
@ -54,20 +56,17 @@ function* getControlGpSaga(
yield put(Actions.controlGpRtDtlAction.request(detailData));
// History Push
// History Push
if(controlGpHistory) {
const stateHistory = controlGpHistory.concat();
const stateHistory = controlGpHistory;
const history = stateHistory.map((h) => {
return {
...h,
detailData
}
});
const hisObj = {
lat: detailData.lat,
lng: detailData.lng,
objectId: detailData.objectId
}
stateHistory.push(hisObj);
yield put(Actions.controlGpHisAction.success({
controlGpHistory: stateHistory
}));
yield put(Actions.controlGpHisAction.success(history));
}
}
} catch (error) {

2
src/modules/control/map/reducers/controlMapReducer.ts

@ -1,6 +1,6 @@
// ** Initial State
const initialState = {
mapType: 'NORMAL',
mapType: 'HYBRID',
objectId: null,
isClickObject: false,
area0001: true, // 비행금지 구역

Loading…
Cancel
Save