@3clear/basegis 0.1.7 → 0.1.8

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@3clear/basegis",
3
- "version": "0.1.7",
3
+ "version": "0.1.8",
4
4
  "description": "BaseGIS map engine adapter and GIS layer utilities.",
5
5
  "type": "module",
6
6
  "module": "./dist/basegis.js",
@@ -1,438 +0,0 @@
1
- const S = {
2
- OK: "OK",
3
- CANCELLED: "CANCELLED",
4
- FAILED: "FAILED",
5
- NOT_INITIALIZED: "NOT_INITIALIZED",
6
- INVALID_CONTAINER: "INVALID_CONTAINER",
7
- ENGINE_NOT_REGISTERED: "ENGINE_NOT_REGISTERED",
8
- ENGINE_RESOURCE_MISSING: "ENGINE_RESOURCE_MISSING",
9
- METHOD_NOT_FOUND: "METHOD_NOT_FOUND",
10
- UNSUPPORTED_CAPABILITY: "UNSUPPORTED_CAPABILITY",
11
- INVALID_DEM: "INVALID_DEM"
12
- };
13
- function v({
14
- success: t = !0,
15
- message: n = "",
16
- data: e = null,
17
- code: i = S.OK
18
- } = {}) {
19
- return { success: t, message: n, data: e, code: i };
20
- }
21
- function q(t = null, n = "OK", e = S.OK) {
22
- return v({ success: !0, message: n, data: t, code: e });
23
- }
24
- function z(t = "Operation failed.", n = S.FAILED, e = null) {
25
- return v({ success: !1, message: t, data: e, code: n });
26
- }
27
- function H(t, n, e = "") {
28
- const i = `${n} adapter does not support "${t}". ${e}`.trim();
29
- return console.warn(`[3clear-dt-base] ${i}`), z(i, S.UNSUPPORTED_CAPABILITY, {
30
- methodName: t,
31
- engineType: n,
32
- detail: e
33
- });
34
- }
35
- function Z(t, n = {}) {
36
- var i, o, s, r, l;
37
- if (n.currentTime !== void 0 && n.currentTime !== null && !Number.isFinite(n.currentTime))
38
- return "currentTime must be a finite timestamp in milliseconds or null.";
39
- if (t.times !== void 0) {
40
- if (!t.colors || !Array.isArray(t.times) || t.times.length !== ((i = t.positions) == null ? void 0 : i.length))
41
- return "line.times requires vertex colors and one timestamp for each position.";
42
- for (let a = 0; a < t.times.length; a += 1)
43
- if (!Number.isFinite(t.times[a]) || a > 0 && t.times[a] <= t.times[a - 1])
44
- return "line.times must contain strictly increasing finite timestamps in milliseconds.";
45
- }
46
- if (t.colors === void 0) return "";
47
- if (!Array.isArray(t.colors) || t.colors.length !== ((o = t.positions) == null ? void 0 : o.length))
48
- return "line.colors must have one color for each position.";
49
- if (t.colors.some((a) => typeof a != "string" || !/^#[0-9a-f]{6}$/i.test(a)))
50
- return "line.colors requires six-digit HEX colors.";
51
- const e = { ...n.style, ...t.style };
52
- return e.pattern === "dashed" || (r = (s = e.color) == null ? void 0 : s.flow) != null && r.enabled ? "Vertex colors support solid lines only." : (e.clampToGround ?? n.clampToGround) === !0 ? "Vertex colors do not support clampToGround; use false for the thematic overlay." : (l = n.animation) != null && l.enabled && (!n.animation.lineId || String(n.animation.lineId) === String(t.id)) ? "Vertex-colored lines do not support reveal animation." : "";
53
- }
54
- const B = {
55
- TD: "#e6d64f",
56
- TS: "#2f8df4",
57
- STS: "#28a46a",
58
- TY: "#f59e0b",
59
- STY: "#d946ef",
60
- SuperTY: "#ef4444"
61
- }, w = {
62
- trackLine: {
63
- color: "#ffffff",
64
- width: 3,
65
- opacity: 0.96,
66
- outlineColor: "#08131f",
67
- outlineWidth: 1
68
- },
69
- forecastLine: {
70
- color: "#f8fafc",
71
- width: 2,
72
- opacity: 0.92,
73
- dashLength: 12,
74
- gapLength: 8
75
- },
76
- point: {
77
- radius: 5,
78
- outlineColor: "#07111f",
79
- outlineWidth: 1
80
- },
81
- label: {
82
- visible: !0,
83
- color: "#ffffff",
84
- fontSize: 12,
85
- backgroundColor: "rgba(2, 20, 42, 0.82)",
86
- offset: [0, -22]
87
- },
88
- center: {
89
- iconUrl: "",
90
- iconSize: [36, 36],
91
- rotate: !0,
92
- rotationDurationMs: 1400,
93
- showLabel: !0,
94
- labelColor: "#07111f",
95
- labelBackgroundColor: "rgba(255, 255, 255, 0.88)",
96
- labelOffset: [30, -30]
97
- },
98
- windCircle: {
99
- visible: !0,
100
- r7: { color: "#c8c537", fillOpacity: 0.26, outlineOpacity: 0.9 },
101
- r10: { color: "#ffaa00", fillOpacity: 0.22, outlineOpacity: 0.9 },
102
- r12: { color: "#cc4400", fillOpacity: 0.18, outlineOpacity: 0.95 }
103
- },
104
- intensityColors: B
105
- }, D = {
106
- enabled: !0,
107
- durationMs: 15e3,
108
- autoplay: !1,
109
- loop: !1,
110
- currentIndex: 0
111
- };
112
- function h(t) {
113
- return !!(t && typeof t == "object" && !Array.isArray(t));
114
- }
115
- function b(t, n) {
116
- return Object.prototype.hasOwnProperty.call(t || {}, n);
117
- }
118
- function f(t, n, e) {
119
- return Math.min(Math.max(t, n), e);
120
- }
121
- function u(t, n = 0) {
122
- const e = Number(t);
123
- return Number.isFinite(e) ? e : n;
124
- }
125
- function m(t, n) {
126
- return {
127
- ...h(t) ? t : {},
128
- ...h(n) ? n : {}
129
- };
130
- }
131
- function R(t = {}, n = {}) {
132
- const e = h(t) ? t : {}, i = h(n) ? n : {}, o = {
133
- ...e,
134
- ...i
135
- };
136
- ["trackLine", "forecastLine", "point", "label", "center", "intensityColors"].forEach((l) => {
137
- o[l] = m(e[l], i[l]);
138
- });
139
- const s = h(e.windCircle) ? e.windCircle : {}, r = h(i.windCircle) ? i.windCircle : {};
140
- return o.windCircle = {
141
- ...s,
142
- ...r,
143
- r7: m(s.r7, r.r7),
144
- r10: m(s.r10, r.r10),
145
- r12: m(s.r12, r.r12)
146
- }, o;
147
- }
148
- function Q(t = {}, n = {}) {
149
- const e = h(t) ? t : {}, i = h(n) ? n : {}, o = {
150
- ...e,
151
- ...i,
152
- typhoon: m(e.typhoon, i.typhoon),
153
- style: R(e.style, i.style),
154
- playback: m(e.playback, i.playback)
155
- };
156
- return !b(i, "tracks") && b(e, "tracks") && (o.tracks = e.tracks), !b(i, "forecastPaths") && b(e, "forecastPaths") && (o.forecastPaths = e.forecastPaths), o;
157
- }
158
- function U(t, n) {
159
- if (!Array.isArray(t) || t.length < 2)
160
- throw new Error(`${n} must be [longitude, latitude, height?].`);
161
- const e = Number(t[0]), i = Number(t[1]), o = t.length > 2 ? Number(t[2]) : 0;
162
- if (!Number.isFinite(e) || !Number.isFinite(i) || !Number.isFinite(o) || i < -90 || i > 90)
163
- throw new Error(`${n} must contain finite coordinates and latitude must be between -90 and 90.`);
164
- return [e, i, o];
165
- }
166
- function G(t, n) {
167
- if (t == null) return null;
168
- if (!h(t))
169
- throw new Error(`${n} must be { ne, se, sw, nw } in kilometres.`);
170
- const e = {};
171
- for (const i of ["ne", "se", "sw", "nw"]) {
172
- const o = Number(t[i]);
173
- if (!Number.isFinite(o) || o < 0)
174
- throw new Error(`${n}.${i} must be a non-negative number.`);
175
- e[i] = o;
176
- }
177
- return e;
178
- }
179
- function V(t, n) {
180
- if (t == null) return {};
181
- if (!h(t)) throw new Error(`${n} must be an object.`);
182
- return ["r7", "r10", "r12"].reduce((e, i) => {
183
- const o = G(t[i], `${n}.${i}`);
184
- return o && (e[i] = o), e;
185
- }, {});
186
- }
187
- function _(t, n, e = "tracks") {
188
- if (!h(t)) throw new Error(`${e}[${n}] must be an object.`);
189
- const i = t.time ?? "", o = Date.parse(i), s = i == null || String(i) === "" ? `${e}-${n}` : i;
190
- return {
191
- ...t,
192
- id: String(t.id === void 0 || t.id === null || String(t.id) === "" ? s : t.id),
193
- time: i,
194
- timestamp: Number.isFinite(o) ? o : null,
195
- position: U(t.position, `${e}[${n}].position`),
196
- level: String(t.level || "TD"),
197
- windSpeed: t.windSpeed === void 0 ? null : u(t.windSpeed, null),
198
- pressure: t.pressure === void 0 ? null : u(t.pressure, null),
199
- windCircles: V(t.windCircles, `${e}[${n}].windCircles`)
200
- };
201
- }
202
- function W(t, n, e) {
203
- if (!h(t)) throw new Error(`forecastPaths[${n}] must be an object.`);
204
- if (!Array.isArray(t.points) || t.points.length === 0)
205
- throw new Error(`forecastPaths[${n}].points requires at least one point.`);
206
- const i = String(t.id ?? `forecast-${n}`), o = t.points.map((s, r) => {
207
- const l = _(s, r, `forecastPaths[${n}].points`), a = s == null ? void 0 : s.uncertaintyRadiusKm;
208
- return {
209
- ...l,
210
- uncertaintyRadiusKm: a == null ? 0 : Math.max(u(a, 0), 0)
211
- };
212
- });
213
- return {
214
- ...t,
215
- id: i,
216
- points: o,
217
- style: m(e, t.style)
218
- };
219
- }
220
- function Y(t = {}) {
221
- const n = R(w, t);
222
- return n.trackLine.width = Math.max(u(n.trackLine.width, 3), 0.5), n.trackLine.opacity = f(u(n.trackLine.opacity, 0.96), 0, 1), n.trackLine.outlineWidth = Math.max(u(n.trackLine.outlineWidth, 1), 0), n.forecastLine.width = Math.max(u(n.forecastLine.width, 2), 0.5), n.forecastLine.opacity = f(u(n.forecastLine.opacity, 0.92), 0, 1), n.forecastLine.dashLength = Math.max(u(n.forecastLine.dashLength, 12), 1), n.forecastLine.gapLength = Math.max(u(n.forecastLine.gapLength, 8), 1), n.point.radius = Math.max(u(n.point.radius, 5), 1), n.point.outlineWidth = Math.max(u(n.point.outlineWidth, 1), 0), n.label.fontSize = Math.max(u(n.label.fontSize, 12), 8), n.label.offset = Array.isArray(n.label.offset) ? n.label.offset.slice(0, 2) : [0, -22], n.center.iconSize = Array.isArray(n.center.iconSize) ? n.center.iconSize.slice(0, 2).map((e) => Math.max(u(e, 36), 1)) : [36, 36], n.center.rotationDurationMs = Math.max(u(n.center.rotationDurationMs, 1400), 1), n.center.labelOffset = Array.isArray(n.center.labelOffset) ? n.center.labelOffset.slice(0, 2) : [30, -30], ["r7", "r10", "r12"].forEach((e) => {
223
- n.windCircle[e].fillOpacity = f(
224
- u(n.windCircle[e].fillOpacity, w.windCircle[e].fillOpacity),
225
- 0,
226
- 1
227
- ), n.windCircle[e].outlineOpacity = f(
228
- u(n.windCircle[e].outlineOpacity, w.windCircle[e].outlineOpacity),
229
- 0,
230
- 1
231
- );
232
- }), n;
233
- }
234
- function X(t = {}, n = {}) {
235
- const e = h(t) ? t : {}, i = Array.isArray(e.tracks) ? e.tracks.map((l, a) => _(l, a)) : [];
236
- if (!n.allowEmpty && i.length === 0)
237
- throw new Error("Typhoon path requires a non-empty tracks array.");
238
- const o = Y(e.style), s = Array.isArray(e.forecastPaths) ? e.forecastPaths.map((l, a) => W(l, a, o.forecastLine)) : [], r = m(D, e.playback);
239
- return r.enabled = r.enabled !== !1, r.durationMs = Math.max(u(r.durationMs, D.durationMs), 1), r.autoplay = r.autoplay === !0, r.loop = r.loop === !0, r.currentIndex = i.length ? f(Math.floor(u(r.currentIndex, 0)), 0, i.length - 1) : 0, {
240
- ...e,
241
- layerId: String(e.typhoonPathLayerId || e.layerId || e.id || "typhoon-path-default"),
242
- typhoon: m({}, e.typhoon),
243
- tracks: i,
244
- forecastPaths: s,
245
- style: o,
246
- playback: r,
247
- visible: e.visible !== !1,
248
- onCurrentChange: typeof e.onCurrentChange == "function" ? e.onCurrentChange : null,
249
- onPointClick: typeof e.onPointClick == "function" ? e.onPointClick : null
250
- };
251
- }
252
- function d(t) {
253
- return t * Math.PI / 180;
254
- }
255
- function N(t) {
256
- return t * 180 / Math.PI;
257
- }
258
- function j(t, n) {
259
- const e = d(t[1]), i = d(n[1]), o = i - e, s = d(n[0] - t[0]), r = Math.sin(o / 2) ** 2 + Math.cos(e) * Math.cos(i) * Math.sin(s / 2) ** 2;
260
- return 6371e3 * 2 * Math.atan2(Math.sqrt(r), Math.sqrt(Math.max(1 - r, 0)));
261
- }
262
- function $(t) {
263
- if (t.length <= 1) return [0];
264
- if (t.every(
265
- (o, s) => o.timestamp !== null && (s === 0 || o.timestamp > t[s - 1].timestamp)
266
- )) {
267
- const o = t[0].timestamp, s = t[t.length - 1].timestamp - o;
268
- if (s > 0) return t.map((r) => (r.timestamp - o) / s);
269
- }
270
- const e = [0];
271
- for (let o = 1; o < t.length; o += 1) {
272
- const s = j(t[o - 1].position, t[o].position), r = t[o].position[2] - t[o - 1].position[2];
273
- e.push(e[o - 1] + Math.hypot(s, r));
274
- }
275
- const i = e[e.length - 1];
276
- return i > 0 ? e.map((o) => o / i) : e.map((o, s) => s / (t.length - 1));
277
- }
278
- function K(t, n, e) {
279
- const i = d(t[1]), o = d(t[0]), s = d(n[1]), r = d(n[0]), l = 2 * Math.asin(Math.sqrt(
280
- Math.sin((s - i) / 2) ** 2 + Math.cos(i) * Math.cos(s) * Math.sin((r - o) / 2) ** 2
281
- ));
282
- if (!Number.isFinite(l) || l < 1e-9)
283
- return [t[0], t[1], t[2] + (n[2] - t[2]) * e];
284
- const a = Math.sin(l), c = Math.sin((1 - e) * l) / a, p = Math.sin(e * l) / a, M = c * Math.cos(i) * Math.cos(o) + p * Math.cos(s) * Math.cos(r), g = c * Math.cos(i) * Math.sin(o) + p * Math.cos(s) * Math.sin(r), y = c * Math.sin(i) + p * Math.sin(s);
285
- return [
286
- N(Math.atan2(g, M)),
287
- N(Math.atan2(y, Math.hypot(M, g))),
288
- t[2] + (n[2] - t[2]) * e
289
- ];
290
- }
291
- function J(t = [], n = 0) {
292
- if (!t.length) return null;
293
- const e = f(u(n, 0), 0, 1);
294
- if (t.length === 1)
295
- return { progress: e, index: 0, nextIndex: 0, segmentProgress: 0, position: [...t[0].position], track: t[0] };
296
- const i = $(t);
297
- let o = i.length - 2;
298
- for (let c = 1; c < i.length; c += 1)
299
- if (e < i[c]) {
300
- o = c - 1;
301
- break;
302
- }
303
- e >= 1 && (o = t.length - 1);
304
- const s = Math.min(o + 1, t.length - 1), r = i[o], l = i[s], a = s === o ? 0 : f((e - r) / Math.max(l - r, Number.EPSILON), 0, 1);
305
- return {
306
- progress: e,
307
- index: o,
308
- nextIndex: s,
309
- segmentProgress: a,
310
- position: K(t[o].position, t[s].position, a),
311
- track: t[o]
312
- };
313
- }
314
- function k(t = [], n = 0) {
315
- if (!t.length) return 0;
316
- const e = f(Math.floor(u(n, 0)), 0, t.length - 1);
317
- return $(t)[e] || 0;
318
- }
319
- function tt(t = [], n) {
320
- if (!t.length) return -1;
321
- const e = Date.parse(n);
322
- return Number.isFinite(e) ? t.reduce((i, o, s) => {
323
- if (o.timestamp === null) return i;
324
- const r = Math.abs(o.timestamp - e), l = t[i].timestamp === null ? Number.POSITIVE_INFINITY : Math.abs(t[i].timestamp - e);
325
- return r < l ? s : i;
326
- }, 0) : -1;
327
- }
328
- function F(t, n, e, i) {
329
- const o = i / 6371, s = d(e), r = d(n), l = d(t), a = Math.asin(
330
- Math.sin(r) * Math.cos(o) + Math.cos(r) * Math.sin(o) * Math.cos(s)
331
- ), c = l + Math.atan2(
332
- Math.sin(s) * Math.sin(o) * Math.cos(r),
333
- Math.cos(o) - Math.sin(r) * Math.sin(a)
334
- );
335
- return [(N(c) + 540) % 360 - 180, N(a)];
336
- }
337
- function nt(t, n, e, i = 4) {
338
- if (!h(e)) return [];
339
- const o = [], s = f(Math.floor(u(i, 4)), 1, 30);
340
- for (let r = 0; r < 360; r += s) {
341
- const l = r < 90 ? e.ne : r < 180 ? e.se : r < 270 ? e.sw : e.nw;
342
- o.push(F(t, n, r, u(l, 0)));
343
- }
344
- return o;
345
- }
346
- function et(t, n, e, i = 6) {
347
- const o = [], s = f(Math.floor(u(i, 6)), 1, 30);
348
- for (let r = 0; r < 360; r += s)
349
- o.push(F(t, n, r, Math.max(u(e, 0), 0)));
350
- return o;
351
- }
352
- function it(t = [], n = []) {
353
- const e = t.map((i) => i.position);
354
- return n.forEach((i) => i.points.forEach((o) => e.push(o.position))), e.length ? e.reduce((i, o) => ({
355
- west: Math.min(i.west, o[0]),
356
- south: Math.min(i.south, o[1]),
357
- east: Math.max(i.east, o[0]),
358
- north: Math.max(i.north, o[1])
359
- }), { west: 1 / 0, south: 1 / 0, east: -1 / 0, north: -1 / 0 }) : null;
360
- }
361
- function ot(t = {}, n = {}) {
362
- const e = [t.code, t.name].filter(Boolean).join(" "), i = [n.stage || n.level, n.windSpeed === null ? "" : `${n.windSpeed}m/s`].filter(Boolean).join(" ");
363
- return [e, i].filter(Boolean).join(`
364
- `);
365
- }
366
- class rt {
367
- constructor(n = {}) {
368
- this.rawData = n, this.bound = Array.isArray(n.Bound) ? n.Bound : [], this.data = Array.isArray(n.DataAry) ? n.DataAry : [], this.valid = !1, this.errorMessage = "", this.lonMin = 0, this.latMin = 0, this.lonMax = 0, this.latMax = 0, this.lonCount = 0, this.latCount = 0, this.lonSpan = 0, this.latSpan = 0, this.lonStep = 0, this.latStep = 0, this.valueScale = 1, this.parse();
369
- }
370
- parse() {
371
- if (this.bound.length < 6) {
372
- this.errorMessage = "Wind field Bound must contain at least 6 values.";
373
- return;
374
- }
375
- const [n, e, i, o, s, r, l = 1] = this.bound, a = Number(i) * Number(o) * 2;
376
- if (!Number.isFinite(Number(n)) || !Number.isFinite(Number(e)) || Number(i) < 2 || Number(o) < 2 || Number(s) <= 0 || Number(r) <= 0 || this.data.length !== a) {
377
- this.errorMessage = `Invalid wind field data. Expected DataAry length ${a}, got ${this.data.length}.`;
378
- return;
379
- }
380
- this.lonMin = Number(n), this.latMin = Number(e), this.lonCount = Number(i), this.latCount = Number(o), this.lonSpan = Number(s), this.latSpan = Number(r), this.valueScale = Number(l) || 1, this.lonMax = this.lonMin + this.lonSpan, this.latMax = this.latMin + this.latSpan, this.lonStep = this.lonSpan / (this.lonCount - 1), this.latStep = this.latSpan / (this.latCount - 1), this.valid = !0;
381
- }
382
- contains(n, e) {
383
- return Number.isFinite(n) && Number.isFinite(e) && n >= this.lonMin && n <= this.lonMax && e >= this.latMin && e <= this.latMax;
384
- }
385
- getBounds() {
386
- return {
387
- west: this.lonMin,
388
- south: this.latMin,
389
- east: this.lonMax,
390
- north: this.latMax
391
- };
392
- }
393
- getCenter() {
394
- return {
395
- lon: this.lonMin + this.lonSpan / 2,
396
- lat: this.latMin + this.latSpan / 2
397
- };
398
- }
399
- getVector(n, e) {
400
- const i = (n * this.lonCount + e) * 2;
401
- return {
402
- u: Number(this.data[i]) / this.valueScale,
403
- v: Number(this.data[i + 1]) / this.valueScale
404
- };
405
- }
406
- /**
407
- * 双线性插值。
408
- *
409
- * 数据约定为从左下角开始平铺,因此 row 直接对应从南到北的纬度索引。
410
- */
411
- sample(n, e) {
412
- if (!this.valid || !this.contains(n, e))
413
- return null;
414
- const i = (n - this.lonMin) / this.lonStep, o = (e - this.latMin) / this.latStep, s = Math.max(0, Math.min(Math.floor(i), this.lonCount - 2)), r = Math.max(0, Math.min(Math.floor(o), this.latCount - 2)), l = s + 1, a = r + 1, c = Math.max(0, Math.min(i - s, 1)), p = Math.max(0, Math.min(o - r, 1)), M = this.getVector(r, s), g = this.getVector(r, l), y = this.getVector(a, s), E = this.getVector(a, l), L = 1 - c, T = 1 - p, A = L * T, O = c * T, x = L * p, P = c * p, C = M.u * A + g.u * O + y.u * x + E.u * P, I = M.v * A + g.v * O + y.v * x + E.v * P;
415
- return !Number.isFinite(C) || !Number.isFinite(I) ? null : {
416
- u: C,
417
- v: I,
418
- speed: Math.hypot(C, I)
419
- };
420
- }
421
- }
422
- export {
423
- S as R,
424
- rt as W,
425
- nt as a,
426
- et as b,
427
- J as c,
428
- it as d,
429
- z as e,
430
- ot as f,
431
- k as g,
432
- Q as m,
433
- X as n,
434
- tt as r,
435
- q as s,
436
- H as u,
437
- Z as v
438
- };