@lijuhong1981/cesium.utils 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +62 -2
- package/package.json +33 -4
- package/src/additions/Geographic.js +603 -0
- package/src/additions/GeographicTransform.js +291 -0
- package/src/additions/GeometryInstanceAttributes.js +164 -0
- package/src/additions/ModelMatrixTransforms.js +822 -0
- package/src/additions/PropertyChangedListener.js +72 -0
- package/src/additions/PropertyType.js +30 -0
- package/src/additions/StTransforms.js +266 -0
- package/src/additions/TranslationRotationScaleTransform.js +809 -0
- package/src/additions/index.js +8 -0
- package/src/index.js +4 -0
- package/src/parses/index.js +46 -0
- package/src/parses/parseAltitude.js +32 -0
- package/src/parses/parseArcType.js +26 -0
- package/src/parses/parseAttitudeToHeadingPitchRoll.js +26 -0
- package/src/parses/parseAttitudeToMatrix3.js +17 -0
- package/src/parses/parseAttitudeToQuaternion.js +21 -0
- package/src/parses/parseCartographicToCartesian.js +21 -0
- package/src/parses/parseCartographicsToPositions.js +20 -0
- package/src/parses/parseClassificationType.js +24 -0
- package/src/parses/parseClockRange.js +26 -0
- package/src/parses/parseColorBlendMode.js +26 -0
- package/src/parses/parseCornerType.js +24 -0
- package/src/parses/parseCullFace.js +28 -0
- package/src/parses/parseEulerToHeadingPitchRoll.js +21 -0
- package/src/parses/parseEulerToQuaternion.js +18 -0
- package/src/parses/parseGeographicToCartesian.js +21 -0
- package/src/parses/parseGeographicsToPositions.js +20 -0
- package/src/parses/parseHeading.js +28 -0
- package/src/parses/parseHeightReference.js +24 -0
- package/src/parses/parseHorizontalOrigin.js +26 -0
- package/src/parses/parseLabelStyle.js +26 -0
- package/src/parses/parseLatitude.js +28 -0
- package/src/parses/parseLongitude.js +28 -0
- package/src/parses/parsePitch.js +26 -0
- package/src/parses/parseRoll.js +26 -0
- package/src/parses/parseRotationToHeadingPitchRoll.js +40 -0
- package/src/parses/parseRotationToMatrix3.js +25 -0
- package/src/parses/parseRotationToQuaternion.js +27 -0
- package/src/parses/parseShadowMode.js +26 -0
- package/src/parses/parseToBoundingRectangle.js +33 -0
- package/src/parses/parseToCartesian2.js +35 -0
- package/src/parses/parseToCartesian3.js +37 -0
- package/src/parses/parseToCartesian3Array.js +21 -0
- package/src/parses/parseToCartesian4.js +39 -0
- package/src/parses/parseToCartographic.js +31 -0
- package/src/parses/parseToColor.js +33 -0
- package/src/parses/parseToDistanceDisplayCondition.js +41 -0
- package/src/parses/parseToGeographic.js +31 -0
- package/src/parses/parseToHeadingPitchRange.js +45 -0
- package/src/parses/parseToJulianDate.js +23 -0
- package/src/parses/parseToNearFarScalar.js +33 -0
- package/src/parses/parseToPlane.js +37 -0
- package/src/parses/parseToPolygonHierarchy.js +48 -0
- package/src/parses/parseToRange.js +26 -0
- package/src/parses/parseToRectangle.js +32 -0
- package/src/parses/parseToTimeInterval.js +45 -0
- package/src/parses/parseVerticalOrigin.js +28 -0
- package/src/revisions/BoundingSphere.revise.js +107 -0
- package/src/revisions/Camera.revise.js +366 -0
- package/src/revisions/Cartesian.revise.js +313 -0
- package/src/revisions/Cartographic.revise.js +443 -0
- package/src/revisions/Check.revise.js +164 -0
- package/src/revisions/Color.revise.js +271 -0
- package/src/revisions/DistanceDisplayCondition.revise.js +37 -0
- package/src/revisions/Ellipsoid.revise.js +64 -0
- package/src/revisions/Geometry.revise.js +79 -0
- package/src/revisions/Globe.revise.js +92 -0
- package/src/revisions/HeadingPitchRoll.revise.js +328 -0
- package/src/revisions/JulianDate.revise.js +28 -0
- package/src/revisions/Material.revise.js +308 -0
- package/src/revisions/Math.revise.js +98 -0
- package/src/revisions/Matrix.revise.js +578 -0
- package/src/revisions/POI.revise.js +178 -0
- package/src/revisions/Plane.revise.js +43 -0
- package/src/revisions/PolylinePipeline.revise.js +54 -0
- package/src/revisions/PostProcessStageLibrary.revise.js +1143 -0
- package/src/revisions/Primitive.revise.js +83 -0
- package/src/revisions/Property.revise.js +37 -0
- package/src/revisions/Quaternion.revise.js +66 -0
- package/src/revisions/Rectangle.revise.js +570 -0
- package/src/revisions/SceneTransforms.revise.js +82 -0
- package/src/revisions/Spherical.revise.js +35 -0
- package/src/revisions/index.js +25 -0
- package/src/utils/Scratch.js +165 -0
- package/src/utils/computeCirclePositions.js +48 -0
- package/src/utils/computeCircleRadius.js +19 -0
- package/src/utils/computeModelMatrix.js +109 -0
- package/src/utils/computeStTransform.js +57 -0
- package/src/utils/createGeometry.js +114 -0
- package/src/utils/createPointCloudGeometry.js +79 -0
- package/src/utils/getGeometryInstanceAttributes.js +43 -0
- package/src/utils/getPositionFromTarget.js +29 -0
- package/src/utils/getRenderState.js +35 -0
- package/src/utils/index.js +13 -0
- package/src/utils/isColorMaterial.js +13 -0
- package/src/utils/isTranslucent.js +13 -0
- package/src/utils/resolveModelMatrixByFixedFrame.js +30 -0
|
@@ -0,0 +1,570 @@
|
|
|
1
|
+
import { Cartesian3, Cartographic, Math as CesiumMath, Check, DeveloperError, Rectangle, defined } from "cesium";
|
|
2
|
+
import Geographic from "../additions/Geographic.js";
|
|
3
|
+
import parseToCartesian3 from "../parses/parseToCartesian3.js";
|
|
4
|
+
import parseToCartographic from "../parses/parseToCartographic.js";
|
|
5
|
+
import parseToGeographic from "../parses/parseToGeographic.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* 扩展 Cesium 的 Rectangle 类,补充以度/米为单位的边界与尺寸属性,
|
|
9
|
+
* 以及从中心与宽高、地理坐标创建矩形,编辑矩形、点包含判断等方法。
|
|
10
|
+
* @class Rectangle
|
|
11
|
+
* @see {@link https://cesium.com/learn/cesiumjs/ref-doc/Rectangle.html}
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
Object.defineProperties(Rectangle.prototype, {
|
|
15
|
+
/**
|
|
16
|
+
* 矩形西边界经度,单位度。
|
|
17
|
+
* @name westDegrees
|
|
18
|
+
* @type {number}
|
|
19
|
+
* @memberof Rectangle
|
|
20
|
+
*/
|
|
21
|
+
westDegrees: {
|
|
22
|
+
get: function () {
|
|
23
|
+
return CesiumMath.toDegrees(this.west);
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
/**
|
|
27
|
+
* 矩形东边界经度,单位度。
|
|
28
|
+
* @name eastDegrees
|
|
29
|
+
* @type {number}
|
|
30
|
+
* @memberof Rectangle
|
|
31
|
+
*/
|
|
32
|
+
eastDegrees: {
|
|
33
|
+
get: function () {
|
|
34
|
+
return CesiumMath.toDegrees(this.east);
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
/**
|
|
38
|
+
* 矩形南边界纬度,单位度。
|
|
39
|
+
* @name southDegrees
|
|
40
|
+
* @type {number}
|
|
41
|
+
* @memberof Rectangle
|
|
42
|
+
*/
|
|
43
|
+
southDegrees: {
|
|
44
|
+
get: function () {
|
|
45
|
+
return CesiumMath.toDegrees(this.south);
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
/**
|
|
49
|
+
* 矩形北边界纬度,单位度。
|
|
50
|
+
* @name northDegrees
|
|
51
|
+
* @type {number}
|
|
52
|
+
* @memberof Rectangle
|
|
53
|
+
*/
|
|
54
|
+
northDegrees: {
|
|
55
|
+
get: function () {
|
|
56
|
+
return CesiumMath.toDegrees(this.north);
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
/**
|
|
60
|
+
* 矩形经度跨度,单位度。
|
|
61
|
+
* @name widthInDegrees
|
|
62
|
+
* @type {number}
|
|
63
|
+
* @memberof Rectangle
|
|
64
|
+
*/
|
|
65
|
+
widthInDegrees: {
|
|
66
|
+
get: function () {
|
|
67
|
+
return CesiumMath.toDegrees(this.width);
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
/**
|
|
71
|
+
* 矩形纬度跨度,单位度。
|
|
72
|
+
* @name heightInDegrees
|
|
73
|
+
* @type {number}
|
|
74
|
+
* @memberof Rectangle
|
|
75
|
+
*/
|
|
76
|
+
heightInDegrees: {
|
|
77
|
+
get: function () {
|
|
78
|
+
return CesiumMath.toDegrees(this.height);
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
/**
|
|
82
|
+
* 矩形中心线处的宽度,单位米。
|
|
83
|
+
* @name centreWidthInMeters
|
|
84
|
+
* @type {number}
|
|
85
|
+
* @memberof Rectangle
|
|
86
|
+
*/
|
|
87
|
+
centreWidthInMeters: {
|
|
88
|
+
get: function () {
|
|
89
|
+
return Rectangle.computeCentreWidthInMeters(this);
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
/**
|
|
93
|
+
* 矩形中心线处的高度,单位米。
|
|
94
|
+
* @name centreHeightInMeters
|
|
95
|
+
* @type {number}
|
|
96
|
+
* @memberof Rectangle
|
|
97
|
+
*/
|
|
98
|
+
centreHeightInMeters: {
|
|
99
|
+
get: function () {
|
|
100
|
+
return Rectangle.computeCentreHeightInMeters(this);
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
/**
|
|
104
|
+
* 矩形宽度,单位米(等同 centreWidthInMeters)。
|
|
105
|
+
* @name widthInMeters
|
|
106
|
+
* @type {number}
|
|
107
|
+
* @memberof Rectangle
|
|
108
|
+
*/
|
|
109
|
+
widthInMeters: {
|
|
110
|
+
get: function () {
|
|
111
|
+
return Rectangle.computeCentreWidthInMeters(this);
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
/**
|
|
115
|
+
* 矩形高度,单位米(等同 centreHeightInMeters)。
|
|
116
|
+
* @name heightInMeters
|
|
117
|
+
* @type {number}
|
|
118
|
+
* @memberof Rectangle
|
|
119
|
+
*/
|
|
120
|
+
heightInMeters: {
|
|
121
|
+
get: function () {
|
|
122
|
+
return Rectangle.computeCentreHeightInMeters(this);
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
/**
|
|
126
|
+
* 矩形北边宽度,单位米。
|
|
127
|
+
* @name northWidthInMeters
|
|
128
|
+
* @type {number}
|
|
129
|
+
* @memberof Rectangle
|
|
130
|
+
*/
|
|
131
|
+
northWidthInMeters: {
|
|
132
|
+
get: function () {
|
|
133
|
+
return Rectangle.computeNorthWidthInMeters(this);
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
/**
|
|
137
|
+
* 矩形南边宽度,单位米。
|
|
138
|
+
* @name southWidthInMeters
|
|
139
|
+
* @type {number}
|
|
140
|
+
* @memberof Rectangle
|
|
141
|
+
*/
|
|
142
|
+
southWidthInMeters: {
|
|
143
|
+
get: function () {
|
|
144
|
+
return Rectangle.computeSouthWidthInMeters(this);
|
|
145
|
+
}
|
|
146
|
+
},
|
|
147
|
+
/**
|
|
148
|
+
* 矩形西边高度,单位米。
|
|
149
|
+
* @name westHeightInMeters
|
|
150
|
+
* @type {number}
|
|
151
|
+
* @memberof Rectangle
|
|
152
|
+
*/
|
|
153
|
+
westHeightInMeters: {
|
|
154
|
+
get: function () {
|
|
155
|
+
return Rectangle.computeWestHeightInMeters(this);
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
/**
|
|
159
|
+
* 矩形东边高度,单位米。
|
|
160
|
+
* @name eastHeightInMeters
|
|
161
|
+
* @type {number}
|
|
162
|
+
* @memberof Rectangle
|
|
163
|
+
*/
|
|
164
|
+
eastHeightInMeters: {
|
|
165
|
+
get: function () {
|
|
166
|
+
return Rectangle.computeEastHeightInMeters(this);
|
|
167
|
+
}
|
|
168
|
+
},
|
|
169
|
+
/**
|
|
170
|
+
* 矩形中心点。
|
|
171
|
+
* @name center
|
|
172
|
+
* @type {Cartographic}
|
|
173
|
+
* @memberof Rectangle
|
|
174
|
+
*/
|
|
175
|
+
center: {
|
|
176
|
+
get: function () {
|
|
177
|
+
return Rectangle.center(this, new Cartographic());
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
/**
|
|
181
|
+
* 矩形中心点的地理坐标。
|
|
182
|
+
* @name centerGeographic
|
|
183
|
+
* @type {Geographic}
|
|
184
|
+
* @memberof Rectangle
|
|
185
|
+
*/
|
|
186
|
+
centerGeographic: {
|
|
187
|
+
get: function () {
|
|
188
|
+
return this.center.toGeographic();
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
/**
|
|
192
|
+
* 矩形东北角坐标。
|
|
193
|
+
* @name northeast
|
|
194
|
+
* @type {Cartographic}
|
|
195
|
+
* @memberof Rectangle
|
|
196
|
+
*/
|
|
197
|
+
northeast: {
|
|
198
|
+
get: function () {
|
|
199
|
+
return Rectangle.northeast(this, new Cartographic());
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
/**
|
|
203
|
+
* 矩形西北角坐标。
|
|
204
|
+
* @name northwest
|
|
205
|
+
* @type {Cartographic}
|
|
206
|
+
* @memberof Rectangle
|
|
207
|
+
*/
|
|
208
|
+
northwest: {
|
|
209
|
+
get: function () {
|
|
210
|
+
return Rectangle.northwest(this, new Cartographic());
|
|
211
|
+
}
|
|
212
|
+
},
|
|
213
|
+
/**
|
|
214
|
+
* 矩形东南角坐标。
|
|
215
|
+
* @name southeast
|
|
216
|
+
* @type {Cartographic}
|
|
217
|
+
* @memberof Rectangle
|
|
218
|
+
*/
|
|
219
|
+
southeast: {
|
|
220
|
+
get: function () {
|
|
221
|
+
return Rectangle.southeast(this, new Cartographic());
|
|
222
|
+
}
|
|
223
|
+
},
|
|
224
|
+
/**
|
|
225
|
+
* 矩形西南角坐标。
|
|
226
|
+
* @name southwest
|
|
227
|
+
* @type {Cartographic}
|
|
228
|
+
* @memberof Rectangle
|
|
229
|
+
*/
|
|
230
|
+
southwest: {
|
|
231
|
+
get: function () {
|
|
232
|
+
return Rectangle.southwest(this, new Cartographic());
|
|
233
|
+
}
|
|
234
|
+
},
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* 计算矩形北边的地面宽度。
|
|
239
|
+
* @param {Rectangle} rectangle 目标矩形。
|
|
240
|
+
* @param {Ellipsoid} [ellipsoid] 参考椭球体。
|
|
241
|
+
* @returns {number} 北边宽度,单位米。
|
|
242
|
+
* @memberof Rectangle
|
|
243
|
+
* @static
|
|
244
|
+
*/
|
|
245
|
+
Rectangle.computeNorthWidthInMeters = function (rectangle, ellipsoid) {
|
|
246
|
+
return Cartographic.surfaceDistance(rectangle.northwest, rectangle.northeast, ellipsoid);
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* 计算矩形南边的地面宽度。
|
|
251
|
+
* @param {Rectangle} rectangle 目标矩形。
|
|
252
|
+
* @param {Ellipsoid} [ellipsoid] 参考椭球体。
|
|
253
|
+
* @returns {number} 南边宽度,单位米。
|
|
254
|
+
* @memberof Rectangle
|
|
255
|
+
* @static
|
|
256
|
+
*/
|
|
257
|
+
Rectangle.computeSouthWidthInMeters = function (rectangle, ellipsoid) {
|
|
258
|
+
return Cartographic.surfaceDistance(rectangle.southwest, rectangle.southeast, ellipsoid);
|
|
259
|
+
};
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* 计算矩形西边的地面高度。
|
|
263
|
+
* @param {Rectangle} rectangle 目标矩形。
|
|
264
|
+
* @param {Ellipsoid} [ellipsoid] 参考椭球体。
|
|
265
|
+
* @returns {number} 西边高度,单位米。
|
|
266
|
+
* @memberof Rectangle
|
|
267
|
+
* @static
|
|
268
|
+
*/
|
|
269
|
+
Rectangle.computeWestHeightInMeters = function (rectangle, ellipsoid) {
|
|
270
|
+
return Cartographic.surfaceDistance(rectangle.northwest, rectangle.southwest, ellipsoid);
|
|
271
|
+
};
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* 计算矩形东边的地面高度。
|
|
275
|
+
* @param {Rectangle} rectangle 目标矩形。
|
|
276
|
+
* @param {Ellipsoid} [ellipsoid] 参考椭球体。
|
|
277
|
+
* @returns {number} 东边高度,单位米。
|
|
278
|
+
* @memberof Rectangle
|
|
279
|
+
* @static
|
|
280
|
+
*/
|
|
281
|
+
Rectangle.computeEastHeightInMeters = function (rectangle, ellipsoid) {
|
|
282
|
+
return Cartographic.surfaceDistance(rectangle.northeast, rectangle.southeast, ellipsoid);
|
|
283
|
+
};
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* 计算矩形中心线处的宽度。
|
|
287
|
+
* @param {Rectangle} rectangle 目标矩形。
|
|
288
|
+
* @param {Ellipsoid} [ellipsoid] 参考椭球体。
|
|
289
|
+
* @returns {number} 中心线处的宽度,单位米。
|
|
290
|
+
* @memberof Rectangle
|
|
291
|
+
* @static
|
|
292
|
+
*/
|
|
293
|
+
Rectangle.computeCentreWidthInMeters = function (rectangle, ellipsoid) {
|
|
294
|
+
const center = rectangle.center;
|
|
295
|
+
const left = new Cartographic(rectangle.west, center.latitude);
|
|
296
|
+
const right = new Cartographic(rectangle.east, center.latitude);
|
|
297
|
+
return Cartographic.surfaceDistance(left, right, ellipsoid);
|
|
298
|
+
};
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* 计算矩形中心线处的高度。
|
|
302
|
+
* @param {Rectangle} rectangle 目标矩形。
|
|
303
|
+
* @param {Ellipsoid} [ellipsoid] 参考椭球体。
|
|
304
|
+
* @returns {number} 中心线处的高度,单位米。
|
|
305
|
+
* @memberof Rectangle
|
|
306
|
+
* @static
|
|
307
|
+
*/
|
|
308
|
+
Rectangle.computeCentreHeightInMeters = function (rectangle, ellipsoid) {
|
|
309
|
+
const center = rectangle.center;
|
|
310
|
+
const top = new Cartographic(center.longitude, rectangle.north);
|
|
311
|
+
const bottom = new Cartographic(center.longitude, rectangle.south);
|
|
312
|
+
return Cartographic.surfaceDistance(top, bottom, ellipsoid);
|
|
313
|
+
};
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* 计算包含一组矩形的最小外接矩形(并集)。
|
|
317
|
+
* @param {Rectangle[]} rectangles 矩形数组。
|
|
318
|
+
* @param {Rectangle} [result] 用于存储结果的可选对象。
|
|
319
|
+
* @returns {Rectangle} 包含所有矩形的最小外接矩形。
|
|
320
|
+
* @memberof Rectangle
|
|
321
|
+
* @static
|
|
322
|
+
*/
|
|
323
|
+
Rectangle.fromRectangles = function (rectangles, result) {
|
|
324
|
+
Check.typeOf.array('rectangles', rectangles);
|
|
325
|
+
if (!result)
|
|
326
|
+
result = new Rectangle();
|
|
327
|
+
for (let i = 1; i < rectangles.length; i++) {
|
|
328
|
+
const rectangle = rectangles[i];
|
|
329
|
+
if (i === 1)
|
|
330
|
+
Rectangle.union(rectangles[0], rectangle, result);
|
|
331
|
+
else
|
|
332
|
+
Rectangle.union(result, rectangle, result);
|
|
333
|
+
}
|
|
334
|
+
return result;
|
|
335
|
+
};
|
|
336
|
+
|
|
337
|
+
/**
|
|
338
|
+
* 从中心点与宽、高(单位米)创建矩形。
|
|
339
|
+
* @param {Cartographic|Cartesian3|Geographic} center 矩形中心点。
|
|
340
|
+
* @param {number} width 矩形宽度,单位米,须大于 0。
|
|
341
|
+
* @param {number} height 矩形高度,单位米,须大于 0。
|
|
342
|
+
* @param {Ellipsoid} [ellipsoid] 参考椭球体。
|
|
343
|
+
* @param {Rectangle} [result] 用于存储结果的可选对象。
|
|
344
|
+
* @returns {Rectangle} 生成的矩形。
|
|
345
|
+
* @memberof Rectangle
|
|
346
|
+
* @static
|
|
347
|
+
*/
|
|
348
|
+
Rectangle.fromCenterWidthHeight = function (center, width, height, ellipsoid, result) {
|
|
349
|
+
Check.defined('center', center);
|
|
350
|
+
Check.typeOf.number.greaterThan('width', width, 0);
|
|
351
|
+
Check.typeOf.number.greaterThan('height', height, 0);
|
|
352
|
+
|
|
353
|
+
let centerCar;
|
|
354
|
+
if (center instanceof Cartographic)
|
|
355
|
+
centerCar = center;
|
|
356
|
+
else if (center instanceof Cartesian3 || center instanceof Geographic)
|
|
357
|
+
centerCar = center.toCartographic(ellipsoid);
|
|
358
|
+
else
|
|
359
|
+
throw new DeveloperError('illegal center value.');
|
|
360
|
+
|
|
361
|
+
const halfWidth = width / 2;
|
|
362
|
+
const halfHeight = height / 2;
|
|
363
|
+
|
|
364
|
+
const northCar = Cartographic.moveToNorth(centerCar, halfHeight, ellipsoid);
|
|
365
|
+
const southCar = Cartographic.moveToSouth(centerCar, halfHeight, ellipsoid);
|
|
366
|
+
const eastCar = Cartographic.moveToEast(centerCar, halfWidth, ellipsoid);
|
|
367
|
+
const westCar = Cartographic.moveToWest(centerCar, halfWidth, ellipsoid);
|
|
368
|
+
|
|
369
|
+
return Rectangle.fromCartographicArray([northCar, southCar, eastCar, westCar], result);
|
|
370
|
+
};
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* 从中心点与尺寸对象(x 为宽、y 为高,单位米)创建矩形。
|
|
374
|
+
* @param {Cartographic|Cartesian3|Geographic} center 矩形中心点。
|
|
375
|
+
* @param {Cartesian2} dimensions 尺寸对象,x 为宽度、y 为高度,单位米。
|
|
376
|
+
* @param {Ellipsoid} [ellipsoid] 参考椭球体。
|
|
377
|
+
* @param {Rectangle} [result] 用于存储结果的可选对象。
|
|
378
|
+
* @returns {Rectangle} 生成的矩形。
|
|
379
|
+
* @memberof Rectangle
|
|
380
|
+
* @static
|
|
381
|
+
*/
|
|
382
|
+
Rectangle.fromCenterDimensions = function (center, dimensions, ellipsoid, result) {
|
|
383
|
+
Check.defined('dimensions', dimensions);
|
|
384
|
+
return Rectangle.fromCenterWidthHeight(center, dimensions.x, dimensions.y, ellipsoid, result);
|
|
385
|
+
};
|
|
386
|
+
|
|
387
|
+
/**
|
|
388
|
+
* 从一组地理坐标点创建包含这些点的矩形。
|
|
389
|
+
* @param {Array} geographics 地理坐标点数组。
|
|
390
|
+
* @param {Ellipsoid} [ellipsoid] 参考椭球体。
|
|
391
|
+
* @param {Rectangle} [result] 用于存储结果的可选对象。
|
|
392
|
+
* @returns {Rectangle} 包含所有点的矩形。
|
|
393
|
+
* @memberof Rectangle
|
|
394
|
+
* @static
|
|
395
|
+
*/
|
|
396
|
+
Rectangle.fromGeographicArray = function (geographics, ellipsoid, result) {
|
|
397
|
+
const cartesians = Cartesian3.fromGeographicArray(geographics, ellipsoid);
|
|
398
|
+
return Rectangle.fromCartesianArray(cartesians, ellipsoid, result);
|
|
399
|
+
};
|
|
400
|
+
|
|
401
|
+
/**
|
|
402
|
+
* 计算矩形四个角点的地理坐标(按西北、东北、东南、西南顺序)。
|
|
403
|
+
* @param {Rectangle|object} options 矩形对象,或包含 rectangle 与可选 height 的配置对象。
|
|
404
|
+
* @param {Array} [result=[]] 用于存储结果的数组。
|
|
405
|
+
* @returns {Array} 矩形四个角点的 Cartographic 数组。
|
|
406
|
+
* @memberof Rectangle
|
|
407
|
+
* @static
|
|
408
|
+
*/
|
|
409
|
+
Rectangle.computeRectangleCartographics = function (options, result = []) {
|
|
410
|
+
Check.defined('options', options);
|
|
411
|
+
if (options instanceof Rectangle)
|
|
412
|
+
options = {
|
|
413
|
+
rectangle: options
|
|
414
|
+
};
|
|
415
|
+
Check.defined('options.rectangle', options.rectangle);
|
|
416
|
+
|
|
417
|
+
const rectangle = options.rectangle;
|
|
418
|
+
const height = options.height;
|
|
419
|
+
|
|
420
|
+
result[0] = rectangle.northwest;
|
|
421
|
+
result[1] = rectangle.northeast;
|
|
422
|
+
result[2] = rectangle.southeast;
|
|
423
|
+
result[3] = rectangle.southwest;
|
|
424
|
+
|
|
425
|
+
if (defined(height)) {
|
|
426
|
+
result[0].height = height;
|
|
427
|
+
result[1].height = height;
|
|
428
|
+
result[2].height = height;
|
|
429
|
+
result[3].height = height;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
return result;
|
|
433
|
+
};
|
|
434
|
+
|
|
435
|
+
/**
|
|
436
|
+
* 计算矩形四个角点的地理坐标数组。
|
|
437
|
+
* @param {Rectangle|object} options 矩形对象,或包含 rectangle 与可选 height 的配置对象。
|
|
438
|
+
* @param {Array} [result] 用于存储结果的数组。
|
|
439
|
+
* @returns {Array} 矩形四个角点的 Geographic 数组。
|
|
440
|
+
* @memberof Rectangle
|
|
441
|
+
* @static
|
|
442
|
+
*/
|
|
443
|
+
Rectangle.computeRectangleGeographics = function (options, result) {
|
|
444
|
+
const cartographics = Rectangle.computeRectangleCartographics(options);
|
|
445
|
+
|
|
446
|
+
return Geographic.fromCartographicArray(cartographics, result);
|
|
447
|
+
};
|
|
448
|
+
|
|
449
|
+
/**
|
|
450
|
+
* 计算矩形四个角点的世界坐标数组。
|
|
451
|
+
* @param {Rectangle|object} options 矩形对象,或包含 rectangle 与可选 height 的配置对象。
|
|
452
|
+
* @param {Array} [result] 用于存储结果的数组。
|
|
453
|
+
* @returns {Array} 矩形四个角点的 Cartesian3 数组。
|
|
454
|
+
* @memberof Rectangle
|
|
455
|
+
* @static
|
|
456
|
+
*/
|
|
457
|
+
Rectangle.computeRectanglePositions = function (options, result) {
|
|
458
|
+
const cartographics = Rectangle.computeRectangleCartographics(options);
|
|
459
|
+
|
|
460
|
+
return Cartesian3.fromCartographicArray(cartographics, result);
|
|
461
|
+
};
|
|
462
|
+
|
|
463
|
+
/**
|
|
464
|
+
* 判断给定的地理坐标(Cartographic)是否位于矩形范围内。
|
|
465
|
+
* @param {Rectangle} rectangle 目标矩形。
|
|
466
|
+
* @param {Cartographic} cartographic 待判断的地理坐标。
|
|
467
|
+
* @returns {boolean} 若点在矩形内返回 true,否则返回 false。
|
|
468
|
+
* @memberof Rectangle
|
|
469
|
+
* @static
|
|
470
|
+
*/
|
|
471
|
+
Rectangle.containsCartographicPoint = function (rectangle, cartographic) {
|
|
472
|
+
Check.defined('rectangle', rectangle);
|
|
473
|
+
Check.defined('cartographic', cartographic);
|
|
474
|
+
cartographic = parseToCartographic(cartographic);
|
|
475
|
+
let east = rectangle.east;
|
|
476
|
+
const west = rectangle.west;
|
|
477
|
+
if (east < west) {
|
|
478
|
+
east += CesiumMath.TWO_PI;
|
|
479
|
+
}
|
|
480
|
+
const south = rectangle.south;
|
|
481
|
+
const north = rectangle.north;
|
|
482
|
+
if (cartographic.longitude < west || cartographic.longitude > east || cartographic.latitude < south || cartographic.latitude > north)
|
|
483
|
+
return false;
|
|
484
|
+
return true;
|
|
485
|
+
};
|
|
486
|
+
|
|
487
|
+
/**
|
|
488
|
+
* 判断给定的地理坐标(Cartographic)是否位于当前矩形范围内。
|
|
489
|
+
* @param {Cartographic} cartographic 待判断的地理坐标。
|
|
490
|
+
* @returns {boolean} 若点在矩形内返回 true,否则返回 false。
|
|
491
|
+
* @memberof Rectangle
|
|
492
|
+
*/
|
|
493
|
+
Rectangle.prototype.containsCartographicPoint = function (cartographic) {
|
|
494
|
+
return Rectangle.containsCartographicPoint(this, cartographic);
|
|
495
|
+
};
|
|
496
|
+
|
|
497
|
+
/**
|
|
498
|
+
* 判断给定的地理坐标(Geographic)是否位于矩形范围内。
|
|
499
|
+
* @param {Rectangle} rectangle 目标矩形。
|
|
500
|
+
* @param {Geographic} geographic 待判断的地理坐标。
|
|
501
|
+
* @returns {boolean} 若点在矩形内返回 true,否则返回 false。
|
|
502
|
+
* @memberof Rectangle
|
|
503
|
+
* @static
|
|
504
|
+
*/
|
|
505
|
+
Rectangle.containsGeographicPoint = function (rectangle, geographic) {
|
|
506
|
+
Check.defined('rectangle', rectangle);
|
|
507
|
+
Check.defined('geographic', geographic);
|
|
508
|
+
geographic = parseToGeographic(geographic);
|
|
509
|
+
const cartographic = geographic.toCartographic();
|
|
510
|
+
return Rectangle.containsCartographicPoint(rectangle, cartographic);
|
|
511
|
+
};
|
|
512
|
+
|
|
513
|
+
/**
|
|
514
|
+
* 判断给定的地理坐标(Geographic)是否位于当前矩形范围内。
|
|
515
|
+
* @param {Geographic} geographic 待判断的地理坐标。
|
|
516
|
+
* @returns {boolean} 若点在矩形内返回 true,否则返回 false。
|
|
517
|
+
* @memberof Rectangle
|
|
518
|
+
*/
|
|
519
|
+
Rectangle.prototype.containsGeographicPoint = function (geographic) {
|
|
520
|
+
return Rectangle.containsGeographicPoint(this, geographic);
|
|
521
|
+
};
|
|
522
|
+
|
|
523
|
+
/**
|
|
524
|
+
* 判断给定的世界坐标位置是否位于矩形范围内。
|
|
525
|
+
* @param {Rectangle} rectangle 目标矩形。
|
|
526
|
+
* @param {Cartesian3} position 待判断的世界坐标位置。
|
|
527
|
+
* @param {Ellipsoid} [ellipsoid] 参考椭球体。
|
|
528
|
+
* @returns {boolean} 若点在矩形内返回 true,否则返回 false。
|
|
529
|
+
* @memberof Rectangle
|
|
530
|
+
* @static
|
|
531
|
+
*/
|
|
532
|
+
Rectangle.containsPoint = function (rectangle, position, ellipsoid) {
|
|
533
|
+
Check.defined('rectangle', rectangle);
|
|
534
|
+
Check.defined('position', position);
|
|
535
|
+
position = parseToCartesian3(position);
|
|
536
|
+
const cartographic = position.toCartographic(ellipsoid);
|
|
537
|
+
return Rectangle.containsCartographicPoint(rectangle, cartographic);
|
|
538
|
+
};
|
|
539
|
+
|
|
540
|
+
/**
|
|
541
|
+
* 判断给定的世界坐标位置是否位于当前矩形范围内。
|
|
542
|
+
* @param {Cartesian3} position 待判断的世界坐标位置。
|
|
543
|
+
* @param {Ellipsoid} [ellipsoid] 参考椭球体。
|
|
544
|
+
* @returns {boolean} 若点在矩形内返回 true,否则返回 false。
|
|
545
|
+
* @memberof Rectangle
|
|
546
|
+
*/
|
|
547
|
+
Rectangle.prototype.containsPoint = function (position, ellipsoid) {
|
|
548
|
+
return Rectangle.containsPoint(this, position, ellipsoid);
|
|
549
|
+
};
|
|
550
|
+
|
|
551
|
+
/**
|
|
552
|
+
* 将当前矩形各边界以角度值输出到对象中。
|
|
553
|
+
* @param {object} [result={}] 用于存储结果的对象。
|
|
554
|
+
* @returns {object} 包含 west、south、east、north(单位度)的对象。
|
|
555
|
+
* @memberof Rectangle
|
|
556
|
+
*/
|
|
557
|
+
Rectangle.prototype.toDegrees = function (result = {}) {
|
|
558
|
+
result.west = this.westDegrees;
|
|
559
|
+
result.south = this.southDegrees;
|
|
560
|
+
result.east = this.eastDegrees;
|
|
561
|
+
result.north = this.northDegrees;
|
|
562
|
+
// result.northwest = this.northwest.toGeographic();
|
|
563
|
+
// result.northeast = this.northeast.toGeographic();
|
|
564
|
+
// result.southwest = this.southwest.toGeographic();
|
|
565
|
+
// result.southeast = this.southeast.toGeographic();
|
|
566
|
+
return result;
|
|
567
|
+
};
|
|
568
|
+
|
|
569
|
+
export default Rectangle;
|
|
570
|
+
export { Rectangle };
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { Cartesian3, Cartesian4, defined, Matrix4, SceneTransforms } from "cesium";
|
|
2
|
+
import Scratch from "../utils/Scratch.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 扩展 Cesium 的 SceneTransforms 类,补充 NDC 与世界坐标互转、
|
|
6
|
+
* 以及世界坐标转视空间坐标的方法。
|
|
7
|
+
* @class SceneTransforms
|
|
8
|
+
* @see {@link https://cesium.com/learn/cesiumjs/ref-doc/SceneTransforms.html}
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* 将归一化设备坐标(NDC)转换为世界坐标。
|
|
13
|
+
* @param {Scene} scene 场景对象。
|
|
14
|
+
* @param {Cartesian4} ndcPosition 归一化设备坐标位置。
|
|
15
|
+
* @param {Cartesian3} [result] 用于存储结果的可选对象。
|
|
16
|
+
* @returns {Cartesian3} 转换后的世界坐标。
|
|
17
|
+
* @memberof SceneTransforms
|
|
18
|
+
* @static
|
|
19
|
+
*/
|
|
20
|
+
SceneTransforms.ndcToWorldCoordinates = function (scene, ndcPosition, result) {
|
|
21
|
+
const context = scene.context;
|
|
22
|
+
const uniformState = context.uniformState;
|
|
23
|
+
let worldCoords;
|
|
24
|
+
let frustum = scene.camera.frustum;
|
|
25
|
+
if (!defined(frustum.fovy)) {
|
|
26
|
+
if (defined(frustum._offCenterFrustum)) {
|
|
27
|
+
frustum = frustum._offCenterFrustum;
|
|
28
|
+
}
|
|
29
|
+
worldCoords = Scratch.scratchCartesian4;
|
|
30
|
+
worldCoords.x = (ndcPosition.x * (frustum.right - frustum.left) + frustum.left + frustum.right) * 0.5;
|
|
31
|
+
worldCoords.y = (ndcPosition.y * (frustum.top - frustum.bottom) + frustum.bottom + frustum.top) * 0.5;
|
|
32
|
+
worldCoords.z = (ndcPosition.z * (near - far) - near - far) * 0.5;
|
|
33
|
+
worldCoords.w = 1.0;
|
|
34
|
+
|
|
35
|
+
worldCoords = Matrix4.multiplyByVector(uniformState.inverseView, worldCoords, worldCoords);
|
|
36
|
+
} else {
|
|
37
|
+
const ndc = Cartesian4.fromElements(ndcPosition.x, ndcPosition.y, ndcPosition.z, 1, Scratch.scratchNDC);
|
|
38
|
+
worldCoords = Matrix4.multiplyByVector(uniformState.inverseViewProjection, ndc, Scratch.scratchCartesian4);
|
|
39
|
+
|
|
40
|
+
// Reverse perspective divide
|
|
41
|
+
const w = 1.0 / worldCoords.w;
|
|
42
|
+
Cartesian3.multiplyByScalar(worldCoords, w, worldCoords);
|
|
43
|
+
}
|
|
44
|
+
return Cartesian3.fromCartesian4(worldCoords, result);
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* 将世界坐标位置转换为归一化设备坐标(NDC)。
|
|
49
|
+
* @param {Scene} scene 场景对象。
|
|
50
|
+
* @param {Cartesian3} position 世界坐标位置。
|
|
51
|
+
* @param {Cartesian3} [result=new Cartesian3()] 用于存储结果的可选对象。
|
|
52
|
+
* @returns {Cartesian3} 转换后的归一化设备坐标。
|
|
53
|
+
* @memberof SceneTransforms
|
|
54
|
+
* @static
|
|
55
|
+
*/
|
|
56
|
+
SceneTransforms.cartesianToNDC = function (scene, position, result = new Cartesian3()) {
|
|
57
|
+
const context = scene.context;
|
|
58
|
+
const uniformState = context.uniformState;
|
|
59
|
+
const worldCoords = Cartesian4.fromElements(position.x, position.y, position.z, 1, Scratch.scratchCartesian4);
|
|
60
|
+
const ndc = Matrix4.multiplyByVector(uniformState.viewProjection, worldCoords, Scratch.scratchNDC);
|
|
61
|
+
return Cartesian3.divideByScalar(ndc, ndc.w, result);
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* 将世界坐标位置转换为相机视空间坐标。
|
|
66
|
+
* @param {Scene} scene 场景对象。
|
|
67
|
+
* @param {Cartesian3} position 世界坐标位置。
|
|
68
|
+
* @param {Cartesian4} [result=new Cartesian4()] 用于存储结果的可选对象。
|
|
69
|
+
* @returns {Cartesian4} 相机视空间坐标。
|
|
70
|
+
* @memberof SceneTransforms
|
|
71
|
+
* @static
|
|
72
|
+
*/
|
|
73
|
+
SceneTransforms.cartesianToEyeCoordinates = function (scene, position, result = new Cartesian4()) {
|
|
74
|
+
const camera = scene.camera;
|
|
75
|
+
const viewMatrix = camera.viewMatrix;
|
|
76
|
+
const worldCoords = Cartesian4.fromElements(position.x, position.y, position.z, 1, Scratch.scratchCartesian4);
|
|
77
|
+
Matrix4.multiplyByVector(viewMatrix, worldCoords, result);
|
|
78
|
+
return result;
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
export default SceneTransforms;
|
|
82
|
+
export { SceneTransforms };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Spherical, Math as CesiumMath } from "cesium";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 扩展 Cesium 的 Spherical 类,补充以角度表示的 clock、cone 属性。
|
|
5
|
+
* @class Spherical
|
|
6
|
+
* @see {@link https://cesium.com/learn/cesiumjs/ref-doc/Spherical.html}
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
Object.defineProperties(Spherical.prototype, {
|
|
10
|
+
/**
|
|
11
|
+
* 绕 z 轴的旋转角(clock),单位度。
|
|
12
|
+
* @name clockDegrees
|
|
13
|
+
* @type {number}
|
|
14
|
+
* @memberof Spherical
|
|
15
|
+
*/
|
|
16
|
+
clockDegrees: {
|
|
17
|
+
get: function () {
|
|
18
|
+
return CesiumMath.toDegrees(this.clock);
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
/**
|
|
22
|
+
* 与 z 轴的夹角(cone),单位度。
|
|
23
|
+
* @name coneDegrees
|
|
24
|
+
* @type {number}
|
|
25
|
+
* @memberof Spherical
|
|
26
|
+
*/
|
|
27
|
+
coneDegrees: {
|
|
28
|
+
get: function () {
|
|
29
|
+
return CesiumMath.toDegrees(this.cone);
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
export default Spherical;
|
|
35
|
+
export { Spherical };
|