shuishen
2022-04-27 510ae9f8768cd16c39fde70e1ae40b164500d5d5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
/**
 * @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