|
|
|
@ -53,6 +53,7 @@ export const CalculateDistance = (mouse, center) => {
|
|
|
|
|
export const MapBoxDraw = props => { |
|
|
|
|
const mapControl = useSelector(state => state.controlMapReducer); |
|
|
|
|
const mapObject = props.mapObject; |
|
|
|
|
const canvas = mapObject.getCanvasContainer(); |
|
|
|
|
|
|
|
|
|
//비행계획서 작성 완료 후에는 수정 불가일거라서 이거는 임시 보류
|
|
|
|
|
const isDone = props.isDone; |
|
|
|
@ -64,13 +65,6 @@ export const MapBoxDraw = props => {
|
|
|
|
|
desc: '' |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
const canvas = mapObject.getCanvasContainer(); |
|
|
|
|
// const [pastPoint, setPoint] = useState([]);
|
|
|
|
|
// const [pastPolyline, setPolyline] = useState();
|
|
|
|
|
// const [pastBuffer, setBuffer] = useState();
|
|
|
|
|
// const [pastPolygon, setPolygon] = useState();
|
|
|
|
|
// const [pastCircle, setCircle] = useState();
|
|
|
|
|
|
|
|
|
|
//도형들이 온전히 그려진 후 변경 될 때 마다 감지
|
|
|
|
|
const [isDrawDone, setIsDrawDone] = useState(false); |
|
|
|
|
|
|
|
|
@ -95,8 +89,6 @@ export const MapBoxDraw = props => {
|
|
|
|
|
|
|
|
|
|
let point = []; |
|
|
|
|
|
|
|
|
|
//꼭짓점(polyline, polygon 사용)
|
|
|
|
|
let vertex = InitFeature('MultiPoint', 'vertex'); |
|
|
|
|
let dragCircleIdx; |
|
|
|
|
|
|
|
|
|
useEffect(() => { |
|
|
|
@ -135,9 +127,9 @@ export const MapBoxDraw = props => {
|
|
|
|
|
|
|
|
|
|
const handlerClearMode = () => { |
|
|
|
|
console.log('clearMode'); |
|
|
|
|
removeGeoJson(); |
|
|
|
|
|
|
|
|
|
finishDraw(); |
|
|
|
|
|
|
|
|
|
removeGeoJson(); |
|
|
|
|
props.handlerInitCoordinates(); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
@ -167,12 +159,6 @@ export const MapBoxDraw = props => {
|
|
|
|
|
const removeGeoJson = () => { |
|
|
|
|
console.log('removeGeoJson'); |
|
|
|
|
|
|
|
|
|
// setPolyline();
|
|
|
|
|
// setBuffer();
|
|
|
|
|
// setPolygon();
|
|
|
|
|
// setCircle();
|
|
|
|
|
// setPoint([]);
|
|
|
|
|
|
|
|
|
|
handlerRemoveMarker(); |
|
|
|
|
|
|
|
|
|
guideLine.geometry.coordinates = []; |
|
|
|
@ -184,13 +170,12 @@ export const MapBoxDraw = props => {
|
|
|
|
|
circle.geometry.coordinates = []; |
|
|
|
|
|
|
|
|
|
point = []; |
|
|
|
|
vertex.geometry.coordinates = []; |
|
|
|
|
|
|
|
|
|
geojson.features = []; |
|
|
|
|
mapObject.getSource('geojson').setData(geojson); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
const finishDraw = e => { |
|
|
|
|
const finishDraw = () => { |
|
|
|
|
removeListener(); |
|
|
|
|
console.log('finish'); |
|
|
|
|
|
|
|
|
@ -200,7 +185,7 @@ export const MapBoxDraw = props => {
|
|
|
|
|
if (drawType === 'LINE') { |
|
|
|
|
if (path.length > 1) { |
|
|
|
|
handlerReplaceDuplicate('guideline', ''); |
|
|
|
|
handlerSaveAreaInfo(lineString.geometry.coordinates, lineString); |
|
|
|
|
handlerSaveAreaInfo(lineString.geometry.coordinates); |
|
|
|
|
} else { |
|
|
|
|
setAlertModal({ |
|
|
|
|
isOpen: true, |
|
|
|
@ -209,7 +194,7 @@ export const MapBoxDraw = props => {
|
|
|
|
|
}); |
|
|
|
|
removeGeoJson(); |
|
|
|
|
props.handlerDrawType('RESET'); |
|
|
|
|
mapObject.on('click', clickEve); |
|
|
|
|
// mapObject.on('click', clickEve);
|
|
|
|
|
} |
|
|
|
|
mapObject.getSource('geojson').setData(geojson); |
|
|
|
|
} else if (drawType === 'POLYGON') { |
|
|
|
@ -217,7 +202,7 @@ export const MapBoxDraw = props => {
|
|
|
|
|
polygon.geometry.coordinates[0] = path; |
|
|
|
|
|
|
|
|
|
handlerReplaceDuplicate('polygon', polygon); |
|
|
|
|
handlerSaveAreaInfo(polygon.geometry.coordinates[0], polygon); |
|
|
|
|
handlerSaveAreaInfo(polygon.geometry.coordinates[0]); |
|
|
|
|
} else { |
|
|
|
|
setAlertModal({ |
|
|
|
|
isOpen: true, |
|
|
|
@ -226,7 +211,7 @@ export const MapBoxDraw = props => {
|
|
|
|
|
}); |
|
|
|
|
removeGeoJson(); |
|
|
|
|
props.handlerDrawType('RESET'); |
|
|
|
|
mapObject.on('click', clickEve); |
|
|
|
|
// mapObject.on('click', clickEve);
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
mapObject.getSource('geojson').setData(geojson); |
|
|
|
@ -240,9 +225,11 @@ export const MapBoxDraw = props => {
|
|
|
|
|
if (drawType === 'CIRCLE') onClickCircle(e); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
//polyline, polygon 생성
|
|
|
|
|
// polyline, polygon 생성
|
|
|
|
|
const onClickFeature = (e, obj) => { |
|
|
|
|
const formatCoord = FormattingCoord([e.lngLat.lng, e.lngLat.lat]); |
|
|
|
|
//현재 내 좌표가 waypoint레이어의 geojson도형 안에 속해있는지 안해있는지?
|
|
|
|
|
//geojson을 반환해주는 듯?
|
|
|
|
|
const features = mapObject.queryRenderedFeatures(e.point, { |
|
|
|
|
layers: ['waypoint'] |
|
|
|
|
}); |
|
|
|
@ -261,7 +248,11 @@ export const MapBoxDraw = props => {
|
|
|
|
|
geo => geo.properties?.id === 'point' |
|
|
|
|
).length; |
|
|
|
|
|
|
|
|
|
const wayPoint = handlerCreatePoint(formatCoord, index); |
|
|
|
|
const wayPoint = handlerCreatePoint( |
|
|
|
|
formatCoord, |
|
|
|
|
index, |
|
|
|
|
mapControl.drawType |
|
|
|
|
); |
|
|
|
|
handlerReplaceDuplicate('Point', wayPoint); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -288,7 +279,7 @@ export const MapBoxDraw = props => {
|
|
|
|
|
mapObject.getSource('geojson').setData(geojson); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
//polyline 가이드 생성
|
|
|
|
|
// polyline 가이드 생성
|
|
|
|
|
const onMouseMovePolyline = e => { |
|
|
|
|
const formatCoord = FormattingCoord([e.lngLat.lng, e.lngLat.lat]); |
|
|
|
|
if (guideLine.geometry.coordinates.length > 1) { |
|
|
|
@ -300,7 +291,7 @@ export const MapBoxDraw = props => {
|
|
|
|
|
mapObject.getSource('geojson').setData(geojson); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
//polygon 가이드 생성
|
|
|
|
|
// polygon 가이드 생성
|
|
|
|
|
const onMouseMovePolygon = e => { |
|
|
|
|
const formatCoord = FormattingCoord([e.lngLat.lng, e.lngLat.lat]); |
|
|
|
|
|
|
|
|
@ -320,7 +311,7 @@ export const MapBoxDraw = props => {
|
|
|
|
|
mapObject.getSource('geojson').setData(geojson); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
//circle 생성
|
|
|
|
|
// circle 생성
|
|
|
|
|
const onClickCircle = e => { |
|
|
|
|
console.log('circleClick'); |
|
|
|
|
const formatCoord = FormattingCoord([e.lngLat.lng, e.lngLat.lat]); |
|
|
|
@ -334,7 +325,7 @@ export const MapBoxDraw = props => {
|
|
|
|
|
circle.geometry.coordinates = circleCoords; |
|
|
|
|
|
|
|
|
|
handlerReplaceDuplicate('circle', circle); |
|
|
|
|
handlerSaveAreaInfo('', circle); |
|
|
|
|
handlerSaveAreaInfo(''); |
|
|
|
|
|
|
|
|
|
addMileStone(formatCoord, 100); |
|
|
|
|
mapObject.getSource('geojson').setData(geojson); |
|
|
|
@ -344,6 +335,7 @@ export const MapBoxDraw = props => {
|
|
|
|
|
e.preventDefault(); |
|
|
|
|
console.log('down'); |
|
|
|
|
//타입 교체만 하면 왜 처음엔 down이 두번 잡힐까...
|
|
|
|
|
// console.log(e.features[0].properties.type, '>>down e');
|
|
|
|
|
|
|
|
|
|
canvas.style.cursor = 'grab'; |
|
|
|
|
|
|
|
|
@ -398,7 +390,7 @@ export const MapBoxDraw = props => {
|
|
|
|
|
mapObject.getSource('geojson').setData(geojson); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
const onMouseUp = e => { |
|
|
|
|
const onMouseUp = () => { |
|
|
|
|
canvas.style.cursor = ''; |
|
|
|
|
console.log('up'); |
|
|
|
|
|
|
|
|
@ -408,7 +400,15 @@ export const MapBoxDraw = props => {
|
|
|
|
|
mapObject.off('click', clickEve); |
|
|
|
|
setMouseDownEve(false); |
|
|
|
|
|
|
|
|
|
const obj = handlerMatchObj(mapControl.drawType); |
|
|
|
|
const type = mapControl.drawType; |
|
|
|
|
const obj = |
|
|
|
|
type === 'LINE' |
|
|
|
|
? lineString |
|
|
|
|
: type === 'POLYGON' |
|
|
|
|
? polygon |
|
|
|
|
: type === 'CIRCLE' |
|
|
|
|
? circle |
|
|
|
|
: undefined; |
|
|
|
|
|
|
|
|
|
if (obj) { |
|
|
|
|
const id = obj.properties?.id; |
|
|
|
@ -419,9 +419,10 @@ export const MapBoxDraw = props => {
|
|
|
|
|
|
|
|
|
|
if (id === 'circle') { |
|
|
|
|
mapObject.on('click', clickEve); |
|
|
|
|
handlerSaveAreaInfo('', circle); |
|
|
|
|
handlerSaveAreaInfo(''); |
|
|
|
|
} else { |
|
|
|
|
handlerSaveAreaInfo(coord, obj); |
|
|
|
|
// mapObject.on('mousedown', 'waypoint', onMouseDown);
|
|
|
|
|
handlerSaveAreaInfo(coord); |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
// 저장된 좌표 불러왔을 때
|
|
|
|
@ -432,19 +433,19 @@ export const MapBoxDraw = props => {
|
|
|
|
|
areas.coordList.forEach(coord => paths.push([coord.lon, coord.lat])); |
|
|
|
|
|
|
|
|
|
if (type === 'LINE') { |
|
|
|
|
handlerSaveAreaInfo(lineString.geometry.coordinates, lineString); |
|
|
|
|
handlerSaveAreaInfo(lineString.geometry.coordinates); |
|
|
|
|
} else if (type === 'POLYGON') { |
|
|
|
|
handlerSaveAreaInfo(polygon.geometry.coordinates[0], polygon); |
|
|
|
|
handlerSaveAreaInfo(polygon.geometry.coordinates[0]); |
|
|
|
|
} else if (type === 'CIRCLE') { |
|
|
|
|
handlerSaveAreaInfo('', circle); |
|
|
|
|
handlerSaveAreaInfo(''); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
const handlerAreaInfo = path => { |
|
|
|
|
// 도형 정보 변경되면 저장
|
|
|
|
|
const handlerSaveAreaInfo = coord => { |
|
|
|
|
console.log('areaInfo'); |
|
|
|
|
let bufferZone = 100; |
|
|
|
|
if (polygon.geometry.coordinates.length > 0) bufferZone = 0; |
|
|
|
|
const bufferZone = polygon.geometry.coordinates.length > 0 ? 0 : 100; |
|
|
|
|
const prePath = []; |
|
|
|
|
|
|
|
|
|
if (lineString.geometry.coordinates.length > 0) { |
|
|
|
@ -456,7 +457,7 @@ export const MapBoxDraw = props => {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (areaInfo.areaType !== 'CIRCLE') { |
|
|
|
|
path.forEach(item => { |
|
|
|
|
coord.forEach(item => { |
|
|
|
|
const p = { |
|
|
|
|
lat: item[1], |
|
|
|
|
lon: item[0] |
|
|
|
@ -480,9 +481,10 @@ export const MapBoxDraw = props => {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
props.handlerCoordinates(areaInfo); |
|
|
|
|
setIsDrawDone(true); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// let이라서 지워지는 도형 재 생성
|
|
|
|
|
// 확정된 도형 재 생성(let이라서 지워지기 때문에)
|
|
|
|
|
const handlerPastDraw = () => { |
|
|
|
|
if (props.areaCoordList) { |
|
|
|
|
console.log('pastDraw'); |
|
|
|
@ -498,13 +500,11 @@ export const MapBoxDraw = props => {
|
|
|
|
|
|
|
|
|
|
circle.properties.center = paths[0]; |
|
|
|
|
circle.geometry.coordinates = circleCoords; |
|
|
|
|
// setCircle(circle);
|
|
|
|
|
|
|
|
|
|
geojson.features.push(circle); |
|
|
|
|
} else { |
|
|
|
|
if (areas.areaType === 'LINE') { |
|
|
|
|
lineString.geometry.coordinates = paths; |
|
|
|
|
// setPolyline(lineString);
|
|
|
|
|
geojson.features.push(lineString); |
|
|
|
|
|
|
|
|
|
// 버퍼 생성
|
|
|
|
@ -516,21 +516,22 @@ export const MapBoxDraw = props => {
|
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
bufferPolyline.geometry.coordinates = bufferPaths; |
|
|
|
|
// setBuffer(bufferPolyline);
|
|
|
|
|
|
|
|
|
|
handlerReplaceDuplicate('buffer', bufferPolyline); |
|
|
|
|
} |
|
|
|
|
} else if (areas.areaType === 'POLYGON') { |
|
|
|
|
polygon.geometry.coordinates = [paths]; |
|
|
|
|
// setPolygon(polygon);
|
|
|
|
|
geojson.features.push(polygon); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 포인트 생성
|
|
|
|
|
paths.forEach((p, i) => handlerCreatePoint(p, i)); |
|
|
|
|
paths.forEach((p, i) => handlerCreatePoint(p, i, areas.areaType)); |
|
|
|
|
handlerReplaceDuplicate('point', ''); |
|
|
|
|
point.forEach(p => geojson.features.push(p)); |
|
|
|
|
|
|
|
|
|
//once로 하면 꼬이는건 해결되는데 지도를 움직이면 이벤트가 사라짐 -> 왜? onMouseDown이 실행된게 아니잖아?
|
|
|
|
|
//on으로 하면 그 반대 현상 -> 이벤트 다 지워줬는데 왜 down이 두번 잡혀??????
|
|
|
|
|
//얘만 해결하면 끝인데...
|
|
|
|
|
if (!mouseDownEve) { |
|
|
|
|
mapObject.on('mousedown', 'waypoint', onMouseDown); |
|
|
|
|
setMouseDownEve(true); |
|
|
|
@ -576,14 +577,13 @@ export const MapBoxDraw = props => {
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const content = handlerGetReplaceContent(distance); |
|
|
|
|
const popup = new props.mapboxgl.Popup({ |
|
|
|
|
offset: anchor, |
|
|
|
|
closeButton: false, |
|
|
|
|
closeOnClick: false |
|
|
|
|
}) |
|
|
|
|
.setLngLat(lngLat) |
|
|
|
|
.setHTML(content) |
|
|
|
|
.setHTML(handlerGetHtmlContent(distance)) |
|
|
|
|
.addTo(mapObject); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
@ -622,7 +622,7 @@ export const MapBoxDraw = props => {
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// html Content 반환
|
|
|
|
|
const handlerGetReplaceContent = distance => { |
|
|
|
|
const handlerGetHtmlContent = distance => { |
|
|
|
|
const text = |
|
|
|
|
typeof distance === 'number' ? fromMetersToText(distance) : distance; |
|
|
|
|
|
|
|
|
@ -640,7 +640,7 @@ export const MapBoxDraw = props => {
|
|
|
|
|
return text; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
//중복되는 obj 제거 or 제거 후 새로 생성
|
|
|
|
|
// geojson에서 중복되는 obj 제거 or 제거 후 새로 생성
|
|
|
|
|
const handlerReplaceDuplicate = (id, obj) => { |
|
|
|
|
geojson.features = geojson.features.filter( |
|
|
|
|
geo => geo.properties?.id !== id |
|
|
|
@ -648,42 +648,13 @@ export const MapBoxDraw = props => {
|
|
|
|
|
if (obj !== '') geojson.features.push(obj); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
//도형 완성된 좌표 생성 or 변경 될 때 동작
|
|
|
|
|
const handlerSaveAreaInfo = (coord, obj) => { |
|
|
|
|
if (obj.properties?.id === 'polyline') { |
|
|
|
|
// setPolyline(obj);
|
|
|
|
|
} else if (obj.properties?.id === 'polygon') { |
|
|
|
|
// setPolygon(obj);
|
|
|
|
|
} else if (obj.properties?.id === 'circle') { |
|
|
|
|
// setCircle(obj);
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (obj.properties?.id !== 'circle') { |
|
|
|
|
// setPoint(point);
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
handlerAreaInfo(coord); |
|
|
|
|
setIsDrawDone(true); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
//geojson에서 원하는 Id의 coord만 추출
|
|
|
|
|
// geojson에서 원하는 Id의 coord만 추출
|
|
|
|
|
const handlerGetGeoJsonCoord = id => { |
|
|
|
|
return geojson.features |
|
|
|
|
.filter(geo => geo.properties?.id === id) |
|
|
|
|
.map(geo => geo.geometry.coordinates); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// drawType에 따른 obj 반환
|
|
|
|
|
const handlerMatchObj = drawType => { |
|
|
|
|
if (drawType === 'LINE') { |
|
|
|
|
return lineString; |
|
|
|
|
} else if (drawType === 'POLYGON') { |
|
|
|
|
return polygon; |
|
|
|
|
} else if (drawType === 'CIRCLE') { |
|
|
|
|
return circle; |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// circle 360도 좌표 반환
|
|
|
|
|
const handlerGetCircleCoord = (center, distance) => { |
|
|
|
|
const options = { |
|
|
|
@ -694,14 +665,14 @@ export const MapBoxDraw = props => {
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// 포인트 생성
|
|
|
|
|
const handlerCreatePoint = (coord, index) => { |
|
|
|
|
const handlerCreatePoint = (coord, index, type) => { |
|
|
|
|
const wayPoint = { |
|
|
|
|
type: 'Feature', |
|
|
|
|
geometry: { |
|
|
|
|
type: 'Point', |
|
|
|
|
coordinates: coord |
|
|
|
|
}, |
|
|
|
|
properties: { id: 'point', index: index } |
|
|
|
|
properties: { id: 'point', index: index, type: type } |
|
|
|
|
}; |
|
|
|
|
point.push(wayPoint); |
|
|
|
|
|
|
|
|
|