@znemz/cesium-navigation 3.0.5 → 6.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +175 -63
- package/dist/cesium-navigation.css +1 -0
- package/dist/cesium-navigation.js +479 -0
- package/dist/cesium-navigation.js.map +1 -0
- package/dist/cesium-navigation.umd.js +20 -0
- package/dist/cesium-navigation.umd.js.map +1 -0
- package/dist/index.d.ts +174 -0
- package/package.json +52 -67
- package/dist/browser.js +0 -2610
- package/dist/esm.js +0 -2606
- package/dist/index.css +0 -492
- package/dist/index.js +0 -2610
|
@@ -0,0 +1,479 @@
|
|
|
1
|
+
var O = Object.defineProperty;
|
|
2
|
+
var $ = (o, e, t) => e in o ? O(o, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : o[e] = t;
|
|
3
|
+
var n = (o, e, t) => $(o, typeof e != "symbol" ? e + "" : e, t);
|
|
4
|
+
import { SceneMode as b, Ray as _, defined as r, Cartographic as S, EllipsoidGeodesic as V, DeveloperError as w, EventHelper as x, getTimestamp as A, Cartesian2 as p, Rectangle as F, Camera as I, Cartesian3 as v, IntersectionTests as U, BoundingSphere as B, HeadingPitchRange as Z, Math as q, Event as E } from "cesium";
|
|
5
|
+
function W(o, e, t) {
|
|
6
|
+
const { scene: s } = o, { camera: i } = s;
|
|
7
|
+
if (s.mode === b.MORPHING)
|
|
8
|
+
return;
|
|
9
|
+
const a = new _();
|
|
10
|
+
a.origin = i.positionWC, a.direction = i.directionWC;
|
|
11
|
+
const l = s.globe.pick(a, s, t);
|
|
12
|
+
if (r(l))
|
|
13
|
+
return e ? l : s.globe.ellipsoid.cartesianToCartographic(l, new S());
|
|
14
|
+
}
|
|
15
|
+
function G(o, e) {
|
|
16
|
+
return o > 1 ? `${Math.round(o)} ${e}` : o > 0.01 ? `${o.toFixed(2)} ${e}` : `${o.toExponential(2)} ${e}`;
|
|
17
|
+
}
|
|
18
|
+
const k = {
|
|
19
|
+
meters: 1,
|
|
20
|
+
kilometers: 1e-3,
|
|
21
|
+
miles: 621371e-9,
|
|
22
|
+
feet: 3.28084,
|
|
23
|
+
nauticalmiles: 539957e-9
|
|
24
|
+
};
|
|
25
|
+
function j(o, e, t) {
|
|
26
|
+
return o / k[e] * k[t];
|
|
27
|
+
}
|
|
28
|
+
const M = new V(), R = [
|
|
29
|
+
1,
|
|
30
|
+
2,
|
|
31
|
+
3,
|
|
32
|
+
5,
|
|
33
|
+
10,
|
|
34
|
+
20,
|
|
35
|
+
30,
|
|
36
|
+
50,
|
|
37
|
+
100,
|
|
38
|
+
200,
|
|
39
|
+
300,
|
|
40
|
+
500,
|
|
41
|
+
1e3,
|
|
42
|
+
2e3,
|
|
43
|
+
3e3,
|
|
44
|
+
5e3,
|
|
45
|
+
1e4,
|
|
46
|
+
2e4,
|
|
47
|
+
3e4,
|
|
48
|
+
5e4,
|
|
49
|
+
1e5,
|
|
50
|
+
2e5,
|
|
51
|
+
3e5,
|
|
52
|
+
5e5,
|
|
53
|
+
1e6,
|
|
54
|
+
2e6,
|
|
55
|
+
3e6,
|
|
56
|
+
5e6,
|
|
57
|
+
1e7,
|
|
58
|
+
2e7,
|
|
59
|
+
3e7,
|
|
60
|
+
5e7
|
|
61
|
+
];
|
|
62
|
+
class y {
|
|
63
|
+
constructor(e) {
|
|
64
|
+
n(this, "terria");
|
|
65
|
+
n(this, "eventHelper");
|
|
66
|
+
n(this, "_removeSubscription");
|
|
67
|
+
n(this, "_lastLegendUpdate", 0);
|
|
68
|
+
n(this, "distanceLabel");
|
|
69
|
+
n(this, "barWidth");
|
|
70
|
+
n(this, "enableDistanceLegend");
|
|
71
|
+
n(this, "container");
|
|
72
|
+
n(this, "distanceLabelElement");
|
|
73
|
+
n(this, "barElement");
|
|
74
|
+
n(this, "options");
|
|
75
|
+
if (!r(e) || !r(e.terria))
|
|
76
|
+
throw new w("options.terria is required.");
|
|
77
|
+
this.terria = e.terria, this.container = e.container, this.options = e, this.eventHelper = new x(), this.enableDistanceLegend = e.enableDistanceLegend !== !1, this.eventHelper.add(this.terria.afterWidgetChanged, () => {
|
|
78
|
+
r(this._removeSubscription) && (this._removeSubscription(), this._removeSubscription = void 0);
|
|
79
|
+
}), this.addUpdateSubscription(), this.eventHelper.add(this.terria.afterWidgetChanged, () => {
|
|
80
|
+
this.addUpdateSubscription();
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
addUpdateSubscription() {
|
|
84
|
+
if (r(this.terria)) {
|
|
85
|
+
const { scene: e } = this.terria;
|
|
86
|
+
this._removeSubscription = e.postRender.addEventListener(() => {
|
|
87
|
+
this.updateDistanceLegend();
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
destroy() {
|
|
92
|
+
this.eventHelper.removeAll(), this._removeSubscription && this._removeSubscription();
|
|
93
|
+
}
|
|
94
|
+
show(e) {
|
|
95
|
+
const s = `
|
|
96
|
+
<div class="distance-legend" style="display: ${this.enableDistanceLegend ? "visible" : "none"};">
|
|
97
|
+
<div class="distance-legend-label"></div>
|
|
98
|
+
<div class="distance-legend-scale-bar" style="width: 0px; left: 5px;"></div>
|
|
99
|
+
</div>
|
|
100
|
+
`, i = document.createElement("div");
|
|
101
|
+
i.innerHTML = s;
|
|
102
|
+
const a = i.firstElementChild;
|
|
103
|
+
e.appendChild(a), this.distanceLabelElement = a.querySelector(".distance-legend-label"), this.barElement = a.querySelector(".distance-legend-scale-bar");
|
|
104
|
+
}
|
|
105
|
+
updateDistanceLegend() {
|
|
106
|
+
if (!this.enableDistanceLegend) {
|
|
107
|
+
this.barWidth = void 0, this.distanceLabel = void 0;
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const e = A();
|
|
111
|
+
if (e < this._lastLegendUpdate + 250)
|
|
112
|
+
return;
|
|
113
|
+
this._lastLegendUpdate = e;
|
|
114
|
+
const { scene: t } = this.terria, s = t.canvas.clientWidth, i = t.canvas.clientHeight, a = t.camera.getPickRay(
|
|
115
|
+
new p(s / 2 | 0, i - 1)
|
|
116
|
+
), l = t.camera.getPickRay(
|
|
117
|
+
new p(1 + s / 2 | 0, i - 1)
|
|
118
|
+
);
|
|
119
|
+
if (!r(a) || !r(l)) {
|
|
120
|
+
this.barWidth = void 0, this.distanceLabel = void 0, this.updateDOM();
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
const { globe: d } = t, c = d.pick(a, t), u = d.pick(l, t);
|
|
124
|
+
if (!r(c) || !r(u)) {
|
|
125
|
+
this.barWidth = void 0, this.distanceLabel = void 0, this.updateDOM();
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const m = d.ellipsoid.cartesianToCartographic(c), h = d.ellipsoid.cartesianToCartographic(u);
|
|
129
|
+
if (!r(m) || !r(h)) {
|
|
130
|
+
this.barWidth = void 0, this.distanceLabel = void 0, this.updateDOM();
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
M.setEndPoints(m, h);
|
|
134
|
+
const g = M.surfaceDistance, P = 100;
|
|
135
|
+
let C;
|
|
136
|
+
for (let f = R.length - 1; !r(C) && f >= 0; --f) {
|
|
137
|
+
const L = R[f];
|
|
138
|
+
L && L / g < P && (C = L);
|
|
139
|
+
}
|
|
140
|
+
if (C !== void 0) {
|
|
141
|
+
const f = this.options.units || "kilometers", L = j(C, "meters", f), H = (this.options.distanceLabelFormatter || G)(L, f);
|
|
142
|
+
this.barWidth = C / g | 0, this.distanceLabel = H;
|
|
143
|
+
} else
|
|
144
|
+
this.barWidth = void 0, this.distanceLabel = void 0;
|
|
145
|
+
this.updateDOM();
|
|
146
|
+
}
|
|
147
|
+
updateDOM() {
|
|
148
|
+
if (this.distanceLabelElement && this.barElement) {
|
|
149
|
+
const e = this.distanceLabelElement.parentElement;
|
|
150
|
+
this.distanceLabel && this.barWidth && e ? (this.distanceLabelElement.textContent = this.distanceLabel, e.style.display = "", this.barElement.style.width = `${this.barWidth}px`, this.barElement.style.left = `${5 + (125 - this.barWidth) / 2}px`) : e && (e.style.display = "none");
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
static create(e) {
|
|
154
|
+
const t = new y(e);
|
|
155
|
+
return t.show(e.container), t;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
class X {
|
|
159
|
+
constructor(e) {
|
|
160
|
+
n(this, "_terria");
|
|
161
|
+
n(this, "name", "Unnamed Control");
|
|
162
|
+
n(this, "text");
|
|
163
|
+
n(this, "svgIcon");
|
|
164
|
+
n(this, "svgHeight");
|
|
165
|
+
n(this, "svgWidth");
|
|
166
|
+
n(this, "cssClass");
|
|
167
|
+
n(this, "isActive", !1);
|
|
168
|
+
if (!r(e))
|
|
169
|
+
throw new w("terria is required");
|
|
170
|
+
this._terria = e;
|
|
171
|
+
}
|
|
172
|
+
get terria() {
|
|
173
|
+
return this._terria;
|
|
174
|
+
}
|
|
175
|
+
get hasText() {
|
|
176
|
+
return r(this.text) && typeof this.text == "string";
|
|
177
|
+
}
|
|
178
|
+
activate() {
|
|
179
|
+
throw new w("activate must be implemented in the derived class.");
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
class T extends X {
|
|
183
|
+
// Inherits everything from UserInterfaceControl
|
|
184
|
+
}
|
|
185
|
+
const Y = "M 7.5,0 C 3.375,0 0,3.375 0,7.5 0,11.625 3.375,15 7.5,15 c 3.46875,0 6.375,-2.4375 7.21875,-5.625 l -1.96875,0 C 12,11.53125 9.9375,13.125 7.5,13.125 4.40625,13.125 1.875,10.59375 1.875,7.5 1.875,4.40625 4.40625,1.875 7.5,1.875 c 1.59375,0 2.90625,0.65625 3.9375,1.6875 l -3,3 6.5625,0 L 15,0 12.75,2.25 C 11.4375,0.84375 9.5625,0 7.5,0 z";
|
|
186
|
+
class J extends T {
|
|
187
|
+
constructor(t) {
|
|
188
|
+
super(t);
|
|
189
|
+
n(this, "navigationLocked", !1);
|
|
190
|
+
this.name = "Reset View", this.svgIcon = Y, this.svgHeight = 15, this.svgWidth = 15, this.cssClass = "navigation-control-icon-reset";
|
|
191
|
+
}
|
|
192
|
+
setNavigationLocked(t) {
|
|
193
|
+
this.navigationLocked = t;
|
|
194
|
+
}
|
|
195
|
+
activate() {
|
|
196
|
+
this.resetView();
|
|
197
|
+
}
|
|
198
|
+
resetView() {
|
|
199
|
+
if (this.navigationLocked)
|
|
200
|
+
return;
|
|
201
|
+
const { scene: t } = this.terria;
|
|
202
|
+
if (!t.screenSpaceCameraController.enableInputs)
|
|
203
|
+
return;
|
|
204
|
+
this.isActive = !0;
|
|
205
|
+
const { camera: i } = t;
|
|
206
|
+
if (r(this.terria.trackedEntity)) {
|
|
207
|
+
const { trackedEntity: a } = this.terria;
|
|
208
|
+
this.terria.trackedEntity = void 0, this.terria.trackedEntity = a;
|
|
209
|
+
} else
|
|
210
|
+
this.terria.options.defaultResetView ? this.terria.options.defaultResetView instanceof S ? i.flyTo({
|
|
211
|
+
destination: t.globe.ellipsoid.cartographicToCartesian(
|
|
212
|
+
this.terria.options.defaultResetView
|
|
213
|
+
)
|
|
214
|
+
}) : this.terria.options.defaultResetView instanceof F && i.flyTo({
|
|
215
|
+
destination: this.terria.options.defaultResetView
|
|
216
|
+
}) : typeof i.flyHome == "function" ? i.flyHome(1) : i.flyTo({
|
|
217
|
+
destination: I.DEFAULT_VIEW_RECTANGLE,
|
|
218
|
+
duration: 1
|
|
219
|
+
});
|
|
220
|
+
this.isActive = !1;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
const K = new v();
|
|
224
|
+
class N extends T {
|
|
225
|
+
constructor(t, s) {
|
|
226
|
+
super(t);
|
|
227
|
+
n(this, "relativeAmount", 1);
|
|
228
|
+
this.name = `Zoom ${s ? "In" : "Out"}`, this.text = s ? "+" : "-", this.cssClass = `navigation-control-icon-zoom-${s ? "in" : "out"}`, this.relativeAmount = 2, s && (this.relativeAmount = 1 / this.relativeAmount);
|
|
229
|
+
}
|
|
230
|
+
activate() {
|
|
231
|
+
this.zoom(this.relativeAmount);
|
|
232
|
+
}
|
|
233
|
+
zoom(t) {
|
|
234
|
+
if (this.isActive = !0, r(this.terria)) {
|
|
235
|
+
const { scene: s } = this.terria, i = s.screenSpaceCameraController;
|
|
236
|
+
if (!i.enableInputs || !i.enableZoom)
|
|
237
|
+
return;
|
|
238
|
+
const { camera: a } = s;
|
|
239
|
+
let l;
|
|
240
|
+
switch (s.mode) {
|
|
241
|
+
case b.MORPHING:
|
|
242
|
+
break;
|
|
243
|
+
case b.SCENE2D:
|
|
244
|
+
a.zoomIn(
|
|
245
|
+
a.positionCartographic.height * (1 - this.relativeAmount)
|
|
246
|
+
);
|
|
247
|
+
break;
|
|
248
|
+
default: {
|
|
249
|
+
let d;
|
|
250
|
+
if (r(this.terria.trackedEntity) ? d = new v() : d = W(this.terria, !1), r(d))
|
|
251
|
+
l = {
|
|
252
|
+
direction: a.direction,
|
|
253
|
+
up: a.up
|
|
254
|
+
};
|
|
255
|
+
else {
|
|
256
|
+
const h = new _(
|
|
257
|
+
a.worldToCameraCoordinatesPoint(
|
|
258
|
+
s.globe.ellipsoid.cartographicToCartesian(
|
|
259
|
+
a.positionCartographic
|
|
260
|
+
)
|
|
261
|
+
),
|
|
262
|
+
a.directionWC
|
|
263
|
+
);
|
|
264
|
+
d = U.grazingAltitudeLocation(
|
|
265
|
+
h,
|
|
266
|
+
s.globe.ellipsoid
|
|
267
|
+
), l = {
|
|
268
|
+
heading: a.heading,
|
|
269
|
+
pitch: a.pitch,
|
|
270
|
+
roll: a.roll
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
const c = v.subtract(
|
|
274
|
+
a.position,
|
|
275
|
+
d,
|
|
276
|
+
K
|
|
277
|
+
), u = v.multiplyByScalar(
|
|
278
|
+
c,
|
|
279
|
+
t,
|
|
280
|
+
c
|
|
281
|
+
), m = v.add(d, u, d);
|
|
282
|
+
r(this.terria.trackedEntity) || s.mode === b.COLUMBUS_VIEW ? a.position = m : a.flyTo({
|
|
283
|
+
destination: m,
|
|
284
|
+
orientation: l,
|
|
285
|
+
duration: 0.5,
|
|
286
|
+
convert: !1
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
this.isActive = !1;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
const Q = "m 66.5625,0 0,15.15625 3.71875,0 0,-10.40625 5.5,10.40625 4.375,0 0,-15.15625 -3.71875,0 0,10.40625 L 70.9375,0 66.5625,0 z M 72.5,20.21875 c -28.867432,0 -52.28125,23.407738 -52.28125,52.28125 0,28.87351 23.413818,52.3125 52.28125,52.3125 28.86743,0 52.28125,-23.43899 52.28125,-52.3125 0,-28.873512 -23.41382,-52.28125 -52.28125,-52.28125 z m 0,1.75 c 13.842515,0 26.368948,5.558092 35.5,14.5625 l -11.03125,11 0.625,0.625 11.03125,-11 c 8.9199,9.108762 14.4375,21.579143 14.4375,35.34375 0,13.764606 -5.5176,26.22729 -14.4375,35.34375 l -11.03125,-11 -0.625,0.625 11.03125,11 c -9.130866,9.01087 -21.658601,14.59375 -35.5,14.59375 -13.801622,0 -26.321058,-5.53481 -35.4375,-14.5 l 11.125,-11.09375 c 6.277989,6.12179 14.857796,9.90625 24.3125,9.90625 19.241896,0 34.875,-15.629154 34.875,-34.875 0,-19.245847 -15.633104,-34.84375 -34.875,-34.84375 -9.454704,0 -18.034511,3.760884 -24.3125,9.875 L 37.0625,36.4375 C 46.179178,27.478444 58.696991,21.96875 72.5,21.96875 z m -0.875,0.84375 0,13.9375 1.75,0 0,-13.9375 -1.75,0 z M 36.46875,37.0625 47.5625,48.15625 C 41.429794,54.436565 37.65625,63.027539 37.65625,72.5 c 0,9.472461 3.773544,18.055746 9.90625,24.34375 L 36.46875,107.9375 c -8.96721,-9.1247 -14.5,-21.624886 -14.5,-35.4375 0,-13.812615 5.53279,-26.320526 14.5,-35.4375 z M 72.5,39.40625 c 18.297686,0 33.125,14.791695 33.125,33.09375 0,18.302054 -14.827314,33.125 -33.125,33.125 -18.297687,0 -33.09375,-14.822946 -33.09375,-33.125 0,-18.302056 14.796063,-33.09375 33.09375,-33.09375 z M 22.84375,71.625 l 0,1.75 13.96875,0 0,-1.75 -13.96875,0 z m 85.5625,0 0,1.75 14,0 0,-1.75 -14,0 z M 71.75,108.25 l 0,13.9375 1.71875,0 0,-13.9375 -1.71875,0 z", ee = "m 72.71875,54.375 c -0.476702,0 -0.908208,0.245402 -1.21875,0.5625 -0.310542,0.317098 -0.551189,0.701933 -0.78125,1.1875 -0.172018,0.363062 -0.319101,0.791709 -0.46875,1.25 -6.91615,1.075544 -12.313231,6.656514 -13,13.625 -0.327516,0.117495 -0.661877,0.244642 -0.9375,0.375 -0.485434,0.22959 -0.901634,0.471239 -1.21875,0.78125 -0.317116,0.310011 -0.5625,0.742111 -0.5625,1.21875 l 0.03125,0 c 0,0.476639 0.245384,0.877489 0.5625,1.1875 0.317116,0.310011 0.702066,0.58291 1.1875,0.8125 0.35554,0.168155 0.771616,0.32165 1.21875,0.46875 1.370803,6.10004 6.420817,10.834127 12.71875,11.8125 0.146999,0.447079 0.30025,0.863113 0.46875,1.21875 0.230061,0.485567 0.470708,0.870402 0.78125,1.1875 0.310542,0.317098 0.742048,0.5625 1.21875,0.5625 0.476702,0 0.876958,-0.245402 1.1875,-0.5625 0.310542,-0.317098 0.582439,-0.701933 0.8125,-1.1875 0.172018,-0.363062 0.319101,-0.791709 0.46875,-1.25 6.249045,-1.017063 11.256351,-5.7184 12.625,-11.78125 0.447134,-0.1471 0.86321,-0.300595 1.21875,-0.46875 0.485434,-0.22959 0.901633,-0.502489 1.21875,-0.8125 0.317117,-0.310011 0.5625,-0.710861 0.5625,-1.1875 l -0.03125,0 c 0,-0.476639 -0.245383,-0.908739 -0.5625,-1.21875 C 89.901633,71.846239 89.516684,71.60459 89.03125,71.375 88.755626,71.244642 88.456123,71.117495 88.125,71 87.439949,64.078341 82.072807,58.503735 75.21875,57.375 c -0.15044,-0.461669 -0.326927,-0.884711 -0.5,-1.25 -0.230061,-0.485567 -0.501958,-0.870402 -0.8125,-1.1875 -0.310542,-0.317098 -0.710798,-0.5625 -1.1875,-0.5625 z m -0.0625,1.40625 c 0.03595,-0.01283 0.05968,0 0.0625,0 0.0056,0 0.04321,-0.02233 0.1875,0.125 0.144288,0.147334 0.34336,0.447188 0.53125,0.84375 0.06385,0.134761 0.123901,0.309578 0.1875,0.46875 -0.320353,-0.01957 -0.643524,-0.0625 -0.96875,-0.0625 -0.289073,0 -0.558569,0.04702 -0.84375,0.0625 C 71.8761,57.059578 71.936151,56.884761 72,56.75 c 0.18789,-0.396562 0.355712,-0.696416 0.5,-0.84375 0.07214,-0.07367 0.120304,-0.112167 0.15625,-0.125 z m 0,2.40625 c 0.448007,0 0.906196,0.05436 1.34375,0.09375 0.177011,0.592256 0.347655,1.271044 0.5,2.03125 0.475097,2.370753 0.807525,5.463852 0.9375,8.9375 -0.906869,-0.02852 -1.834463,-0.0625 -2.78125,-0.0625 -0.92298,0 -1.802327,0.03537 -2.6875,0.0625 0.138529,-3.473648 0.493653,-6.566747 0.96875,-8.9375 0.154684,-0.771878 0.320019,-1.463985 0.5,-2.0625 0.405568,-0.03377 0.804291,-0.0625 1.21875,-0.0625 z m -2.71875,0.28125 c -0.129732,0.498888 -0.259782,0.987558 -0.375,1.5625 -0.498513,2.487595 -0.838088,5.693299 -0.96875,9.25 -3.21363,0.15162 -6.119596,0.480068 -8.40625,0.9375 -0.682394,0.136509 -1.275579,0.279657 -1.84375,0.4375 0.799068,-6.135482 5.504716,-11.036454 11.59375,-12.1875 z M 75.5,58.5 c 6.043169,1.18408 10.705093,6.052712 11.5,12.15625 -0.569435,-0.155806 -1.200273,-0.302525 -1.875,-0.4375 -2.262525,-0.452605 -5.108535,-0.783809 -8.28125,-0.9375 -0.130662,-3.556701 -0.470237,-6.762405 -0.96875,-9.25 C 75.761959,59.467174 75.626981,58.990925 75.5,58.5 z m -2.84375,12.09375 c 0.959338,0 1.895843,0.03282 2.8125,0.0625 C 75.48165,71.267751 75.5,71.871028 75.5,72.5 c 0,1.228616 -0.01449,2.438313 -0.0625,3.59375 -0.897358,0.0284 -1.811972,0.0625 -2.75,0.0625 -0.927373,0 -1.831062,-0.03473 -2.71875,-0.0625 -0.05109,-1.155437 -0.0625,-2.365134 -0.0625,-3.59375 0,-0.628972 0.01741,-1.232249 0.03125,-1.84375 0.895269,-0.02827 1.783025,-0.0625 2.71875,-0.0625 z M 68.5625,70.6875 c -0.01243,0.60601 -0.03125,1.189946 -0.03125,1.8125 0,1.22431 0.01541,2.407837 0.0625,3.5625 -3.125243,-0.150329 -5.92077,-0.471558 -8.09375,-0.90625 -0.784983,-0.157031 -1.511491,-0.316471 -2.125,-0.5 -0.107878,-0.704096 -0.1875,-1.422089 -0.1875,-2.15625 0,-0.115714 0.02849,-0.228688 0.03125,-0.34375 0.643106,-0.20284 1.389577,-0.390377 2.25,-0.5625 2.166953,-0.433487 4.97905,-0.75541 8.09375,-0.90625 z m 8.3125,0.03125 c 3.075121,0.15271 5.824455,0.446046 7.96875,0.875 0.857478,0.171534 1.630962,0.360416 2.28125,0.5625 0.0027,0.114659 0,0.228443 0,0.34375 0,0.735827 -0.07914,1.450633 -0.1875,2.15625 -0.598568,0.180148 -1.29077,0.34562 -2.0625,0.5 -2.158064,0.431708 -4.932088,0.754666 -8.03125,0.90625 0.04709,-1.154663 0.0625,-2.33819 0.0625,-3.5625 0,-0.611824 -0.01924,-1.185379 -0.03125,-1.78125 z M 57.15625,72.5625 c 0.0023,0.572772 0.06082,1.131112 0.125,1.6875 -0.125327,-0.05123 -0.266577,-0.10497 -0.375,-0.15625 -0.396499,-0.187528 -0.665288,-0.387337 -0.8125,-0.53125 -0.147212,-0.143913 -0.15625,-0.182756 -0.15625,-0.1875 0,-0.0047 -0.02221,-0.07484 0.125,-0.21875 0.147212,-0.143913 0.447251,-0.312472 0.84375,-0.5 0.07123,-0.03369 0.171867,-0.06006 0.25,-0.09375 z m 31.03125,0 c 0.08201,0.03503 0.175941,0.05872 0.25,0.09375 0.396499,0.187528 0.665288,0.356087 0.8125,0.5 0.14725,0.14391 0.15625,0.21405 0.15625,0.21875 0,0.0047 -0.009,0.04359 -0.15625,0.1875 -0.147212,0.143913 -0.416001,0.343722 -0.8125,0.53125 -0.09755,0.04613 -0.233314,0.07889 -0.34375,0.125 0.06214,-0.546289 0.09144,-1.094215 0.09375,-1.65625 z m -29.5,3.625 c 0.479308,0.123125 0.983064,0.234089 1.53125,0.34375 2.301781,0.460458 5.229421,0.787224 8.46875,0.9375 0.167006,2.84339 0.46081,5.433176 0.875,7.5 0.115218,0.574942 0.245268,1.063612 0.375,1.5625 -5.463677,-1.028179 -9.833074,-5.091831 -11.25,-10.34375 z m 27.96875,0 C 85.247546,81.408945 80.919274,85.442932 75.5,86.5 c 0.126981,-0.490925 0.261959,-0.967174 0.375,-1.53125 0.41419,-2.066824 0.707994,-4.65661 0.875,-7.5 3.204493,-0.15162 6.088346,-0.480068 8.375,-0.9375 0.548186,-0.109661 1.051942,-0.220625 1.53125,-0.34375 z M 70.0625,77.53125 c 0.865391,0.02589 1.723666,0.03125 2.625,0.03125 0.912062,0 1.782843,-0.0048 2.65625,-0.03125 -0.165173,2.736408 -0.453252,5.207651 -0.84375,7.15625 -0.152345,0.760206 -0.322989,1.438994 -0.5,2.03125 -0.437447,0.03919 -0.895856,0.0625 -1.34375,0.0625 -0.414943,0 -0.812719,-0.02881 -1.21875,-0.0625 -0.177011,-0.592256 -0.347655,-1.271044 -0.5,-2.03125 -0.390498,-1.948599 -0.700644,-4.419842 -0.875,-7.15625 z m 1.75,10.28125 c 0.284911,0.01545 0.554954,0.03125 0.84375,0.03125 0.325029,0 0.648588,-0.01171 0.96875,-0.03125 -0.05999,0.148763 -0.127309,0.31046 -0.1875,0.4375 -0.18789,0.396562 -0.386962,0.696416 -0.53125,0.84375 -0.144288,0.147334 -0.181857,0.125 -0.1875,0.125 -0.0056,0 -0.07446,0.02233 -0.21875,-0.125 C 72.355712,88.946416 72.18789,88.646562 72,88.25 71.939809,88.12296 71.872486,87.961263 71.8125,87.8125 z", te = new p(), ie = new v();
|
|
295
|
+
class D {
|
|
296
|
+
constructor(e) {
|
|
297
|
+
n(this, "terria");
|
|
298
|
+
n(this, "eventHelper");
|
|
299
|
+
n(this, "enableZoomControls");
|
|
300
|
+
n(this, "enableCompass");
|
|
301
|
+
n(this, "navigationLocked", !1);
|
|
302
|
+
n(this, "controls");
|
|
303
|
+
n(this, "showCompass");
|
|
304
|
+
n(this, "heading", 0);
|
|
305
|
+
n(this, "_unsubscribeFromPostRender");
|
|
306
|
+
this.terria = e.terria, this.eventHelper = new x(), this.enableZoomControls = e.enableZoomControls !== !1, this.enableCompass = e.enableCompass !== !1, this.controls = e.controls || [
|
|
307
|
+
new N(this.terria, !0),
|
|
308
|
+
new J(this.terria),
|
|
309
|
+
new N(this.terria, !1)
|
|
310
|
+
], this.showCompass = r(this.terria) && this.enableCompass, this.heading = this.showCompass ? this.terria.scene.camera.heading : 0, this.eventHelper.add(this.terria.afterWidgetChanged, this.widgetChange.bind(this)), this.widgetChange();
|
|
311
|
+
}
|
|
312
|
+
setNavigationLocked(e) {
|
|
313
|
+
if (this.navigationLocked = e, this.controls && this.controls.length > 1) {
|
|
314
|
+
const t = this.controls[1];
|
|
315
|
+
t.setNavigationLocked && t.setNavigationLocked(this.navigationLocked);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
widgetChange() {
|
|
319
|
+
r(this.terria) ? (this._unsubscribeFromPostRender && (this._unsubscribeFromPostRender(), this._unsubscribeFromPostRender = void 0), this.showCompass = this.enableCompass, this._unsubscribeFromPostRender = this.terria.scene.postRender.addEventListener(() => {
|
|
320
|
+
this.heading = this.terria.scene.camera.heading, this.updateDOM();
|
|
321
|
+
})) : (this._unsubscribeFromPostRender && (this._unsubscribeFromPostRender(), this._unsubscribeFromPostRender = void 0), this.showCompass = !1);
|
|
322
|
+
}
|
|
323
|
+
destroy() {
|
|
324
|
+
this.eventHelper.removeAll(), this._unsubscribeFromPostRender && this._unsubscribeFromPostRender();
|
|
325
|
+
}
|
|
326
|
+
show(e) {
|
|
327
|
+
const t = this.showCompass && this.enableCompass ? "block" : "none", s = this.enableZoomControls ? "block" : "none", i = `
|
|
328
|
+
<div class="compass" style="display: ${t};" title="Drag outer ring: rotate view. Drag inner gyroscope: free orbit. Double-click: reset view.">
|
|
329
|
+
<div class="compass-outer-ring-background"></div>
|
|
330
|
+
<div class="compass-rotation-marker" style="display: none; transform: rotate(0rad);"></div>
|
|
331
|
+
<div class="compass-outer-ring" title="Click and drag to rotate the camera">
|
|
332
|
+
<svg width="145" height="145" viewBox="0 0 145 145"><path d="${Q}" fill="rgba(255,255,255,0.5)"></path></svg>
|
|
333
|
+
</div>
|
|
334
|
+
<div class="compass-gyro-background"></div>
|
|
335
|
+
<div class="compass-gyro">
|
|
336
|
+
<svg width="145" height="145" viewBox="0 0 145 145"><path d="${ee}" fill="#CCC"></path></svg>
|
|
337
|
+
</div>
|
|
338
|
+
</div>
|
|
339
|
+
<div class="navigation-controls" style="display: ${s};"></div>
|
|
340
|
+
`, a = document.createElement("div");
|
|
341
|
+
for (a.innerHTML = i; a.firstChild; )
|
|
342
|
+
e.appendChild(a.firstChild);
|
|
343
|
+
const l = e.querySelector(".compass");
|
|
344
|
+
l && (l.addEventListener("pointerdown", (c) => this.handleMouseDown(c)), l.addEventListener("dblclick", () => this.handleDoubleClick()));
|
|
345
|
+
const d = e.querySelector(".navigation-controls");
|
|
346
|
+
d && this.controls && this.controls.forEach((c, u) => {
|
|
347
|
+
const m = u === this.controls.length - 1, h = document.createElement("div");
|
|
348
|
+
if (h.className = m ? "navigation-control-last" : "navigation-control", h.title = c.name, c.hasText && c.text) {
|
|
349
|
+
const g = document.createElement("div");
|
|
350
|
+
g.textContent = c.text, g.className = c.cssClass || "", h.appendChild(g);
|
|
351
|
+
} else if (c.svgIcon) {
|
|
352
|
+
const g = document.createElement("div");
|
|
353
|
+
g.className = c.cssClass || "", g.innerHTML = `<svg width="${c.svgWidth}" height="${c.svgHeight}" viewBox="0 0 ${c.svgWidth} ${c.svgHeight}"><path d="${c.svgIcon}"></path></svg>`, h.appendChild(g);
|
|
354
|
+
}
|
|
355
|
+
h.addEventListener("click", () => c.activate()), d.appendChild(h);
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
handleMouseDown(e) {
|
|
359
|
+
const { scene: t } = this.terria;
|
|
360
|
+
if (t.mode === b.MORPHING || this.navigationLocked)
|
|
361
|
+
return !0;
|
|
362
|
+
const i = e.currentTarget.getBoundingClientRect(), a = i.width / 2, l = new p(
|
|
363
|
+
(i.right - i.left) / 2,
|
|
364
|
+
(i.bottom - i.top) / 2
|
|
365
|
+
), d = new p(
|
|
366
|
+
e.clientX - i.left,
|
|
367
|
+
e.clientY - i.top
|
|
368
|
+
), c = p.subtract(d, l, te), m = p.magnitude(c) / a;
|
|
369
|
+
return m < 50 / 145 || m < 1 ? (e.preventDefault(), !1) : !0;
|
|
370
|
+
}
|
|
371
|
+
handleDoubleClick() {
|
|
372
|
+
const { scene: e } = this.terria, { camera: t } = e, s = e.screenSpaceCameraController;
|
|
373
|
+
if (e.mode === b.MORPHING || !s.enableInputs || this.navigationLocked)
|
|
374
|
+
return !0;
|
|
375
|
+
const i = W(this.terria, !0, ie);
|
|
376
|
+
if (!r(i))
|
|
377
|
+
return this.controls && this.controls.length > 1 && this.controls[1].activate(), !1;
|
|
378
|
+
const a = e.globe.ellipsoid.cartographicToCartesian(
|
|
379
|
+
t.positionCartographic,
|
|
380
|
+
new v()
|
|
381
|
+
), l = e.globe.ellipsoid.geodeticSurfaceNormal(i), d = new B(i, 0);
|
|
382
|
+
return t.flyToBoundingSphere(d, {
|
|
383
|
+
offset: new Z(
|
|
384
|
+
0,
|
|
385
|
+
q.PI_OVER_TWO - v.angleBetween(l, t.directionWC),
|
|
386
|
+
v.distance(a, i)
|
|
387
|
+
),
|
|
388
|
+
duration: 1.5
|
|
389
|
+
}), !1;
|
|
390
|
+
}
|
|
391
|
+
isLastControl(e) {
|
|
392
|
+
return e === this.controls[this.controls.length - 1];
|
|
393
|
+
}
|
|
394
|
+
updateDOM() {
|
|
395
|
+
const e = document.querySelector(".compass-outer-ring");
|
|
396
|
+
e && (e.style.transform = `rotate(-${this.heading}rad)`);
|
|
397
|
+
}
|
|
398
|
+
static create(e) {
|
|
399
|
+
const t = new D(e);
|
|
400
|
+
return t.show(e.container), t;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
class se {
|
|
404
|
+
constructor(e, t = {}) {
|
|
405
|
+
n(this, "distanceLegendViewModel");
|
|
406
|
+
n(this, "navigationViewModel");
|
|
407
|
+
n(this, "navigationDiv");
|
|
408
|
+
n(this, "distanceLegendDiv");
|
|
409
|
+
n(this, "terria");
|
|
410
|
+
n(this, "container");
|
|
411
|
+
n(this, "_onDestroyListeners", []);
|
|
412
|
+
n(this, "_navigationLocked", !1);
|
|
413
|
+
if (!r(e))
|
|
414
|
+
throw new w("CesiumWidget or Viewer is required.");
|
|
415
|
+
const s = "cesiumWidget" in e ? e.cesiumWidget : e, i = document.createElement("div");
|
|
416
|
+
i.className = "cesium-widget-cesiumNavigationContainer", s.container.appendChild(i), this.terria = {
|
|
417
|
+
scene: s.scene,
|
|
418
|
+
camera: s.scene.camera,
|
|
419
|
+
clock: s.clock,
|
|
420
|
+
cesiumWidget: s,
|
|
421
|
+
options: t,
|
|
422
|
+
afterWidgetChanged: new E(),
|
|
423
|
+
beforeWidgetChanged: new E(),
|
|
424
|
+
trackedEntity: "trackedEntity" in e ? e.trackedEntity : void 0
|
|
425
|
+
}, this.container = i, t.enableDistanceLegend !== !1 && (this.distanceLegendDiv = document.createElement("div"), i.appendChild(this.distanceLegendDiv), this.distanceLegendDiv.setAttribute("id", "distanceLegendDiv"), this.distanceLegendViewModel = y.create({
|
|
426
|
+
...t,
|
|
427
|
+
container: this.distanceLegendDiv,
|
|
428
|
+
terria: this.terria,
|
|
429
|
+
enableDistanceLegend: !0
|
|
430
|
+
})), (t.enableZoomControls !== !1 || t.enableCompass !== !1) && (this.navigationDiv = document.createElement("div"), this.navigationDiv.setAttribute("id", "navigationDiv"), i.appendChild(this.navigationDiv), this.navigationViewModel = D.create({
|
|
431
|
+
container: this.navigationDiv,
|
|
432
|
+
terria: this.terria,
|
|
433
|
+
enableZoomControls: t.enableZoomControls !== !1,
|
|
434
|
+
enableCompass: t.enableCompass !== !1
|
|
435
|
+
}));
|
|
436
|
+
}
|
|
437
|
+
setNavigationLocked(e) {
|
|
438
|
+
this._navigationLocked = e, this.navigationViewModel && this.navigationViewModel.setNavigationLocked(this._navigationLocked);
|
|
439
|
+
}
|
|
440
|
+
getNavigationLocked() {
|
|
441
|
+
return this._navigationLocked;
|
|
442
|
+
}
|
|
443
|
+
destroy() {
|
|
444
|
+
var e, t, s;
|
|
445
|
+
r(this.navigationViewModel) && this.navigationViewModel.destroy(), r(this.distanceLegendViewModel) && this.distanceLegendViewModel.destroy(), r(this.navigationDiv) && ((e = this.navigationDiv.parentNode) == null || e.removeChild(this.navigationDiv), delete this.navigationDiv), r(this.distanceLegendDiv) && ((t = this.distanceLegendDiv.parentNode) == null || t.removeChild(this.distanceLegendDiv), delete this.distanceLegendDiv), r(this.container) && ((s = this.container.parentNode) == null || s.removeChild(this.container), delete this.container);
|
|
446
|
+
for (const i of this._onDestroyListeners)
|
|
447
|
+
i();
|
|
448
|
+
}
|
|
449
|
+
addOnDestroyListener(e) {
|
|
450
|
+
typeof e == "function" && this._onDestroyListeners.push(e);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
function z(o, e) {
|
|
454
|
+
const t = new se(o, e), s = "cesiumWidget" in o ? o.cesiumWidget : o;
|
|
455
|
+
return Object.defineProperty(s, "cesiumNavigation", {
|
|
456
|
+
configurable: !0,
|
|
457
|
+
get: () => t
|
|
458
|
+
}), t.addOnDestroyListener(() => {
|
|
459
|
+
const i = s;
|
|
460
|
+
delete i.cesiumNavigation;
|
|
461
|
+
}), t;
|
|
462
|
+
}
|
|
463
|
+
function ne(o, e) {
|
|
464
|
+
if (!r(o))
|
|
465
|
+
throw new w("viewer is required.");
|
|
466
|
+
z(o, e).addOnDestroyListener(() => {
|
|
467
|
+
delete o.cesiumNavigation;
|
|
468
|
+
}), Object.defineProperty(o, "cesiumNavigation", {
|
|
469
|
+
configurable: !0,
|
|
470
|
+
get: () => o.cesiumWidget.cesiumNavigation
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
ne.mixinWidget = (o, e) => z(o, e);
|
|
474
|
+
export {
|
|
475
|
+
se as CesiumNavigation,
|
|
476
|
+
ne as default,
|
|
477
|
+
ne as viewerCesiumNavigationMixin
|
|
478
|
+
};
|
|
479
|
+
//# sourceMappingURL=cesium-navigation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cesium-navigation.js","sources":["../src/core/utils.ts","../src/viewmodels/distance-legend-view-model.ts","../src/viewmodels/user-interface-control.ts","../src/viewmodels/navigation-control.ts","../src/svgpaths/reset.ts","../src/viewmodels/reset-view-navigation-control.ts","../src/viewmodels/zoom-navigation-control.ts","../src/svgpaths/compass-outer-ring.ts","../src/svgpaths/compass-gyro.ts","../src/viewmodels/navigation-view-model.ts","../src/cesium-navigation.ts","../src/viewer-cesium-navigation-mixin.ts"],"sourcesContent":["import { Cartesian3, Cartographic, defined, Ray, SceneMode } from 'cesium';\n\nexport interface CesiumViewer {\n scene: any;\n camera: any;\n clock?: any;\n cesiumWidget?: any;\n}\n\n/**\n * Gets the focus point of the camera.\n * @param viewer The Cesium viewer instance\n * @param inWorldCoordinates Whether to return in world coordinates\n * @param result Optional result parameter\n * @returns The camera focus point\n */\nexport function getCameraFocus(viewer: CesiumViewer, inWorldCoordinates: boolean, result?: Cartesian3): Cartesian3 | undefined {\n const { scene } = viewer;\n const { camera } = scene;\n\n if (scene.mode === SceneMode.MORPHING) {\n return undefined;\n }\n\n const rayScratch = new Ray();\n rayScratch.origin = camera.positionWC;\n rayScratch.direction = camera.directionWC;\n\n const center = scene.globe.pick(rayScratch, scene, result);\n\n if (!defined(center)) {\n return undefined;\n }\n\n if (inWorldCoordinates) {\n return center;\n }\n\n return scene.globe.ellipsoid.cartesianToCartographic(center, new Cartographic());\n}\n\n/**\n * Formats a distance label based on the value and units.\n * @param distanceValue The distance value\n * @param units The units (kilometers, meters, miles, etc.)\n * @returns Formatted label string\n */\nexport function distanceLabelFormatter(distanceValue: number, units: string): string {\n if (distanceValue > 1) {\n return `${Math.round(distanceValue)} ${units}`;\n }\n \n if (distanceValue > 0.01) {\n return `${distanceValue.toFixed(2)} ${units}`;\n }\n \n return `${distanceValue.toExponential(2)} ${units}`;\n}\n","import {\n defined,\n DeveloperError,\n EllipsoidGeodesic,\n Cartesian2,\n getTimestamp,\n EventHelper\n} from 'cesium';\nimport * as utils from '../core/utils';\nimport type { CesiumNavigationOptions, TerraWrapper } from '../types';\n\ntype Units = 'meters' | 'kilometers' | 'miles' | 'feet' | 'nauticalmiles';\n\nconst UNIT_FACTORS: Record<Units, number> = {\n meters: 1,\n kilometers: 0.001,\n miles: 0.000621371,\n feet: 3.28084,\n nauticalmiles: 0.000539957,\n};\n\nfunction convertLength(value: number, from: Units, to: Units): number {\n const meters = value / UNIT_FACTORS[from];\n return meters * UNIT_FACTORS[to];\n}\n\nconst geodesic = new EllipsoidGeodesic();\n\nconst distances = [\n 1, 2, 3, 5, 10, 20, 30, 50, 100, 200, 300, 500, 1000, 2000, 3000, 5000,\n 10000, 20000, 30000, 50000, 100000, 200000, 300000, 500000, 1000000,\n 2000000, 3000000, 5000000, 10000000, 20000000, 30000000, 50000000\n];\n\n/**\n * View model for the distance legend widget\n */\nexport class DistanceLegendViewModel {\n terria: TerraWrapper;\n private eventHelper: EventHelper;\n private _removeSubscription?: () => void;\n private _lastLegendUpdate: number = 0;\n \n distanceLabel?: string;\n barWidth?: number;\n enableDistanceLegend: boolean;\n container: HTMLElement;\n \n private distanceLabelElement?: HTMLElement;\n private barElement?: HTMLElement;\n private options: CesiumNavigationOptions;\n\n constructor(options: CesiumNavigationOptions & { container: HTMLElement; terria: TerraWrapper }) {\n if (!defined(options) || !defined(options.terria)) {\n throw new DeveloperError('options.terria is required.');\n }\n\n this.terria = options.terria;\n this.container = options.container;\n this.options = options;\n this.eventHelper = new EventHelper();\n this.enableDistanceLegend = options.enableDistanceLegend !== false;\n\n this.eventHelper.add(this.terria.afterWidgetChanged, () => {\n if (defined(this._removeSubscription)) {\n this._removeSubscription();\n this._removeSubscription = undefined;\n }\n });\n\n this.addUpdateSubscription();\n \n this.eventHelper.add(this.terria.afterWidgetChanged, () => {\n this.addUpdateSubscription();\n });\n }\n\n private addUpdateSubscription(): void {\n if (defined(this.terria)) {\n const { scene } = this.terria;\n this._removeSubscription = scene.postRender.addEventListener(() => {\n this.updateDistanceLegend();\n });\n }\n }\n\n destroy(): void {\n this.eventHelper.removeAll();\n if (this._removeSubscription) {\n this._removeSubscription();\n }\n }\n\n show(container: HTMLElement): void {\n const visibility = this.enableDistanceLegend ? 'visible' : 'none';\n const html = `\n <div class=\"distance-legend\" style=\"display: ${visibility};\">\n <div class=\"distance-legend-label\"></div>\n <div class=\"distance-legend-scale-bar\" style=\"width: 0px; left: 5px;\"></div>\n </div>\n `;\n \n const temp = document.createElement('div');\n temp.innerHTML = html;\n const element = temp.firstElementChild as HTMLElement;\n container.appendChild(element);\n \n this.distanceLabelElement = element.querySelector('.distance-legend-label') as HTMLElement;\n this.barElement = element.querySelector('.distance-legend-scale-bar') as HTMLElement;\n }\n\n private updateDistanceLegend(): void {\n if (!this.enableDistanceLegend) {\n this.barWidth = undefined;\n this.distanceLabel = undefined;\n return;\n }\n\n const now = getTimestamp();\n if (now < this._lastLegendUpdate + 250) {\n return;\n }\n\n this._lastLegendUpdate = now;\n\n const { scene } = this.terria;\n const width = scene.canvas.clientWidth;\n const height = scene.canvas.clientHeight;\n\n const left = scene.camera.getPickRay(\n new Cartesian2((width / 2) | 0, height - 1)\n );\n const right = scene.camera.getPickRay(\n new Cartesian2((1 + width / 2) | 0, height - 1)\n );\n\n if (!defined(left) || !defined(right)) {\n this.barWidth = undefined;\n this.distanceLabel = undefined;\n this.updateDOM();\n return;\n }\n\n const { globe } = scene;\n const leftPosition = globe.pick(left, scene);\n const rightPosition = globe.pick(right, scene);\n\n if (!defined(leftPosition) || !defined(rightPosition)) {\n this.barWidth = undefined;\n this.distanceLabel = undefined;\n this.updateDOM();\n return;\n }\n\n const leftCartographic = globe.ellipsoid.cartesianToCartographic(leftPosition);\n const rightCartographic = globe.ellipsoid.cartesianToCartographic(rightPosition);\n\n if (!defined(leftCartographic) || !defined(rightCartographic)) {\n this.barWidth = undefined;\n this.distanceLabel = undefined;\n this.updateDOM();\n return;\n }\n\n geodesic.setEndPoints(leftCartographic, rightCartographic);\n const pixelDistance = geodesic.surfaceDistance;\n\n const maxBarWidth = 100;\n let distance: number | undefined;\n \n for (let i = distances.length - 1; !defined(distance) && i >= 0; --i) {\n const currentDistance = distances[i];\n if (currentDistance && currentDistance / pixelDistance < maxBarWidth) {\n distance = currentDistance;\n }\n }\n\n if (distance !== undefined) {\n const units = this.options.units || 'kilometers';\n const convertedDistance = convertLength(distance, 'meters', units as Units);\n const formatter = this.options.distanceLabelFormatter || utils.distanceLabelFormatter;\n const label = formatter(convertedDistance, units);\n\n this.barWidth = (distance / pixelDistance) | 0;\n this.distanceLabel = label;\n } else {\n this.barWidth = undefined;\n this.distanceLabel = undefined;\n }\n\n this.updateDOM();\n }\n\n private updateDOM(): void {\n if (this.distanceLabelElement && this.barElement) {\n const parentElement = this.distanceLabelElement.parentElement;\n if (this.distanceLabel && this.barWidth && parentElement) {\n this.distanceLabelElement.textContent = this.distanceLabel;\n parentElement.style.display = '';\n this.barElement.style.width = `${this.barWidth}px`;\n this.barElement.style.left = `${5 + (125 - this.barWidth) / 2}px`;\n } else if (parentElement) {\n parentElement.style.display = 'none';\n }\n }\n }\n\n static create(options: CesiumNavigationOptions & { container: HTMLElement; terria: TerraWrapper }): DistanceLegendViewModel {\n const result = new DistanceLegendViewModel(options);\n result.show(options.container);\n return result;\n }\n}\n","import { defined, DeveloperError } from 'cesium';\nimport type { TerraWrapper, NavigationControlInterface } from '../types';\n\n/**\n * Base class for UI controls in the navigation widget\n */\nexport class UserInterfaceControl implements NavigationControlInterface {\n protected _terria: TerraWrapper;\n \n name: string = 'Unnamed Control';\n text?: string;\n svgIcon?: string;\n svgHeight?: number;\n svgWidth?: number;\n cssClass?: string;\n isActive: boolean = false;\n\n constructor(terria: TerraWrapper) {\n if (!defined(terria)) {\n throw new DeveloperError('terria is required');\n }\n this._terria = terria;\n }\n\n get terria(): TerraWrapper {\n return this._terria;\n }\n\n get hasText(): boolean {\n return defined(this.text) && typeof this.text === 'string';\n }\n\n activate(): void {\n throw new DeveloperError('activate must be implemented in the derived class.');\n }\n}\n","import { UserInterfaceControl } from './user-interface-control';\n\n/**\n * Base class for navigation controls\n */\nexport class NavigationControl extends UserInterfaceControl {\n // Inherits everything from UserInterfaceControl\n}\n","export const svgReset = 'M 7.5,0 C 3.375,0 0,3.375 0,7.5 0,11.625 3.375,15 7.5,15 c 3.46875,0 6.375,-2.4375 7.21875,-5.625 l -1.96875,0 C 12,11.53125 9.9375,13.125 7.5,13.125 4.40625,13.125 1.875,10.59375 1.875,7.5 1.875,4.40625 4.40625,1.875 7.5,1.875 c 1.59375,0 2.90625,0.65625 3.9375,1.6875 l -3,3 6.5625,0 L 15,0 12.75,2.25 C 11.4375,0.84375 9.5625,0 7.5,0 z';\n","import { defined, Camera, Rectangle, Cartographic } from 'cesium';\nimport { NavigationControl } from './navigation-control';\nimport { svgReset } from '../svgpaths/reset';\nimport type { TerraWrapper } from '../types';\n\n/**\n * Navigation control for resetting the view\n */\nexport class ResetViewNavigationControl extends NavigationControl {\n navigationLocked: boolean = false;\n\n constructor(terria: TerraWrapper) {\n super(terria);\n \n this.name = 'Reset View';\n this.svgIcon = svgReset;\n this.svgHeight = 15;\n this.svgWidth = 15;\n this.cssClass = 'navigation-control-icon-reset';\n }\n\n setNavigationLocked(locked: boolean): void {\n this.navigationLocked = locked;\n }\n\n activate(): void {\n this.resetView();\n }\n\n private resetView(): void {\n if (this.navigationLocked) {\n return;\n }\n\n const { scene } = this.terria;\n const sscc = scene.screenSpaceCameraController;\n \n if (!sscc.enableInputs) {\n return;\n }\n\n this.isActive = true;\n\n const { camera } = scene;\n\n if (defined(this.terria.trackedEntity)) {\n // When tracking an entity, re-set the tracked entity to reset to its default view\n const { trackedEntity } = this.terria;\n this.terria.trackedEntity = undefined;\n this.terria.trackedEntity = trackedEntity;\n } else {\n // Reset to default position or view defined in options\n if (this.terria.options.defaultResetView) {\n if (this.terria.options.defaultResetView instanceof Cartographic) {\n camera.flyTo({\n destination: scene.globe.ellipsoid.cartographicToCartesian(\n this.terria.options.defaultResetView\n )\n });\n } else if (this.terria.options.defaultResetView instanceof Rectangle) {\n camera.flyTo({\n destination: this.terria.options.defaultResetView\n });\n }\n } else if (typeof (camera as any).flyHome === 'function') {\n (camera as any).flyHome(1);\n } else {\n camera.flyTo({\n destination: Camera.DEFAULT_VIEW_RECTANGLE,\n duration: 1\n });\n }\n }\n \n this.isActive = false;\n }\n}\n","import {\n defined,\n Ray,\n IntersectionTests,\n Cartesian3,\n SceneMode\n} from 'cesium';\nimport { NavigationControl } from './navigation-control';\nimport * as Utils from '../core/utils';\nimport type { TerraWrapper } from '../types';\n\nconst cartesian3Scratch = new Cartesian3();\n\n/**\n * Navigation control for zooming in/out\n */\nexport class ZoomNavigationControl extends NavigationControl {\n relativeAmount: number = 1;\n\n constructor(terria: TerraWrapper, zoomIn: boolean) {\n super(terria);\n \n this.name = `Zoom ${zoomIn ? 'In' : 'Out'}`;\n this.text = zoomIn ? '+' : '-';\n this.cssClass = `navigation-control-icon-zoom-${zoomIn ? 'in' : 'out'}`;\n \n this.relativeAmount = 2;\n if (zoomIn) {\n // Ensure zooming in is inverse of zooming out\n this.relativeAmount = 1 / this.relativeAmount;\n }\n }\n\n activate(): void {\n this.zoom(this.relativeAmount);\n }\n\n private zoom(relativeAmount: number): void {\n this.isActive = true;\n\n if (defined(this.terria)) {\n const { scene } = this.terria;\n const sscc = scene.screenSpaceCameraController;\n \n // Do not zoom if disabled\n if (!sscc.enableInputs || !sscc.enableZoom) {\n return;\n }\n\n const { camera } = scene;\n let orientation: Record<string, unknown>;\n\n switch (scene.mode) {\n case SceneMode.MORPHING:\n break;\n \n case SceneMode.SCENE2D:\n camera.zoomIn(\n camera.positionCartographic.height * (1 - this.relativeAmount)\n );\n break;\n \n default: {\n let focus: Cartesian3 | undefined;\n\n if (defined(this.terria.trackedEntity)) {\n focus = new Cartesian3();\n } else {\n focus = Utils.getCameraFocus(this.terria, false);\n }\n\n if (!defined(focus)) {\n // Camera not pointing at globe, use ellipsoid horizon point\n const ray = new Ray(\n camera.worldToCameraCoordinatesPoint(\n scene.globe.ellipsoid.cartographicToCartesian(\n camera.positionCartographic\n )\n ),\n camera.directionWC\n );\n focus = IntersectionTests.grazingAltitudeLocation(\n ray,\n scene.globe.ellipsoid\n );\n\n orientation = {\n heading: camera.heading,\n pitch: camera.pitch,\n roll: camera.roll\n };\n } else {\n orientation = {\n direction: camera.direction,\n up: camera.up\n };\n }\n\n const direction = Cartesian3.subtract(\n camera.position,\n focus,\n cartesian3Scratch\n );\n const movementVector = Cartesian3.multiplyByScalar(\n direction,\n relativeAmount,\n direction\n );\n const endPosition = Cartesian3.add(focus, movementVector, focus);\n\n if (\n defined(this.terria.trackedEntity) ||\n scene.mode === SceneMode.COLUMBUS_VIEW\n ) {\n // Set position directly without animation\n camera.position = endPosition;\n } else {\n camera.flyTo({\n destination: endPosition,\n orientation,\n duration: 0.5,\n convert: false\n });\n }\n }\n }\n }\n\n this.isActive = false;\n }\n}\n","export const svgCompassOuterRing = 'm 66.5625,0 0,15.15625 3.71875,0 0,-10.40625 5.5,10.40625 4.375,0 0,-15.15625 -3.71875,0 0,10.40625 L 70.9375,0 66.5625,0 z M 72.5,20.21875 c -28.867432,0 -52.28125,23.407738 -52.28125,52.28125 0,28.87351 23.413818,52.3125 52.28125,52.3125 28.86743,0 52.28125,-23.43899 52.28125,-52.3125 0,-28.873512 -23.41382,-52.28125 -52.28125,-52.28125 z m 0,1.75 c 13.842515,0 26.368948,5.558092 35.5,14.5625 l -11.03125,11 0.625,0.625 11.03125,-11 c 8.9199,9.108762 14.4375,21.579143 14.4375,35.34375 0,13.764606 -5.5176,26.22729 -14.4375,35.34375 l -11.03125,-11 -0.625,0.625 11.03125,11 c -9.130866,9.01087 -21.658601,14.59375 -35.5,14.59375 -13.801622,0 -26.321058,-5.53481 -35.4375,-14.5 l 11.125,-11.09375 c 6.277989,6.12179 14.857796,9.90625 24.3125,9.90625 19.241896,0 34.875,-15.629154 34.875,-34.875 0,-19.245847 -15.633104,-34.84375 -34.875,-34.84375 -9.454704,0 -18.034511,3.760884 -24.3125,9.875 L 37.0625,36.4375 C 46.179178,27.478444 58.696991,21.96875 72.5,21.96875 z m -0.875,0.84375 0,13.9375 1.75,0 0,-13.9375 -1.75,0 z M 36.46875,37.0625 47.5625,48.15625 C 41.429794,54.436565 37.65625,63.027539 37.65625,72.5 c 0,9.472461 3.773544,18.055746 9.90625,24.34375 L 36.46875,107.9375 c -8.96721,-9.1247 -14.5,-21.624886 -14.5,-35.4375 0,-13.812615 5.53279,-26.320526 14.5,-35.4375 z M 72.5,39.40625 c 18.297686,0 33.125,14.791695 33.125,33.09375 0,18.302054 -14.827314,33.125 -33.125,33.125 -18.297687,0 -33.09375,-14.822946 -33.09375,-33.125 0,-18.302056 14.796063,-33.09375 33.09375,-33.09375 z M 22.84375,71.625 l 0,1.75 13.96875,0 0,-1.75 -13.96875,0 z m 85.5625,0 0,1.75 14,0 0,-1.75 -14,0 z M 71.75,108.25 l 0,13.9375 1.71875,0 0,-13.9375 -1.71875,0 z';\n","export const svgCompassGyro = 'm 72.71875,54.375 c -0.476702,0 -0.908208,0.245402 -1.21875,0.5625 -0.310542,0.317098 -0.551189,0.701933 -0.78125,1.1875 -0.172018,0.363062 -0.319101,0.791709 -0.46875,1.25 -6.91615,1.075544 -12.313231,6.656514 -13,13.625 -0.327516,0.117495 -0.661877,0.244642 -0.9375,0.375 -0.485434,0.22959 -0.901634,0.471239 -1.21875,0.78125 -0.317116,0.310011 -0.5625,0.742111 -0.5625,1.21875 l 0.03125,0 c 0,0.476639 0.245384,0.877489 0.5625,1.1875 0.317116,0.310011 0.702066,0.58291 1.1875,0.8125 0.35554,0.168155 0.771616,0.32165 1.21875,0.46875 1.370803,6.10004 6.420817,10.834127 12.71875,11.8125 0.146999,0.447079 0.30025,0.863113 0.46875,1.21875 0.230061,0.485567 0.470708,0.870402 0.78125,1.1875 0.310542,0.317098 0.742048,0.5625 1.21875,0.5625 0.476702,0 0.876958,-0.245402 1.1875,-0.5625 0.310542,-0.317098 0.582439,-0.701933 0.8125,-1.1875 0.172018,-0.363062 0.319101,-0.791709 0.46875,-1.25 6.249045,-1.017063 11.256351,-5.7184 12.625,-11.78125 0.447134,-0.1471 0.86321,-0.300595 1.21875,-0.46875 0.485434,-0.22959 0.901633,-0.502489 1.21875,-0.8125 0.317117,-0.310011 0.5625,-0.710861 0.5625,-1.1875 l -0.03125,0 c 0,-0.476639 -0.245383,-0.908739 -0.5625,-1.21875 C 89.901633,71.846239 89.516684,71.60459 89.03125,71.375 88.755626,71.244642 88.456123,71.117495 88.125,71 87.439949,64.078341 82.072807,58.503735 75.21875,57.375 c -0.15044,-0.461669 -0.326927,-0.884711 -0.5,-1.25 -0.230061,-0.485567 -0.501958,-0.870402 -0.8125,-1.1875 -0.310542,-0.317098 -0.710798,-0.5625 -1.1875,-0.5625 z m -0.0625,1.40625 c 0.03595,-0.01283 0.05968,0 0.0625,0 0.0056,0 0.04321,-0.02233 0.1875,0.125 0.144288,0.147334 0.34336,0.447188 0.53125,0.84375 0.06385,0.134761 0.123901,0.309578 0.1875,0.46875 -0.320353,-0.01957 -0.643524,-0.0625 -0.96875,-0.0625 -0.289073,0 -0.558569,0.04702 -0.84375,0.0625 C 71.8761,57.059578 71.936151,56.884761 72,56.75 c 0.18789,-0.396562 0.355712,-0.696416 0.5,-0.84375 0.07214,-0.07367 0.120304,-0.112167 0.15625,-0.125 z m 0,2.40625 c 0.448007,0 0.906196,0.05436 1.34375,0.09375 0.177011,0.592256 0.347655,1.271044 0.5,2.03125 0.475097,2.370753 0.807525,5.463852 0.9375,8.9375 -0.906869,-0.02852 -1.834463,-0.0625 -2.78125,-0.0625 -0.92298,0 -1.802327,0.03537 -2.6875,0.0625 0.138529,-3.473648 0.493653,-6.566747 0.96875,-8.9375 0.154684,-0.771878 0.320019,-1.463985 0.5,-2.0625 0.405568,-0.03377 0.804291,-0.0625 1.21875,-0.0625 z m -2.71875,0.28125 c -0.129732,0.498888 -0.259782,0.987558 -0.375,1.5625 -0.498513,2.487595 -0.838088,5.693299 -0.96875,9.25 -3.21363,0.15162 -6.119596,0.480068 -8.40625,0.9375 -0.682394,0.136509 -1.275579,0.279657 -1.84375,0.4375 0.799068,-6.135482 5.504716,-11.036454 11.59375,-12.1875 z M 75.5,58.5 c 6.043169,1.18408 10.705093,6.052712 11.5,12.15625 -0.569435,-0.155806 -1.200273,-0.302525 -1.875,-0.4375 -2.262525,-0.452605 -5.108535,-0.783809 -8.28125,-0.9375 -0.130662,-3.556701 -0.470237,-6.762405 -0.96875,-9.25 C 75.761959,59.467174 75.626981,58.990925 75.5,58.5 z m -2.84375,12.09375 c 0.959338,0 1.895843,0.03282 2.8125,0.0625 C 75.48165,71.267751 75.5,71.871028 75.5,72.5 c 0,1.228616 -0.01449,2.438313 -0.0625,3.59375 -0.897358,0.0284 -1.811972,0.0625 -2.75,0.0625 -0.927373,0 -1.831062,-0.03473 -2.71875,-0.0625 -0.05109,-1.155437 -0.0625,-2.365134 -0.0625,-3.59375 0,-0.628972 0.01741,-1.232249 0.03125,-1.84375 0.895269,-0.02827 1.783025,-0.0625 2.71875,-0.0625 z M 68.5625,70.6875 c -0.01243,0.60601 -0.03125,1.189946 -0.03125,1.8125 0,1.22431 0.01541,2.407837 0.0625,3.5625 -3.125243,-0.150329 -5.92077,-0.471558 -8.09375,-0.90625 -0.784983,-0.157031 -1.511491,-0.316471 -2.125,-0.5 -0.107878,-0.704096 -0.1875,-1.422089 -0.1875,-2.15625 0,-0.115714 0.02849,-0.228688 0.03125,-0.34375 0.643106,-0.20284 1.389577,-0.390377 2.25,-0.5625 2.166953,-0.433487 4.97905,-0.75541 8.09375,-0.90625 z m 8.3125,0.03125 c 3.075121,0.15271 5.824455,0.446046 7.96875,0.875 0.857478,0.171534 1.630962,0.360416 2.28125,0.5625 0.0027,0.114659 0,0.228443 0,0.34375 0,0.735827 -0.07914,1.450633 -0.1875,2.15625 -0.598568,0.180148 -1.29077,0.34562 -2.0625,0.5 -2.158064,0.431708 -4.932088,0.754666 -8.03125,0.90625 0.04709,-1.154663 0.0625,-2.33819 0.0625,-3.5625 0,-0.611824 -0.01924,-1.185379 -0.03125,-1.78125 z M 57.15625,72.5625 c 0.0023,0.572772 0.06082,1.131112 0.125,1.6875 -0.125327,-0.05123 -0.266577,-0.10497 -0.375,-0.15625 -0.396499,-0.187528 -0.665288,-0.387337 -0.8125,-0.53125 -0.147212,-0.143913 -0.15625,-0.182756 -0.15625,-0.1875 0,-0.0047 -0.02221,-0.07484 0.125,-0.21875 0.147212,-0.143913 0.447251,-0.312472 0.84375,-0.5 0.07123,-0.03369 0.171867,-0.06006 0.25,-0.09375 z m 31.03125,0 c 0.08201,0.03503 0.175941,0.05872 0.25,0.09375 0.396499,0.187528 0.665288,0.356087 0.8125,0.5 0.14725,0.14391 0.15625,0.21405 0.15625,0.21875 0,0.0047 -0.009,0.04359 -0.15625,0.1875 -0.147212,0.143913 -0.416001,0.343722 -0.8125,0.53125 -0.09755,0.04613 -0.233314,0.07889 -0.34375,0.125 0.06214,-0.546289 0.09144,-1.094215 0.09375,-1.65625 z m -29.5,3.625 c 0.479308,0.123125 0.983064,0.234089 1.53125,0.34375 2.301781,0.460458 5.229421,0.787224 8.46875,0.9375 0.167006,2.84339 0.46081,5.433176 0.875,7.5 0.115218,0.574942 0.245268,1.063612 0.375,1.5625 -5.463677,-1.028179 -9.833074,-5.091831 -11.25,-10.34375 z m 27.96875,0 C 85.247546,81.408945 80.919274,85.442932 75.5,86.5 c 0.126981,-0.490925 0.261959,-0.967174 0.375,-1.53125 0.41419,-2.066824 0.707994,-4.65661 0.875,-7.5 3.204493,-0.15162 6.088346,-0.480068 8.375,-0.9375 0.548186,-0.109661 1.051942,-0.220625 1.53125,-0.34375 z M 70.0625,77.53125 c 0.865391,0.02589 1.723666,0.03125 2.625,0.03125 0.912062,0 1.782843,-0.0048 2.65625,-0.03125 -0.165173,2.736408 -0.453252,5.207651 -0.84375,7.15625 -0.152345,0.760206 -0.322989,1.438994 -0.5,2.03125 -0.437447,0.03919 -0.895856,0.0625 -1.34375,0.0625 -0.414943,0 -0.812719,-0.02881 -1.21875,-0.0625 -0.177011,-0.592256 -0.347655,-1.271044 -0.5,-2.03125 -0.390498,-1.948599 -0.700644,-4.419842 -0.875,-7.15625 z m 1.75,10.28125 c 0.284911,0.01545 0.554954,0.03125 0.84375,0.03125 0.325029,0 0.648588,-0.01171 0.96875,-0.03125 -0.05999,0.148763 -0.127309,0.31046 -0.1875,0.4375 -0.18789,0.396562 -0.386962,0.696416 -0.53125,0.84375 -0.144288,0.147334 -0.181857,0.125 -0.1875,0.125 -0.0056,0 -0.07446,0.02233 -0.21875,-0.125 C 72.355712,88.946416 72.18789,88.646562 72,88.25 71.939809,88.12296 71.872486,87.961263 71.8125,87.8125 z';\n","import {\n defined,\n Math as CesiumMath,\n EventHelper,\n SceneMode,\n Cartesian2,\n Cartesian3,\n BoundingSphere,\n HeadingPitchRange\n} from 'cesium';\nimport { ResetViewNavigationControl } from './reset-view-navigation-control';\nimport { ZoomNavigationControl } from './zoom-navigation-control';\nimport { svgCompassOuterRing } from '../svgpaths/compass-outer-ring';\nimport { svgCompassGyro } from '../svgpaths/compass-gyro';\nimport * as Utils from '../core/utils';\nimport type { TerraWrapper, NavigationControlInterface } from '../types';\n\nconst vectorScratch = new Cartesian2();\nconst centerScratch = new Cartesian3();\n\n/**\n * View model for the navigation widget (compass and controls)\n */\nexport class NavigationViewModel {\n terria: TerraWrapper;\n private eventHelper: EventHelper;\n enableZoomControls: boolean;\n enableCompass: boolean;\n navigationLocked: boolean = false;\n \n controls: NavigationControlInterface[];\n showCompass: boolean;\n heading: number = 0.0;\n \n private _unsubscribeFromPostRender?: () => void;\n\n constructor(options: {\n terria: TerraWrapper;\n enableZoomControls?: boolean;\n enableCompass?: boolean;\n controls?: NavigationControlInterface[];\n }) {\n this.terria = options.terria;\n this.eventHelper = new EventHelper();\n this.enableZoomControls = options.enableZoomControls !== false;\n this.enableCompass = options.enableCompass !== false;\n\n this.controls = options.controls || [\n new ZoomNavigationControl(this.terria, true),\n new ResetViewNavigationControl(this.terria),\n new ZoomNavigationControl(this.terria, false)\n ];\n\n this.showCompass = defined(this.terria) && this.enableCompass;\n this.heading = this.showCompass ? this.terria.scene.camera.heading : 0.0;\n\n this.eventHelper.add(this.terria.afterWidgetChanged, this.widgetChange.bind(this));\n this.widgetChange();\n }\n\n setNavigationLocked(locked: boolean): void {\n this.navigationLocked = locked;\n if (this.controls && this.controls.length > 1) {\n const resetControl = this.controls[1] as ResetViewNavigationControl;\n if (resetControl.setNavigationLocked) {\n resetControl.setNavigationLocked(this.navigationLocked);\n }\n }\n }\n\n private widgetChange(): void {\n if (defined(this.terria)) {\n if (this._unsubscribeFromPostRender) {\n this._unsubscribeFromPostRender();\n this._unsubscribeFromPostRender = undefined;\n }\n\n this.showCompass = this.enableCompass;\n\n this._unsubscribeFromPostRender = this.terria.scene.postRender.addEventListener(() => {\n this.heading = this.terria.scene.camera.heading;\n this.updateDOM();\n });\n } else {\n if (this._unsubscribeFromPostRender) {\n this._unsubscribeFromPostRender();\n this._unsubscribeFromPostRender = undefined;\n }\n this.showCompass = false;\n }\n }\n\n destroy(): void {\n this.eventHelper.removeAll();\n if (this._unsubscribeFromPostRender) {\n this._unsubscribeFromPostRender();\n }\n }\n\n show(container: HTMLElement): void {\n const compassDisplay = this.showCompass && this.enableCompass ? 'block' : 'none';\n const controlsDisplay = this.enableZoomControls ? 'block' : 'none';\n \n const html = `\n <div class=\"compass\" style=\"display: ${compassDisplay};\" title=\"Drag outer ring: rotate view. Drag inner gyroscope: free orbit. Double-click: reset view.\">\n <div class=\"compass-outer-ring-background\"></div>\n <div class=\"compass-rotation-marker\" style=\"display: none; transform: rotate(0rad);\"></div>\n <div class=\"compass-outer-ring\" title=\"Click and drag to rotate the camera\">\n <svg width=\"145\" height=\"145\" viewBox=\"0 0 145 145\"><path d=\"${svgCompassOuterRing}\" fill=\"rgba(255,255,255,0.5)\"></path></svg>\n </div>\n <div class=\"compass-gyro-background\"></div>\n <div class=\"compass-gyro\">\n <svg width=\"145\" height=\"145\" viewBox=\"0 0 145 145\"><path d=\"${svgCompassGyro}\" fill=\"#CCC\"></path></svg>\n </div>\n </div>\n <div class=\"navigation-controls\" style=\"display: ${controlsDisplay};\"></div>\n `;\n \n const temp = document.createElement('div');\n temp.innerHTML = html;\n while (temp.firstChild) {\n container.appendChild(temp.firstChild);\n }\n\n // Set up event listeners\n const compassEl = container.querySelector('.compass') as HTMLElement;\n if (compassEl) {\n compassEl.addEventListener('pointerdown', (e) => this.handleMouseDown(e));\n compassEl.addEventListener('dblclick', () => this.handleDoubleClick());\n }\n\n // Render controls\n const controlsContainer = container.querySelector('.navigation-controls') as HTMLElement;\n if (controlsContainer && this.controls) {\n this.controls.forEach((control, index) => {\n const isLast = index === this.controls.length - 1;\n const controlEl = document.createElement('div');\n controlEl.className = isLast ? 'navigation-control-last' : 'navigation-control';\n controlEl.title = control.name;\n \n if (control.hasText && control.text) {\n const textEl = document.createElement('div');\n textEl.textContent = control.text;\n textEl.className = control.cssClass || '';\n controlEl.appendChild(textEl);\n } else if (control.svgIcon) {\n const iconEl = document.createElement('div');\n iconEl.className = control.cssClass || '';\n iconEl.innerHTML = `<svg width=\"${control.svgWidth}\" height=\"${control.svgHeight}\" viewBox=\"0 0 ${control.svgWidth} ${control.svgHeight}\"><path d=\"${control.svgIcon}\"></path></svg>`;\n controlEl.appendChild(iconEl);\n }\n \n controlEl.addEventListener('click', () => control.activate());\n controlsContainer.appendChild(controlEl);\n });\n }\n }\n\n handleMouseDown(e: MouseEvent | PointerEvent): boolean {\n const { scene } = this.terria;\n if (scene.mode === SceneMode.MORPHING || this.navigationLocked) {\n return true;\n }\n\n const compassElement = e.currentTarget as HTMLElement;\n const compassRectangle = compassElement.getBoundingClientRect();\n const maxDistance = compassRectangle.width / 2.0;\n const center = new Cartesian2(\n (compassRectangle.right - compassRectangle.left) / 2.0,\n (compassRectangle.bottom - compassRectangle.top) / 2.0\n );\n const clickLocation = new Cartesian2(\n e.clientX - compassRectangle.left,\n e.clientY - compassRectangle.top\n );\n const vector = Cartesian2.subtract(clickLocation, center, vectorScratch);\n const distanceFromCenter = Cartesian2.magnitude(vector);\n const distanceFraction = distanceFromCenter / maxDistance;\n\n const nominalTotalRadius = 145;\n const normalGyroRadius = 50;\n\n if (distanceFraction < normalGyroRadius / nominalTotalRadius) {\n // Orbit gesture - simplified implementation\n e.preventDefault();\n return false;\n } else if (distanceFraction < 1.0) {\n // Rotate gesture - simplified implementation\n e.preventDefault();\n return false;\n }\n \n return true;\n }\n\n handleDoubleClick(): boolean {\n const { scene } = this.terria;\n const { camera } = scene;\n const sscc = scene.screenSpaceCameraController;\n\n if (scene.mode === SceneMode.MORPHING || !sscc.enableInputs || this.navigationLocked) {\n return true;\n }\n\n const center = Utils.getCameraFocus(this.terria, true, centerScratch);\n\n if (!defined(center)) {\n // Reset to home view\n if (this.controls && this.controls.length > 1) {\n const resetControl = this.controls[1] as ResetViewNavigationControl;\n resetControl.activate();\n }\n return false;\n }\n\n const cameraPosition = scene.globe.ellipsoid.cartographicToCartesian(\n camera.positionCartographic,\n new Cartesian3()\n );\n const surfaceNormal = scene.globe.ellipsoid.geodeticSurfaceNormal(center);\n const focusBoundingSphere = new BoundingSphere(center, 0);\n\n camera.flyToBoundingSphere(focusBoundingSphere, {\n offset: new HeadingPitchRange(\n 0,\n CesiumMath.PI_OVER_TWO - Cartesian3.angleBetween(surfaceNormal, camera.directionWC),\n Cartesian3.distance(cameraPosition, center)\n ),\n duration: 1.5\n });\n\n return false;\n }\n\n isLastControl(control: NavigationControlInterface): boolean {\n return control === this.controls[this.controls.length - 1];\n }\n\n private updateDOM(): void {\n // Update compass rotation\n const outerRing = document.querySelector('.compass-outer-ring') as HTMLElement;\n if (outerRing) {\n outerRing.style.transform = `rotate(-${this.heading}rad)`;\n }\n }\n\n static create(options: {\n container: HTMLElement;\n terria: TerraWrapper;\n enableZoomControls?: boolean;\n enableCompass?: boolean;\n }): NavigationViewModel {\n const result = new NavigationViewModel(options);\n result.show(options.container);\n return result;\n }\n}\n","import { defined, DeveloperError, Event as CesiumEvent } from 'cesium';\nimport type { Viewer, CesiumWidget } from 'cesium';\nimport { DistanceLegendViewModel } from './viewmodels/distance-legend-view-model';\nimport { NavigationViewModel } from './viewmodels/navigation-view-model';\nimport type { CesiumNavigationOptions, TerraWrapper } from './types';\nimport './styles/cesium-navigation.css';\n\n/**\n * Main CesiumNavigation plugin class\n */\nexport class CesiumNavigation {\n distanceLegendViewModel?: DistanceLegendViewModel;\n navigationViewModel?: NavigationViewModel;\n navigationDiv?: HTMLElement;\n distanceLegendDiv?: HTMLElement;\n terria: TerraWrapper;\n container: HTMLElement;\n \n private _onDestroyListeners: Array<() => void> = [];\n private _navigationLocked: boolean = false;\n\n constructor(viewerCesiumWidget: Viewer | CesiumWidget, options: CesiumNavigationOptions = {}) {\n if (!defined(viewerCesiumWidget)) {\n throw new DeveloperError('CesiumWidget or Viewer is required.');\n }\n\n const cesiumWidget = 'cesiumWidget' in viewerCesiumWidget\n ? viewerCesiumWidget.cesiumWidget\n : viewerCesiumWidget;\n\n const container = document.createElement('div');\n container.className = 'cesium-widget-cesiumNavigationContainer';\n cesiumWidget.container.appendChild(container);\n\n // Create terria wrapper\n this.terria = {\n scene: cesiumWidget.scene,\n camera: cesiumWidget.scene.camera,\n clock: cesiumWidget.clock,\n cesiumWidget,\n options,\n afterWidgetChanged: new CesiumEvent(),\n beforeWidgetChanged: new CesiumEvent(),\n trackedEntity: 'trackedEntity' in viewerCesiumWidget ? (viewerCesiumWidget as Viewer).trackedEntity : undefined\n };\n \n this.container = container;\n\n // Create distance legend\n if (options.enableDistanceLegend !== false) {\n this.distanceLegendDiv = document.createElement('div');\n container.appendChild(this.distanceLegendDiv);\n this.distanceLegendDiv.setAttribute('id', 'distanceLegendDiv');\n \n this.distanceLegendViewModel = DistanceLegendViewModel.create({\n ...options,\n container: this.distanceLegendDiv,\n terria: this.terria,\n enableDistanceLegend: true\n });\n }\n\n // Create navigation controls\n if (\n (options.enableZoomControls !== false) ||\n (options.enableCompass !== false)\n ) {\n this.navigationDiv = document.createElement('div');\n this.navigationDiv.setAttribute('id', 'navigationDiv');\n container.appendChild(this.navigationDiv);\n \n this.navigationViewModel = NavigationViewModel.create({\n container: this.navigationDiv,\n terria: this.terria,\n enableZoomControls: options.enableZoomControls !== false,\n enableCompass: options.enableCompass !== false\n });\n }\n }\n\n setNavigationLocked(locked: boolean): void {\n this._navigationLocked = locked;\n if (this.navigationViewModel) {\n this.navigationViewModel.setNavigationLocked(this._navigationLocked);\n }\n }\n\n getNavigationLocked(): boolean {\n return this._navigationLocked;\n }\n\n destroy(): void {\n if (defined(this.navigationViewModel)) {\n this.navigationViewModel.destroy();\n }\n \n if (defined(this.distanceLegendViewModel)) {\n this.distanceLegendViewModel.destroy();\n }\n\n if (defined(this.navigationDiv)) {\n this.navigationDiv.parentNode?.removeChild(this.navigationDiv);\n delete (this as any).navigationDiv;\n }\n\n if (defined(this.distanceLegendDiv)) {\n this.distanceLegendDiv.parentNode?.removeChild(this.distanceLegendDiv);\n delete (this as any).distanceLegendDiv;\n }\n\n if (defined(this.container)) {\n this.container.parentNode?.removeChild(this.container);\n delete (this as any).container;\n }\n\n for (const listener of this._onDestroyListeners) {\n listener();\n }\n }\n\n addOnDestroyListener(callback: () => void): void {\n if (typeof callback === 'function') {\n this._onDestroyListeners.push(callback);\n }\n }\n}\n\nexport default CesiumNavigation;\n","import { defined, DeveloperError } from 'cesium';\nimport type { Viewer, CesiumWidget } from 'cesium';\nimport { CesiumNavigation } from './cesium-navigation';\nimport type { CesiumNavigationOptions } from './types';\nimport './styles/cesium-navigation.css';\n\n/**\n * Viewer/CesiumWidget extended with cesiumNavigation property\n */\nexport interface ViewerWithCesiumNavigation extends Viewer {\n cesiumNavigation: CesiumNavigation;\n}\n\nexport interface CesiumWidgetWithCesiumNavigation extends CesiumWidget {\n cesiumNavigation: CesiumNavigation;\n}\n\n/**\n * Initialize the navigation widget\n */\nfunction init(viewerCesiumWidget: Viewer | CesiumWidget, options?: CesiumNavigationOptions): CesiumNavigation {\n const cesiumNavigation = new CesiumNavigation(viewerCesiumWidget, options);\n\n const cesiumWidget = 'cesiumWidget' in viewerCesiumWidget\n ? viewerCesiumWidget.cesiumWidget\n : viewerCesiumWidget;\n\n Object.defineProperty(cesiumWidget, 'cesiumNavigation', {\n configurable: true,\n get: () => cesiumNavigation\n });\n\n cesiumNavigation.addOnDestroyListener(() => {\n const widget = cesiumWidget as any;\n delete widget.cesiumNavigation;\n });\n\n return cesiumNavigation;\n}\n\n/**\n * A mixin which adds the Compass/Navigation widget to the Viewer widget.\n * Rather than being called directly, this function is normally passed as\n * a parameter to {@link Viewer#extend}, as shown in the example below.\n *\n * @param viewer The viewer instance\n * @param options The options\n *\n * @example\n * const viewer = new Cesium.Viewer('cesiumContainer');\n * viewer.extend(viewerCesiumNavigationMixin);\n */\nexport function viewerCesiumNavigationMixin(viewer: Viewer, options?: CesiumNavigationOptions): void {\n if (!defined(viewer)) {\n throw new DeveloperError('viewer is required.');\n }\n\n const cesiumNavigation = init(viewer, options);\n\n cesiumNavigation.addOnDestroyListener(() => {\n delete (viewer as any).cesiumNavigation;\n });\n\n Object.defineProperty(viewer, 'cesiumNavigation', {\n configurable: true,\n get: () => (viewer.cesiumWidget as CesiumWidgetWithCesiumNavigation).cesiumNavigation\n });\n}\n\n/**\n * Mixin for CesiumWidget\n */\nviewerCesiumNavigationMixin.mixinWidget = (\n cesiumWidget: CesiumWidget,\n options?: CesiumNavigationOptions\n): CesiumNavigation => {\n return init(cesiumWidget, options);\n};\n\nexport default viewerCesiumNavigationMixin;\n"],"names":["getCameraFocus","viewer","inWorldCoordinates","result","scene","camera","SceneMode","rayScratch","Ray","center","defined","Cartographic","distanceLabelFormatter","distanceValue","units","UNIT_FACTORS","convertLength","value","from","to","geodesic","EllipsoidGeodesic","distances","DistanceLegendViewModel","options","__publicField","DeveloperError","EventHelper","container","html","temp","element","now","getTimestamp","width","height","left","Cartesian2","right","globe","leftPosition","rightPosition","leftCartographic","rightCartographic","pixelDistance","maxBarWidth","distance","i","currentDistance","convertedDistance","label","utils.distanceLabelFormatter","parentElement","UserInterfaceControl","terria","NavigationControl","svgReset","ResetViewNavigationControl","locked","trackedEntity","Rectangle","Camera","cartesian3Scratch","Cartesian3","ZoomNavigationControl","zoomIn","relativeAmount","sscc","orientation","focus","Utils.getCameraFocus","ray","IntersectionTests","direction","movementVector","endPosition","svgCompassOuterRing","svgCompassGyro","vectorScratch","centerScratch","NavigationViewModel","resetControl","compassDisplay","controlsDisplay","compassEl","e","controlsContainer","control","index","isLast","controlEl","textEl","iconEl","compassRectangle","maxDistance","clickLocation","vector","distanceFraction","cameraPosition","surfaceNormal","focusBoundingSphere","BoundingSphere","HeadingPitchRange","CesiumMath","outerRing","CesiumNavigation","viewerCesiumWidget","cesiumWidget","CesiumEvent","_a","_b","_c","listener","callback","init","cesiumNavigation","widget","viewerCesiumNavigationMixin"],"mappings":"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"}
|