vesium 1.0.1-beta.51 → 1.0.1-beta.54

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