/** * 鼠标坐标 */ import Tools from "../../Tools"; import { getCoordinateSystem, getDMS } from "../../Global/global"; import MouseEvent from '../../Event/index' import { getSdk as get2DSdk } from '../../Global/MultiViewportMode' import { getSdk as getSplitScreenSdk } from "../../Global/SplitScreen"; let event let event2 let MouseCoordinateElm let requestAnimationFrameEventId let tmovement let targetSdk let sdkD const MouseCoordinate = (sdk, status) => { if (!sdk || !sdk.viewer) { return } targetSdk = sdk sdkD = get2DSdk().sdkD if (!sdkD) { sdkD = getSplitScreenSdk().sdkD } let tools = new Tools(sdk) let proj = sdk.proj if (status) { if (event) { event.destroy() } if (event2) { event2.destroy() event2 = undefined } event = new MouseEvent(sdk) tmovement = null let position = { x: '', y: '', z: '' } let contentElm if (MouseCoordinateElm) { contentElm = MouseCoordinateElm } else { contentElm = document.createElement('div'); contentElm.style.position = 'absolute'; contentElm.style['z-index'] = 777; contentElm.style.color = '#ffffff'; contentElm.style.left = '0px'; contentElm.style.top = '0px'; contentElm.style.width = '100%'; contentElm.style.height = '100%'; contentElm.style['font-size'] = '12px'; contentElm.style['pointer-events'] = 'none'; contentElm.style.background = `url(${tools.getSourceRootPath()}/img/cross.png) no-repeat 100% 100%`; contentElm.style['background-size'] = `200% 200%`; MouseCoordinateElm = contentElm } sdk.viewer.container.appendChild(contentElm) event.mouse_move((movement, cartesian) => { targetSdk = sdk tmovement = { ...movement.endPosition } }) const posiToCoordinate = (coordinateSystem, position) => { let type switch (coordinateSystem) { case 'EPSG:32601'://WGS84 通用横轴墨卡托投影 //带号 = ⌊(经度 + 180)/6⌋ + 1 var dh = Math.round((position.lng + 180) / 6 + 1) if (position.lat > 0) {//北纬 type = 32600 + dh type = 'EPSG:' + type } else {//南纬 type = 32700 + dh type = 'EPSG:' + type } break; case 'EPSG:4534'://2000 坐标 3 度不带代号 //N = round(经度/3) //EPSG = N - 25 + 4534 var dh3y = Math.round(position.lng / 3) type = dh3y - 25 + 4534 type = 'EPSG:' + type break; case 'EPSG:4513'://2000 坐标 3 度带代号 //N = round(经度/3) //EPSG = N - 25 + 4513 var dh3w = Math.round(position.lng / 3) type = dh3w - 25 + 4513 type = 'EPSG:' + type break; case 'EPSG:4502'://2000 坐标 6 度不带代号 let zoneNumber = Math.floor(position.lng / 6) + 31 // 中国区域6度带带号范围为13-23 if (zoneNumber < 13) zoneNumber = 13; if (zoneNumber > 23) zoneNumber = 23; type = (zoneNumber - 13) + 4502 type = 'EPSG:' + type break; case 'EPSG:4491'://2000 坐标 6 度带代号 //N = floor(longitude/6) + 31 var dh6 = Math.floor(position.lng / 6) + 31 // 中国区域6度带带号范围为13-23 if (dh6 < 13) dh6 = 13; if (dh6 > 23) dh6 = 23; type = (dh6 - 13) + 4491 type = 'EPSG:' + type break; default: break; } return type } const getPosition = () => { if (!targetSdk) { return } let canvas = sdk.viewer._element.getElementsByTagName('canvas')[0] sdkD = get2DSdk().sdkD if (!sdkD) { sdkD = getSplitScreenSdk().sdkD } if (!event2 && sdkD) { event2 = new MouseEvent(sdkD) event2.mouse_move((movement, cartesian) => { targetSdk = sdkD tmovement = { x: movement.endPosition.x, y: movement.endPosition.y } }) } if (!tmovement) { return } let left = tmovement.x; let top = tmovement.y; let cartesian if (targetSdk.viewer.scene.mode === 2) { left = left + canvas.width cartesian = targetSdk.viewer.camera.pickEllipsoid(tmovement, targetSdk.viewer.scene.globe.ellipsoid) } else { cartesian = targetSdk.viewer.scene.pickPosition(tmovement) if (!cartesian) { const ray = targetSdk.viewer.camera.getPickRay(position); //相交的射线 let pickedObjects = targetSdk.viewer.scene.drillPickFromRay(ray, 10); let result = {} for (let i = 0; i < pickedObjects.length; i++) { if (pickedObjects[i].position) { result = pickedObjects[i] break } } cartesian = result.position if (!cartesian) { cartesian = targetSdk.viewer.scene.globe.pick(ray, targetSdk.viewer.scene); } } } contentElm.style['background-position-x'] = `${-sdk.viewer.container.clientWidth + left + 4}px`; contentElm.style['background-position-y'] = `${-sdk.viewer.container.clientHeight + top - 2}px`; // this.entity.position = cartesian if (cartesian) { let degrees = tools.cartesian3Towgs84(cartesian, sdk.viewer) let coordinateSystem = getCoordinateSystem() let positionType = getDMS() if (coordinateSystem === 'EPSG:4326') { position = { x: degrees.lng, y: degrees.lat, z: degrees.alt } // contentElm.innerHTML = `
经度:${degrees.lng.toFixed(6)}°
维度:${degrees.lat.toFixed(6)}°
海拔:${degrees.alt.toFixed(2)} m
经度:${degrees.lng.toFixed(8)}°
维度:${degrees.lat.toFixed(8)}°
海拔:${degrees.alt.toFixed(2)} m
经度:${proj.degreesToDMS(degrees.lng, true)}
维度:${proj.degreesToDMS(degrees.lat, true)}
海拔:${degrees.alt.toFixed(2)} m
经度:${proj.degreesToDMS(degrees.lng, false)}
维度:${proj.degreesToDMS(degrees.lat, false)}
海拔:${degrees.alt.toFixed(2)} m
x:${position.x.toFixed(2)}
y:${position.y.toFixed(2)}
z:${position.z.toFixed(2)}
经度:-
维度:-
海拔:-
x:-
y:-
z:-