@lijuhong1981/cesium.utils 0.0.0-stage → 0.1.1

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.
Files changed (99) hide show
  1. package/README.md +62 -2
  2. package/package.json +45 -4
  3. package/src/additions/Geographic.js +603 -0
  4. package/src/additions/GeographicTransform.js +291 -0
  5. package/src/additions/GeometryInstanceAttributes.js +164 -0
  6. package/src/additions/ModelMatrixTransforms.js +822 -0
  7. package/src/additions/PropertyChangedListener.js +72 -0
  8. package/src/additions/PropertyType.js +30 -0
  9. package/src/additions/StTransforms.js +266 -0
  10. package/src/additions/TranslationRotationScaleTransform.js +809 -0
  11. package/src/additions/index.js +8 -0
  12. package/src/index.js +4 -0
  13. package/src/parses/index.js +46 -0
  14. package/src/parses/parseAltitude.js +32 -0
  15. package/src/parses/parseArcType.js +26 -0
  16. package/src/parses/parseAttitudeToHeadingPitchRoll.js +26 -0
  17. package/src/parses/parseAttitudeToMatrix3.js +17 -0
  18. package/src/parses/parseAttitudeToQuaternion.js +21 -0
  19. package/src/parses/parseCartographicToCartesian.js +21 -0
  20. package/src/parses/parseCartographicsToPositions.js +20 -0
  21. package/src/parses/parseClassificationType.js +24 -0
  22. package/src/parses/parseClockRange.js +26 -0
  23. package/src/parses/parseColorBlendMode.js +26 -0
  24. package/src/parses/parseCornerType.js +24 -0
  25. package/src/parses/parseCullFace.js +28 -0
  26. package/src/parses/parseEulerToHeadingPitchRoll.js +21 -0
  27. package/src/parses/parseEulerToQuaternion.js +18 -0
  28. package/src/parses/parseGeographicToCartesian.js +21 -0
  29. package/src/parses/parseGeographicsToPositions.js +20 -0
  30. package/src/parses/parseHeading.js +28 -0
  31. package/src/parses/parseHeightReference.js +24 -0
  32. package/src/parses/parseHorizontalOrigin.js +26 -0
  33. package/src/parses/parseLabelStyle.js +26 -0
  34. package/src/parses/parseLatitude.js +28 -0
  35. package/src/parses/parseLongitude.js +28 -0
  36. package/src/parses/parsePitch.js +26 -0
  37. package/src/parses/parseRoll.js +26 -0
  38. package/src/parses/parseRotationToHeadingPitchRoll.js +40 -0
  39. package/src/parses/parseRotationToMatrix3.js +25 -0
  40. package/src/parses/parseRotationToQuaternion.js +27 -0
  41. package/src/parses/parseShadowMode.js +26 -0
  42. package/src/parses/parseToBoundingRectangle.js +33 -0
  43. package/src/parses/parseToCartesian2.js +35 -0
  44. package/src/parses/parseToCartesian3.js +37 -0
  45. package/src/parses/parseToCartesian3Array.js +21 -0
  46. package/src/parses/parseToCartesian4.js +39 -0
  47. package/src/parses/parseToCartographic.js +31 -0
  48. package/src/parses/parseToColor.js +33 -0
  49. package/src/parses/parseToDistanceDisplayCondition.js +41 -0
  50. package/src/parses/parseToGeographic.js +31 -0
  51. package/src/parses/parseToHeadingPitchRange.js +45 -0
  52. package/src/parses/parseToJulianDate.js +23 -0
  53. package/src/parses/parseToNearFarScalar.js +33 -0
  54. package/src/parses/parseToPlane.js +37 -0
  55. package/src/parses/parseToPolygonHierarchy.js +48 -0
  56. package/src/parses/parseToRange.js +26 -0
  57. package/src/parses/parseToRectangle.js +32 -0
  58. package/src/parses/parseToTimeInterval.js +45 -0
  59. package/src/parses/parseVerticalOrigin.js +28 -0
  60. package/src/revisions/BoundingSphere.revise.js +107 -0
  61. package/src/revisions/Camera.revise.js +366 -0
  62. package/src/revisions/Cartesian.revise.js +313 -0
  63. package/src/revisions/Cartographic.revise.js +443 -0
  64. package/src/revisions/Check.revise.js +164 -0
  65. package/src/revisions/Color.revise.js +271 -0
  66. package/src/revisions/DistanceDisplayCondition.revise.js +37 -0
  67. package/src/revisions/Ellipsoid.revise.js +64 -0
  68. package/src/revisions/Geometry.revise.js +79 -0
  69. package/src/revisions/Globe.revise.js +92 -0
  70. package/src/revisions/HeadingPitchRoll.revise.js +328 -0
  71. package/src/revisions/JulianDate.revise.js +28 -0
  72. package/src/revisions/Material.revise.js +308 -0
  73. package/src/revisions/Math.revise.js +98 -0
  74. package/src/revisions/Matrix.revise.js +578 -0
  75. package/src/revisions/POI.revise.js +178 -0
  76. package/src/revisions/Plane.revise.js +43 -0
  77. package/src/revisions/PolylinePipeline.revise.js +54 -0
  78. package/src/revisions/PostProcessStageLibrary.revise.js +1143 -0
  79. package/src/revisions/Primitive.revise.js +83 -0
  80. package/src/revisions/Property.revise.js +37 -0
  81. package/src/revisions/Quaternion.revise.js +66 -0
  82. package/src/revisions/Rectangle.revise.js +570 -0
  83. package/src/revisions/SceneTransforms.revise.js +82 -0
  84. package/src/revisions/Spherical.revise.js +35 -0
  85. package/src/revisions/index.js +25 -0
  86. package/src/utils/Scratch.js +165 -0
  87. package/src/utils/computeCirclePositions.js +48 -0
  88. package/src/utils/computeCircleRadius.js +19 -0
  89. package/src/utils/computeModelMatrix.js +109 -0
  90. package/src/utils/computeStTransform.js +57 -0
  91. package/src/utils/createGeometry.js +114 -0
  92. package/src/utils/createPointCloudGeometry.js +79 -0
  93. package/src/utils/getGeometryInstanceAttributes.js +43 -0
  94. package/src/utils/getPositionFromTarget.js +29 -0
  95. package/src/utils/getRenderState.js +35 -0
  96. package/src/utils/index.js +13 -0
  97. package/src/utils/isColorMaterial.js +13 -0
  98. package/src/utils/isTranslucent.js +13 -0
  99. 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 };