|
|
|
@ -7,6 +7,7 @@ import {
|
|
|
|
|
Suspense |
|
|
|
|
} from 'react'; |
|
|
|
|
import { useSelector, useDispatch } from '@src/redux/store'; |
|
|
|
|
import * as turf from '@turf/turf'; |
|
|
|
|
import { |
|
|
|
|
Button, |
|
|
|
|
Modal, |
|
|
|
@ -95,6 +96,8 @@ export default function MapBoxMap({ handlerDrawObjInit }) {
|
|
|
|
|
// 노탐 정보 모달
|
|
|
|
|
const [centeredModal, setCenteredModal] = useState(false); |
|
|
|
|
|
|
|
|
|
const mouseCursorRef = useRef(null); |
|
|
|
|
|
|
|
|
|
// 비행예상경로 geoJson 정보
|
|
|
|
|
const [planGeo, setPlanGeo] = useState({ |
|
|
|
|
type: 'FeatureCollection', |
|
|
|
@ -328,7 +331,7 @@ export default function MapBoxMap({ handlerDrawObjInit }) {
|
|
|
|
|
map.addControl(language); |
|
|
|
|
// 거리 축적
|
|
|
|
|
map.addControl(new mapboxgl.ScaleControl()); |
|
|
|
|
const drawObj = getDraw(); |
|
|
|
|
const drawObj = getDraw('map'); |
|
|
|
|
map.addControl(drawObj); |
|
|
|
|
// 드래그 제한 2d
|
|
|
|
|
// map.dragRotate.disable();
|
|
|
|
@ -346,6 +349,8 @@ export default function MapBoxMap({ handlerDrawObjInit }) {
|
|
|
|
|
} |
|
|
|
|
)); |
|
|
|
|
|
|
|
|
|
let startPoint = null; |
|
|
|
|
|
|
|
|
|
map.on('style.load', () => { |
|
|
|
|
const layers = map.getStyle().layers; |
|
|
|
|
const labelLayerId = layers.find( |
|
|
|
@ -566,11 +571,52 @@ export default function MapBoxMap({ handlerDrawObjInit }) {
|
|
|
|
|
|
|
|
|
|
setMapLoaded(true); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
map.on('click', e => { |
|
|
|
|
if (drawObj.getMode() === 'draw_line_string') { |
|
|
|
|
mouseCursorRef.current.style.display = 'block'; |
|
|
|
|
mouseCursorRef.current.style.left = e.originalEvent.pageX + 'px'; |
|
|
|
|
mouseCursorRef.current.style.top = e.originalEvent.pageY + 45 + 'px'; |
|
|
|
|
// mouseCursorRef.current.innerText = '시작점 선택';
|
|
|
|
|
startPoint = e.lngLat; |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
map.on('mousemove', e => { |
|
|
|
|
if (startPoint) { |
|
|
|
|
// console.log(drawObj.getAll());
|
|
|
|
|
const feature = []; |
|
|
|
|
drawObj |
|
|
|
|
.getAll() |
|
|
|
|
.features[0].geometry.coordinates.map(i => feature.push(i)); |
|
|
|
|
const obj = { |
|
|
|
|
geometry: { |
|
|
|
|
coordinates: [...feature], |
|
|
|
|
type: 'LineString' |
|
|
|
|
}, |
|
|
|
|
type: 'Feature' |
|
|
|
|
}; |
|
|
|
|
const distance = turf.length(obj); |
|
|
|
|
mouseCursorRef.current.innerText = `${distance.toLocaleString()}km`; |
|
|
|
|
// const endPoint = e.lngLat;
|
|
|
|
|
// const distance = calculateDistance(startPoint, endPoint);
|
|
|
|
|
// mouseCursorRef.current.innerText = `Distance from start point: ${distance.toFixed(
|
|
|
|
|
// 2
|
|
|
|
|
// )} meters`;
|
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
handlerDrawObjInit(drawObj); |
|
|
|
|
setMapObject(map); |
|
|
|
|
dispatch(clientMapInit(map)); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
function calculateDistance(point1, point2) { |
|
|
|
|
return mapboxgl.MercatorCoordinate.fromLngLat(point1).distanceTo( |
|
|
|
|
mapboxgl.MercatorCoordinate.fromLngLat(point2) |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return ( |
|
|
|
|
<> |
|
|
|
|
<div |
|
|
|
@ -578,6 +624,18 @@ export default function MapBoxMap({ handlerDrawObjInit }) {
|
|
|
|
|
ref={mapContainer} |
|
|
|
|
style={{ width: '100%', height: '100vh' }} |
|
|
|
|
></div> |
|
|
|
|
<div |
|
|
|
|
ref={mouseCursorRef} |
|
|
|
|
style={{ |
|
|
|
|
position: 'absolute', |
|
|
|
|
display: 'none', |
|
|
|
|
background: '#8a1c05', |
|
|
|
|
color: '#fff', |
|
|
|
|
padding: '5px', |
|
|
|
|
borderRadius: '5px', |
|
|
|
|
fontWeight: 500 |
|
|
|
|
}} |
|
|
|
|
></div> |
|
|
|
|
{isMapLoaded && mapObject ? ( |
|
|
|
|
<> |
|
|
|
|
<DronToast /> |
|
|
|
|