| this.on(this._types.WHEEL, this._mouseWheelHandler, this) | this.on(this._types.WHEEL, this._mouseWheelHandler, this) | ||||
| } | } | ||||
| /** | |||||
| * 调整位置,将视图位置从像素坐标转换为归一化设备独立像素坐标。 | |||||
| * 这个函数用于处理不同设备上因DPI不同导致的显示问题,确保在高DPI设备上也能正确显示。 | |||||
| * | |||||
| * @param {Object} position - 像素坐标,包含x和y属性。 | |||||
| * @returns {Cesium.Cartesian2} - 归一化设备独立像素坐标。 | |||||
| */ | |||||
| _adjustPosition(position) { | |||||
| // 获取容器的矩形信息,包括宽度和高度。 | |||||
| const containerRect = this._viewer.container.getBoundingClientRect() | |||||
| // 计算容器的缩放因子,用于处理响应式布局或自适应大小的容器。 | |||||
| const scaleX = containerRect.width / this._viewer.container.offsetWidth | |||||
| const scaleY = containerRect.height / this._viewer.container.offsetHeight | |||||
| // 获取设备的像素比,用于处理高DPI设备的显示问题。 | |||||
| const dpiScale = window.devicePixelRatio | |||||
| // 将像素坐标转换为归一化设备独立像素坐标,同时考虑了容器的缩放和设备的DPI。 | |||||
| const x = (position.x - containerRect.left) / scaleX / dpiScale | |||||
| const y = (position.y - containerRect.top) / scaleY / dpiScale | |||||
| // 返回转换后的坐标。 | |||||
| return new Cesium.Cartesian2(x, y) | |||||
| } | |||||
| /** | /** | ||||
| * | * | ||||
| * Gets the mouse information for the mouse event | * Gets the mouse information for the mouse event | ||||
| * | * | ||||
| */ | */ | ||||
| _getMouseInfo(position) { | _getMouseInfo(position) { | ||||
| let adjustedPosition = this._adjustPosition(position) | |||||
| let scene = this._viewer.scene | let scene = this._viewer.scene | ||||
| let target = scene.pick(position) | |||||
| let target = scene.pick(adjustedPosition) | |||||
| let cartesian = undefined | let cartesian = undefined | ||||
| let surfaceCartesian = undefined | let surfaceCartesian = undefined | ||||
| let wgs84Position = undefined | let wgs84Position = undefined | ||||
| let wgs84SurfacePosition = undefined | let wgs84SurfacePosition = undefined | ||||
| if (scene.pickPositionSupported) { | if (scene.pickPositionSupported) { | ||||
| cartesian = scene.pickPosition(position) | |||||
| cartesian = scene.pickPosition(adjustedPosition) | |||||
| } | } | ||||
| if (cartesian) { | if (cartesian) { | ||||
| let c = Cesium.Ellipsoid.WGS84.cartesianToCartographic(cartesian) | let c = Cesium.Ellipsoid.WGS84.cartesianToCartographic(cartesian) | ||||
| scene.mode === Cesium.SceneMode.SCENE3D && | scene.mode === Cesium.SceneMode.SCENE3D && | ||||
| !(this._viewer.terrainProvider instanceof Cesium.EllipsoidTerrainProvider) | !(this._viewer.terrainProvider instanceof Cesium.EllipsoidTerrainProvider) | ||||
| ) { | ) { | ||||
| let ray = scene.camera.getPickRay(position) | |||||
| let ray = scene.camera.getPickRay(adjustedPosition) | |||||
| surfaceCartesian = scene.globe.pick(ray, scene) | surfaceCartesian = scene.globe.pick(ray, scene) | ||||
| } else { | } else { | ||||
| surfaceCartesian = scene.camera.pickEllipsoid( | surfaceCartesian = scene.camera.pickEllipsoid( | ||||
| position, | |||||
| adjustedPosition, | |||||
| Cesium.Ellipsoid.WGS84 | Cesium.Ellipsoid.WGS84 | ||||
| ) | ) | ||||
| } | } | ||||
| return { | return { | ||||
| target: target, | target: target, | ||||
| windowPosition: position, | |||||
| windowPosition: adjustedPosition, | |||||
| position: cartesian, | position: cartesian, | ||||
| wgs84Position: wgs84Position, | wgs84Position: wgs84Position, | ||||
| surfacePosition: surfaceCartesian, | surfacePosition: surfaceCartesian, |