/** * 鼠标坐标 */ 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

` switch (positionType || '度') { case '度': contentElm.innerHTML = `

经度:${degrees.lng.toFixed(8)}°

维度:${degrees.lat.toFixed(8)}°

海拔:${degrees.alt.toFixed(2)} m

` break; case '度分': contentElm.innerHTML = `

经度:${proj.degreesToDMS(degrees.lng, true)}

维度:${proj.degreesToDMS(degrees.lat, true)}

海拔:${degrees.alt.toFixed(2)} m

` break; case '度分秒': contentElm.innerHTML = `

经度:${proj.degreesToDMS(degrees.lng, false)}

维度:${proj.degreesToDMS(degrees.lat, false)}

海拔:${degrees.alt.toFixed(2)} m

` break; default: break; } } else { // let result = tools.convert([{ x: degrees.lng, y: degrees.lat, z: degrees.alt }], 'EPSG:4326', coordinateSystem) let result = tools.convert([{ x: degrees.lng, y: degrees.lat, z: degrees.alt }], 'EPSG:4326', posiToCoordinate(coordinateSystem, degrees)) position = result.points[0] contentElm.innerHTML = `

x:${position.x.toFixed(2)}

y:${position.y.toFixed(2)}

z:${position.z.toFixed(2)}

` } } else { let coordinateSystem = getCoordinateSystem() if (coordinateSystem === 'EPSG:4326') { contentElm.innerHTML = `

经度:-

维度:-

海拔:-

` } else { contentElm.innerHTML = `

x:-

y:-

z:-

` } } } animateUpdate() function animateUpdate() { requestAnimationFrameEventId = requestAnimationFrame( animateUpdate ) getPosition() } } else { if (event) { event.destroy() } if (event2) { event2.destroy() event2 = undefined } if (MouseCoordinateElm) { sdk.viewer.container.removeChild(MouseCoordinateElm) MouseCoordinateElm = undefined } if (requestAnimationFrameEventId) { cancelAnimationFrame(requestAnimationFrameEventId) } } } export { MouseCoordinate }