vesium 1.0.1-beta.52 → 1.0.1-beta.57

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.
@@ -1,1604 +1,1021 @@
1
- (function(exports, __vueuse_core, cesium, vue) {
1
+ (function(exports, __vueuse_core, cesium, vue, __vesium_shared) {
2
2
 
3
- //#region rolldown:runtime
4
- var __create = Object.create;
5
- var __defProp = Object.defineProperty;
6
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
- var __getOwnPropNames = Object.getOwnPropertyNames;
8
- var __getProtoOf = Object.getPrototypeOf;
9
- var __hasOwnProp = Object.prototype.hasOwnProperty;
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
12
- key = keys[i];
13
- if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
14
- get: ((k) => from[k]).bind(null, key),
15
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
16
- });
17
- }
18
- return to;
19
- };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
21
- value: mod,
22
- enumerable: true
23
- }) : target, mod));
24
-
25
- //#endregion
26
- __vueuse_core = __toESM(__vueuse_core);
27
- cesium = __toESM(cesium);
28
- vue = __toESM(vue);
29
3
 
30
4
  //#region createViewer/index.ts
31
5
  /**
32
- * @internal
33
- */
34
- const CREATE_VIEWER_INJECTION_KEY = Symbol("CREATE_VIEWER_INJECTION_KEY");
35
- /**
36
- * @internal
37
- */
38
- const CREATE_VIEWER_COLLECTION = /* @__PURE__ */ new WeakMap();
39
- /**
40
- */
41
- function createViewer(...args) {
42
- const viewer = (0, vue.shallowRef)();
43
- const readonlyViewer = (0, vue.shallowReadonly)(viewer);
44
- (0, vue.provide)(CREATE_VIEWER_INJECTION_KEY, readonlyViewer);
45
- const scope = (0, vue.getCurrentScope)();
46
- if (scope) CREATE_VIEWER_COLLECTION.set(scope, readonlyViewer);
47
- const canvas = (0, vue.computed)(() => viewer.value?.canvas);
48
- (0, __vueuse_core.useMutationObserver)(document?.body, () => {
49
- if (canvas.value && !document?.body.contains(canvas.value)) viewer.value = void 0;
50
- }, {
51
- childList: true,
52
- subtree: true
53
- });
54
- (0, vue.watchEffect)((onCleanup) => {
55
- const [arg1, arg2] = args;
56
- const value = (0, vue.toRaw)((0, vue.toValue)(arg1));
57
- if (value instanceof cesium.Viewer) viewer.value = (0, vue.markRaw)(value);
58
- else if (value) {
59
- const element = value;
60
- const options = arg2;
61
- viewer.value = new cesium.Viewer(element, options);
62
- onCleanup(() => !viewer.value?.isDestroyed() && viewer.value?.destroy());
63
- } else viewer.value = void 0;
64
- });
65
- (0, __vueuse_core.tryOnScopeDispose)(() => {
66
- viewer.value = void 0;
67
- });
68
- return (0, vue.computed)(() => {
69
- return viewer.value?.isDestroyed() ? void 0 : viewer.value;
70
- });
71
- }
72
-
73
- //#endregion
74
- //#region utils/arrayDiff.ts
75
- /**
76
- * 计算两个数组的差异,返回新增和删除的元素
77
- */
78
- function arrayDiff(list, oldList) {
79
- const oldListSet = new Set(oldList);
80
- const added = list.filter((obj) => !oldListSet.has(obj));
81
- const newListSet = new Set(list);
82
- const removed = oldList?.filter((obj) => !newListSet.has(obj)) ?? [];
83
- return {
84
- added,
85
- removed
86
- };
87
- }
88
-
89
- //#endregion
90
- //#region utils/canvasCoordToCartesian.ts
91
- /**
92
- * Convert canvas coordinates to Cartesian coordinates
93
- *
94
- * @param canvasCoord Canvas coordinates
95
- * @param scene Cesium.Scene instance
96
- * @param mode optional values are 'pickPosition' | 'globePick' | 'auto' | 'noHeight' @default 'auto'
97
- *
98
- * `pickPosition`: Use scene.pickPosition for conversion, which can be used for picking models, oblique photography, etc.
99
- * However, if depth detection is not enabled (globe.depthTestAgainstTerrain=false), picking terrain or inaccurate issues may occur
100
- *
101
- * `globePick`: Use camera.getPickRay for conversion, which cannot be used for picking models or oblique photography,
102
- * but can be used for picking terrain. If terrain does not exist, the picked elevation is 0
103
- *
104
- * `auto`: Automatically determine which picking content to return
105
- *
106
- * Calculation speed comparison: globePick > auto >= pickPosition
107
- */
108
- function canvasCoordToCartesian(canvasCoord, scene, mode = "auto") {
109
- if (mode === "pickPosition") return scene.pickPosition(canvasCoord);
110
- else if (mode === "globePick") {
111
- const ray = scene.camera.getPickRay(canvasCoord);
112
- return ray && scene.globe.pick(ray, scene);
113
- } else {
114
- if (scene.globe.depthTestAgainstTerrain) return scene.pickPosition(canvasCoord);
115
- const position1 = scene.pickPosition(canvasCoord);
116
- const ray = scene.camera.getPickRay(canvasCoord);
117
- const position2 = ray && scene.globe.pick(ray, scene);
118
- if (!position1) return position2;
119
- const height1 = (position1 && cesium.Ellipsoid.WGS84.cartesianToCartographic(position1).height) ?? 0;
120
- const height2 = (position2 && cesium.Ellipsoid.WGS84.cartesianToCartographic(position2).height) ?? 0;
121
- return height1 < height2 ? position1 : position2;
122
- }
123
- }
124
-
125
- //#endregion
126
- //#region utils/cartesianToCanvasCoord.ts
127
- /**
128
- * Convert Cartesian coordinates to canvas coordinates
129
- *
130
- * @param position Cartesian coordinates
131
- * @param scene Cesium.Scene instance
132
- */
133
- function cartesianToCanvasCoord(position, scene) {
134
- return scene.cartesianToCanvasCoordinates(position);
135
- }
136
-
137
- //#endregion
138
- //#region utils/is.ts
139
- const toString = Object.prototype.toString;
140
- function isDef(val) {
141
- return typeof val !== "undefined";
142
- }
143
- function isBoolean(val) {
144
- return typeof val === "boolean";
145
- }
146
- function isFunction(val) {
147
- return typeof val === "function";
148
- }
149
- function isNumber(val) {
150
- return typeof val === "number";
151
- }
152
- function isString(val) {
153
- return typeof val === "string";
154
- }
155
- function isObject(val) {
156
- return toString.call(val) === "[object Object]";
157
- }
158
- function isWindow(val) {
159
- return typeof window !== "undefined" && toString.call(val) === "[object Window]";
160
- }
161
- function isPromise(val) {
162
- return !!val && (typeof val === "object" || typeof val === "function") && typeof val.then === "function";
163
- }
164
- function isElement(val) {
165
- return !!(val && val.nodeName && val.nodeType === 1);
166
- }
167
- const isArray = Array.isArray;
168
- function isBase64(val) {
169
- const reg = /^\s*data:([a-z]+\/[\d+.a-z-]+(;[a-z-]+=[\da-z-]+)?)?(;base64)?,([\s\w!$%&'()*+,./:;=?@~-]*?)\s*$/i;
170
- return reg.test(val);
171
- }
172
- function assertError(condition, error) {
173
- if (condition) throw new Error(error);
174
- }
175
-
176
- //#endregion
177
- //#region utils/cesiumEquals.ts
178
- /**
179
- * Determines if two Cesium objects are equal.
180
- *
181
- * This function not only judges whether the instances are equal,
182
- * but also judges the equals method in the example.
183
- *
184
- * @param left The first Cesium object
185
- * @param right The second Cesium object
186
- * @returns Returns true if the two Cesium objects are equal, otherwise false
187
- */
188
- function cesiumEquals(left, right) {
189
- return left === right || isFunction(left?.equals) && left.equals(right) || isFunction(right?.equals) && right.equals(left);
190
- }
191
-
192
- //#endregion
193
- //#region utils/toCoord.ts
194
- /**
195
- * Converts coordinates to an array or object in the specified format.
196
- *
197
- * @param position The coordinate to be converted, which can be a Cartesian3, Cartographic, array, or object.
198
- * @param options Conversion options, including conversion type and whether to include altitude information.
199
- * @returns The converted coordinate, which may be an array or object. If the input position is empty, undefined is returned.
200
- *
201
- * @template T Conversion type, optional values are 'Array' or 'Object', @default 'Array'.
202
- * @template Alt Whether to include altitude information, default is false
203
- */
204
- function toCoord(position, options = {}) {
205
- if (!position) return void 0;
206
- const { type = "Array", alt = false } = options;
207
- let longitude, latitude, height;
208
- if (position instanceof cesium.Cartesian3) {
209
- const cartographic = cesium.Ellipsoid.WGS84.cartesianToCartographic(position);
210
- longitude = cesium.Math.toDegrees(cartographic.longitude);
211
- latitude = cesium.Math.toDegrees(cartographic.latitude);
212
- height = cartographic.height;
213
- } else if (position instanceof cesium.Cartographic) {
214
- const cartographic = position;
215
- longitude = cesium.Math.toDegrees(cartographic.longitude);
216
- latitude = cesium.Math.toDegrees(cartographic.latitude);
217
- height = cartographic.height;
218
- } else if (Array.isArray(position)) {
219
- longitude = cesium.Math.toDegrees(position[0]);
220
- latitude = cesium.Math.toDegrees(position[1]);
221
- height = position[2];
222
- } else {
223
- longitude = position.longitude;
224
- latitude = position.latitude;
225
- height = position.height;
226
- }
227
- if (type === "Array") return alt ? [
228
- longitude,
229
- latitude,
230
- height
231
- ] : [longitude, latitude];
232
- else return alt ? {
233
- longitude,
234
- latitude,
235
- height
236
- } : {
237
- longitude,
238
- latitude
239
- };
240
- }
241
-
242
- //#endregion
243
- //#region utils/convertDMS.ts
244
- /**
245
- * Convert degrees to DMS (Degrees Minutes Seconds) format string
246
- *
247
- * @param degrees The angle value
248
- * @param precision The number of decimal places to retain for the seconds, defaults to 3
249
- * @returns A DMS formatted string in the format: degrees° minutes′ seconds″
250
- */
251
- function dmsEncode(degrees, precision = 3) {
252
- const str = `${degrees}`;
253
- let i = str.indexOf(".");
254
- const d = i < 0 ? str : str.slice(0, Math.max(0, i));
255
- let m = "0";
256
- let s = "0";
257
- if (i > 0) {
258
- m = `0${str.slice(Math.max(0, i))}`;
259
- m = `${+m * 60}`;
260
- i = m.indexOf(".");
261
- if (i > 0) {
262
- s = `0${m.slice(Math.max(0, i))}`;
263
- m = m.slice(0, Math.max(0, i));
264
- s = `${+s * 60}`;
265
- i = s.indexOf(".");
266
- s = s.slice(0, Math.max(0, i + 4));
267
- s = (+s).toFixed(precision);
268
- }
269
- }
270
- return `${Math.abs(+d)}°${+m}′${+s}″`;
271
- }
272
- /**
273
- * Decode a DMS (Degrees Minutes Seconds) formatted string to a decimal angle value
274
- *
275
- * @param dmsCode DMS formatted string, e.g. "120°30′45″N"
276
- * @returns The decoded decimal angle value, or 0 if decoding fails
277
- */
278
- function dmsDecode(dmsCode) {
279
- const [dd, msStr] = dmsCode.split("°") ?? [];
280
- const [mm, sStr] = msStr?.split("′") ?? [];
281
- const ss = sStr?.split("″")[0];
282
- const d = Number(dd) || 0;
283
- const m = (Number(mm) || 0) / 60;
284
- const s = (Number(ss) || 0) / 60 / 60;
285
- const degrees = d + m + s;
286
- if (degrees === 0) return 0;
287
- else {
288
- let res = degrees;
289
- if ([
290
- "W",
291
- "w",
292
- "S",
293
- "s"
294
- ].includes(dmsCode[dmsCode.length - 1])) res = -res;
295
- return res;
296
- }
297
- }
298
- /**
299
- * Convert latitude and longitude coordinates to degrees-minutes-seconds format
300
- *
301
- * @param position The latitude and longitude coordinates
302
- * @param precision The number of decimal places to retain for 'seconds', default is 3
303
- * @returns Returns the coordinates in degrees-minutes-seconds format, or undefined if the conversion fails
304
- */
305
- function degreesToDms(position, precision = 3) {
306
- const coord = toCoord(position, { alt: true });
307
- if (!coord) return;
308
- const [longitude, latitude, height] = coord;
309
- const x = dmsEncode(longitude, precision);
310
- const y = dmsEncode(latitude, precision);
311
- return [
312
- `${x}${longitude > 0 ? "E" : "W"}`,
313
- `${y}${latitude > 0 ? "N" : "S"}`,
314
- height
315
- ];
316
- }
317
- /**
318
- * Convert DMS (Degrees Minutes Seconds) format to decimal degrees for latitude and longitude coordinates
319
- *
320
- * @param dms The latitude or longitude coordinate in DMS format
321
- * @returns Returns the coordinate in decimal degrees format, or undefined if the conversion fails
322
- */
323
- function dmsToDegrees(dms) {
324
- const [x, y, height] = dms;
325
- const longitude = dmsDecode(x);
326
- const latitude = dmsDecode(y);
327
- return [
328
- longitude,
329
- latitude,
330
- Number(height) || 0
331
- ];
332
- }
333
-
334
- //#endregion
335
- //#region utils/isCesiumConstant.ts
336
- /**
337
- * Determines if the Cesium property is a constant.
338
- *
339
- * @param value Cesium property
340
- */
341
- function isCesiumConstant(value) {
342
- return !(0, cesium.defined)(value) || !!value.isConstant;
343
- }
344
-
345
- //#endregion
346
- //#region utils/material.ts
347
- /**
348
- * Only as a type fix for `Cesium.Material`
349
- */
350
- var CesiumMaterial = class extends cesium.Material {
351
- constructor(options) {
352
- super(options);
353
- }
354
- };
355
- /**
356
- * Get material from cache, alias of `Material._materialCache.getMaterial`
357
- */
358
- function getMaterialCache(type) {
359
- return cesium.Material._materialCache.getMaterial(type);
360
- }
361
- /**
362
- * Add material to Cesium's material cache, alias of `Material._materialCache.addMaterial`
363
- */
364
- function addMaterialCache(type, material) {
365
- return cesium.Material._materialCache.addMaterial(type, material);
366
- }
367
-
368
- //#endregion
369
- //#region utils/pick.ts
370
- /**
371
- * Analyze the result of Cesium's `scene.pick` and convert it to an array format
372
- */
373
- function resolvePick(pick = {}) {
374
- const { primitive, id, primitiveCollection, collection } = pick;
375
- const entityCollection = id && id.entityCollection || null;
376
- const dataSource = entityCollection && entityCollection.owner || null;
377
- const ids = Array.isArray(id) ? id : [id].filter(Boolean);
378
- return [
379
- ...ids,
380
- primitive,
381
- primitiveCollection,
382
- collection,
383
- entityCollection,
384
- dataSource
385
- ].filter((e) => !!e);
386
- }
387
- /**
388
- * Determine if the given array of graphics is hit by Cesium's `scene.pick`
389
- *
390
- * @param pick The `scene.pick` object used for matching
391
- * @param graphic An array of graphics to check for hits
392
- */
393
- function pickHitGraphic(pick, graphic) {
394
- if (!Array.isArray(graphic) || !graphic.length) return false;
395
- const elements = resolvePick(pick);
396
- if (!elements.length) return false;
397
- return elements.some((element) => graphic.includes(element));
398
- }
399
-
400
- //#endregion
401
- //#region utils/property.ts
402
- /**
403
- * Is Cesium.Property
404
- * @param value - The target object
405
- */
406
- function isProperty(value) {
407
- return value && isFunction(value.getValue);
408
- }
409
- /**
410
- * Converts a value that may be a Property into its target value, @see {toProperty} for the reverse operation
411
- * ```typescript
412
- * toPropertyValue('val') //=> 'val'
413
- * toPropertyValue(new ConstantProperty('val')) //=> 'val'
414
- * toPropertyValue(new CallbackProperty(()=>'val')) //=> 'val'
415
- * ```
416
- *
417
- * @param value - The value to convert
418
- */
419
- function toPropertyValue(value, time) {
420
- return isProperty(value) ? value.getValue(time) : value;
421
- }
422
- /**
423
- * Converts a value that may be a Property into a Property object, @see {toPropertyValue} for the reverse operation
424
- *
425
- * @param value - The property value or getter to convert, can be undefined or null
426
- * @param isConstant - The second parameter for converting to CallbackProperty
427
- * @returns Returns the converted Property object, if value is undefined or null, returns undefined
428
- */
429
- function toProperty(value, isConstant = false) {
430
- return isProperty(value) ? value : isFunction(value) ? new cesium.CallbackProperty(value, isConstant) : new cesium.ConstantProperty(value);
431
- }
432
- /**
433
- * Create a Cesium property key
434
- *
435
- * @param scope The host object
436
- * @param field The property name
437
- * @param maybeProperty Optional property or getter
438
- * @param readonly Whether the property is read-only
439
- */
440
- function createPropertyField(scope, field, maybeProperty, readonly$2) {
441
- let removeOwnerListener;
442
- const ownerBinding = (value) => {
443
- removeOwnerListener?.();
444
- if ((0, cesium.defined)(value?.definitionChanged)) removeOwnerListener = value?.definitionChanged?.addEventListener(() => {
445
- scope.definitionChanged.raiseEvent(scope, field, value, value);
6
+ * @internal
7
+ */
8
+ const CREATE_VIEWER_INJECTION_KEY = Symbol("CREATE_VIEWER_INJECTION_KEY");
9
+ /**
10
+ * @internal
11
+ */
12
+ const CREATE_VIEWER_COLLECTION = /* @__PURE__ */ new WeakMap();
13
+ /**
14
+ */
15
+ function createViewer(...args) {
16
+ const viewer = (0, vue.shallowRef)();
17
+ const readonlyViewer = (0, vue.shallowReadonly)(viewer);
18
+ (0, vue.provide)(CREATE_VIEWER_INJECTION_KEY, readonlyViewer);
19
+ const scope = (0, vue.getCurrentScope)();
20
+ if (scope) CREATE_VIEWER_COLLECTION.set(scope, readonlyViewer);
21
+ const canvas = (0, vue.computed)(() => viewer.value?.canvas);
22
+ (0, __vueuse_core.useMutationObserver)(document?.body, () => {
23
+ if (canvas.value && !document?.body.contains(canvas.value)) viewer.value = void 0;
24
+ }, {
25
+ childList: true,
26
+ subtree: true
446
27
  });
447
- };
448
- const privateField = `_${field}`;
449
- const property = toProperty(maybeProperty);
450
- scope[privateField] = property;
451
- ownerBinding(property);
452
- if (readonly$2) Object.defineProperty(scope, field, { get() {
453
- return scope[privateField];
454
- } });
455
- else Object.defineProperty(scope, field, {
456
- get() {
457
- return scope[privateField];
458
- },
459
- set(value) {
460
- const previous = scope[privateField];
461
- if (scope[privateField] !== value) {
462
- scope[privateField] = value;
463
- ownerBinding(value);
464
- if ((0, cesium.defined)(scope.definitionChanged)) scope.definitionChanged.raiseEvent(scope, field, value, previous);
465
- }
466
- }
467
- });
468
- }
469
- function createCesiumAttribute(scope, key, value, options = {}) {
470
- const allowToProperty = !!options.toProperty;
471
- const shallowClone = !!options.shallowClone;
472
- const changedEventKey = options.changedEventKey || "definitionChanged";
473
- const changedEvent = Reflect.get(scope, changedEventKey);
474
- const privateKey = `_${String(key)}`;
475
- const attribute = allowToProperty ? toProperty(value) : value;
476
- Reflect.set(scope, privateKey, attribute);
477
- const obj = { get() {
478
- const value$1 = Reflect.get(scope, privateKey);
479
- if (shallowClone) return Array.isArray(value$1) ? [...value$1] : { ...value$1 };
480
- else return value$1;
481
- } };
482
- let previousListener;
483
- const serial = (property, previous) => {
484
- previousListener?.();
485
- previousListener = property?.definitionChanged?.addEventListener(() => {
486
- changedEvent?.raiseEvent.bind(changedEvent)(scope, key, property, previous);
28
+ (0, vue.watchEffect)((onCleanup) => {
29
+ const [arg1, arg2] = args;
30
+ const value = (0, vue.toRaw)((0, vue.toValue)(arg1));
31
+ if (value instanceof cesium.Viewer) viewer.value = (0, vue.markRaw)(value);
32
+ else if (value) {
33
+ viewer.value = new cesium.Viewer(value, arg2);
34
+ onCleanup(() => !viewer.value?.isDestroyed() && viewer.value?.destroy());
35
+ } else viewer.value = void 0;
36
+ });
37
+ (0, __vueuse_core.tryOnScopeDispose)(() => {
38
+ viewer.value = void 0;
39
+ });
40
+ return (0, vue.computed)(() => {
41
+ return viewer.value?.isDestroyed() ? void 0 : viewer.value;
487
42
  });
488
- };
489
- if (!options.readonly) {
490
- if (allowToProperty && isProperty(value)) serial(value);
491
- obj.set = (value$1) => {
492
- if (allowToProperty && !isProperty(value$1)) throw new Error(`The value of ${String(key)} must be a Cesium.Property object`);
493
- const previous = Reflect.get(scope, privateKey);
494
- if (previous !== value$1) {
495
- Reflect.set(scope, privateKey, value$1);
496
- changedEvent?.raiseEvent.bind(changedEvent)(scope, key, value$1, previous);
497
- if (allowToProperty) serial(value$1);
498
- }
499
- };
500
43
  }
501
- Object.defineProperty(scope, key, obj);
502
- }
503
- function createCesiumProperty(scope, key, value, options = {}) {
504
- return createCesiumAttribute(scope, key, value, {
505
- ...options,
506
- toProperty: true
507
- });
508
- }
509
44
 
510
45
  //#endregion
511
- //#region utils/throttle.ts
512
- /**
513
- * Throttle function, which limits the frequency of execution of the function
514
- *
515
- * @param callback raw function
516
- * @param delay Throttled delay duration (ms)
517
- * @param trailing Trigger callback function after last call @default true
518
- * @param leading Trigger the callback function immediately on the first call @default false
519
- * @returns Throttle function
520
- */
521
- function throttle(callback, delay = 100, trailing = true, leading = false) {
522
- const restList = [];
523
- let tracked = false;
524
- const trigger = async () => {
525
- await (0, __vueuse_core.promiseTimeout)(delay);
526
- tracked = false;
527
- if (leading) try {
528
- callback(...restList[0]);
529
- } catch (error) {
530
- console.error(error);
531
- }
532
- if (trailing && (!leading || restList.length > 1)) try {
533
- callback(...restList[restList.length - 1]);
534
- } catch (error) {
535
- console.error(error);
536
- }
537
- restList.length = 0;
538
- };
539
- return (...rest) => {
540
- if (restList.length < 2) restList.push(rest);
541
- else restList[1] = rest;
542
- if (!tracked) {
543
- tracked = true;
544
- trigger();
545
- }
546
- };
547
- }
548
-
549
- //#endregion
550
- //#region utils/toCartesian3.ts
551
- /**
552
- * Converts position to a coordinate point in the Cartesian coordinate system
553
- *
554
- * @param position Position information, which can be a Cartesian coordinate point (Cartesian3), a geographic coordinate point (Cartographic), an array, or an object containing WGS84 latitude, longitude, and height information
555
- * @returns The converted Cartesian coordinate point. If the input parameter is invalid, undefined is returned
556
- */
557
- function toCartesian3(position) {
558
- if (!position) return void 0;
559
- if (position instanceof cesium.Cartesian3) return position.clone();
560
- else if (position instanceof cesium.Cartographic) return cesium.Ellipsoid.WGS84.cartographicToCartesian(position);
561
- else if (Array.isArray(position)) return cesium.Cartesian3.fromDegrees(position[0], position[1], position[2]);
562
- else return cesium.Cartesian3.fromDegrees(position.longitude, position.latitude, position.height);
563
- }
564
-
565
- //#endregion
566
- //#region utils/toCartographic.ts
567
- /**
568
- * Converts a position to a Cartographic coordinate point
569
- *
570
- * @param position Position information, which can be a Cartesian3 coordinate point, a Cartographic coordinate point, an array, or an object containing WGS84 longitude, latitude, and height information
571
- * @returns The converted Cartographic coordinate point, or undefined if the input parameter is invalid
572
- */
573
- function toCartographic(position) {
574
- if (!position) return void 0;
575
- if (position instanceof cesium.Cartesian3) return cesium.Ellipsoid.WGS84.cartesianToCartographic(position);
576
- else if (position instanceof cesium.Cartographic) return position.clone();
577
- else if (Array.isArray(position)) return cesium.Cartographic.fromDegrees(position[0], position[1], position[2]);
578
- else return cesium.Cartographic.fromDegrees(position.longitude, position.latitude, position.height);
579
- }
580
-
581
- //#endregion
582
- //#region utils/tryRun.ts
46
+ //#region toPromiseValue/index.ts
583
47
  /**
584
- * Safely execute the provided function without throwing errors,
585
- * essentially a simple wrapper around a `try...catch...` block
586
- */
587
- function tryRun(fn) {
588
- return (...args) => {
48
+ * Similar to Vue's built-in `toValue`, but capable of handling asynchronous functions, thus returning a `await value`.
49
+ *
50
+ * Used in conjunction with VueUse's `computedAsync`.
51
+ *
52
+ * @param source The source value, which can be a reactive reference or an asynchronous getter.
53
+ * @param options Conversion options
54
+ * @returns The converted value.
55
+ *
56
+ * @example
57
+ * ```ts
58
+ *
59
+ * const data = computedAsync(async ()=> {
60
+ * return await toPromiseValue(promiseRef)
61
+ * })
62
+ *
63
+ * ```
64
+ */
65
+ async function toPromiseValue(source, options = {}) {
589
66
  try {
590
- return fn?.(...args);
67
+ const { raw = true } = options;
68
+ let value;
69
+ if ((0, __vesium_shared.isFunction)(source)) value = await source();
70
+ else {
71
+ const result = (0, vue.toValue)(source);
72
+ value = (0, __vesium_shared.isPromise)(result) ? await result : result;
73
+ }
74
+ return raw ? (0, vue.toRaw)(value) : value;
591
75
  } catch (error) {
592
76
  console.error(error);
77
+ throw error;
593
78
  }
594
- };
595
- }
596
-
597
- //#endregion
598
- //#region toPromiseValue/index.ts
599
- /**
600
- * Similar to Vue's built-in `toValue`, but capable of handling asynchronous functions, thus returning a `await value`.
601
- *
602
- * Used in conjunction with VueUse's `computedAsync`.
603
- *
604
- * @param source The source value, which can be a reactive reference or an asynchronous getter.
605
- * @param options Conversion options
606
- * @returns The converted value.
607
- *
608
- * @example
609
- * ```ts
610
- *
611
- * const data = computedAsync(async ()=> {
612
- * return await toPromiseValue(promiseRef)
613
- * })
614
- *
615
- * ```
616
- */
617
- async function toPromiseValue(source, options = {}) {
618
- try {
619
- const { raw = true } = options;
620
- let value;
621
- if (isFunction(source)) value = await source();
622
- else {
623
- const result = (0, vue.toValue)(source);
624
- value = isPromise(result) ? await result : result;
625
- }
626
- return raw ? (0, vue.toRaw)(value) : value;
627
- } catch (error) {
628
- console.error(error);
629
- throw error;
630
79
  }
631
- }
632
80
 
633
81
  //#endregion
634
82
  //#region useCesiumEventListener/index.ts
635
83
  /**
636
- * Easily use the `addEventListener` in `Cesium.Event` instances,
637
- * when the dependent data changes or the component is unmounted,
638
- * the listener function will automatically reload or destroy.
639
- *
640
- * @param event The Cesium.Event instance
641
- * @param listener The listener function
642
- * @param options additional options
643
- * @returns A function that can be called to remove the event listener
644
- */
645
- function useCesiumEventListener(event, listener, options = {}) {
646
- const isActive = (0, vue.toRef)(options.isActive ?? true);
647
- const cleanup = (0, vue.watchEffect)((onCleanup) => {
648
- const _event = (0, vue.toValue)(event);
649
- const events = Array.isArray(_event) ? _event : [_event];
650
- if (events) {
651
- if (events.length && isActive.value) {
652
- const stopFns = events.map((event$1) => {
653
- const e = (0, vue.toValue)(event$1);
654
- return e?.addEventListener(listener, e);
655
- });
656
- onCleanup(() => stopFns.forEach((stop) => stop?.()));
84
+ * Easily use the `addEventListener` in `Cesium.Event` instances,
85
+ * when the dependent data changes or the component is unmounted,
86
+ * the listener function will automatically reload or destroy.
87
+ *
88
+ * @param event The Cesium.Event instance
89
+ * @param listener The listener function
90
+ * @param options additional options
91
+ * @returns A function that can be called to remove the event listener
92
+ */
93
+ function useCesiumEventListener(event, listener, options = {}) {
94
+ const isActive = (0, vue.toRef)(options.isActive ?? true);
95
+ const cleanup = (0, vue.watchEffect)((onCleanup) => {
96
+ const _event = (0, vue.toValue)(event);
97
+ const events = Array.isArray(_event) ? _event : [_event];
98
+ if (events) {
99
+ if (events.length && isActive.value) {
100
+ const stopFns = events.map((event$1) => {
101
+ const e = (0, vue.toValue)(event$1);
102
+ return e?.addEventListener(listener, e);
103
+ });
104
+ onCleanup(() => stopFns.forEach((stop) => stop?.()));
105
+ }
657
106
  }
658
- }
659
- });
660
- (0, __vueuse_core.tryOnScopeDispose)(cleanup.stop);
661
- return cleanup.stop;
662
- }
107
+ });
108
+ (0, __vueuse_core.tryOnScopeDispose)(cleanup.stop);
109
+ return cleanup.stop;
110
+ }
663
111
 
664
112
  //#endregion
665
113
  //#region useViewer/index.ts
666
114
  /**
667
- * Obtain the `Viewer` instance injected through `createViewer` in the current component or its ancestor components.
668
- *
669
- * note:
670
- * - If `createViewer` and `useViewer` are called in the same component, the `Viewer` instance injected by `createViewer` will be used preferentially.
671
- * - When calling `createViewer` and `useViewer` in the same component, `createViewer` should be called before `useViewer`.
672
- */
673
- function useViewer() {
674
- const scope = (0, vue.getCurrentScope)();
675
- const instanceViewer = scope ? CREATE_VIEWER_COLLECTION.get(scope) : void 0;
676
- if (instanceViewer) return instanceViewer;
677
- else {
678
- const injectViewer = (0, vue.inject)(CREATE_VIEWER_INJECTION_KEY);
679
- if (!injectViewer) throw new Error("The `Viewer` instance injected by `createViewer` was not found in the current component or its ancestor components. Have you called `createViewer`?");
680
- return injectViewer;
115
+ * Obtain the `Viewer` instance injected through `createViewer` in the current component or its ancestor components.
116
+ *
117
+ * note:
118
+ * - If `createViewer` and `useViewer` are called in the same component, the `Viewer` instance injected by `createViewer` will be used preferentially.
119
+ * - When calling `createViewer` and `useViewer` in the same component, `createViewer` should be called before `useViewer`.
120
+ */
121
+ function useViewer() {
122
+ const scope = (0, vue.getCurrentScope)();
123
+ const instanceViewer = scope ? CREATE_VIEWER_COLLECTION.get(scope) : void 0;
124
+ if (instanceViewer) return instanceViewer;
125
+ else {
126
+ const injectViewer = (0, vue.inject)(CREATE_VIEWER_INJECTION_KEY);
127
+ if (!injectViewer) throw new Error("The `Viewer` instance injected by `createViewer` was not found in the current component or its ancestor components. Have you called `createViewer`?");
128
+ return injectViewer;
129
+ }
681
130
  }
682
- }
683
131
 
684
132
  //#endregion
685
133
  //#region useCameraState/index.ts
686
134
  /**
687
- * Reactive Cesium Camera state
688
- * @param options options
689
- * @returns Reactive camera states
690
- */
691
- function useCameraState(options = {}) {
692
- let getCamera = options.camera;
693
- if (!getCamera) {
694
- const viewer = useViewer();
695
- getCamera = () => viewer.value?.scene.camera;
135
+ * Reactive Cesium Camera state
136
+ * @param options options
137
+ * @returns Reactive camera states
138
+ */
139
+ function useCameraState(options = {}) {
140
+ let getCamera = options.camera;
141
+ if (!getCamera) {
142
+ const viewer = useViewer();
143
+ getCamera = () => viewer.value?.scene.camera;
144
+ }
145
+ const camera = (0, vue.computed)(() => (0, vue.toValue)(getCamera));
146
+ const event = (0, vue.computed)(() => {
147
+ const eventField = (0, vue.toValue)(options.event) || "changed";
148
+ return camera.value?.[eventField];
149
+ });
150
+ const changedSymbol = (0, __vueuse_core.refThrottled)((0, vue.shallowRef)(Symbol("camera change")), options.delay ?? 8, true, false);
151
+ const setChangedSymbol = () => {
152
+ changedSymbol.value = Symbol("camera change");
153
+ };
154
+ (0, vue.watch)(camera, () => setChangedSymbol());
155
+ useCesiumEventListener(event, () => setChangedSymbol());
156
+ return {
157
+ camera,
158
+ position: (0, vue.computed)(() => changedSymbol.value ? camera.value?.position?.clone() : void 0),
159
+ direction: (0, vue.computed)(() => changedSymbol.value ? camera.value?.direction?.clone() : void 0),
160
+ up: (0, vue.computed)(() => changedSymbol.value ? camera.value?.up?.clone() : void 0),
161
+ right: (0, vue.computed)(() => changedSymbol.value ? camera.value?.right?.clone() : void 0),
162
+ positionCartographic: (0, vue.computed)(() => changedSymbol.value ? camera.value?.positionCartographic?.clone() : void 0),
163
+ positionWC: (0, vue.computed)(() => changedSymbol.value ? camera.value?.positionWC?.clone() : void 0),
164
+ directionWC: (0, vue.computed)(() => changedSymbol.value ? camera.value?.directionWC?.clone() : void 0),
165
+ upWC: (0, vue.computed)(() => changedSymbol.value ? camera.value?.directionWC?.clone() : void 0),
166
+ rightWC: (0, vue.computed)(() => changedSymbol.value ? camera.value?.directionWC?.clone() : void 0),
167
+ viewRectangle: (0, vue.computed)(() => changedSymbol.value ? camera.value?.computeViewRectangle() : void 0),
168
+ heading: (0, vue.computed)(() => changedSymbol.value ? camera.value?.heading : void 0),
169
+ pitch: (0, vue.computed)(() => changedSymbol.value ? camera.value?.pitch : void 0),
170
+ roll: (0, vue.computed)(() => changedSymbol.value ? camera.value?.roll : void 0),
171
+ level: (0, vue.computed)(() => changedSymbol.value && camera.value?.positionCartographic?.height ? computeLevel(camera.value.positionCartographic.height) : void 0)
172
+ };
173
+ }
174
+ const A = 40487.57;
175
+ const B = 7096758e-11;
176
+ const C = 91610.74;
177
+ const D = -40467.74;
178
+ /**
179
+ * Compute the camera level at a given height.
180
+ */
181
+ function computeLevel(height) {
182
+ return D + (A - D) / (1 + (height / C) ** B);
696
183
  }
697
- const camera = (0, vue.computed)(() => (0, vue.toValue)(getCamera));
698
- const event = (0, vue.computed)(() => {
699
- const eventField = (0, vue.toValue)(options.event) || "changed";
700
- return camera.value?.[eventField];
701
- });
702
- const changedSymbol = (0, __vueuse_core.refThrottled)((0, vue.shallowRef)(Symbol("camera change")), options.delay ?? 8, true, false);
703
- const setChangedSymbol = () => {
704
- changedSymbol.value = Symbol("camera change");
705
- };
706
- (0, vue.watch)(camera, () => setChangedSymbol());
707
- useCesiumEventListener(event, () => setChangedSymbol());
708
- return {
709
- camera,
710
- position: (0, vue.computed)(() => changedSymbol.value ? camera.value?.position?.clone() : void 0),
711
- direction: (0, vue.computed)(() => changedSymbol.value ? camera.value?.direction?.clone() : void 0),
712
- up: (0, vue.computed)(() => changedSymbol.value ? camera.value?.up?.clone() : void 0),
713
- right: (0, vue.computed)(() => changedSymbol.value ? camera.value?.right?.clone() : void 0),
714
- positionCartographic: (0, vue.computed)(() => changedSymbol.value ? camera.value?.positionCartographic?.clone() : void 0),
715
- positionWC: (0, vue.computed)(() => changedSymbol.value ? camera.value?.positionWC?.clone() : void 0),
716
- directionWC: (0, vue.computed)(() => changedSymbol.value ? camera.value?.directionWC?.clone() : void 0),
717
- upWC: (0, vue.computed)(() => changedSymbol.value ? camera.value?.directionWC?.clone() : void 0),
718
- rightWC: (0, vue.computed)(() => changedSymbol.value ? camera.value?.directionWC?.clone() : void 0),
719
- viewRectangle: (0, vue.computed)(() => changedSymbol.value ? camera.value?.computeViewRectangle() : void 0),
720
- heading: (0, vue.computed)(() => changedSymbol.value ? camera.value?.heading : void 0),
721
- pitch: (0, vue.computed)(() => changedSymbol.value ? camera.value?.pitch : void 0),
722
- roll: (0, vue.computed)(() => changedSymbol.value ? camera.value?.roll : void 0),
723
- level: (0, vue.computed)(() => changedSymbol.value && camera.value?.positionCartographic?.height ? computeLevel(camera.value.positionCartographic.height) : void 0)
724
- };
725
- }
726
- const A = 40487.57;
727
- const B = 7096758e-11;
728
- const C = 91610.74;
729
- const D = -40467.74;
730
- /**
731
- * Compute the camera level at a given height.
732
- */
733
- function computeLevel(height) {
734
- return D + (A - D) / (1 + (height / C) ** B);
735
- }
736
184
 
737
185
  //#endregion
738
186
  //#region useCesiumFps/index.ts
739
187
  /**
740
- * Reactive get the frame rate of Cesium
741
- * @param options options
742
- * @returns Reactive fps states
743
- */
744
- function useCesiumFps(options = {}) {
745
- const { delay = 100 } = options;
746
- const viewer = useViewer();
747
- const p = (0, vue.shallowRef)(performance.now());
748
- useCesiumEventListener(() => viewer.value?.scene.postRender, () => p.value = performance.now());
749
- const interval = (0, vue.ref)(0);
750
- (0, __vueuse_core.watchThrottled)(p, (value, oldValue) => {
751
- interval.value = value - oldValue;
752
- }, { throttle: delay });
753
- const fps = (0, vue.computed)(() => {
754
- return 1e3 / interval.value;
755
- });
756
- return {
757
- interval: (0, vue.readonly)(interval),
758
- fps
759
- };
760
- }
188
+ * Reactive get the frame rate of Cesium
189
+ * @param options options
190
+ * @returns Reactive fps states
191
+ */
192
+ function useCesiumFps(options = {}) {
193
+ const { delay = 100 } = options;
194
+ const viewer = useViewer();
195
+ const p = (0, vue.shallowRef)(performance.now());
196
+ useCesiumEventListener(() => viewer.value?.scene.postRender, () => p.value = performance.now());
197
+ const interval = (0, vue.ref)(0);
198
+ (0, __vueuse_core.watchThrottled)(p, (value, oldValue) => {
199
+ interval.value = value - oldValue;
200
+ }, { throttle: delay });
201
+ const fps = (0, vue.computed)(() => {
202
+ return 1e3 / interval.value;
203
+ });
204
+ return {
205
+ interval: (0, vue.readonly)(interval),
206
+ fps
207
+ };
208
+ }
761
209
 
762
210
  //#endregion
763
211
  //#region useCollectionScope/index.ts
764
212
  /**
765
- * Scope the SideEffects of Cesium-related `Collection` and automatically remove them when unmounted.
766
- * - note: This is a basic function that is intended to be called by other lower-level function
767
- * @param addFn - add SideEffect function. eg.`entites.add`
768
- * @param removeFn - Clean SideEffect function. eg.`entities.remove`
769
- * @param removeScopeArgs - The parameters to pass for `removeScope` triggered when the component is unmounted
770
- *
771
- * @returns Contains side effect addition and removal functions
772
- */
773
- function useCollectionScope(addFn, removeFn, removeScopeArgs) {
774
- const scope = (0, vue.shallowReactive)(/* @__PURE__ */ new Set());
775
- const add = (instance, ...args) => {
776
- const result = addFn(instance, ...args);
777
- if (isPromise(result)) return new Promise((resolve, reject) => {
778
- result.then((i) => {
779
- scope.add(i);
780
- resolve(i);
781
- }).catch((error) => reject(error));
782
- });
783
- else {
784
- scope.add(result);
785
- return result;
786
- }
787
- };
788
- const remove = (instance, ...args) => {
789
- scope.delete(instance);
790
- return removeFn(instance, ...args);
791
- };
792
- const removeWhere = (predicate, ...args) => {
793
- scope.forEach((instance) => {
794
- if (predicate(instance)) remove(instance, ...args);
795
- });
796
- };
797
- const removeScope = (...args) => {
798
- scope.forEach((instance) => {
799
- remove(instance, ...args);
800
- });
801
- };
802
- (0, __vueuse_core.tryOnScopeDispose)(() => removeScope(...removeScopeArgs));
803
- return {
804
- scope: (0, vue.shallowReadonly)(scope),
805
- add,
806
- remove,
807
- removeWhere,
808
- removeScope
809
- };
810
- }
213
+ * Scope the SideEffects of Cesium-related `Collection` and automatically remove them when unmounted.
214
+ * - note: This is a basic function that is intended to be called by other lower-level function
215
+ * @returns Contains side effect addition and removal functions
216
+ */
217
+ function useCollectionScope(options) {
218
+ const { addEffect, removeEffect, removeScopeArgs } = options;
219
+ const scope = (0, vue.shallowReactive)(/* @__PURE__ */ new Set());
220
+ const add = (instance, ...args) => {
221
+ const result = addEffect(instance, ...args);
222
+ if ((0, __vesium_shared.isPromise)(result)) return new Promise((resolve, reject) => {
223
+ result.then((i) => {
224
+ scope.add(i);
225
+ resolve(i);
226
+ }).catch((error) => reject(error));
227
+ });
228
+ else {
229
+ scope.add(result);
230
+ return result;
231
+ }
232
+ };
233
+ const remove = (instance, ...args) => {
234
+ scope.delete(instance);
235
+ return removeEffect(instance, ...args);
236
+ };
237
+ const removeWhere = (predicate, ...args) => {
238
+ scope.forEach((instance) => {
239
+ if (predicate(instance)) remove(instance, ...args);
240
+ });
241
+ };
242
+ const removeScope = (...args) => {
243
+ scope.forEach((instance) => {
244
+ remove(instance, ...args);
245
+ });
246
+ };
247
+ (0, __vueuse_core.tryOnScopeDispose)(() => removeScope(...removeScopeArgs));
248
+ return {
249
+ scope: (0, vue.shallowReadonly)(scope),
250
+ add,
251
+ remove,
252
+ removeWhere,
253
+ removeScope
254
+ };
255
+ }
811
256
 
812
257
  //#endregion
813
258
  //#region useDataSource/index.ts
814
- function useDataSource(dataSources, options = {}) {
815
- const { destroyOnRemove, collection, isActive = true, evaluating } = options;
816
- const result = (0, __vueuse_core.computedAsync)(() => toPromiseValue(dataSources), void 0, { evaluating });
817
- const viewer = useViewer();
818
- (0, vue.watchEffect)((onCleanup) => {
819
- const _isActive = (0, vue.toValue)(isActive);
820
- if (_isActive) {
821
- const list = Array.isArray(result.value) ? [...result.value] : [result.value];
822
- const _collection = collection ?? viewer.value?.dataSources;
823
- list.forEach((item) => item && _collection?.add(item));
824
- onCleanup(() => {
825
- const destroy = (0, vue.toValue)(destroyOnRemove);
826
- !_collection?.isDestroyed() && list.forEach((dataSource) => dataSource && _collection?.remove(dataSource, destroy));
827
- });
828
- }
829
- });
830
- return result;
831
- }
259
+ function useDataSource(dataSources, options = {}) {
260
+ const { destroyOnRemove, collection, isActive = true, evaluating } = options;
261
+ const result = (0, __vueuse_core.computedAsync)(() => toPromiseValue(dataSources), void 0, { evaluating });
262
+ const viewer = useViewer();
263
+ (0, vue.watchEffect)((onCleanup) => {
264
+ if ((0, vue.toValue)(isActive)) {
265
+ const list = Array.isArray(result.value) ? [...result.value] : [result.value];
266
+ const _collection = collection ?? viewer.value?.dataSources;
267
+ list.forEach((item) => item && _collection?.add(item));
268
+ onCleanup(() => {
269
+ const destroy = (0, vue.toValue)(destroyOnRemove);
270
+ !_collection?.isDestroyed() && list.forEach((dataSource) => dataSource && _collection?.remove(dataSource, destroy));
271
+ });
272
+ }
273
+ });
274
+ return result;
275
+ }
832
276
 
833
277
  //#endregion
834
278
  //#region useDataSourceScope/index.ts
835
279
  /**
836
- * // Scope the SideEffects of `DataSourceCollection` operations and automatically remove them when unmounted
837
- */
838
- function useDataSourceScope(options = {}) {
839
- const { collection: _collection, destroyOnRemove } = options;
840
- const viewer = useViewer();
841
- const collection = (0, vue.computed)(() => {
842
- return (0, vue.toValue)(_collection) ?? viewer.value?.dataSources;
843
- });
844
- const addFn = (dataSource) => {
845
- if (!collection.value) throw new Error("collection is not defined");
846
- return collection.value.add(dataSource);
847
- };
848
- const removeFn = (dataSource, destroy) => {
849
- return !!collection.value?.remove(dataSource, destroy);
850
- };
851
- const { scope, add, remove, removeWhere, removeScope } = useCollectionScope(addFn, removeFn, [destroyOnRemove]);
852
- return {
853
- scope,
854
- add,
855
- remove,
856
- removeWhere,
857
- removeScope
858
- };
859
- }
280
+ * Scope the SideEffects of `DataSourceCollection` operations and automatically remove them when unmounted
281
+ */
282
+ function useDataSourceScope(options = {}) {
283
+ const { collection: _collection, destroyOnRemove } = options;
284
+ const viewer = useViewer();
285
+ const collection = (0, vue.computed)(() => {
286
+ return (0, vue.toValue)(_collection) ?? viewer.value?.dataSources;
287
+ });
288
+ return useCollectionScope({
289
+ addEffect(instance) {
290
+ if (!collection.value) throw new Error("collection is not defined");
291
+ if ((0, __vesium_shared.isPromise)(instance)) return new Promise((resolve, reject) => {
292
+ instance.then((i) => {
293
+ collection.value.add(i);
294
+ resolve(i);
295
+ }).catch((error) => reject(error));
296
+ });
297
+ else {
298
+ collection.value.add(instance);
299
+ return instance;
300
+ }
301
+ },
302
+ removeEffect(instance, destroy) {
303
+ return !!collection.value?.remove(instance, destroy);
304
+ },
305
+ removeScopeArgs: [destroyOnRemove]
306
+ });
307
+ }
860
308
 
861
309
  //#endregion
862
310
  //#region useElementOverlay/index.ts
863
311
  /**
864
- * Cesium HtmlElement Overlay
865
- */
866
- function useElementOverlay(target, position, options = {}) {
867
- const { referenceWindow, horizontal = "center", vertical = "bottom", offset = {
868
- x: 0,
869
- y: 0
870
- } } = options;
871
- const cartesian3 = (0, vue.computed)(() => toCartesian3((0, vue.toValue)(position)));
872
- const viewer = useViewer();
873
- const coord = (0, vue.shallowRef)();
874
- useCesiumEventListener(() => viewer.value?.scene.postRender, () => {
875
- if (!viewer.value?.scene) return;
876
- if (!cartesian3.value) coord.value = void 0;
877
- else {
878
- const reslut = cartesianToCanvasCoord(cartesian3.value, viewer.value.scene);
879
- coord.value = !cesium.Cartesian2.equals(reslut, coord.value) ? reslut : coord.value;
880
- }
881
- });
882
- const canvasBounding = (0, __vueuse_core.useElementBounding)(() => viewer.value?.canvas.parentElement);
883
- const targetBounding = (0, __vueuse_core.useElementBounding)(target);
884
- const finalOffset = (0, vue.computed)(() => {
885
- const _offset = (0, vue.toValue)(offset);
886
- let x$1 = _offset?.x ?? 0;
887
- const _horizontal = (0, vue.toValue)(horizontal);
888
- if (_horizontal === "center") x$1 -= targetBounding.width.value / 2;
889
- else if (_horizontal === "right") x$1 -= targetBounding.width.value;
890
- let y$1 = _offset?.y ?? 0;
891
- const _vertical = (0, vue.toValue)(vertical);
892
- if (_vertical === "center") y$1 -= targetBounding.height.value / 2;
893
- else if (_vertical === "bottom") y$1 -= targetBounding.height.value;
894
- return {
895
- x: x$1,
896
- y: y$1
897
- };
898
- });
899
- const location = (0, vue.computed)(() => {
900
- const data = {
901
- x: coord.value?.x ?? 0,
902
- y: coord.value?.y ?? 0
903
- };
904
- if ((0, vue.toValue)(referenceWindow)) {
905
- data.x += canvasBounding.x.value;
906
- data.y += canvasBounding.y.value;
907
- }
312
+ * Cesium HtmlElement Overlay
313
+ */
314
+ function useElementOverlay(target, position, options = {}) {
315
+ const { referenceWindow, horizontal = "center", vertical = "bottom", clampToGround, offset = {
316
+ x: 0,
317
+ y: 0
318
+ } } = options;
319
+ const viewer = useViewer();
320
+ const cartesian3 = (0, vue.computed)(() => {
321
+ if (!(0, vue.toValue)(clampToGround)) return (0, __vesium_shared.toCartesian3)((0, vue.toValue)(position));
322
+ else {
323
+ const cartographic = (0, __vesium_shared.toCartographic)((0, vue.toValue)(position));
324
+ cartographic.height = +(viewer.value?.scene.globe.getHeight(cartographic) || 0).toFixed(2);
325
+ return (0, __vesium_shared.toCartesian3)(cartographic);
326
+ }
327
+ });
328
+ const coord = (0, vue.shallowRef)();
329
+ useCesiumEventListener(() => viewer.value?.scene.postRender, () => {
330
+ if (!viewer.value?.scene) return;
331
+ if (!cartesian3.value) coord.value = void 0;
332
+ else {
333
+ const result = (0, __vesium_shared.cartesianToCanvasCoord)(cartesian3.value, viewer.value.scene);
334
+ coord.value = !cesium.Cartesian2.equals(result, coord.value) ? result : coord.value;
335
+ }
336
+ });
337
+ const canvasBounding = (0, __vueuse_core.useElementBounding)(() => viewer.value?.canvas.parentElement);
338
+ const targetBounding = (0, __vueuse_core.useElementBounding)(target);
339
+ const finalOffset = (0, vue.computed)(() => {
340
+ const _offset = (0, vue.toValue)(offset);
341
+ let x$1 = _offset?.x ?? 0;
342
+ const _horizontal = (0, vue.toValue)(horizontal);
343
+ if (_horizontal === "center") x$1 -= targetBounding.width.value / 2;
344
+ else if (_horizontal === "right") x$1 -= targetBounding.width.value;
345
+ let y$1 = _offset?.y ?? 0;
346
+ const _vertical = (0, vue.toValue)(vertical);
347
+ if (_vertical === "center") y$1 -= targetBounding.height.value / 2;
348
+ else if (_vertical === "bottom") y$1 -= targetBounding.height.value;
349
+ return {
350
+ x: x$1,
351
+ y: y$1
352
+ };
353
+ });
354
+ const location = (0, vue.computed)(() => {
355
+ const data = {
356
+ x: coord.value?.x ?? 0,
357
+ y: coord.value?.y ?? 0
358
+ };
359
+ if ((0, vue.toValue)(referenceWindow)) {
360
+ data.x += canvasBounding.x.value;
361
+ data.y += canvasBounding.y.value;
362
+ }
363
+ return {
364
+ x: finalOffset.value.x + data.x,
365
+ y: finalOffset.value.y + data.y
366
+ };
367
+ });
368
+ const x = (0, vue.computed)(() => location.value.x);
369
+ const y = (0, vue.computed)(() => location.value.y);
370
+ const style = (0, vue.computed)(() => ({
371
+ left: `${x.value?.toFixed(2)}px`,
372
+ top: `${y.value?.toFixed(2)}px`
373
+ }));
374
+ (0, vue.watchEffect)(() => {
375
+ const element = (0, vue.toValue)(target);
376
+ if (element && (0, vue.toValue)(options.applyStyle ?? true)) {
377
+ element.style?.setProperty?.("left", style.value.left);
378
+ element.style?.setProperty?.("top", style.value.top);
379
+ }
380
+ });
908
381
  return {
909
- x: finalOffset.value.x + data.x,
910
- y: finalOffset.value.y + data.y
382
+ x,
383
+ y,
384
+ style
911
385
  };
912
- });
913
- const x = (0, vue.computed)(() => location.value.x);
914
- const y = (0, vue.computed)(() => location.value.y);
915
- const style = (0, vue.computed)(() => ({
916
- left: `${x.value?.toFixed(2)}px`,
917
- top: `${y.value?.toFixed(2)}px`
918
- }));
919
- (0, vue.watchEffect)(() => {
920
- const element = (0, vue.toValue)(target);
921
- if (element && (0, vue.toValue)(options.applyStyle ?? true)) {
922
- element.style?.setProperty?.("left", style.value.left);
923
- element.style?.setProperty?.("top", style.value.top);
924
- }
925
- });
926
- return {
927
- x,
928
- y,
929
- style
930
- };
931
- }
386
+ }
932
387
 
933
388
  //#endregion
934
389
  //#region useEntity/index.ts
935
- function useEntity(data, options = {}) {
936
- const { collection, isActive = true, evaluating } = options;
937
- const result = (0, __vueuse_core.computedAsync)(() => toPromiseValue(data), [], { evaluating });
938
- const viewer = useViewer();
939
- (0, vue.watchEffect)((onCleanup) => {
940
- const _isActive = (0, vue.toValue)(isActive);
941
- if (_isActive) {
942
- const list = Array.isArray(result.value) ? [...result.value] : [result.value];
943
- const _collection = collection ?? viewer.value?.entities;
944
- list.forEach((item) => item && _collection?.add(item));
945
- onCleanup(() => {
946
- list.forEach((item) => item && _collection?.remove(item));
947
- });
948
- }
949
- });
950
- return result;
951
- }
390
+ function useEntity(data, options = {}) {
391
+ const { collection, isActive = true, evaluating } = options;
392
+ const result = (0, __vueuse_core.computedAsync)(() => toPromiseValue(data), [], { evaluating });
393
+ const viewer = useViewer();
394
+ (0, vue.watchEffect)((onCleanup) => {
395
+ if ((0, vue.toValue)(isActive)) {
396
+ const list = Array.isArray(result.value) ? [...result.value] : [result.value];
397
+ const _collection = collection ?? viewer.value?.entities;
398
+ list.forEach((item) => item && _collection?.add(item));
399
+ onCleanup(() => {
400
+ list.forEach((item) => item && _collection?.remove(item));
401
+ });
402
+ }
403
+ });
404
+ return result;
405
+ }
952
406
 
953
407
  //#endregion
954
408
  //#region useEntityScope/index.ts
955
409
  /**
956
- * Make `add` and `remove` operations of `EntityCollection` scoped,
957
- * automatically remove `Entity` instance when component is unmounted.
958
- */
959
- function useEntityScope(options = {}) {
960
- const { collection: _collection } = options;
961
- const viewer = useViewer();
962
- const collection = (0, vue.computed)(() => {
963
- return (0, vue.toValue)(_collection) ?? viewer.value?.entities;
964
- });
965
- const addFn = (entity) => {
966
- if (!collection.value) throw new Error("collection is not defined");
967
- if (!collection.value.contains(entity)) collection.value.add(entity);
968
- return entity;
969
- };
970
- const removeFn = (entity) => {
971
- return !!collection.value?.remove(entity);
972
- };
973
- const { scope, add, remove, removeWhere, removeScope } = useCollectionScope(addFn, removeFn, []);
974
- return {
975
- scope,
976
- add,
977
- remove,
978
- removeWhere,
979
- removeScope
980
- };
981
- }
410
+ * Make `add` and `remove` operations of `EntityCollection` scoped,
411
+ * automatically remove `Entity` instance when component is unmounted.
412
+ */
413
+ function useEntityScope(options = {}) {
414
+ const { collection: _collection } = options;
415
+ const viewer = useViewer();
416
+ const collection = (0, vue.computed)(() => {
417
+ return (0, vue.toValue)(_collection) ?? viewer.value?.entities;
418
+ });
419
+ return useCollectionScope({
420
+ addEffect(instance) {
421
+ if (!collection.value) throw new Error("collection is not defined");
422
+ if ((0, __vesium_shared.isPromise)(instance)) return new Promise((resolve, reject) => {
423
+ instance.then((i) => {
424
+ collection.value.add(i);
425
+ resolve(i);
426
+ }).catch((error) => reject(error));
427
+ });
428
+ else {
429
+ collection.value.add(instance);
430
+ return instance;
431
+ }
432
+ },
433
+ removeEffect(instance) {
434
+ return !!collection.value?.remove(instance);
435
+ },
436
+ removeScopeArgs: []
437
+ });
438
+ }
982
439
 
983
440
  //#endregion
984
441
  //#region useScenePick/index.ts
985
- const pickCache = /* @__PURE__ */ new WeakMap();
986
- /**
987
- * Uses the `scene.pick` function in Cesium's Scene object to perform screen point picking,
988
- * return a computed property containing the pick result, or undefined if no object is picked.
989
- *
990
- * @param windowPosition The screen coordinates of the pick point.
991
- */
992
- function useScenePick(windowPosition, options = {}) {
993
- const { width = 3, height = 3, throttled = 8 } = options;
994
- const isActive = (0, vue.toRef)(options.isActive ?? true);
995
- const viewer = useViewer();
996
- const position = (0, __vueuse_core.refThrottled)((0, vue.computed)(() => (0, vue.toValue)(windowPosition)?.clone()), throttled, false, true);
997
- const pick = (0, vue.shallowRef)();
998
- (0, vue.watchEffect)(() => {
999
- if (viewer.value && position.value && isActive.value) {
1000
- const cache = pickCache.get(viewer.value);
1001
- if (cache && cache[0].equals(position.value)) pick.value = cache[1];
1002
- else {
1003
- pickCache.set(viewer.value, [position.value.clone(), pick.value]);
1004
- pick.value = viewer.value?.scene.pick(position.value, (0, vue.toValue)(width), (0, vue.toValue)(height));
442
+ const pickCache = /* @__PURE__ */ new WeakMap();
443
+ /**
444
+ * Uses the `scene.pick` function in Cesium's Scene object to perform screen point picking,
445
+ * return a computed property containing the pick result, or undefined if no object is picked.
446
+ *
447
+ * @param windowPosition The screen coordinates of the pick point.
448
+ */
449
+ function useScenePick(windowPosition, options = {}) {
450
+ const { width = 3, height = 3, throttled = 8 } = options;
451
+ const isActive = (0, vue.toRef)(options.isActive ?? true);
452
+ const viewer = useViewer();
453
+ const position = (0, __vueuse_core.refThrottled)((0, vue.computed)(() => (0, vue.toValue)(windowPosition)?.clone()), throttled, false, true);
454
+ const pick = (0, vue.shallowRef)();
455
+ (0, vue.watchEffect)(() => {
456
+ if (viewer.value && position.value && isActive.value) {
457
+ const cache = pickCache.get(viewer.value);
458
+ if (cache && cache[0].equals(position.value)) pick.value = cache[1];
459
+ else {
460
+ pickCache.set(viewer.value, [position.value.clone(), pick.value]);
461
+ pick.value = viewer.value?.scene.pick(position.value, (0, vue.toValue)(width), (0, vue.toValue)(height));
462
+ }
1005
463
  }
1006
- }
1007
- });
1008
- return pick;
1009
- }
464
+ });
465
+ return pick;
466
+ }
1010
467
 
1011
468
  //#endregion
1012
469
  //#region useScreenSpaceEventHandler/index.ts
1013
470
  /**
1014
- * Easily use the `ScreenSpaceEventHandler`,
1015
- * when the dependent data changes or the component is unmounted,
1016
- * the listener function will automatically reload or destroy.
1017
- *
1018
- * @param type Types of mouse event
1019
- * @param inputAction Callback function for listening
1020
- */
1021
- function useScreenSpaceEventHandler(type, inputAction, options = {}) {
1022
- const { modifier } = options;
1023
- const viewer = useViewer();
1024
- const isActive = (0, vue.toRef)(options.isActive ?? true);
1025
- const handler = (0, vue.computed)(() => {
1026
- if (viewer.value?.cesiumWidget?.canvas) return new cesium.ScreenSpaceEventHandler(viewer.value.cesiumWidget.canvas);
1027
- });
1028
- const cleanup1 = (0, vue.watch)(handler, (_value, previous) => {
1029
- viewer.value?.cesiumWidget && previous?.destroy();
1030
- });
1031
- const cleanup2 = (0, vue.watchEffect)((onCleanup) => {
1032
- const typeValue = (0, vue.toValue)(type);
1033
- const modifierValue = (0, vue.toValue)(modifier);
1034
- const handlerValue = (0, vue.toValue)(handler);
1035
- if (!handlerValue || !isActive.value || !inputAction) return;
1036
- if (isDef(typeValue)) {
1037
- handlerValue.setInputAction(inputAction, typeValue, modifierValue);
1038
- onCleanup(() => handlerValue.removeInputAction(typeValue, modifierValue));
1039
- }
1040
- });
1041
- const stop = () => {
1042
- cleanup1();
1043
- cleanup2();
1044
- };
1045
- (0, __vueuse_core.tryOnScopeDispose)(stop);
1046
- return stop;
1047
- }
471
+ * Easily use the `ScreenSpaceEventHandler`,
472
+ * when the dependent data changes or the component is unmounted,
473
+ * the listener function will automatically reload or destroy.
474
+ *
475
+ * @param type Types of mouse event
476
+ * @param inputAction Callback function for listening
477
+ */
478
+ function useScreenSpaceEventHandler(type, inputAction, options = {}) {
479
+ const { modifier } = options;
480
+ const viewer = useViewer();
481
+ const isActive = (0, vue.toRef)(options.isActive ?? true);
482
+ const handler = (0, vue.computed)(() => {
483
+ if (viewer.value?.cesiumWidget?.canvas) return new cesium.ScreenSpaceEventHandler(viewer.value.cesiumWidget.canvas);
484
+ });
485
+ const cleanup1 = (0, vue.watch)(handler, (_value, previous) => {
486
+ viewer.value?.cesiumWidget && previous?.destroy();
487
+ });
488
+ const cleanup2 = (0, vue.watchEffect)((onCleanup) => {
489
+ const typeValue = (0, vue.toValue)(type);
490
+ const modifierValue = (0, vue.toValue)(modifier);
491
+ const handlerValue = (0, vue.toValue)(handler);
492
+ if (!handlerValue || !isActive.value || !inputAction) return;
493
+ if ((0, __vesium_shared.isDef)(typeValue)) {
494
+ handlerValue.setInputAction(inputAction, typeValue, modifierValue);
495
+ onCleanup(() => handlerValue.removeInputAction(typeValue, modifierValue));
496
+ }
497
+ });
498
+ const stop = () => {
499
+ cleanup1();
500
+ cleanup2();
501
+ };
502
+ (0, __vueuse_core.tryOnScopeDispose)(stop);
503
+ return stop;
504
+ }
1048
505
 
1049
506
  //#endregion
1050
507
  //#region useGraphicEvent/useDrag.ts
1051
508
  /**
1052
- * Use graphic drag events with ease, and remove listener automatically on unmounted.
1053
- */
1054
- function useDrag(listener) {
1055
- const position = (0, vue.shallowRef)();
1056
- const pick = useScenePick(position);
1057
- const motionEvent = (0, vue.shallowRef)();
1058
- const dragging = (0, vue.ref)(false);
1059
- const viewer = useViewer();
1060
- const cameraLocked = (0, vue.ref)(false);
1061
- (0, vue.watch)(cameraLocked, (cameraLocked$1) => {
1062
- viewer.value && (viewer.value.scene.screenSpaceCameraController.enableRotate = !cameraLocked$1);
1063
- });
1064
- const lockCamera = () => {
1065
- cameraLocked.value = true;
1066
- };
1067
- const execute = (pick$1, startPosition, endPosition) => {
1068
- listener({
1069
- event: {
1070
- startPosition: startPosition.clone(),
509
+ * Use graphic drag events with ease, and remove listener automatically on unmounted.
510
+ */
511
+ function useDrag(listener) {
512
+ const position = (0, vue.shallowRef)();
513
+ const pick = useScenePick(position);
514
+ const motionEvent = (0, vue.shallowRef)();
515
+ const dragging = (0, vue.ref)(false);
516
+ const viewer = useViewer();
517
+ const cameraLocked = (0, vue.ref)(false);
518
+ (0, vue.watch)(cameraLocked, (cameraLocked$1) => {
519
+ viewer.value && (viewer.value.scene.screenSpaceCameraController.enableRotate = !cameraLocked$1);
520
+ });
521
+ const lockCamera = () => {
522
+ cameraLocked.value = true;
523
+ };
524
+ const execute = (pick$1, startPosition, endPosition) => {
525
+ listener({
526
+ event: {
527
+ startPosition: startPosition.clone(),
528
+ endPosition: endPosition.clone()
529
+ },
530
+ pick: pick$1,
531
+ dragging: dragging.value,
532
+ lockCamera
533
+ });
534
+ (0, vue.nextTick)(() => {
535
+ if (!dragging.value && cameraLocked.value) cameraLocked.value = false;
536
+ });
537
+ };
538
+ const stopLeftDownWatch = useScreenSpaceEventHandler(cesium.ScreenSpaceEventType.LEFT_DOWN, (event) => {
539
+ dragging.value = true;
540
+ position.value = event.position.clone();
541
+ });
542
+ const stopMouseMoveWatch = useScreenSpaceEventHandler(cesium.ScreenSpaceEventType.MOUSE_MOVE, (0, __vesium_shared.throttle)(({ startPosition, endPosition }) => {
543
+ motionEvent.value = {
544
+ startPosition: motionEvent.value?.endPosition.clone() || startPosition.clone(),
1071
545
  endPosition: endPosition.clone()
1072
- },
1073
- pick: pick$1,
1074
- dragging: dragging.value,
1075
- lockCamera
546
+ };
547
+ }, 8, false, true));
548
+ (0, vue.watch)([pick, motionEvent], ([pick$1, motionEvent$1]) => {
549
+ if (pick$1 && motionEvent$1) {
550
+ const { startPosition, endPosition } = motionEvent$1;
551
+ dragging.value && execute(pick$1, startPosition, endPosition);
552
+ }
1076
553
  });
1077
- (0, vue.nextTick)(() => {
1078
- if (!dragging.value && cameraLocked.value) cameraLocked.value = false;
554
+ const stopLeftUpWatch = useScreenSpaceEventHandler(cesium.ScreenSpaceEventType.LEFT_UP, (event) => {
555
+ dragging.value = false;
556
+ if (pick.value && motionEvent.value) execute(pick.value, motionEvent.value.endPosition, event.position);
557
+ position.value = void 0;
558
+ motionEvent.value = void 0;
1079
559
  });
1080
- };
1081
- const stopLeftDownWatch = useScreenSpaceEventHandler(cesium.ScreenSpaceEventType.LEFT_DOWN, (event) => {
1082
- dragging.value = true;
1083
- position.value = event.position.clone();
1084
- });
1085
- const stopMouseMoveWatch = useScreenSpaceEventHandler(cesium.ScreenSpaceEventType.MOUSE_MOVE, throttle(({ startPosition, endPosition }) => {
1086
- motionEvent.value = {
1087
- startPosition: motionEvent.value?.endPosition.clone() || startPosition.clone(),
1088
- endPosition: endPosition.clone()
560
+ const stop = () => {
561
+ stopLeftDownWatch();
562
+ stopMouseMoveWatch();
563
+ stopLeftUpWatch();
1089
564
  };
1090
- }, 8, false, true));
1091
- (0, vue.watch)([pick, motionEvent], ([pick$1, motionEvent$1]) => {
1092
- if (pick$1 && motionEvent$1) {
1093
- const { startPosition, endPosition } = motionEvent$1;
1094
- dragging.value && execute(pick$1, startPosition, endPosition);
1095
- }
1096
- });
1097
- const stopLeftUpWatch = useScreenSpaceEventHandler(cesium.ScreenSpaceEventType.LEFT_UP, (event) => {
1098
- dragging.value = false;
1099
- if (pick.value && motionEvent.value) execute(pick.value, motionEvent.value.endPosition, event.position);
1100
- position.value = void 0;
1101
- motionEvent.value = void 0;
1102
- });
1103
- const stop = () => {
1104
- stopLeftDownWatch();
1105
- stopMouseMoveWatch();
1106
- stopLeftUpWatch();
1107
- };
1108
- (0, __vueuse_core.tryOnScopeDispose)(stop);
1109
- return stop;
1110
- }
565
+ (0, __vueuse_core.tryOnScopeDispose)(stop);
566
+ return stop;
567
+ }
1111
568
 
1112
569
  //#endregion
1113
570
  //#region useGraphicEvent/useHover.ts
1114
571
  /**
1115
- * Use graphic hover events with ease, and remove listener automatically on unmounted.
1116
- */
1117
- function useHover(listener) {
1118
- const motionEvent = (0, vue.shallowRef)();
1119
- const pick = useScenePick(() => motionEvent.value?.endPosition);
1120
- const execute = (pick$1, startPosition, endPosition, hovering) => {
1121
- listener({
1122
- event: {
572
+ * Use graphic hover events with ease, and remove listener automatically on unmounted.
573
+ */
574
+ function useHover(listener) {
575
+ const motionEvent = (0, vue.shallowRef)();
576
+ const pick = useScenePick(() => motionEvent.value?.endPosition);
577
+ const execute = (pick$1, startPosition, endPosition, hovering) => {
578
+ listener({
579
+ event: {
580
+ startPosition: startPosition.clone(),
581
+ endPosition: endPosition.clone()
582
+ },
583
+ pick: pick$1,
584
+ hovering
585
+ });
586
+ };
587
+ useScreenSpaceEventHandler(cesium.ScreenSpaceEventType.MOUSE_MOVE, ({ startPosition, endPosition }) => {
588
+ if (!startPosition.equals(motionEvent.value?.startPosition) || !endPosition.equals(motionEvent.value?.endPosition)) motionEvent.value = {
1123
589
  startPosition: startPosition.clone(),
1124
590
  endPosition: endPosition.clone()
1125
- },
1126
- pick: pick$1,
1127
- hovering
591
+ };
1128
592
  });
1129
- };
1130
- useScreenSpaceEventHandler(cesium.ScreenSpaceEventType.MOUSE_MOVE, ({ startPosition, endPosition }) => {
1131
- if (!startPosition.equals(motionEvent.value?.startPosition) || !endPosition.equals(motionEvent.value?.endPosition)) motionEvent.value = {
1132
- startPosition: startPosition.clone(),
1133
- endPosition: endPosition.clone()
1134
- };
1135
- });
1136
- (0, vue.watch)([pick, motionEvent], ([pick$1, motionEvent$1]) => {
1137
- if (pick$1 && motionEvent$1) {
1138
- const { startPosition, endPosition } = motionEvent$1;
1139
- execute(pick$1, startPosition, endPosition, true);
1140
- }
1141
- });
1142
- (0, vue.watch)(pick, (pick$1, prevPick) => {
1143
- if (prevPick && motionEvent.value) {
1144
- const { startPosition, endPosition } = motionEvent.value;
1145
- execute(prevPick, startPosition, endPosition, false);
1146
- }
1147
- });
1148
- }
593
+ (0, vue.watch)([pick, motionEvent], ([pick$1, motionEvent$1]) => {
594
+ if (pick$1 && motionEvent$1) {
595
+ const { startPosition, endPosition } = motionEvent$1;
596
+ execute(pick$1, startPosition, endPosition, true);
597
+ }
598
+ });
599
+ (0, vue.watch)(pick, (pick$1, prevPick) => {
600
+ if (prevPick && motionEvent.value) {
601
+ const { startPosition, endPosition } = motionEvent.value;
602
+ execute(prevPick, startPosition, endPosition, false);
603
+ }
604
+ });
605
+ }
1149
606
 
1150
607
  //#endregion
1151
608
  //#region useGraphicEvent/usePositioned.ts
1152
609
  /**
1153
- * @internal
1154
- */
1155
- const EVENT_TYPE_RECORD = {
1156
- LEFT_DOWN: cesium.ScreenSpaceEventType.LEFT_DOWN,
1157
- LEFT_UP: cesium.ScreenSpaceEventType.LEFT_UP,
1158
- LEFT_CLICK: cesium.ScreenSpaceEventType.LEFT_CLICK,
1159
- LEFT_DOUBLE_CLICK: cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK,
1160
- RIGHT_DOWN: cesium.ScreenSpaceEventType.RIGHT_DOWN,
1161
- RIGHT_UP: cesium.ScreenSpaceEventType.RIGHT_UP,
1162
- RIGHT_CLICK: cesium.ScreenSpaceEventType.RIGHT_CLICK,
1163
- MIDDLE_DOWN: cesium.ScreenSpaceEventType.MIDDLE_DOWN,
1164
- MIDDLE_UP: cesium.ScreenSpaceEventType.MIDDLE_UP,
1165
- MIDDLE_CLICK: cesium.ScreenSpaceEventType.MIDDLE_CLICK
1166
- };
1167
- function usePositioned(type, listener) {
1168
- const screenEvent = EVENT_TYPE_RECORD[type];
1169
- const viewer = useViewer();
1170
- useScreenSpaceEventHandler(screenEvent, (event) => {
1171
- const position = event.position;
1172
- const pick = viewer.value?.scene.pick(position);
1173
- pick && position && listener({
1174
- event: { position },
1175
- pick
610
+ * @internal
611
+ */
612
+ const EVENT_TYPE_RECORD = {
613
+ LEFT_DOWN: cesium.ScreenSpaceEventType.LEFT_DOWN,
614
+ LEFT_UP: cesium.ScreenSpaceEventType.LEFT_UP,
615
+ LEFT_CLICK: cesium.ScreenSpaceEventType.LEFT_CLICK,
616
+ LEFT_DOUBLE_CLICK: cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK,
617
+ RIGHT_DOWN: cesium.ScreenSpaceEventType.RIGHT_DOWN,
618
+ RIGHT_UP: cesium.ScreenSpaceEventType.RIGHT_UP,
619
+ RIGHT_CLICK: cesium.ScreenSpaceEventType.RIGHT_CLICK,
620
+ MIDDLE_DOWN: cesium.ScreenSpaceEventType.MIDDLE_DOWN,
621
+ MIDDLE_UP: cesium.ScreenSpaceEventType.MIDDLE_UP,
622
+ MIDDLE_CLICK: cesium.ScreenSpaceEventType.MIDDLE_CLICK
623
+ };
624
+ function usePositioned(type, listener) {
625
+ const screenEvent = EVENT_TYPE_RECORD[type];
626
+ const viewer = useViewer();
627
+ useScreenSpaceEventHandler(screenEvent, (event) => {
628
+ const position = event.position;
629
+ const pick = viewer.value?.scene.pick(position);
630
+ pick && position && listener({
631
+ event: { position },
632
+ pick
633
+ });
1176
634
  });
1177
- });
1178
- }
635
+ }
1179
636
 
1180
637
  //#endregion
1181
638
  //#region useGraphicEvent/index.ts
1182
- const GLOBAL_GRAPHIC_SYMBOL = Symbol("GLOBAL_GRAPHIC_SYMBOL");
1183
- const POSITIONED_EVENT_TYPES = [
1184
- "LEFT_DOWN",
1185
- "LEFT_UP",
1186
- "LEFT_CLICK",
1187
- "LEFT_DOUBLE_CLICK",
1188
- "RIGHT_DOWN",
1189
- "RIGHT_UP",
1190
- "RIGHT_CLICK",
1191
- "MIDDLE_DOWN",
1192
- "MIDDLE_UP",
1193
- "MIDDLE_CLICK"
1194
- ];
1195
- /**
1196
- * Handle graphic event listeners and cursor styles for Cesium graphics.
1197
- * You don't need to overly worry about memory leaks from the function, as it automatically cleans up internally.
1198
- */
1199
- function useGraphicEvent() {
1200
- const collection = /* @__PURE__ */ new WeakMap();
1201
- const cursorCollection = /* @__PURE__ */ new WeakMap();
1202
- const dragCursorCollection = /* @__PURE__ */ new WeakMap();
1203
- const removeGraphicEvent = (graphic, type, listener) => {
1204
- const _graphic = graphic === "global" ? GLOBAL_GRAPHIC_SYMBOL : graphic;
1205
- collection?.get(_graphic)?.get(type)?.delete(listener);
1206
- cursorCollection?.get(_graphic)?.get(type)?.delete(listener);
1207
- if (collection?.get(_graphic)?.get(type)?.size === 0) collection.get(_graphic).delete(type);
1208
- if (collection.get(_graphic)?.size === 0) collection.delete(_graphic);
1209
- cursorCollection?.get(_graphic)?.get(type)?.delete(listener);
1210
- if (cursorCollection?.get(_graphic)?.get(type)?.size === 0) cursorCollection?.get(_graphic)?.delete(type);
1211
- if (cursorCollection?.get(_graphic)?.size === 0) cursorCollection?.delete(_graphic);
1212
- dragCursorCollection?.get(_graphic)?.get(type)?.delete(listener);
1213
- if (dragCursorCollection?.get(_graphic)?.get(type)?.size === 0) dragCursorCollection?.get(_graphic)?.delete(type);
1214
- if (dragCursorCollection?.get(_graphic)?.size === 0) dragCursorCollection?.delete(_graphic);
1215
- };
1216
- const addGraphicEvent = (graphic, type, listener, options = {}) => {
1217
- const _graphic = graphic === "global" ? GLOBAL_GRAPHIC_SYMBOL : graphic;
1218
- collection.get(_graphic) ?? collection.set(_graphic, /* @__PURE__ */ new Map());
1219
- const eventTypeMap = collection.get(_graphic);
1220
- eventTypeMap.get(type) ?? eventTypeMap.set(type, /* @__PURE__ */ new Set());
1221
- const listeners = eventTypeMap.get(type);
1222
- listeners.add(listener);
1223
- let { cursor = "pointer", dragCursor } = options;
1224
- if (isDef(cursor)) {
1225
- const _cursor = isFunction(cursor) ? cursor : () => cursor;
1226
- cursorCollection.get(_graphic) ?? cursorCollection.set(_graphic, /* @__PURE__ */ new Map());
1227
- cursorCollection.get(_graphic).get(type) ?? cursorCollection.get(_graphic).set(type, /* @__PURE__ */ new Map());
1228
- cursorCollection.get(_graphic).get(type).set(listener, _cursor);
1229
- }
1230
- if (type === "DRAG") dragCursor ??= (event) => event?.dragging ? "crosshair" : void 0;
1231
- if (isDef(dragCursor)) {
1232
- const _dragCursor = isFunction(dragCursor) ? dragCursor : () => dragCursor;
1233
- dragCursorCollection.get(_graphic) ?? dragCursorCollection.set(_graphic, /* @__PURE__ */ new Map());
1234
- dragCursorCollection.get(_graphic).get(type) ?? dragCursorCollection.get(_graphic).set(type, /* @__PURE__ */ new Map());
1235
- dragCursorCollection.get(_graphic).get(type).set(listener, _dragCursor);
1236
- }
1237
- return () => removeGraphicEvent(graphic, type, listener);
1238
- };
1239
- const clearGraphicEvent = (graphic, type) => {
1240
- const _graphic = graphic === "global" ? GLOBAL_GRAPHIC_SYMBOL : graphic;
1241
- if (type === "all") {
1242
- collection.delete(_graphic);
1243
- cursorCollection.delete(_graphic);
1244
- dragCursorCollection.delete(_graphic);
1245
- return;
1246
- }
1247
- collection.get(_graphic)?.delete(type);
1248
- if (collection.get(_graphic)?.size === 0) collection.delete(_graphic);
1249
- cursorCollection?.get(_graphic)?.delete(type);
1250
- dragCursorCollection?.get(_graphic)?.delete(type);
1251
- if (cursorCollection?.get(_graphic)?.size === 0) cursorCollection?.delete(_graphic);
1252
- if (dragCursorCollection?.get(_graphic)?.size === 0) dragCursorCollection?.delete(_graphic);
1253
- };
1254
- for (const type of POSITIONED_EVENT_TYPES) usePositioned(type, (event) => {
1255
- const graphics = resolvePick(event.pick);
1256
- graphics.concat(GLOBAL_GRAPHIC_SYMBOL).forEach((graphic) => {
1257
- collection.get(graphic)?.get(type)?.forEach((fn) => tryRun(fn)?.(event));
639
+ const GLOBAL_GRAPHIC_SYMBOL = Symbol("GLOBAL_GRAPHIC_SYMBOL");
640
+ const POSITIONED_EVENT_TYPES = [
641
+ "LEFT_DOWN",
642
+ "LEFT_UP",
643
+ "LEFT_CLICK",
644
+ "LEFT_DOUBLE_CLICK",
645
+ "RIGHT_DOWN",
646
+ "RIGHT_UP",
647
+ "RIGHT_CLICK",
648
+ "MIDDLE_DOWN",
649
+ "MIDDLE_UP",
650
+ "MIDDLE_CLICK"
651
+ ];
652
+ /**
653
+ * Handle graphic event listeners and cursor styles for Cesium graphics.
654
+ * You don't need to overly worry about memory leaks from the function, as it automatically cleans up internally.
655
+ */
656
+ function useGraphicEvent() {
657
+ const collection = /* @__PURE__ */ new WeakMap();
658
+ const cursorCollection = /* @__PURE__ */ new WeakMap();
659
+ const dragCursorCollection = /* @__PURE__ */ new WeakMap();
660
+ const remove = (graphic, type, listener) => {
661
+ const _graphic = graphic === "global" ? GLOBAL_GRAPHIC_SYMBOL : graphic;
662
+ collection?.get(_graphic)?.get(type)?.delete(listener);
663
+ cursorCollection?.get(_graphic)?.get(type)?.delete(listener);
664
+ if (collection?.get(_graphic)?.get(type)?.size === 0) collection.get(_graphic).delete(type);
665
+ if (collection.get(_graphic)?.size === 0) collection.delete(_graphic);
666
+ cursorCollection?.get(_graphic)?.get(type)?.delete(listener);
667
+ if (cursorCollection?.get(_graphic)?.get(type)?.size === 0) cursorCollection?.get(_graphic)?.delete(type);
668
+ if (cursorCollection?.get(_graphic)?.size === 0) cursorCollection?.delete(_graphic);
669
+ dragCursorCollection?.get(_graphic)?.get(type)?.delete(listener);
670
+ if (dragCursorCollection?.get(_graphic)?.get(type)?.size === 0) dragCursorCollection?.get(_graphic)?.delete(type);
671
+ if (dragCursorCollection?.get(_graphic)?.size === 0) dragCursorCollection?.delete(_graphic);
672
+ };
673
+ const add = (graphic, type, listener, options = {}) => {
674
+ const _graphic = graphic === "global" ? GLOBAL_GRAPHIC_SYMBOL : graphic;
675
+ collection.get(_graphic) ?? collection.set(_graphic, /* @__PURE__ */ new Map());
676
+ const eventTypeMap = collection.get(_graphic);
677
+ eventTypeMap.get(type) ?? eventTypeMap.set(type, /* @__PURE__ */ new Set());
678
+ eventTypeMap.get(type).add(listener);
679
+ let { cursor = "pointer", dragCursor } = options;
680
+ if ((0, __vesium_shared.isDef)(cursor)) {
681
+ const _cursor = (0, __vesium_shared.isFunction)(cursor) ? cursor : () => cursor;
682
+ cursorCollection.get(_graphic) ?? cursorCollection.set(_graphic, /* @__PURE__ */ new Map());
683
+ cursorCollection.get(_graphic).get(type) ?? cursorCollection.get(_graphic).set(type, /* @__PURE__ */ new Map());
684
+ cursorCollection.get(_graphic).get(type).set(listener, _cursor);
685
+ }
686
+ if (type === "DRAG") dragCursor ??= ((event) => event?.dragging ? "crosshair" : void 0);
687
+ if ((0, __vesium_shared.isDef)(dragCursor)) {
688
+ const _dragCursor = (0, __vesium_shared.isFunction)(dragCursor) ? dragCursor : () => dragCursor;
689
+ dragCursorCollection.get(_graphic) ?? dragCursorCollection.set(_graphic, /* @__PURE__ */ new Map());
690
+ dragCursorCollection.get(_graphic).get(type) ?? dragCursorCollection.get(_graphic).set(type, /* @__PURE__ */ new Map());
691
+ dragCursorCollection.get(_graphic).get(type).set(listener, _dragCursor);
692
+ }
693
+ return () => remove(graphic, type, listener);
694
+ };
695
+ const clear = (graphic, type) => {
696
+ const _graphic = graphic === "global" ? GLOBAL_GRAPHIC_SYMBOL : graphic;
697
+ if (type === "all") {
698
+ collection.delete(_graphic);
699
+ cursorCollection.delete(_graphic);
700
+ dragCursorCollection.delete(_graphic);
701
+ return;
702
+ }
703
+ collection.get(_graphic)?.delete(type);
704
+ if (collection.get(_graphic)?.size === 0) collection.delete(_graphic);
705
+ cursorCollection?.get(_graphic)?.delete(type);
706
+ dragCursorCollection?.get(_graphic)?.delete(type);
707
+ if (cursorCollection?.get(_graphic)?.size === 0) cursorCollection?.delete(_graphic);
708
+ if (dragCursorCollection?.get(_graphic)?.size === 0) dragCursorCollection?.delete(_graphic);
709
+ };
710
+ for (const type of POSITIONED_EVENT_TYPES) usePositioned(type, (event) => {
711
+ (0, __vesium_shared.resolvePick)(event.pick).concat(GLOBAL_GRAPHIC_SYMBOL).forEach((graphic) => {
712
+ collection.get(graphic)?.get(type)?.forEach((fn) => (0, __vesium_shared.tryRun)(fn)?.(event));
713
+ });
1258
714
  });
1259
- });
1260
- const dragging = (0, vue.ref)(false);
1261
- const viewer = useViewer();
1262
- useHover((event) => {
1263
- const graphics = resolvePick(event.pick).concat(GLOBAL_GRAPHIC_SYMBOL);
1264
- graphics.forEach((graphic) => {
1265
- collection.get(graphic)?.get("HOVER")?.forEach((fn) => tryRun(fn)?.(event));
1266
- if (!dragging.value) cursorCollection.get(graphic)?.forEach((map) => {
1267
- map.forEach((fn) => {
1268
- const cursor = event.hovering ? tryRun(fn)(event) : "";
1269
- viewer.value?.canvas.style?.setProperty("cursor", cursor);
715
+ const dragging = (0, vue.ref)(false);
716
+ const viewer = useViewer();
717
+ useHover((event) => {
718
+ (0, __vesium_shared.resolvePick)(event.pick).concat(GLOBAL_GRAPHIC_SYMBOL).forEach((graphic) => {
719
+ collection.get(graphic)?.get("HOVER")?.forEach((fn) => (0, __vesium_shared.tryRun)(fn)?.(event));
720
+ if (!dragging.value) cursorCollection.get(graphic)?.forEach((map) => {
721
+ map.forEach((fn) => {
722
+ const cursor = event.hovering ? (0, __vesium_shared.tryRun)(fn)(event) : "";
723
+ viewer.value?.canvas.style?.setProperty("cursor", cursor);
724
+ });
1270
725
  });
1271
726
  });
1272
727
  });
1273
- });
1274
- useDrag((event) => {
1275
- const graphics = resolvePick(event.pick).concat(GLOBAL_GRAPHIC_SYMBOL);
1276
- dragging.value = event.dragging;
1277
- graphics.forEach((graphic) => {
1278
- collection.get(graphic)?.get("DRAG")?.forEach((fn) => tryRun(fn)(event));
1279
- dragCursorCollection.get(graphic)?.forEach((map) => {
1280
- map.forEach((fn) => {
1281
- const cursor = event.dragging ? tryRun(fn)(event) : "";
1282
- viewer.value?.canvas.style?.setProperty("cursor", cursor);
728
+ useDrag((event) => {
729
+ const graphics = (0, __vesium_shared.resolvePick)(event.pick).concat(GLOBAL_GRAPHIC_SYMBOL);
730
+ dragging.value = event.dragging;
731
+ graphics.forEach((graphic) => {
732
+ collection.get(graphic)?.get("DRAG")?.forEach((fn) => (0, __vesium_shared.tryRun)(fn)(event));
733
+ dragCursorCollection.get(graphic)?.forEach((map) => {
734
+ map.forEach((fn) => {
735
+ const cursor = event.dragging ? (0, __vesium_shared.tryRun)(fn)(event) : "";
736
+ viewer.value?.canvas.style?.setProperty("cursor", cursor);
737
+ });
1283
738
  });
1284
739
  });
1285
740
  });
1286
- });
1287
- return {
1288
- addGraphicEvent,
1289
- removeGraphicEvent,
1290
- clearGraphicEvent
1291
- };
1292
- }
741
+ return {
742
+ add,
743
+ remove,
744
+ clear
745
+ };
746
+ }
1293
747
 
1294
748
  //#endregion
1295
749
  //#region useImageryLayer/index.ts
1296
- function useImageryLayer(data, options = {}) {
1297
- const { destroyOnRemove, collection, isActive = true, evaluating } = options;
1298
- const result = (0, __vueuse_core.computedAsync)(() => toPromiseValue(data), [], { evaluating });
1299
- const viewer = useViewer();
1300
- (0, vue.watchEffect)((onCleanup) => {
1301
- const _isActive = (0, vue.toValue)(isActive);
1302
- if (_isActive) {
1303
- const list = Array.isArray(result.value) ? [...result.value] : [result.value];
1304
- const _collection = collection ?? viewer.value?.imageryLayers;
1305
- if (collection?.isDestroyed()) return;
1306
- list.forEach((item) => {
1307
- if (!item) {
1308
- console.warn("ImageryLayer is undefined");
1309
- return;
1310
- }
1311
- if (item?.isDestroyed()) {
1312
- console.warn("ImageryLayer is destroyed");
1313
- return;
1314
- }
1315
- _collection?.add(item);
1316
- });
1317
- onCleanup(() => {
1318
- const destroy = (0, vue.toValue)(destroyOnRemove);
1319
- list.forEach((item) => item && _collection?.remove(item, destroy));
1320
- });
1321
- }
1322
- });
1323
- return result;
1324
- }
750
+ function useImageryLayer(data, options = {}) {
751
+ const { destroyOnRemove, collection, isActive = true, evaluating } = options;
752
+ const result = (0, __vueuse_core.computedAsync)(() => toPromiseValue(data), [], { evaluating });
753
+ const viewer = useViewer();
754
+ (0, vue.watchEffect)((onCleanup) => {
755
+ if ((0, vue.toValue)(isActive)) {
756
+ const list = Array.isArray(result.value) ? [...result.value] : [result.value];
757
+ const _collection = collection ?? viewer.value?.imageryLayers;
758
+ if (collection?.isDestroyed()) return;
759
+ list.forEach((item) => {
760
+ if (!item) {
761
+ console.warn("ImageryLayer is undefined");
762
+ return;
763
+ }
764
+ if (item?.isDestroyed()) {
765
+ console.warn("ImageryLayer is destroyed");
766
+ return;
767
+ }
768
+ _collection?.add(item);
769
+ });
770
+ onCleanup(() => {
771
+ const destroy = (0, vue.toValue)(destroyOnRemove);
772
+ list.forEach((item) => item && _collection?.remove(item, destroy));
773
+ });
774
+ }
775
+ });
776
+ return result;
777
+ }
1325
778
 
1326
779
  //#endregion
1327
780
  //#region useImageryLayerScope/index.ts
1328
781
  /**
1329
- * Make `add` and `remove` operations of `ImageryLayerCollection` scoped,
1330
- * automatically remove `ImageryLayer` instance when component is unmounted.
1331
- */
1332
- function useImageryLayerScope(options = {}) {
1333
- const { collection: _collection, destroyOnRemove } = options;
1334
- const viewer = useViewer();
1335
- const collection = (0, vue.computed)(() => {
1336
- return (0, vue.toValue)(_collection) ?? viewer.value?.imageryLayers;
1337
- });
1338
- const addFn = (imageryLayer, index) => {
1339
- if (!collection.value) throw new Error("collection is not defined");
1340
- collection.value.add(imageryLayer, index);
1341
- return imageryLayer;
1342
- };
1343
- const removeFn = (imageryLayer, destroy) => {
1344
- return !!collection.value?.remove(imageryLayer, destroy);
1345
- };
1346
- const { scope, add, remove, removeWhere, removeScope } = useCollectionScope(addFn, removeFn, [destroyOnRemove]);
1347
- return {
1348
- scope,
1349
- add,
1350
- remove,
1351
- removeWhere,
1352
- removeScope
1353
- };
1354
- }
782
+ * Make `add` and `remove` operations of `ImageryLayerCollection` scoped,
783
+ * automatically remove `ImageryLayer` instance when component is unmounted.
784
+ */
785
+ function useImageryLayerScope(options = {}) {
786
+ const { collection: _collection, destroyOnRemove } = options;
787
+ const viewer = useViewer();
788
+ const collection = (0, vue.computed)(() => {
789
+ return (0, vue.toValue)(_collection) ?? viewer.value?.imageryLayers;
790
+ });
791
+ return useCollectionScope({
792
+ addEffect(instance, index) {
793
+ if (!collection.value) throw new Error("collection is not defined");
794
+ if ((0, __vesium_shared.isPromise)(instance)) return new Promise((resolve, reject) => {
795
+ instance.then((i) => {
796
+ collection.value.add(i, index);
797
+ resolve(i);
798
+ }).catch((error) => reject(error));
799
+ });
800
+ else {
801
+ collection.value.add(instance, index);
802
+ return instance;
803
+ }
804
+ },
805
+ removeEffect(instance, destroy) {
806
+ return !!collection.value?.remove(instance, destroy);
807
+ },
808
+ removeScopeArgs: [destroyOnRemove]
809
+ });
810
+ }
1355
811
 
1356
812
  //#endregion
1357
813
  //#region usePostProcessStage/index.ts
1358
- function usePostProcessStage(data, options = {}) {
1359
- const { collection, isActive = true, evaluating } = options;
1360
- const result = (0, __vueuse_core.computedAsync)(() => toPromiseValue(data), void 0, { evaluating });
1361
- const viewer = useViewer();
1362
- (0, vue.watchEffect)((onCleanup) => {
1363
- if (!viewer.value) return;
1364
- const _isActive = (0, vue.toValue)(isActive);
1365
- if (_isActive) {
1366
- const list = Array.isArray(result.value) ? [...result.value] : [result.value];
1367
- const _collection = collection ?? viewer.value.scene.postProcessStages;
1368
- list.forEach((item) => item && _collection.add(item));
1369
- onCleanup(() => {
1370
- list.forEach((item) => item && _collection.remove(item));
1371
- });
1372
- }
1373
- });
1374
- return result;
1375
- }
814
+ function usePostProcessStage(data, options = {}) {
815
+ const { collection, isActive = true, evaluating } = options;
816
+ const result = (0, __vueuse_core.computedAsync)(() => toPromiseValue(data), void 0, { evaluating });
817
+ const viewer = useViewer();
818
+ (0, vue.watchEffect)((onCleanup) => {
819
+ if (!viewer.value) return;
820
+ if ((0, vue.toValue)(isActive)) {
821
+ const list = Array.isArray(result.value) ? [...result.value] : [result.value];
822
+ const _collection = collection ?? viewer.value.scene.postProcessStages;
823
+ list.forEach((item) => item && _collection.add(item));
824
+ onCleanup(() => {
825
+ list.forEach((item) => item && _collection.remove(item));
826
+ });
827
+ }
828
+ });
829
+ return result;
830
+ }
1376
831
 
1377
832
  //#endregion
1378
833
  //#region usePostProcessStageScope/index.ts
1379
834
  /**
1380
- * Make `add` and `remove` operations of `PostProcessStageCollection` scoped,
1381
- * automatically remove `PostProcessStage` instance when component is unmounted.
1382
- */
1383
- function usePostProcessStageScope(options = {}) {
1384
- const { collection: _collection } = options;
1385
- const viewer = useViewer();
1386
- const collection = (0, vue.computed)(() => {
1387
- return (0, vue.toValue)(_collection) ?? viewer.value?.postProcessStages;
1388
- });
1389
- const addFn = (postProcessStage) => {
1390
- if (!collection.value) throw new Error("collection is not defined");
1391
- return collection.value.add(postProcessStage);
1392
- };
1393
- const removeFn = (postProcessStage) => {
1394
- return !!collection.value?.remove(postProcessStage);
1395
- };
1396
- const { scope, add, remove, removeWhere, removeScope } = useCollectionScope(addFn, removeFn, []);
1397
- return {
1398
- scope,
1399
- add,
1400
- remove,
1401
- removeWhere,
1402
- removeScope
1403
- };
1404
- }
835
+ * Make `add` and `remove` operations of `PostProcessStageCollection` scoped,
836
+ * automatically remove `PostProcessStage` instance when component is unmounted.
837
+ */
838
+ function usePostProcessStageScope(options = {}) {
839
+ const { collection: _collection } = options;
840
+ const viewer = useViewer();
841
+ const collection = (0, vue.computed)(() => {
842
+ return (0, vue.toValue)(_collection) ?? viewer.value?.postProcessStages;
843
+ });
844
+ return useCollectionScope({
845
+ addEffect(instance) {
846
+ if (!collection.value) throw new Error("collection is not defined");
847
+ if ((0, __vesium_shared.isPromise)(instance)) return new Promise((resolve, reject) => {
848
+ instance.then((instance$1) => {
849
+ collection.value.add(instance$1);
850
+ resolve(instance$1);
851
+ }).catch((error) => reject(error));
852
+ });
853
+ else return collection.value.add(instance);
854
+ },
855
+ removeEffect(instance, ...args) {
856
+ return !!collection.value?.remove(instance, ...args);
857
+ },
858
+ removeScopeArgs: []
859
+ });
860
+ }
1405
861
 
1406
862
  //#endregion
1407
863
  //#region usePrimitive/index.ts
1408
- function usePrimitive(data, options = {}) {
1409
- const { collection, isActive = true, evaluating } = options;
1410
- const result = (0, __vueuse_core.computedAsync)(() => toPromiseValue(data), void 0, { evaluating });
1411
- const viewer = useViewer();
1412
- (0, vue.watchEffect)((onCleanup) => {
1413
- const _isActive = (0, vue.toValue)(isActive);
1414
- if (_isActive) {
1415
- const list = Array.isArray(result.value) ? [...result.value] : [result.value];
1416
- const _collection = collection === "ground" ? viewer.value?.scene.groundPrimitives : collection ?? viewer.value?.scene.primitives;
1417
- list.forEach((item) => item && _collection?.add(item));
1418
- onCleanup(() => {
1419
- !_collection?.isDestroyed() && list.forEach((item) => item && _collection?.remove(item));
1420
- });
1421
- }
1422
- });
1423
- return result;
1424
- }
864
+ function usePrimitive(data, options = {}) {
865
+ const { collection, isActive = true, evaluating } = options;
866
+ const result = (0, __vueuse_core.computedAsync)(() => toPromiseValue(data), void 0, { evaluating });
867
+ const viewer = useViewer();
868
+ (0, vue.watchEffect)((onCleanup) => {
869
+ if ((0, vue.toValue)(isActive)) {
870
+ const list = Array.isArray(result.value) ? [...result.value] : [result.value];
871
+ const _collection = collection === "ground" ? viewer.value?.scene.groundPrimitives : collection ?? viewer.value?.scene.primitives;
872
+ list.forEach((item) => item && _collection?.add(item));
873
+ onCleanup(() => {
874
+ !_collection?.isDestroyed() && list.forEach((item) => item && _collection?.remove(item));
875
+ });
876
+ }
877
+ });
878
+ return result;
879
+ }
1425
880
 
1426
881
  //#endregion
1427
882
  //#region usePrimitiveScope/index.ts
1428
883
  /**
1429
- * Make `add` and `remove` operations of `PrimitiveCollection` scoped,
1430
- * automatically remove `Primitive` instance when component is unmounted.
1431
- */
1432
- function usePrimitiveScope(options = {}) {
1433
- const { collection: _collection } = options;
1434
- const viewer = useViewer();
1435
- const collection = (0, vue.computed)(() => {
1436
- return (0, vue.toValue)(_collection) ?? viewer.value?.scene.primitives;
1437
- });
1438
- const addFn = (primitive) => {
1439
- if (!collection.value) throw new Error("collection is not defined");
1440
- return collection.value.add(primitive);
1441
- };
1442
- const removeFn = (primitive) => {
1443
- return !!collection.value?.remove(primitive);
1444
- };
1445
- const { scope, add, remove, removeWhere, removeScope } = useCollectionScope(addFn, removeFn, []);
1446
- return {
1447
- scope,
1448
- add,
1449
- remove,
1450
- removeWhere,
1451
- removeScope
1452
- };
1453
- }
884
+ * Make `add` and `remove` operations of `PrimitiveCollection` scoped,
885
+ * automatically remove `Primitive` instance when component is unmounted.
886
+ */
887
+ function usePrimitiveScope(options = {}) {
888
+ const { collection: _collection } = options;
889
+ const viewer = useViewer();
890
+ const collection = (0, vue.computed)(() => {
891
+ const value = (0, vue.toValue)(_collection);
892
+ return value === "ground" ? viewer.value?.scene?.groundPrimitives : value || viewer.value?.scene.primitives;
893
+ });
894
+ const { scope, add, remove, removeWhere, removeScope } = useCollectionScope({
895
+ addEffect(instance, ...args) {
896
+ if (!collection.value) throw new Error("collection is not defined");
897
+ if ((0, __vesium_shared.isPromise)(instance)) return new Promise((resolve, reject) => {
898
+ instance.then((instance$1) => resolve(collection.value.add(instance$1, ...args))).catch((error) => reject(error));
899
+ });
900
+ else return collection.value.add(instance, ...args);
901
+ },
902
+ removeEffect(instance) {
903
+ return !!collection.value?.remove(instance);
904
+ },
905
+ removeScopeArgs: []
906
+ });
907
+ return {
908
+ scope,
909
+ add,
910
+ remove,
911
+ removeWhere,
912
+ removeScope
913
+ };
914
+ }
1454
915
 
1455
916
  //#endregion
1456
917
  //#region useScaleBar/index.ts
1457
- const distances = [
1458
- .01,
1459
- .05,
1460
- .1,
1461
- .5,
1462
- 1,
1463
- 2,
1464
- 3,
1465
- 5,
1466
- 10,
1467
- 20,
1468
- 30,
1469
- 50,
1470
- 100,
1471
- 200,
1472
- 300,
1473
- 500,
1474
- 1e3,
1475
- 2e3,
1476
- 3e3,
1477
- 5e3,
1478
- 1e4,
1479
- 2e4,
1480
- 3e4,
1481
- 5e4,
1482
- 1e5,
1483
- 2e5,
1484
- 3e5,
1485
- 5e5,
1486
- 1e6,
1487
- 2e6,
1488
- 3e6,
1489
- 5e6,
1490
- 1e7,
1491
- 2e7,
1492
- 3e7,
1493
- 5e7
1494
- ].reverse();
1495
- /**
1496
- * Reactive generation of scale bars
1497
- */
1498
- function useScaleBar(options = {}) {
1499
- const { maxPixel = 80, delay = 8 } = options;
1500
- const maxPixelRef = (0, vue.computed)(() => (0, vue.toValue)(maxPixel));
1501
- const viewer = useViewer();
1502
- const canvasSize = (0, __vueuse_core.useElementSize)(() => viewer.value?.canvas);
1503
- const pixelDistance = (0, vue.ref)();
1504
- const setPixelDistance = async () => {
1505
- await (0, vue.nextTick)();
1506
- const scene = viewer.value?.scene;
1507
- if (!scene) return;
1508
- const left = scene.camera.getPickRay(new cesium.Cartesian2(Math.floor(canvasSize.width.value / 2), canvasSize.height.value - 1));
1509
- const right = scene.camera.getPickRay(new cesium.Cartesian2(Math.floor(1 + canvasSize.width.value / 2), canvasSize.height.value - 1));
1510
- if (!left || !right) return;
1511
- const leftPosition = scene.globe.pick(left, scene);
1512
- const rightPosition = scene.globe.pick(right, scene);
1513
- if (!leftPosition || !rightPosition) return;
1514
- const leftCartographic = scene.globe.ellipsoid.cartesianToCartographic(leftPosition);
1515
- const rightCartographic = scene.globe.ellipsoid.cartesianToCartographic(rightPosition);
1516
- const geodesic = new cesium.EllipsoidGeodesic(leftCartographic, rightCartographic);
1517
- pixelDistance.value = geodesic.surfaceDistance;
1518
- };
1519
- (0, __vueuse_core.watchImmediate)(viewer, () => setPixelDistance());
1520
- useCesiumEventListener(() => viewer.value?.camera.changed, throttle(setPixelDistance, delay));
1521
- const distance = (0, vue.computed)(() => {
1522
- if (pixelDistance.value) return distances.find((item) => pixelDistance.value * maxPixelRef.value > item);
1523
- });
1524
- const width = (0, vue.computed)(() => {
1525
- if (distance.value && pixelDistance.value) {
1526
- const value = distance.value / pixelDistance.value;
1527
- return value;
1528
- }
1529
- return 0;
1530
- });
1531
- const distanceText = (0, vue.computed)(() => {
1532
- if (distance.value) return distance.value > 1e3 ? `${distance.value / 1e3 || 0}km` : `${distance.value || 0}m`;
1533
- });
1534
- return {
1535
- pixelDistance: (0, vue.readonly)(pixelDistance),
1536
- width,
1537
- distance,
1538
- distanceText
1539
- };
1540
- }
918
+ const distances = [
919
+ .01,
920
+ .05,
921
+ .1,
922
+ .5,
923
+ 1,
924
+ 2,
925
+ 3,
926
+ 5,
927
+ 10,
928
+ 20,
929
+ 30,
930
+ 50,
931
+ 100,
932
+ 200,
933
+ 300,
934
+ 500,
935
+ 1e3,
936
+ 2e3,
937
+ 3e3,
938
+ 5e3,
939
+ 1e4,
940
+ 2e4,
941
+ 3e4,
942
+ 5e4,
943
+ 1e5,
944
+ 2e5,
945
+ 3e5,
946
+ 5e5,
947
+ 1e6,
948
+ 2e6,
949
+ 3e6,
950
+ 5e6,
951
+ 1e7,
952
+ 2e7,
953
+ 3e7,
954
+ 5e7
955
+ ].reverse();
956
+ /**
957
+ * Reactive generation of scale bars
958
+ */
959
+ function useScaleBar(options = {}) {
960
+ const { maxPixel = 80, delay = 8 } = options;
961
+ const maxPixelRef = (0, vue.computed)(() => (0, vue.toValue)(maxPixel));
962
+ const viewer = useViewer();
963
+ const canvasSize = (0, __vueuse_core.useElementSize)(() => viewer.value?.canvas);
964
+ const pixelDistance = (0, vue.ref)();
965
+ const setPixelDistance = async () => {
966
+ await (0, vue.nextTick)();
967
+ const scene = viewer.value?.scene;
968
+ if (!scene) return;
969
+ const left = scene.camera.getPickRay(new cesium.Cartesian2(Math.floor(canvasSize.width.value / 2), canvasSize.height.value - 1));
970
+ const right = scene.camera.getPickRay(new cesium.Cartesian2(Math.floor(1 + canvasSize.width.value / 2), canvasSize.height.value - 1));
971
+ if (!left || !right) return;
972
+ const leftPosition = scene.globe.pick(left, scene);
973
+ const rightPosition = scene.globe.pick(right, scene);
974
+ if (!leftPosition || !rightPosition) return;
975
+ pixelDistance.value = new cesium.EllipsoidGeodesic(scene.globe.ellipsoid.cartesianToCartographic(leftPosition), scene.globe.ellipsoid.cartesianToCartographic(rightPosition)).surfaceDistance;
976
+ };
977
+ (0, __vueuse_core.watchImmediate)(viewer, () => setPixelDistance());
978
+ useCesiumEventListener(() => viewer.value?.camera.changed, (0, __vesium_shared.throttle)(setPixelDistance, delay));
979
+ const distance = (0, vue.computed)(() => {
980
+ if (pixelDistance.value) return distances.find((item) => pixelDistance.value * maxPixelRef.value > item);
981
+ });
982
+ const width = (0, vue.computed)(() => {
983
+ if (distance.value && pixelDistance.value) return distance.value / pixelDistance.value;
984
+ return 0;
985
+ });
986
+ const distanceText = (0, vue.computed)(() => {
987
+ if (distance.value) return distance.value > 1e3 ? `${distance.value / 1e3 || 0}km` : `${distance.value || 0}m`;
988
+ });
989
+ return {
990
+ pixelDistance: (0, vue.readonly)(pixelDistance),
991
+ width,
992
+ distance,
993
+ distanceText
994
+ };
995
+ }
1541
996
 
1542
997
  //#endregion
1543
998
  //#region useSceneDrillPick/index.ts
1544
999
  /**
1545
- * Uses the `scene.drillPick` function to perform screen point picking,
1546
- * return a computed property containing the pick result, or undefined if no object is picked.
1547
- *
1548
- * @param windowPosition The screen coordinates of the pick point.
1549
- */
1550
- function useSceneDrillPick(windowPosition, options = {}) {
1551
- const { width = 3, height = 3, limit, throttled = 8, isActive = true } = options;
1552
- const viewer = useViewer();
1553
- const position = (0, __vueuse_core.refThrottled)((0, vue.computed)(() => (0, vue.toValue)(windowPosition)), throttled, false, true);
1554
- const pick = (0, vue.computed)(() => {
1555
- if (position.value && (0, vue.toValue)(isActive)) return viewer.value?.scene.drillPick(position.value, (0, vue.toValue)(limit), (0, vue.toValue)(width), (0, vue.toValue)(height));
1556
- });
1557
- return pick;
1558
- }
1000
+ * Uses the `scene.drillPick` function to perform screen point picking,
1001
+ * return a computed property containing the pick result, or undefined if no object is picked.
1002
+ *
1003
+ * @param windowPosition The screen coordinates of the pick point.
1004
+ */
1005
+ function useSceneDrillPick(windowPosition, options = {}) {
1006
+ const { width = 3, height = 3, limit, throttled = 8, isActive = true } = options;
1007
+ const viewer = useViewer();
1008
+ const position = (0, __vueuse_core.refThrottled)((0, vue.computed)(() => (0, vue.toValue)(windowPosition)), throttled, false, true);
1009
+ return (0, vue.computed)(() => {
1010
+ if (position.value && (0, vue.toValue)(isActive)) return viewer.value?.scene.drillPick(position.value, (0, vue.toValue)(limit), (0, vue.toValue)(width), (0, vue.toValue)(height));
1011
+ });
1012
+ }
1559
1013
 
1560
1014
  //#endregion
1561
1015
  exports.CREATE_VIEWER_COLLECTION = CREATE_VIEWER_COLLECTION;
1562
1016
  exports.CREATE_VIEWER_INJECTION_KEY = CREATE_VIEWER_INJECTION_KEY;
1563
- exports.CesiumMaterial = CesiumMaterial;
1564
- exports.addMaterialCache = addMaterialCache;
1565
- exports.arrayDiff = arrayDiff;
1566
- exports.assertError = assertError;
1567
- exports.canvasCoordToCartesian = canvasCoordToCartesian;
1568
- exports.cartesianToCanvasCoord = cartesianToCanvasCoord;
1569
- exports.cesiumEquals = cesiumEquals;
1570
- exports.createCesiumAttribute = createCesiumAttribute;
1571
- exports.createCesiumProperty = createCesiumProperty;
1572
- exports.createPropertyField = createPropertyField;
1573
1017
  exports.createViewer = createViewer;
1574
- exports.degreesToDms = degreesToDms;
1575
- exports.dmsDecode = dmsDecode;
1576
- exports.dmsEncode = dmsEncode;
1577
- exports.dmsToDegrees = dmsToDegrees;
1578
- exports.getMaterialCache = getMaterialCache;
1579
- exports.isArray = isArray;
1580
- exports.isBase64 = isBase64;
1581
- exports.isBoolean = isBoolean;
1582
- exports.isCesiumConstant = isCesiumConstant;
1583
- exports.isDef = isDef;
1584
- exports.isElement = isElement;
1585
- exports.isFunction = isFunction;
1586
- exports.isNumber = isNumber;
1587
- exports.isObject = isObject;
1588
- exports.isPromise = isPromise;
1589
- exports.isProperty = isProperty;
1590
- exports.isString = isString;
1591
- exports.isWindow = isWindow;
1592
- exports.pickHitGraphic = pickHitGraphic;
1593
- exports.resolvePick = resolvePick;
1594
- exports.throttle = throttle;
1595
- exports.toCartesian3 = toCartesian3;
1596
- exports.toCartographic = toCartographic;
1597
- exports.toCoord = toCoord;
1598
1018
  exports.toPromiseValue = toPromiseValue;
1599
- exports.toProperty = toProperty;
1600
- exports.toPropertyValue = toPropertyValue;
1601
- exports.tryRun = tryRun;
1602
1019
  exports.useCameraState = useCameraState;
1603
1020
  exports.useCesiumEventListener = useCesiumEventListener;
1604
1021
  exports.useCesiumFps = useCesiumFps;
@@ -1620,5 +1037,12 @@ exports.useSceneDrillPick = useSceneDrillPick;
1620
1037
  exports.useScenePick = useScenePick;
1621
1038
  exports.useScreenSpaceEventHandler = useScreenSpaceEventHandler;
1622
1039
  exports.useViewer = useViewer;
1623
- })(this.Vesium = this.Vesium || {}, VueUse, Cesium, Vue);
1040
+ Object.keys(__vesium_shared).forEach(function (k) {
1041
+ if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
1042
+ enumerable: true,
1043
+ get: function () { return __vesium_shared[k]; }
1044
+ });
1045
+ });
1046
+
1047
+ })(this.Vesium = this.Vesium || {}, VueUse, Cesium, Vue, Vesium);
1624
1048
  //# sourceMappingURL=index.iife.js.map