/** * @Author: Caven * @Date: 2020-01-15 20:27:27 */ import baseLayerImgUrl from '@/assets/baseUrl' const viewerHeight = 700 class SingleTileImageryProviderMe { // eslint-disable-next-line space-before-function-paren constructor(viewer, options) { this._url = options.url this._viewer = viewer this._tilingScheme = new global.DC.Namespace.Cesium.WebMercatorTilingScheme({ rectangleSouthwestInMeters: new global.DC.Namespace.Cesium.Cartesian2(-33554054, -33746824), rectangleNortheastInMeters: new global.DC.Namespace.Cesium.Cartesian2(33554054, 33746824) }) console.log(this._tilingScheme) this.realChange() } get url () { return this._url } get viewer () { return this._viewer } get rectangle () { if (!this.ready) { throw new global.DC.Namespace.Cesium.DeveloperError( 'rectangle must not be called before the imagery provider is ready.' ) } return this._rectangle } realChange () { const self = this this._viewer.on(global.DC.SceneEventType.CAMERA_CHANGED, function () { const params = {} const extend = self._viewer.camera.computeViewRectangle() if (typeof extend === 'undefined') { // 2D下会可能拾取不到坐标,extend返回undefined,所以做以下转换 const canvas = self._viewer.scene.canvas const upperLeft = new global.DC.Namespace.Cesium.Cartesian2(0, 0)// canvas左上角坐标转2d坐标 const lowerRight = new global.DC.Namespace.Cesium.Cartesian2( canvas.clientWidth, canvas.clientHeight )// canvas右下角坐标转2d坐标 const ellipsoid = self._viewer.scene.globe.ellipsoid const upperLeft3 = self._viewer.camera.pickEllipsoid( upperLeft, ellipsoid )// 2D转3D世界坐标 const lowerRight3 = self._viewer.camera.pickEllipsoid( lowerRight, ellipsoid )// 2D转3D世界坐标 const upperLeftCartographic = self._viewer.scene.globe.ellipsoid.cartesianToCartographic( upperLeft3 )// 3D世界坐标转弧度 const lowerRightCartographic = self._viewer.scene.globe.ellipsoid.cartesianToCartographic( lowerRight3 )// 3D世界坐标转弧度 const minx = global.DC.Namespace.Cesium.Math.toDegrees(upperLeftCartographic.longitude)// 弧度转经纬度 const maxx = global.DC.Namespace.Cesium.Math.toDegrees(lowerRightCartographic.longitude)// 弧度转经纬度 const miny = global.DC.Namespace.Cesium.Math.toDegrees(lowerRightCartographic.latitude)// 弧度转经纬度 const maxy = global.DC.Namespace.Cesium.Math.toDegrees(upperLeftCartographic.latitude)// 弧度转经纬度 console.log('经度:' + minx + '----' + maxx) console.log('纬度:' + miny + '----' + maxy) params.minx = minx params.maxx = maxx params.miny = miny params.maxy = maxy } else { // 3D获取方式 params.maxx = global.DC.Namespace.Cesium.Math.toDegrees(extend.east) params.maxy = global.DC.Namespace.Cesium.Math.toDegrees(extend.north) params.minx = global.DC.Namespace.Cesium.Math.toDegrees(extend.west) params.miny = global.DC.Namespace.Cesium.Math.toDegrees(extend.south) } const extent = params baseLayerImgUrl[3][viewerHeight].forEach(sm => { if ( ( sm.rectangle[0] > extent.minx && sm.rectangle[1] > extent.miny && sm.rectangle[2] < extent.maxx && sm.rectangle[3] < extent.maxy ) || ( sm.rectangle[0] < extent.minx && sm.rectangle[1] < extent.maxy && sm.rectangle[2] > extent.minx && sm.rectangle[3] > extent.maxy ) || ( sm.rectangle[0] < extent.maxx && sm.rectangle[1] < extent.maxy && sm.rectangle[2] > extent.maxx && sm.rectangle[3] > extent.maxy ) || ( sm.rectangle[0] < extent.maxx && sm.rectangle[1] < extent.miny && sm.rectangle[2] > extent.maxx && sm.rectangle[3] > extent.miny ) || ( sm.rectangle[0] < extent.minx && sm.rectangle[1] < extent.miny && sm.rectangle[2] > extent.minx && sm.rectangle[3] > extent.miny ) || ( sm.rectangle[0] > extent.minx && sm.rectangle[1] < extent.maxy && sm.rectangle[2] < extent.maxx && sm.rectangle[3] > extent.maxy ) || ( sm.rectangle[0] > extent.minx && sm.rectangle[1] > extent.miny && sm.rectangle[2] > extent.maxx && sm.rectangle[3] < extent.maxy ) || ( sm.rectangle[0] > extent.minx && sm.rectangle[1] < extent.miny && sm.rectangle[2] < extent.maxx && sm.rectangle[3] > extent.miny ) || ( sm.rectangle[0] < extent.minx && sm.rectangle[1] > extent.miny && sm.rectangle[2] > extent.minx && sm.rectangle[3] < extent.maxy ) ) { var min = global.DC.Namespace.Cesium.Cartesian3.fromDegrees(sm.rectangle[0], sm.rectangle[1]) var max = global.DC.Namespace.Cesium.Cartesian3.fromDegrees(sm.rectangle[2], sm.rectangle[3]) self._rectangle = { west: min.x, south: min.y, east: max.x, north: max.y } console.log(self) return global.DC.Namespace.Cesium.ImageryProvider.loadImage(self, sm.url) } }) }) } mapCameraEvent () { // return global.DC.Namespace.Cesium.ImageryProvider.loadImage(this, url) } } export default SingleTileImageryProviderMe