Browse Source

그리기 도구 생성

feature/flight-practice
junh_eee 2 years ago
parent
commit
8449c39cc9
  1. 4
      src/assets/css/custom.css
  2. 9
      src/components/mapDraw/naver/NaverMap.js
  3. 125
      src/components/mapDraw/naver/draw/DrawMap.js
  4. 18
      src/components/mapDraw/naver/draw/DrawPath.js
  5. 71
      src/components/mapDraw/naver/draw/DrawTest0.js
  6. 157
      src/components/mapDraw/naver/draw/DrawTest1.js
  7. 180
      src/components/mapDraw/naver/draw/DrawTest2.js
  8. 5
      src/modules/control/map/actions/controlMapActions.ts
  9. 10
      src/modules/control/map/reducers/controlMapReducer.ts
  10. 25
      src/views/testDraw/main/ControlMainDraw.js

4
src/assets/css/custom.css

@ -244,9 +244,7 @@ h1.logo span{display:block;color:#f4f4f4;font-weight:bold;letter-spacing:2px;fon
.left-menu-nav li button svg path{fill:#f4f4f4;} .left-menu-nav li button svg path{fill:#f4f4f4;}
/* fligth path draw */ /* fligth path draw */
.left-menu-nav li .circle{background-color: #283046; font-size:0.9rem; color: white; width:70px; border: 0px;} .left-menu-nav li .check{background-color: #283046; font-size:0.9rem; color: white; width:70px; border: 0px;}
.left-menu-nav li .line{background-color: #283046; font-size:0.9rem; color: white; width:70px; border: 0px;}
.left-menu-nav li .none{background-color: #283046; font-size:0.9rem; color: white; width:70px; border: 0px;}
/*메인-알림*/ /*메인-알림*/
.notice{width:650px;height:45px;overflow:hidden;position:absolute;left:50%;top:20px;transform: translate(-50%,0px);background:#283046;display:flex;font-size:0.9375rem;color:#f4f4f4;padding:0px 20px;border-radius:30px;} .notice{width:650px;height:45px;overflow:hidden;position:absolute;left:50%;top:20px;transform: translate(-50%,0px);background:#283046;display:flex;font-size:0.9375rem;color:#f4f4f4;padding:0px 20px;border-radius:30px;}

9
src/components/mapDraw/naver/NaverMap.js

@ -8,9 +8,6 @@ import NaverMapControl from './NaverMapControl';
import { NaverMapSearch } from './search/NaverMapSearch'; import { NaverMapSearch } from './search/NaverMapSearch';
import { FeatureAirZone } from './feature/FeatureAirZone'; import { FeatureAirZone } from './feature/FeatureAirZone';
import { DrawPath } from './draw/DrawPath'; import { DrawPath } from './draw/DrawPath';
import { DrawTest0 } from './draw/DrawTest0';
import { DrawTest1 } from './draw/DrawTest1';
import { DrawTest2 } from './draw/DrawTest2';
import { DrawMap } from './draw/DrawMap'; import { DrawMap } from './draw/DrawMap';
import geoJson from '../geojson/airArea.json'; import geoJson from '../geojson/airArea.json';
@ -34,9 +31,9 @@ export const NaverCustomMap = () => {
// setIsMapLoad(true); // setIsMapLoad(true);
}, []); }, []);
useEffect(() => { // useEffect(() => {
console.log('==============11111==================', mapObject); // console.log('==============11111==================', mapObject);
}, [mapObject]); // }, [mapObject]);
const removeArrMarkers = arrData => { const removeArrMarkers = arrData => {
arrMarkers = arrData; arrMarkers = arrData;

125
src/components/mapDraw/naver/draw/DrawMap.js

@ -1,71 +1,84 @@
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { render } from "react-dom";
import { BiCaretLeftCircle } from "react-icons/bi"; import { BiCaretLeftCircle } from "react-icons/bi";
import { useSelector } from "react-redux"; import { useSelector } from "react-redux";
export const DrawMap = props => { export const DrawMap = props => {
const {naver} = props; const {naver} = props;
const {map} = props; const {map} = props;
const [check, setCheck] = useState([]);
const {drawCheck} = useSelector(state => state.controlMapReducer);
useEffect(() => { useEffect(() => {
init();
}, [drawCheck]);
const init = () => {
removeDraw();
}
const removeDraw = () => {
check.forEach(prev => prev.setMap(null));
drawSetting(); drawSetting();
// debugger; }
console.log("draw create")
}, []);
const drawSetting = () => {
// debugger;
console.log(map)
const drawingManager = new naver.maps.drawing.DrawingManager({ const drawSetting = () => {
drawingControl: [ if(drawCheck) {
naver.maps.drawing.DrawingMode.POLYLINE, let drawingManager = new naver.maps.drawing.DrawingManager({
naver.maps.drawing.DrawingMode.POLYGON, drawingControl: [
naver.maps.drawing.DrawingMode.ELLIPSE, naver.maps.drawing.DrawingMode.POLYLINE,
naver.maps.drawing.DrawingMode.RECTANGLE naver.maps.drawing.DrawingMode.POLYGON,
], naver.maps.drawing.DrawingMode.ELLIPSE,
drawingControlOptions: { naver.maps.drawing.DrawingMode.RECTANGLE
position: naver.maps.Position.LEFT_CENTER, ],
style: naver.maps.drawing.DrawingStyle.VERTICAL drawingControlOptions: {
}, position: naver.maps.Position.LEFT_CENTER,
controlPointOptions: { style: naver.maps.drawing.DrawingStyle.VERTICAL
anchorPointOptions: { },
radius: 5, controlPointOptions: {
fillColor: '#ff0000', anchorPointOptions: {
strokeColor: '#0000ff', radius: 5,
strokeWeight: 2 fillColor: '#ff0000',
}, strokeColor: '#ffffff',
midPointOptions: { strokeWeight: 2
radius: 4, },
fillColor: '#ff0000', midPointOptions: {
strokeColor: '#0000ff', radius: 4,
strokeWeight: 2, fillColor: '#0067a3',
fillOpacity: 0.5 strokeColor: '#ffffff',
} strokeWeight: 2,
}, }
rectangleOptions: { },
fillColor: '#ff0000', rectangleOptions: {
fillOpacity: 0.3, fillColor: '#ff0000',
strokeWeight: 2, fillOpacity: 0.3,
strokeColor: '#ff0000' strokeWeight: 2,
}, strokeColor: '#ff0000'
ellipseOptions: { },
fillColor: '#ff25dc', ellipseOptions: {
fillOpacity: 0.3, fillColor: '#ff25dc',
strokeWeight: 2, fillOpacity: 0.3,
strokeColor: '#ff25dc' strokeWeight: 2,
}, strokeColor: '#ff25dc'
polylineOptions: { // 화살표 아이콘 계열 옵션은 무시됩니다. },
strokeColor: '#222', polylineOptions: { // 화살표 아이콘 계열 옵션은 무시됩니다.
strokeWeight: 2 strokeColor: '#222',
}, strokeWeight: 2
polygonOptions: { },
fillColor: '#ffc300', polygonOptions: {
fillOpacity: 0.3, fillColor: '#ffc300',
strokeWeight: 2, fillOpacity: 0.3,
strokeColor:'#ffc300' strokeWeight: 2,
} strokeColor:'#ffc300'
}); }
drawingManager.setMap(map); });
drawingManager.setMap(map);
setCheck(prev => ([...prev, drawingManager]));
}
} }
return null; return null;

18
src/components/mapDraw/naver/draw/DrawPath.js

@ -35,7 +35,6 @@ export const DrawPath = props => {
} }
const drawSetting = () => { const drawSetting = () => {
debugger;
const drawingManager = new naver.maps.drawing.DrawingManager({ const drawingManager = new naver.maps.drawing.DrawingManager({
drawingControl: [ drawingControl: [
naver.maps.drawing.DrawingMode.POLYLINE, naver.maps.drawing.DrawingMode.POLYLINE,
@ -53,7 +52,7 @@ export const DrawPath = props => {
const removeEvent = () => { const removeEvent = () => {
eventGroup.forEach(prev => naver.maps.Event.removeListener(prev)); eventGroup.forEach(prev => naver.maps.Event.removeListener(prev));
eventGroup.forEach(prev => console.log(prev)); // eventGroup.forEach(prev => console.log(prev));
// const test = eventGroup.find(prev=> prev='drawingManager'); // const test = eventGroup.find(prev=> prev='drawingManager');
// if(test) { // if(test) {
// test.setMap(null); // test.setMap(null);
@ -98,23 +97,8 @@ export const DrawPath = props => {
// } // }
// }); // });
// const drawingManager = new naver.maps.drawing.DrawingManager({
// drawingControl: [
// naver.maps.drawing.DrawingMode.POLYLINE,
// naver.maps.drawing.DrawingMode.POLYGON,
// naver.maps.drawing.DrawingMode.ELLIPSE,
// naver.maps.drawing.DrawingMode.RECTANGLE
// ],
// drawingControlOptions: {
// position: naver.maps.Position.LEFT_CENTER,
// style: naver.maps.drawing.DrawingStyle.VERTICAL
// }
// });
// drawingManager.setMap(map);
setEventGroup(prev => ([...prev, addClick])); setEventGroup(prev => ([...prev, addClick]));
// setEventGroup(prev => ([...prev, addClick, drawingManager]));
} }
const startDraw = () => { const startDraw = () => {

71
src/components/mapDraw/naver/draw/DrawTest0.js

@ -1,71 +0,0 @@
import { useEffect, useState } from "react";
import { useSelector } from "react-redux";
export const DrawTest0 = props => {
const {naver} = props;
const {map} = props;
const mapControl = useSelector(state => state.controlMapReducer);
// const [linePositions, setLinePositions] = useState([]);
const positions = ([]);
const [lineZips, setLineZips] = useState([]);
useEffect(() => {
}, [mapControl.drawType]);
if(mapControl.drawType === 'LINE') {
naver.maps.Event.addListener(map, 'click', function(e) {
// const position = e.coord;
positions.push(e.coord);
createPolyline(positions);
})
// naver.maps.Event.addListener(map, 'dbclick', function(e) {
// console.log("dbclick")
// })
naver.maps.Event.addListener(map, 'keydown', function(e) {
const keyboardEvent = e.keyboardEvent,
keyCode = keyboardEvent.keyCode || keyboardEvent.which;
const ESC = 27;
if(keyCode === ESC) {
keyboardEvent.preventDefault();
// for(var i=0, ii=lineZips.length; i<ii; i++) {
// lineZips[i].setMap(null);
// // console.log(lineZips[i]);
// }
lineZips.forEach(line => line.setMap(null));
setLineZips([]);
console.log(lineZips);
}
})
}
const createPolyline = (positions) => {
if(positions.length >= 2) {
const polyline = new naver.maps.Polyline({
path: [positions[(positions.length)-1], positions[(positions.length)-2]],
strokeWeight: 2,
strokeOpacity: 1,
strokeColor: '#ff0000',
map: map
})
// polyline.setMap(map);
setLineZips([...lineZips, positions]);
}
}
const removeLine = () => {
}
return null;
}

157
src/components/mapDraw/naver/draw/DrawTest1.js

@ -1,157 +0,0 @@
import { useEffect, useState } from "react";
import { BiCaretLeftCircle } from "react-icons/bi";
import { useSelector } from "react-redux";
export const DrawTest1 = props => {
const {naver} = props;
const {map} = props;
const {drawType} = useSelector(state => state.controlMapReducer);
let linePath = ([]);
let circleCenter = '';
// let positions = ([]);
// let po = '';
const r = 1000;
// const [polylines, setPolylines] = useState([]);
// const [circleLayers, setCircleLayers] = useState();
let polylines = ([]);
// let circleLayers = ('');
let circleLayers = ([]);
useEffect(() => {
init();
}, []);
useEffect(() => {
remove();
console.log(drawType)
// init();
}, [drawType]);
const event = () => {
let addClick = naver.maps.Event.addListener(map, 'click', function(e) {
if(drawType) {
linePath.push(e.coord);
circleCenter = e.coord
clickDraw();
} else {
}
})
let escDown = naver.maps.Event.addListener(map, 'keydown', function(e) {
const keyboardEvent = e.keyboardEvent,
keyCode = keyboardEvent.keyCode || keyboardEvent.which;
const ESC = 27;
if(keyCode === ESC) {
keyboardEvent.preventDefault();
remove();
}
})
}
const init = () => {
remove();
event();
}
const clickDraw = () => {
// if(!drawType) {
// alert("path option을 선택해주세요.")
// } else {
// if(drawType === 'LINE') {
// console.log("LINE")
// createPolyline();
// } else if(drawType === 'CIRCLE') {
// console.log("CIRCLE")
// createCircle();
// }
// }
if(drawType === 'LINE') {
console.log('1')
createPolyline();
} else if(drawType === 'CIRCLE') {
createCircle();
}
}
const createPolyline = () => {
if(linePath.length >= 2) {
const polyline = new naver.maps.Polyline({
// path: [positions[positions.length-1], po],
path: linePath,
strokeColor: '#ff0000',
strokeWeight: 2,
strokeOpacity: 0.5,
map: map
});
linePath.shift();
// setPolylines(prev => ([...prev, polyline]));
polylines.push(polyline);
}
}
// const createCircle = (positions) => {
const createCircle = () => {
if(circleLayers) remove();
// const circleCenter = positions[0];
// console.log(circleCenter)
// console.log(po)
// const te = positions[0];
const circle = new naver.maps.Circle({
center: circleCenter,
// center: positions[0],
strokeColor: '#ff0000',
strokeWeight: 2,
strokeOpacity: 1,
fillColor: '#0000ff',
fillOpacity: 0.35,
radius: r,
clickable: false,
map: map
})
// circleCenter.shift();
// setCircleLayers(circle);
// circleLayers = circle;
circleLayers.push(circle);
}
// const reCircle = () => {
// // circle.setMap(null);
// // positions = ([]);
// // circleLayers.forEach(cir => cir.setMap(null));
// circleLayers.setMap(null);
// // setCircleLayers();
// circleLayers = '';
// }
const remove = () => {
// debugger;
if(polylines) {
polylines.forEach(poly => poly.setMap(null));
polylines = ([]);
// console.log("poly remove")
}
if(circleLayers) {
circleLayers.forEach(cir => cir.setMap(null));
circleLayers = ([]);
// console.log("circle remove")
}
// circleLayers.forEach(cir => cir.setMap(null));
// circleLayers = ([]);
circleCenter = '';
linePath = ([]);
// console.log("remove!!")
// setClickable(0);
}
return null;
};

180
src/components/mapDraw/naver/draw/DrawTest2.js

@ -1,180 +0,0 @@
import { useEffect, useState } from "react";
import { useSelector } from "react-redux";
export const DrawTest2 = props => {
const {naver} = props;
const {map} = props;
let draw = '';
const {drawType} = useSelector(state => state.controlMapReducer);
const r = 1000;
let positions = ([]);
const [polyGroup, setPolyGroup] = useState([]);
const [eventGroup, setEventGrouop] = useState([]);
const [circleGroup, setCircleGroup] = useState([]);
useEffect(() => {
remove2();
clickEvent();
}, [drawType]);
useEffect(() => {
remove();
}, [polyGroup, eventGroup]);
useEffect(() => {
// moveCircle();
remove();
}, [circleGroup]);
const moveCircle = () => {
if(circleGroup) {
circleGroup.forEach(prev => prev.setMap(null));
}
};
const movePoly = () => {
if(polyGroup) {
polyGroup.forEach(prev => prev.setMap(null));
}
}
const clickEvent = () => {
console.log("d")
// remove2();
// drawType =
if(drawType === 'CIRCLE') {
console.log("circle")
} else if(drawType === 'LINE') {
console.log("LINE")
}else if(drawType === 'POLYGON') {
console.log("POLYGON")
}
addPositions();
}
const remove2 = () => {
polyGroup.forEach(poly => poly.setMap(null));
setPolyGroup([]);
circleGroup.forEach(cir => cir.setMap(null));
setCircleGroup([]);
eventGroup.forEach(eve => naver.maps.Event.removeListener(eve));
setEventGrouop([]);
positions = [];
}
const addPositions = () => {
if(event) naver.maps.Event.removeListener(event);
var event = naver.maps.Event.addListener(map, 'click', function(e) {
debugger;
if(drawType === 'LINE') {
positions.push(e.coord);
createPolyline(positions);
} else if(drawType === 'CIRCLE') {
positions = e.coord;
createCircle(positions);
}
})
// setEventGrouop(prev => ([...prev, event]));
}
const createCircle = (positions) => {
moveCircle();
const circle = new naver.maps.Circle({
center: positions,
strokeColor: '#ff0000',
strokeWeight: 2,
strokeOpacity: 1,
fillColor: '#0000ff',
fillOpacity: 0.35,
radius: r,
clickable: false,
map: map
})
draw = drawType;
setCircleGroup(prev => ([...prev, circle]));
}
const createPolyline = (positions) => {
if(positions.length >= 2) {
movePoly();
const polyline = new naver.maps.Polyline({
// path: [positions[(positions.length)-1], positions[(positions.length)-2]],
path: positions,
strokeColor: '#ff0000',
strokeWeight: 2,
strokeOpacity: 1,
map: map
})
positions.shift();
console.log(positions)
draw = drawType;
setPolyGroup(prev => ([...prev, polyline]));
}
}
const remove = () => {
if(drawType!=draw) {
naver.maps.Event.addListener(map, 'keydown', function(e) {
const keyboardEvent = e.keyboardEvent,
keyCode = keyboardEvent.keyCode || keyboardEvent.which;
const ESC = 27;
if(keyCode === ESC) {
keyboardEvent.preventDefault();
polyGroup.forEach(poly => poly.setMap(null));
setPolyGroup([]);
circleGroup.forEach(cir => cir.setMap(null));
setCircleGroup([]);
// eventGroup.forEach(eve => naver.maps.Event.removeListener(eve));
// setEventGrouop([]);
positions = [];
// debugger;
}
})
}
}
// const drawTypeChange = () => {
// remove();
// draw = drawType;
// }
// const init = () => {
// // draw = drawType;
// if(draw) {
// var event = naver.maps.Event.addListener(map, 'click', function(e) {
// draw = drawType;
// console.log(drawType, "drawType")
// // remove(draw, event);
// drawTypeChange();
// // naver.maps.Event.removeListener(event);
// })
// }
// // remove(event);
// }
// const remove = (draw, event) => {
// if(draw == drawType) {
// console.log("안지워")
// } else {
// console.log("지워")
// naver.maps.Event.removeListener(event);
// }
// if(positions) naver.maps.Event.removeListener(map, 'click', function(e) {
// console.log(e);
// });
// naver.maps.removeListener(event);
// }
return null;
}

5
src/modules/control/map/actions/controlMapActions.ts

@ -4,7 +4,10 @@ export const mapTypeChangeAction = (value: any) => dispatch =>
// draw 옵션 변경 Action // draw 옵션 변경 Action
export const drawTypeChangeAction = (value: any) => dispatch => export const drawTypeChangeAction = (value: any) => dispatch =>
dispatch({type: 'DRAW_TYPE_CHANGE', value}) dispatch({type: 'DRAW_TYPE_CHANGE', value});
export const drawCheckAction = (value: any) => dispatch =>
dispatch({type: 'DRAW_CHECK', value});
// 드론체 클릭 시 Action // 드론체 클릭 시 Action
export const objectClickAction = (value: any) => dispatch => export const objectClickAction = (value: any) => dispatch =>

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

@ -11,7 +11,9 @@ const initialState = {
area0006: true, // 초경량비행장치 area0006: true, // 초경량비행장치
sensor: 'dust', sensor: 'dust',
drawType: '' drawType: '',
drawCheck: false
}; };
const controlReducerReducer = (state = initialState, action) => { const controlReducerReducer = (state = initialState, action) => {
@ -75,6 +77,12 @@ const controlReducerReducer = (state = initialState, action) => {
...state, ...state,
drawType: action.value drawType: action.value
}; };
case 'DRAW_CHECK':
return {
...state,
drawCheck: action.value
};
} }
}; };

25
src/views/testDraw/main/ControlMainDraw.js

@ -29,7 +29,7 @@ import {
} from 'reactstrap' } from 'reactstrap'
import { import {
drawTypeChangeAction drawTypeChangeAction, drawCheckAction
} from '../../../modules/control/map/actions/controlMapActions'; } from '../../../modules/control/map/actions/controlMapActions';
const ControlMainDraw = () => { const ControlMainDraw = () => {
@ -79,6 +79,10 @@ const ControlMainDraw = () => {
dispatch(drawTypeChangeAction(val)); dispatch(drawTypeChangeAction(val));
}; };
const handlerDrawCheck = val => {
dispatch(drawCheckAction(val));
}
return ( return (
<> <>
<ControlAlarmNotice /> <ControlAlarmNotice />
@ -102,25 +106,36 @@ const ControlMainDraw = () => {
<CustomInput <CustomInput
id='circle' id='circle'
type='button' type='button'
className='circle' className='check'
onClick={e => handlerDrawType('CIRCLE')} onClick={e => handlerDrawType('CIRCLE')}
value={mapControl.drawType === 'CIRCLE' ? 'check' : 'CIRCLE'} value={mapControl.drawType === 'CIRCLE' ? 'check' : 'CIRCLE'}
/> />
<CustomInput <CustomInput
id='line' id='line'
type='button' type='button'
className='line' className='check'
onClick={e => handlerDrawType('LINE')} onClick={e => handlerDrawType('LINE')}
value={mapControl.drawType === 'LINE' ? 'check' : 'LINE'} value={mapControl.drawType === 'LINE' ? 'check' : 'LINE'}
/><br/> /><br/>
<CustomInput <CustomInput
id='none' id='none'
type='button' type='button'
className='none' className='check'
onClick={e => handlerDrawType('')} onClick={e => handlerDrawType('')}
value={mapControl.drawType === '' ? 'check' : 'X'} value={mapControl.drawType === '' ? 'check' : 'X'}
/>
</li>
</ul>
<ul className='left-menu-nav'>
<li>
<CustomInput
id='check'
type='button'
className='check'
onClick={e => handlerDrawCheck(!mapControl.drawCheck)}
value={mapControl.drawCheck === true ? 'IN USE' : 'STOP'}
/> />
</li> </li>
</ul> </ul>

Loading…
Cancel
Save