@idm-plugin/geo 1.3.5 → 1.3.7

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/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import * as g from "@turf/turf";
2
- import R from "moment";
2
+ import x from "moment";
3
3
  import "moment-timezone";
4
- import E from "tz-lookup";
5
- function k(C) {
4
+ import k from "tz-lookup";
5
+ function F(C) {
6
6
  return C && C.__esModule && Object.prototype.hasOwnProperty.call(C, "default") ? C.default : C;
7
7
  }
8
- class y {
8
+ class I {
9
9
  log() {
10
10
  }
11
11
  isLevelEnabled() {
@@ -19,20 +19,20 @@ class y {
19
19
  }
20
20
  }
21
21
  ["Trace", "Debug", "Info", "Warn", "Error", "Fatal", "Mark"].forEach((C) => {
22
- y.prototype[C.toLowerCase()] = () => {
23
- }, y.prototype[`is${C}Enabled`] = () => !1;
22
+ I.prototype[C.toLowerCase()] = () => {
23
+ }, I.prototype[`is${C}Enabled`] = () => !1;
24
24
  });
25
- const A = () => {
25
+ const L = () => {
26
26
  try {
27
27
  return require("log4js");
28
28
  } catch {
29
29
  return null;
30
30
  }
31
- }, x = A(), L = x ? x.getLogger : () => new y();
32
- var F = {
33
- getLogger: L
31
+ }, $ = L(), O = $ ? $.getLogger : () => new I();
32
+ var j = {
33
+ getLogger: O
34
34
  };
35
- const O = /* @__PURE__ */ k(F);
35
+ const B = /* @__PURE__ */ F(j);
36
36
  class l {
37
37
  /**
38
38
  * 基于输入的经度,计算出时区
@@ -40,7 +40,7 @@ class l {
40
40
  * @param lat
41
41
  */
42
42
  static guessTimeZoneOffset(t, e) {
43
- const n = E(e, t), s = R().tz(n).utcOffset();
43
+ const n = k(e, t), s = x().tz(n).utcOffset();
44
44
  return this.roundPrecision(s / 60, 1);
45
45
  }
46
46
  /**
@@ -56,12 +56,12 @@ class l {
56
56
  t = l.convertToStdLng(t, e);
57
57
  let s = "E";
58
58
  t < 0 && (s = "W"), t = Math.abs(t), n = n.toUpperCase();
59
- let o = t * 3600, i, r, c, a, d, u;
60
- i = o % 3600 % 60, n.indexOf("S") !== -1 && (o = o - i, r = l.padNumber(i, 2, 2)), c = o / 60 % 60, n.indexOf("M") !== -1 && (n.indexOf("S") !== -1 ? a = l.roundPrecision(c, e).toString().padStart(2, "0") : a = l.padNumber(c, 2, 2), o = o - c * 60), d = o / 3600, n.indexOf("M") !== -1 ? u = l.roundPrecision(d, e).toString().padStart(3, "0") : u = l.padNumber(d, 3, 2);
61
- const f = `${n.replace(/S+/gi, r).replace(/M+/gi, a).replace(/H+/gi, u)}${s}`;
59
+ let o = t * 3600, i, r, c, d, a, u;
60
+ i = o % 3600 % 60, n.indexOf("S") !== -1 && (o = o - i, r = l.padNumber(i, 2, 2)), c = o / 60 % 60, n.indexOf("M") !== -1 && (n.indexOf("S") !== -1 ? d = l.roundPrecision(c, e).toString().padStart(2, "0") : d = l.padNumber(c, 2, 2), o = o - c * 60), a = o / 3600, n.indexOf("M") !== -1 ? u = l.roundPrecision(a, e).toString().padStart(3, "0") : u = l.padNumber(a, 3, 2);
61
+ const f = `${n.replace(/S+/gi, r).replace(/M+/gi, d).replace(/H+/gi, u)}${s}`;
62
62
  return {
63
63
  direction: s,
64
- degree: l.roundPrecision(d, e),
64
+ degree: l.roundPrecision(a, e),
65
65
  minute: l.roundPrecision(c, e),
66
66
  second: l.roundPrecision(i, e),
67
67
  pretty: f
@@ -77,12 +77,12 @@ class l {
77
77
  t = t % 180;
78
78
  let s = "N";
79
79
  t < 0 && (s = "S"), t = Math.abs(t), n = n.toUpperCase();
80
- let o = t * 3600, i, r, c, a, d, u;
81
- i = o % 3600 % 60, n.indexOf("S") !== -1 && (o = o - i, r = l.padNumber(i, 2, 2)), c = o / 60 % 60, n.indexOf("M") !== -1 && (n.indexOf("S") !== -1 ? a = l.roundPrecision(c, e).toString().padStart(2, "0") : a = l.padNumber(c, 2, 2), o = o - c * 60), d = o / 3600, n.indexOf("M") !== -1 ? u = l.roundPrecision(d, e).toString().padStart(2, "0") : u = l.padNumber(d, 2, 2);
82
- const f = `${n.replace(/S+/gi, r).replace(/M+/gi, a).replace(/H+/gi, u)}${s}`;
80
+ let o = t * 3600, i, r, c, d, a, u;
81
+ i = o % 3600 % 60, n.indexOf("S") !== -1 && (o = o - i, r = l.padNumber(i, 2, 2)), c = o / 60 % 60, n.indexOf("M") !== -1 && (n.indexOf("S") !== -1 ? d = l.roundPrecision(c, e).toString().padStart(2, "0") : d = l.padNumber(c, 2, 2), o = o - c * 60), a = o / 3600, n.indexOf("M") !== -1 ? u = l.roundPrecision(a, e).toString().padStart(2, "0") : u = l.padNumber(a, 2, 2);
82
+ const f = `${n.replace(/S+/gi, r).replace(/M+/gi, d).replace(/H+/gi, u)}${s}`;
83
83
  return {
84
84
  direction: s,
85
- degree: l.roundPrecision(d, e),
85
+ degree: l.roundPrecision(a, e),
86
86
  minute: l.roundPrecision(c, e),
87
87
  second: l.roundPrecision(i, e),
88
88
  pretty: f
@@ -182,7 +182,7 @@ class l {
182
182
  return `${s}.${o}`;
183
183
  }
184
184
  }
185
- class S {
185
+ class T {
186
186
  /**
187
187
  * 计算方位角
188
188
  * @param from 坐标 {lng, lat}
@@ -229,8 +229,8 @@ class S {
229
229
  for (let r = 0; r < i.length - 1; r++) {
230
230
  const c = { lng: i[r][0], lat: i[r][1] };
231
231
  r === 0 && o && (s += this.calculateDistance(o, c, !0, e, n));
232
- const a = { lng: i[r + 1][0], lat: i[r + 1][1] };
233
- s += this.calculateDistance(c, a, !0, e, n), o = a;
232
+ const d = { lng: i[r + 1][0], lat: i[r + 1][1] };
233
+ s += this.calculateDistance(c, d, !0, e, n), o = d;
234
234
  }
235
235
  return l.roundPrecision(s, e);
236
236
  }
@@ -259,11 +259,11 @@ class S {
259
259
  * @param units 单位,默认 nm(海里)
260
260
  */
261
261
  static interpolateCoordinates(t, e, n, s = !0, o = !0, i = "nauticalmiles") {
262
- const r = [], c = this.calculateBearing(t, e, !1), a = this.calculateDistance(t, e, !1, 8, i);
262
+ const r = [], c = this.calculateBearing(t, e, !1), d = this.calculateDistance(t, e, !1, 8, i);
263
263
  s && r.push({ lng: t.lng, lat: t.lat });
264
- let d = 0;
265
- for (; d < a; )
266
- d += n, d < a && r.push(this.calculateCoordinate(t, c, d, i, !1));
264
+ let a = 0;
265
+ for (; a < d; )
266
+ a += n, a < d && r.push(this.calculateCoordinate(t, c, a, i, !1));
267
267
  return o && r.push({ lng: e.lng, lat: e.lat }), r;
268
268
  }
269
269
  /**
@@ -288,20 +288,20 @@ class S {
288
288
  o = l.convertToStdLng(t[r].lng, 8), i = l.convertToStdLng(t[r + 1].lng, 8), t[r].lat = l.roundPrecision(t[r].lat, 8), t[r + 1].lat = l.roundPrecision(t[r + 1].lat, 8), n.push([o, t[r].lat]);
289
289
  const c = o - i;
290
290
  if (Math.abs(c) > 180) {
291
- const a = l.convertToMonotonicLng2([
291
+ const d = l.convertToMonotonicLng2([
292
292
  [o, t[r].lat],
293
293
  [i, t[r + 1].lat]
294
294
  ]);
295
- let d, u;
296
- e ? (d = g.lineString(a), u = g.lineString([
295
+ let a, u;
296
+ e ? (a = g.lineString(d), u = g.lineString([
297
297
  [c > 0 ? 180 : -180, 89],
298
298
  [c > 0 ? 180 : -180, -89]
299
- ])) : (d = g.greatCircle(a[0], a[1]), u = g.greatCircle([c > 0 ? 180 : -180, 89], [c > 0 ? 180 : -180, -89]));
300
- const f = g.lineIntersect(d, u);
299
+ ])) : (a = g.greatCircle(d[0], d[1]), u = g.greatCircle([c > 0 ? 180 : -180, 89], [c > 0 ? 180 : -180, -89]));
300
+ const f = g.lineIntersect(a, u);
301
301
  let h;
302
302
  if (f.features.length) {
303
- const P = g.getCoord(f.features[0]);
304
- h = l.roundPrecision(P[1], 8);
303
+ const S = g.getCoord(f.features[0]);
304
+ h = l.roundPrecision(S[1], 8);
305
305
  } else
306
306
  h = t[r].lat;
307
307
  c > 0 ? (n.push([180 - 1e-6, h]), s.push([...n]), n = [], n.push([-(180 - 1e-6), h])) : (n.push([-(180 - 1e-6), h]), s.push([...n]), n = [], n.push([180 - 1e-6, h]));
@@ -366,10 +366,10 @@ class S {
366
366
  static mergeCoordinateToRoute(t, e) {
367
367
  t.lng = l.convertToStdLng(t.lng, 8);
368
368
  let n = Number.MAX_VALUE, s = 0, o = 0, i, r;
369
- return e.forEach((c, a) => {
370
- for (let d = 0; d < c.length - 1; d++) {
371
- const u = { lng: c[d][0], lat: c[d][1] }, f = { lng: c[d + 1][0], lat: c[d + 1][1] }, h = this.calculatePointToLineDistance(t, u, f);
372
- n > h && (n = h, o = d, s = a, i = this.calculateDistance(u, t), r = this.calculateDistance(f, t));
369
+ return e.forEach((c, d) => {
370
+ for (let a = 0; a < c.length - 1; a++) {
371
+ const u = { lng: c[a][0], lat: c[a][1] }, f = { lng: c[a + 1][0], lat: c[a + 1][1] }, h = this.calculatePointToLineDistance(t, u, f);
372
+ n > h && (n = h, o = a, s = d, i = this.calculateDistance(u, t), r = this.calculateDistance(f, t));
373
373
  }
374
374
  }), i !== 0 && r !== 0 ? e[s].splice(o + 1, 0, [t.lng, t.lat]) : i === 0 ? e[s].splice(o, 1, [t.lng, t.lat]) : r === 0 && e[s].splice(o + 1, 1, [t.lng, t.lat]), e;
375
375
  }
@@ -380,8 +380,8 @@ class S {
380
380
  */
381
381
  static appendCoordinateToRoute(t, e) {
382
382
  t.lng = l.convertToStdLng(t.lng, 8);
383
- const n = S.convertRouteToCoordinates(e);
384
- return n.push(t), S.divideAccordingToLng(n);
383
+ const n = T.convertRouteToCoordinates(e);
384
+ return n.push(t), T.divideAccordingToLng(n);
385
385
  }
386
386
  /**
387
387
  * 向route头加1个坐标
@@ -389,8 +389,8 @@ class S {
389
389
  * @param route
390
390
  */
391
391
  static unshiftCoordinateToRoute(t, e) {
392
- const n = S.convertRouteToCoordinates(e);
393
- return n.unshift(t), S.divideAccordingToLng(n);
392
+ const n = T.convertRouteToCoordinates(e);
393
+ return n.unshift(t), T.divideAccordingToLng(n);
394
394
  }
395
395
  /**
396
396
  * 合并多个waypoints进航线
@@ -437,11 +437,11 @@ class S {
437
437
  */
438
438
  static calculateRangeWaypoints(t, e, n, s = []) {
439
439
  const o = this.convertRouteToCoordinates(n, 0), i = this.mergeCoordinatesToWaypoints([t, e, ...s], o), r = i.findIndex(
440
- (d) => l.roundPrecision(t.lng, 8) === l.roundPrecision(d.lng, 8) && l.roundPrecision(t.lat, 8) === l.roundPrecision(d.lat, 8)
440
+ (a) => l.roundPrecision(t.lng, 8) === l.roundPrecision(a.lng, 8) && l.roundPrecision(t.lat, 8) === l.roundPrecision(a.lat, 8)
441
441
  ), c = i.findIndex(
442
- (d) => l.roundPrecision(e.lng, 8) === l.roundPrecision(d.lng, 8) && l.roundPrecision(e.lat, 8) === l.roundPrecision(d.lat, 8)
442
+ (a) => l.roundPrecision(e.lng, 8) === l.roundPrecision(a.lng, 8) && l.roundPrecision(e.lat, 8) === l.roundPrecision(a.lat, 8)
443
443
  );
444
- return i.filter((d, u) => u >= r && u <= c);
444
+ return i.filter((a, u) => u >= r && u <= c);
445
445
  }
446
446
  /**
447
447
  * 计算坐标到航路上的最短距离
@@ -452,7 +452,7 @@ class S {
452
452
  let n = Number.MAX_VALUE, s = 0, o = 0;
453
453
  return e.forEach((i, r) => {
454
454
  for (let c = 0; c < i.length - 1; c++) {
455
- const a = { lng: i[c][0], lat: i[c][1] }, d = { lng: i[c + 1][0], lat: i[c + 1][1] }, u = this.calculatePointToLineDistance(t, a, d);
455
+ const d = { lng: i[c][0], lat: i[c][1] }, a = { lng: i[c + 1][0], lat: i[c + 1][1] }, u = this.calculatePointToLineDistance(t, d, a);
456
456
  n > u && (n = u, s = c, o = r);
457
457
  }
458
458
  }), { minDist: n, segIndex: o, minIndex: s };
@@ -464,20 +464,22 @@ class S {
464
464
  * @return [[[lng, lat]]]
465
465
  */
466
466
  static calculateSubRoute(t, e) {
467
- const { segIndex: n, minIndex: s } = this.calculateMinDistanceToRoute({ ...t }, e);
467
+ const n = T.convertRouteToCoordinates(e);
468
+ T.mergeCoordinateToWaypoints(t, n, !0), e = T.divideAccordingToLng(n);
469
+ const { segIndex: s, minIndex: o } = this.calculateMinDistanceToRoute({ ...t }, e);
468
470
  t.lng = l.convertToStdLng(t.lng);
469
- const o = [];
470
- let i = !0;
471
- for (let r = n; r < e.length; r++)
472
- if (i) {
473
- const c = [];
474
- c.push([t.lng, t.lat]);
475
- for (let a = s + 1; a < e[r].length; a++)
476
- t.lng === e[r][a][0] && t.lat === e[r][a][1] || c.push(e[r][a]);
477
- o.push(c), i = !1;
471
+ const i = [];
472
+ let r = !0;
473
+ for (let c = s; c < e.length; c++)
474
+ if (r) {
475
+ const d = [];
476
+ d.push([t.lng, t.lat]);
477
+ for (let a = o + 1; a < e[c].length; a++)
478
+ t.lng === e[c][a][0] && t.lat === e[c][a][1] || d.push(e[c][a]);
479
+ i.push(d), r = !1;
478
480
  } else
479
- o.push([...e[r]]);
480
- return o;
481
+ i.push([...e[c]]);
482
+ return i;
481
483
  }
482
484
  /**
483
485
  * 计算子途经点
@@ -492,9 +494,9 @@ class S {
492
494
  if (this.calculateDistance(t, r) === 0)
493
495
  return e;
494
496
  if (this.calculateDistance(t, c) === 0)
495
- return e.filter((d, u) => u > 0);
496
- const a = this.calculatePointToLineDistance(t, r, c);
497
- n > a && (n = a, s = i);
497
+ return e.filter((a, u) => u > 0);
498
+ const d = this.calculatePointToLineDistance(t, r, c);
499
+ n > d && (n = d, s = i);
498
500
  }
499
501
  t.lng = l.convertToStdLng(t.lng);
500
502
  const o = [t];
@@ -558,8 +560,8 @@ class S {
558
560
  t.lng = l.convertToStdLng(t.lng, 8);
559
561
  let s = Number.MAX_VALUE, o = 0, i = 0, r = 0;
560
562
  for (let c = 0; c < e.length - 1; c++) {
561
- const a = { lng: e[c].lng, lat: e[c].lat }, d = { lng: e[c + 1].lng, lat: e[c + 1].lat }, u = this.calculatePointToLineDistance(t, a, d);
562
- s >= u && (s = u, o = c, i = this.calculateDistance(a, t, !1, 6), r = this.calculateDistance(d, t, !1, 6));
563
+ const d = { lng: e[c].lng, lat: e[c].lat }, a = { lng: e[c + 1].lng, lat: e[c + 1].lat }, u = this.calculatePointToLineDistance(t, d, a);
564
+ s >= u && (s = u, o = c, i = this.calculateDistance(d, t, !1, 6), r = this.calculateDistance(a, t, !1, 6));
563
565
  }
564
566
  return i !== 0 && r !== 0 ? i < s || i === s && o === 0 ? e.unshift(t) : r < s || r === s && o === e.length - 2 ? e.push(t) : e.splice(o + 1, 0, t) : i === 0 ? n && e.splice(o, 1, t) : r === 0 && n && e.splice(o + 1, 1, t), e.map((c) => (c.lng = l.convertToStdLng(c.lng), c));
565
567
  }
@@ -586,7 +588,7 @@ class S {
586
588
  * @param route [[[lng, lat]]]
587
589
  */
588
590
  static nearestCoordinateInRoute(t, e) {
589
- const n = g.point([t.lng, t.lat]), o = this.convertRouteToCoordinates(e).map((a) => [a.lng, a.lat]), i = g.lineString(o), r = g.nearestPointOnLine(i, n), c = g.getCoord(r);
591
+ const n = g.point([t.lng, t.lat]), o = this.convertRouteToCoordinates(e).map((d) => [d.lng, d.lat]), i = g.lineString(o), r = g.nearestPointOnLine(i, n), c = g.getCoord(r);
590
592
  return { lng: l.roundPrecision(c[0], 8), lat: l.roundPrecision(c[1], 8) };
591
593
  }
592
594
  /**
@@ -621,8 +623,8 @@ class S {
621
623
  static calculateNextCoordinateAlongRoute(t, e, n, s = "nauticalmiles") {
622
624
  var f;
623
625
  const o = t.speed || 12, i = [];
624
- let r = [], c = !1, a = 0, d = 0, u;
625
- if (e && n.length ? (i.push(t), n.forEach((h, P) => {
626
+ let r = [], c = !1, d = 0, a = 0, u;
627
+ if (e && n.length ? (i.push(t), n.forEach((h, S) => {
626
628
  if (c)
627
629
  r.push(h);
628
630
  else {
@@ -633,23 +635,23 @@ class S {
633
635
  m.push(h[M]);
634
636
  else {
635
637
  v = { lng: h[M][0], lat: h[M][1] };
636
- const D = this.calculateDistance(t, v, !0, 8, s);
637
- if (a += D, a < e)
638
- d += D, i.push(v), t = v;
638
+ const y = this.calculateDistance(t, v, !0, 8, s);
639
+ if (d += y, d < e)
640
+ a += y, i.push(v), t = v;
639
641
  else {
640
- if (d = e, a === e)
642
+ if (a = e, d === e)
641
643
  u = v, m.push([u.lng, u.lat]);
642
644
  else {
643
- const T = a - e, p = this.calculateBearing(v, t);
644
- u = this.calculateCoordinate(v, p, T, s), m.push([u.lng, u.lat]), m.push([v.lng, v.lat]);
645
+ const D = d - e, R = this.calculateBearing(v, t);
646
+ u = this.calculateCoordinate(v, R, D, s), m.push([u.lng, u.lat]), m.push([v.lng, v.lat]);
645
647
  }
646
648
  c = !0;
647
649
  }
648
650
  }
649
- m.length && r.push(m), P === n.length - 1 && !u && (u = v);
651
+ m.length && r.push(m), S === n.length - 1 && !u && (u = v);
650
652
  }
651
653
  })) : (r = n, u = { ...t }), u)
652
- if (i.push(u), u.distanceFromPrevious = d, u.hourFromPrevious = Math.round(d / o * 1e4) / 1e4, ((f = r[0]) == null ? void 0 : f.length) > 1) {
654
+ if (i.push(u), u.distanceFromPrevious = a, u.hourFromPrevious = Math.round(a / o * 1e4) / 1e4, ((f = r[0]) == null ? void 0 : f.length) > 1) {
653
655
  const h = { lng: r[0][1][0], lat: r[0][1][1] };
654
656
  u.bearing = this.calculateBearing(u, h);
655
657
  } else
@@ -666,7 +668,7 @@ class S {
666
668
  const s = l.convertToStdLng(t.lng, 6), o = g.point([s, t.lat]), i = l.convertToStdLng(e.lng, 6), r = l.convertToStdLng(n.lng, 6), c = g.lineString([
667
669
  [i, e.lat],
668
670
  [r, n.lat]
669
- ]), a = g.nearestPointOnLine(c, o), d = g.getCoord(a), u = l.roundPrecision(d[0], 6), f = l.roundPrecision(d[1], 6);
671
+ ]), d = g.nearestPointOnLine(c, o), a = g.getCoord(d), u = l.roundPrecision(a[0], 6), f = l.roundPrecision(a[1], 6);
670
672
  return { lng: u, lat: f, inline: !(u === i && f === e.lat) && !(u === r && f === n.lat) };
671
673
  }
672
674
  /**
@@ -685,8 +687,8 @@ class S {
685
687
  else if (o.bearing === void 0)
686
688
  o.bearing = this.calculateBearing(o, c, !0);
687
689
  else {
688
- const a = this.calculateDistance(s, c, !0);
689
- a && a >= e && (s.bearing = this.calculateBearing(s, c, !0), n.push(s), o = s);
690
+ const d = this.calculateDistance(s, c, !0);
691
+ d && d >= e && (s.bearing = this.calculateBearing(s, c, !0), n.push(s), o = s);
690
692
  }
691
693
  s = c;
692
694
  });
@@ -714,9 +716,9 @@ class S {
714
716
  for (let s = 1; s < e.length; s++) {
715
717
  const o = e[s - 1], i = e[s];
716
718
  if (i.gcToPrevious) {
717
- const r = t.findIndex((a) => a.lng === o.lng && a.lat === o.lat), c = t.findIndex((a) => a.lng === i.lng && a.lat === i.lat);
718
- for (let a = c - 1; a > r; a--)
719
- t.splice(a, 1);
719
+ const r = t.findIndex((d) => d.lng === o.lng && d.lat === o.lat), c = t.findIndex((d) => d.lng === i.lng && d.lat === i.lat);
720
+ for (let d = c - 1; d > r; d--)
721
+ t.splice(d, 1);
720
722
  }
721
723
  }
722
724
  let n = 0;
@@ -770,13 +772,13 @@ class S {
770
772
  return this.calculateBBox(e);
771
773
  }
772
774
  }
773
- let b;
775
+ let P;
774
776
  try {
775
- b = O.getLogger("vessel");
777
+ P = B.getLogger("vessel");
776
778
  } catch {
777
779
  } finally {
778
780
  }
779
- class q {
781
+ class Z {
780
782
  /**
781
783
  * 将原始数据转换为geojson
782
784
  * @param raw
@@ -788,56 +790,56 @@ class q {
788
790
  if (s.forecasts) {
789
791
  const o = (n = s.history) == null ? void 0 : n[0];
790
792
  for (const i of s.forecasts) {
791
- const r = [], c = R(i.date).utc(), a = `${s.name}-${i.model}`;
793
+ const r = [], c = x(i.date).utc(), d = `${s.name}-${i.model}`;
792
794
  if (o) {
793
- const d = R(o.updated).utc(), u = g.point([o.lng, o.lat], {
795
+ const a = x(o.updated).utc(), u = g.point([o.lng, o.lat], {
794
796
  model: i.model,
795
797
  name: s.name,
796
- date: d.format(),
798
+ date: a.format(),
797
799
  hour: 0,
798
- format: d.format("MMM-DD/HHmm[Z]"),
800
+ format: a.format("MMM-DD/HHmm[Z]"),
799
801
  pressure: o.pressure > 1e4 ? l.roundPrecision(o.pressure / 100, 0) : l.roundPrecision(o.pressure, 0),
800
802
  wind: { kts: o.kts, spd: o.speed || o.spd },
801
- category: a,
803
+ category: d,
802
804
  type: "forecast"
803
805
  });
804
806
  e.features.push(u), r.push(u.geometry.coordinates);
805
807
  }
806
- for (const d in i == null ? void 0 : i.hours) {
807
- const u = i.hours[d];
808
+ for (const a in i == null ? void 0 : i.hours) {
809
+ const u = i.hours[a];
808
810
  u.wind.spd = u.wind.spd || u.wind.speed;
809
- const f = c.clone().add(Number(d), "hour"), h = g.point([u.lng, u.lat], {
811
+ const f = c.clone().add(Number(a), "hour"), h = g.point([u.lng, u.lat], {
810
812
  model: i.model,
811
813
  name: s.name,
812
814
  date: f.format(),
813
- hour: Number(d),
815
+ hour: Number(a),
814
816
  format: f.format("MMM-DD/HHmm[Z]"),
815
817
  pressure: u.pressure > 1e4 ? l.roundPrecision(u.pressure / 100, 0) : l.roundPrecision(u.pressure, 0),
816
818
  gusts: u.gusts,
817
819
  wind: u.wind || {},
818
820
  movement: u.movement,
819
- category: a,
821
+ category: d,
820
822
  type: "forecast"
821
823
  });
822
824
  e.features.push(h), r.push(h.geometry.coordinates);
823
825
  }
824
826
  if ((r == null ? void 0 : r.length) > 1) {
825
- const d = g.lineString(l.convertToMonotonicLng2(r), {
827
+ const a = g.lineString(l.convertToMonotonicLng2(r), {
826
828
  date: i.date,
827
829
  id: s.id || s.name,
828
830
  model: i.model,
829
831
  name: s.name,
830
- category: a,
832
+ category: d,
831
833
  type: "forecast"
832
834
  });
833
- e.features.push(d);
835
+ e.features.push(a);
834
836
  }
835
837
  }
836
838
  }
837
839
  if (s.history) {
838
840
  const o = [];
839
841
  for (const r of s.history) {
840
- const c = R(r.updated).utc(), a = g.point([r.lng, r.lat], {
842
+ const c = x(r.updated).utc(), d = g.point([r.lng, r.lat], {
841
843
  name: s.name,
842
844
  date: c.format(),
843
845
  format: c.format("MMM-DD/HHmm[Z]"),
@@ -847,9 +849,10 @@ class q {
847
849
  source: r.source,
848
850
  level: r.type,
849
851
  type: "history",
850
- category: `${s.name}-history`
852
+ category: `${s.name}-history`,
853
+ wind: r.wind
851
854
  });
852
- e.features.push(a), o.push(a.geometry.coordinates);
855
+ e.features.push(d), o.push(d.geometry.coordinates);
853
856
  }
854
857
  const i = s.history[0];
855
858
  if (o.length === 1 && o.push(o[0]), o.length > 1) {
@@ -875,35 +878,35 @@ class q {
875
878
  * @param step
876
879
  */
877
880
  static interpolate(t, e = 3) {
878
- var o, i, r, c;
881
+ var o, i, r, c, d;
879
882
  const n = (o = t == null ? void 0 : t.data) == null ? void 0 : o.features.filter((a) => a.geometry.type === "LineString" && a.properties.type === "forecast"), s = [];
880
883
  for (const a of n) {
881
- const d = a.properties.name, u = a.properties.model, f = a.properties.showCircle, h = a.properties.disabled, P = R(a.properties.date).utc();
882
- let m = e * 60 - (P.get("hour") * 60 + P.get("minute")) % (e * 60);
883
- const v = (i = t == null ? void 0 : t.data) == null ? void 0 : i.features.filter(
884
- (T) => T.geometry.type === "Point" && T.properties.type === "forecast" && T.properties.category === `${d}-${u}`
885
- );
886
- let M, D = P.clone().add(m, "minute").set({ minute: 0, second: 0, millisecond: 0 });
887
- for (; M = this.pickIndex(v, D), M <= v.length - 1; ) {
888
- if (M > 0) {
889
- const T = v[M], p = M === 0 ? void 0 : v[M - 1], N = (m / 60 - ((r = p == null ? void 0 : p.properties) == null ? void 0 : r.hour)) / (T.properties.hour - ((c = p == null ? void 0 : p.properties) == null ? void 0 : c.hour)), I = this.computeNumber(p == null ? void 0 : p.geometry.coordinates[0], T.geometry.coordinates[0], N), $ = this.computeNumber(p == null ? void 0 : p.geometry.coordinates[1], T.geometry.coordinates[1], N), W = g.point([I, $], {
890
- name: d,
891
- model: u,
892
- category: T == null ? void 0 : T.properties.category,
893
- date: D.format(),
894
- format: D.format("MMM-DD/HHmm[Z]"),
895
- gusts: this.computeNumber(p == null ? void 0 : p.properties.gusts, T.properties.gusts, N),
896
- hour: this.computeNumber(p == null ? void 0 : p.properties.hour, T.properties.hour, N),
897
- movement: this.computeNumber(p == null ? void 0 : p.properties.movement, T.properties.movement, N),
898
- pressure: this.computeNumber(p == null ? void 0 : p.properties.pressure, T.properties.pressure, N),
899
- wind: this.computeNumber(p == null ? void 0 : p.properties.wind, T.properties.wind, N),
884
+ const u = a.properties.name, f = a.properties.model, h = a.properties.showCircle, S = a.properties.disabled, m = x(a.properties.date).utc();
885
+ let v = e * 60 - (m.get("hour") * 60 + m.get("minute")) % (e * 60);
886
+ const M = (i = t == null ? void 0 : t.data) == null ? void 0 : i.features.filter(
887
+ (b) => b.geometry.type === "Point" && b.properties.type === "forecast" && b.properties.category === `${u}-${f}`
888
+ ), y = (r = t == null ? void 0 : t.data) == null ? void 0 : r.features.filter((b) => b.geometry.type === "Point" && b.properties.type === "history" && b.properties.category === `${u}-history`);
889
+ let D, R = m.clone().add(v, "minute").set({ minute: 0, second: 0, millisecond: 0 });
890
+ for (; D = this.pickIndex(M, R), D <= M.length - 1; ) {
891
+ if (D > 0) {
892
+ const b = M[D], p = D === 0 ? y == null ? void 0 : y[0] : M[D - 1], N = (v / 60 - ((c = p == null ? void 0 : p.properties) == null ? void 0 : c.hour)) / (b.properties.hour - ((d = p == null ? void 0 : p.properties) == null ? void 0 : d.hour)), W = this.computeNumber(p == null ? void 0 : p.geometry.coordinates[0], b.geometry.coordinates[0], N), A = this.computeNumber(p == null ? void 0 : p.geometry.coordinates[1], b.geometry.coordinates[1], N), E = g.point([W, A], {
893
+ name: u,
894
+ model: f,
895
+ category: b == null ? void 0 : b.properties.category,
896
+ date: R.format(),
897
+ format: R.format("MMM-DD/HHmm[Z]"),
898
+ gusts: this.computeNumber(p == null ? void 0 : p.properties.gusts, b.properties.gusts, N),
899
+ hour: this.computeNumber(p == null ? void 0 : p.properties.hour, b.properties.hour, N),
900
+ movement: this.computeNumber(p == null ? void 0 : p.properties.movement, b.properties.movement, N),
901
+ pressure: this.computeNumber(p == null ? void 0 : p.properties.pressure, b.properties.pressure, N),
902
+ wind: this.computeNumber(p == null ? void 0 : p.properties.wind, b.properties.wind, N),
900
903
  type: "forecast",
901
- disabled: h,
902
- showCircle: f
904
+ disabled: S,
905
+ showCircle: h
903
906
  });
904
- s.push(W);
907
+ s.push(E);
905
908
  }
906
- m += e * 60, D = P.clone().add(m, "minute").set({ minute: 0, second: 0, millisecond: 0 });
909
+ v += e * 60, R = m.clone().add(v, "minute").set({ minute: 0, second: 0, millisecond: 0 });
907
910
  }
908
911
  }
909
912
  return s;
@@ -933,26 +936,26 @@ class q {
933
936
  const { t1: o, t2: i, hr: r, hours: c } = this.tropicalCenterTwin(e, 24, s);
934
937
  if (o && i) {
935
938
  if (!s.debug) {
936
- const P = S.calculateDistance(t, o), m = S.calculateDistance(t, i);
937
- if (P > 2 * n && m > 2 * n)
938
- return b == null || b.info("[%s] the distance between from and t1(%d) and t2(%d) is enough, no need diversion: %j", s.requestId, P, m, {
939
+ const S = T.calculateDistance(t, o), m = T.calculateDistance(t, i);
940
+ if (S > 2 * n && m > 2 * n)
941
+ return P == null || P.info("[%s] the distance between from and t1(%d) and t2(%d) is enough, no need diversion: %j", s.requestId, S, m, {
939
942
  from: t,
940
943
  t1: o,
941
944
  t2: i,
942
945
  hr: r
943
946
  }), {};
944
947
  }
945
- const a = S.calculateBearing(t, o), d = S.calculateBearing(o, i), u = Math.abs(a - d);
948
+ const d = T.calculateBearing(t, o), a = T.calculateBearing(o, i), u = Math.abs(d - a);
946
949
  let f = 0;
947
950
  u < 180 ? f = u + 90 : u >= 180 && (f = u - 90);
948
- const h = S.calculateCoordinate(o, f, n);
949
- return b == null || b.info("[%s] the right tangent position: %j", s.requestId, {
951
+ const h = T.calculateCoordinate(o, f, n);
952
+ return P == null || P.info("[%s] the right tangent position: %j", s.requestId, {
950
953
  from: t,
951
954
  t1: o,
952
955
  t2: i,
953
956
  radius: n,
954
- bearing1: a,
955
- bearing2: d,
957
+ bearing1: d,
958
+ bearing2: a,
956
959
  right: h
957
960
  }), { at: h, t1: o, t2: i, hr: Number(r), hours: c };
958
961
  }
@@ -972,19 +975,19 @@ class q {
972
975
  const { t1: o, t2: i, hr: r, hours: c } = this.tropicalCenterTwin(e, 24, s);
973
976
  if (o && i) {
974
977
  if (!s.debug) {
975
- const h = S.calculateDistance(t, o), P = S.calculateDistance(t, i);
976
- if (h > 2 * n && P > 2 * n)
977
- return b == null || b.info("[%s] the distance between from and t1(%d) and t2(%d) is enough, no need drifting: %j", s.requestId, h, P, {
978
+ const h = T.calculateDistance(t, o), S = T.calculateDistance(t, i);
979
+ if (h > 2 * n && S > 2 * n)
980
+ return P == null || P.info("[%s] the distance between from and t1(%d) and t2(%d) is enough, no need drifting: %j", s.requestId, h, S, {
978
981
  from: t,
979
982
  t1: o,
980
983
  t2: i,
981
984
  hr: r
982
985
  }), {};
983
986
  }
984
- const a = S.calculateBearing(t, o), d = S.calculateBearing(o, i), u = S.calculateDistance(t, o);
985
- return { at: S.calculateCoordinate(o, a - d + 180, n < u ? n : u), t1: o, t2: i, hr: Number(r), hours: c };
987
+ const d = T.calculateBearing(t, o), a = T.calculateBearing(o, i), u = T.calculateDistance(t, o);
988
+ return { at: T.calculateCoordinate(o, d - a + 180, n < u ? n : u), t1: o, t2: i, hr: Number(r), hours: c };
986
989
  } else
987
- return b == null || b.info("[%s] no need drift: %j", s.requestId, { from: t, t1: o, t2: i, hr: r }), {};
990
+ return P == null || P.info("[%s] no need drift: %j", s.requestId, { from: t, t1: o, t2: i, hr: r }), {};
988
991
  }
989
992
  /**
990
993
  * 获取台风中心点对
@@ -995,26 +998,26 @@ class q {
995
998
  * @private
996
999
  */
997
1000
  static tropicalCenterTwin(t, e = 24, n = {}) {
998
- var d, u, f, h, P;
1001
+ var a, u, f, h, S;
999
1002
  let s = {};
1000
- (d = t.forecasts) == null || d.forEach((m) => {
1003
+ (a = t.forecasts) == null || a.forEach((m) => {
1001
1004
  s = { ...m.hours, ...s };
1002
1005
  });
1003
1006
  const o = ((u = t == null ? void 0 : t.history) == null ? void 0 : u[0]) || (s == null ? void 0 : s[(f = Object.keys(s)) == null ? void 0 : f[0]]);
1004
- b == null || b.info("[%s] the first tropical center: %j", n.requestId, o);
1007
+ P == null || P.info("[%s] the first tropical center: %j", n.requestId, o);
1005
1008
  let i = (h = Object.keys(s || {}).filter((m) => Number(m) <= (e < 0 ? 24 : e))) == null ? void 0 : h.at(-1);
1006
- i || (i = (P = Object.keys(s || {}).filter((m) => Number(m) <= (e < 0 ? 24 : 2 * e))) == null ? void 0 : P.at(-1));
1009
+ i || (i = (S = Object.keys(s || {}).filter((m) => Number(m) <= (e < 0 ? 24 : 2 * e))) == null ? void 0 : S.at(-1));
1007
1010
  const r = s == null ? void 0 : s[i || -1];
1008
- b == null || b.info("[%s] the second tropical center: %j in %d hrs", n.requestId, r, i);
1009
- const c = Object.keys(s || {}).filter((m) => Number(m) <= Number(i)), a = { 0: o };
1011
+ P == null || P.info("[%s] the second tropical center: %j in %d hrs", n.requestId, r, i);
1012
+ const c = Object.keys(s || {}).filter((m) => Number(m) <= Number(i)), d = { 0: o };
1010
1013
  for (const m of c)
1011
- a[m] = s[m];
1012
- return { t1: o, t2: r, hr: Number(i), hours: a };
1014
+ d[m] = s[m];
1015
+ return { t1: o, t2: r, hr: Number(i), hours: d };
1013
1016
  }
1014
1017
  static pickIndex(t, e) {
1015
1018
  let n = 0;
1016
1019
  for (const s of t) {
1017
- if (R(s.properties.date).isAfter(e))
1020
+ if (x(s.properties.date).isAfter(e))
1018
1021
  return n === 0 ? -1 : n;
1019
1022
  n++;
1020
1023
  }
@@ -1037,7 +1040,7 @@ class q {
1037
1040
  }
1038
1041
  }
1039
1042
  export {
1040
- S as LaneHelper,
1043
+ T as LaneHelper,
1041
1044
  l as LngLatHelper,
1042
- q as TropicalHelper
1045
+ Z as TropicalHelper
1043
1046
  };
@@ -1 +1 @@
1
- (function(M,I){typeof exports=="object"&&typeof module<"u"?I(exports,require("@turf/turf"),require("moment"),require("moment-timezone"),require("tz-lookup")):typeof define=="function"&&define.amd?define(["exports","@turf/turf","moment","moment-timezone","tz-lookup"],I):(M=typeof globalThis<"u"?globalThis:M||self,I(M["idm-plugin-rabbitmq"]={},M["@turf/turf"],M.moment,M["moment-timezone"],M["tz-lookup"]))})(this,function(M,I,R,q,j){"use strict";function k(P){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(P){for(const t in P)if(t!=="default"){const n=Object.getOwnPropertyDescriptor(P,t);Object.defineProperty(e,t,n.get?n:{enumerable:!0,get:()=>P[t]})}}return e.default=P,Object.freeze(e)}const g=k(I);function L(P){return P&&P.__esModule&&Object.prototype.hasOwnProperty.call(P,"default")?P.default:P}class x{log(){}isLevelEnabled(){return!1}addContext(){}removeContext(){}clearContext(){}}["Trace","Debug","Info","Warn","Error","Fatal","Mark"].forEach(P=>{x.prototype[P.toLowerCase()]=()=>{},x.prototype[`is${P}Enabled`]=()=>!1});const $=(()=>{try{return require("log4js")}catch{return null}})();var O={getLogger:$?$.getLogger:()=>new x};const W=L(O);class l{static guessTimeZoneOffset(e,t){const n=j(t,e),s=R().tz(n).utcOffset();return this.roundPrecision(s/60,1)}static prettyTimeZoneOffset(e){let t=Math.floor(Math.abs(e)),n=Math.round((Math.abs(e)-t)*60);return n=n>9?n:`0${n}`,t=t>9?t:`0${t}`,e>0?`+${t}:${n}`:`-${t}:${n}`}static lng2pretty(e,t=6,n="H°M′"){e=l.convertToStdLng(e,t);let s="E";e<0&&(s="W"),e=Math.abs(e),n=n.toUpperCase();let o=e*3600,i,r,c,a,d,u;i=o%3600%60,n.indexOf("S")!==-1&&(o=o-i,r=l.padNumber(i,2,2)),c=o/60%60,n.indexOf("M")!==-1&&(n.indexOf("S")!==-1?a=l.roundPrecision(c,t).toString().padStart(2,"0"):a=l.padNumber(c,2,2),o=o-c*60),d=o/3600,n.indexOf("M")!==-1?u=l.roundPrecision(d,t).toString().padStart(3,"0"):u=l.padNumber(d,3,2);const h=`${n.replace(/S+/gi,r).replace(/M+/gi,a).replace(/H+/gi,u)}${s}`;return{direction:s,degree:l.roundPrecision(d,t),minute:l.roundPrecision(c,t),second:l.roundPrecision(i,t),pretty:h}}static lat2pretty(e,t=6,n="H°M′"){e=e%180;let s="N";e<0&&(s="S"),e=Math.abs(e),n=n.toUpperCase();let o=e*3600,i,r,c,a,d,u;i=o%3600%60,n.indexOf("S")!==-1&&(o=o-i,r=l.padNumber(i,2,2)),c=o/60%60,n.indexOf("M")!==-1&&(n.indexOf("S")!==-1?a=l.roundPrecision(c,t).toString().padStart(2,"0"):a=l.padNumber(c,2,2),o=o-c*60),d=o/3600,n.indexOf("M")!==-1?u=l.roundPrecision(d,t).toString().padStart(2,"0"):u=l.padNumber(d,2,2);const h=`${n.replace(/S+/gi,r).replace(/M+/gi,a).replace(/H+/gi,u)}${s}`;return{direction:s,degree:l.roundPrecision(d,t),minute:l.roundPrecision(c,t),second:l.roundPrecision(i,t),pretty:h}}static str2Lng(e,t=6){let n;if(isNaN(e)){e=l.strReplace(e,"LNG");const s=e[e.length-1].toUpperCase();e=e.substring(0,e.length-1).trim();const o=e.split(" ").filter(c=>c!=="").map(c=>Number(c));let[i,r]=o;if(r=r>60?r/Math.pow(10,String(r).length-2):r,i>360&&!r){const c=this.roundPrecision(i/100,0);r=i-c*100,i=c}n=i+(r??0)/60,s==="W"&&(n=n*-1)}else n=Number(e);return l.convertToStdLng(n,t)}static str2Lat(e,t=6){let n;if(isNaN(e)){e=l.strReplace(e,"LAT");const s=e[e.length-1].toUpperCase();e=e.substring(0,e.length-1).trim();const o=e.split(" ").filter(c=>c!=="").map(c=>Number(c));let[i,r]=o;if(r=r>60?r/Math.pow(10,String(r).length-2):r,i>90&&!r){const c=this.roundPrecision(i/100,0);r=i-c*100,i=c}n=i+(r??0)/60,s==="S"&&(n=n*-1)}else n=Number(e);return l.roundPrecision(n,t)}static str2LngOrLat(e,t=6,n="LAT"){e=l.strReplace(e,n);const s=e[e.length-1].toUpperCase();return["N","S"].includes(s)?{lat:l.str2Lat(e,t)}:{lng:l.str2Lng(e,t)}}static convertToStdLng(e,t=6){return e>180?(e=e%360,e=e>180?e-360:e):e<-180&&(e=e%360,e=e<-180?e+360:e),l.roundPrecision(e,t)}static roundPrecision(e,t=4){if(typeof e=="number"){const n=Number("1".padEnd(t+1,"0"));return Math.round(e*n)/n}return e}static convertToMonotonicLng2(e){for(let t=1;t<e.length;t++)e[t][0]+=Math.round((e[t-1][0]-e[t][0])/360)*360;return e}static convertToMonotonicLng(e){for(let t=1;t<e.length;t++)e[t].lng+=Math.round((e[t-1].lng-e[t].lng)/360)*360;return e}static strReplace(e,t="LAT"){e=e.replace(/([0-9]+)\.([0-9]+\.[0-9]+)/g,"$1 $2").replace(/-/g," ").replace(/°/," ").replace(/'/g," ").replace(/′/g," ").replace(/"/g," ").replace(/∼/g," ").replace(/°/g," ").replace(/,/g,".").replace(/^ /g,"").replace(/ $/g,"").trim();const n=e[e.length-1].toUpperCase();if(!["N","S","E","W"].includes(n)){const s=e,o=Number(s.split(" ")[0]);if(isNaN(o))throw new Error(`invalid Lat/Lng: ${e}`);o>=90?e=`${s}E`:o<=-90?e=`${s}W`:["LAN","LNG"].includes(t==null?void 0:t.toUpperCase())?e=`${s}${o>0?"E":"W"}`:e=`${s}${o>0?"N":"S"}`}return e}static padNumber(e,t=2,n=2){const s=Math.trunc(e).toString().padStart(t,"0"),o=Math.trunc(l.roundPrecision(e-Math.trunc(e),n)*Math.pow(10,n)).toString().padStart(n,"0");return`${s}.${o}`}}class T{static calculateBearing(e,t,n=!0,s=4){const o=g.points([[e.lng,e.lat],[t.lng,t.lat]]);let i;return n?i=g.rhumbBearing(o.features[0],o.features[1]):i=g.bearing(o.features[0],o.features[1]),i<0&&(i+=360),l.roundPrecision(i,s)}static calculateDistance(e,t,n=!0,s=4,o="nauticalmiles"){e={...e},t={...t},e.lng=l.convertToStdLng(e.lng,s),t.lng=l.convertToStdLng(t.lng,s);const i=g.points([[e.lng,e.lat],[t.lng,t.lat]]);let r;return n?r=g.rhumbDistance(i.features[0],i.features[1],{units:o}):r=g.distance(i.features[0],i.features[1],{units:o}),l.roundPrecision(r,s)}static calculateRouteDistance(e,t=4,n="nauticalmiles"){let s=0,o;for(const i of e)for(let r=0;r<i.length-1;r++){const c={lng:i[r][0],lat:i[r][1]};r===0&&o&&(s+=this.calculateDistance(o,c,!0,t,n));const a={lng:i[r+1][0],lat:i[r+1][1]};s+=this.calculateDistance(c,a,!0,t,n),o=a}return l.roundPrecision(s,t)}static calculateCoordinate(e,t,n,s="nauticalmiles",o=!0){const i=g.point([e.lng,e.lat]);let r;o?r=g.rhumbDestination(i,n,t,{units:s}):r=g.destination(i,n,t,{units:s});const c=r.geometry.coordinates;return{lng:l.convertToStdLng(c[0],8),lat:l.roundPrecision(c[1],8)}}static interpolateCoordinates(e,t,n,s=!0,o=!0,i="nauticalmiles"){const r=[],c=this.calculateBearing(e,t,!1),a=this.calculateDistance(e,t,!1,8,i);s&&r.push({lng:e.lng,lat:e.lat});let d=0;for(;d<a;)d+=n,d<a&&r.push(this.calculateCoordinate(e,c,d,i,!1));return o&&r.push({lng:t.lng,lat:t.lat}),r}static divideAccordingToLng(e,t=!1){if((e==null?void 0:e.length)<2)return[];e=this.deduplicateCoordinates(e);let n=[];const s=[];let o,i;for(let r=0;r<e.length-1;r++){o=l.convertToStdLng(e[r].lng,8),i=l.convertToStdLng(e[r+1].lng,8),e[r].lat=l.roundPrecision(e[r].lat,8),e[r+1].lat=l.roundPrecision(e[r+1].lat,8),n.push([o,e[r].lat]);const c=o-i;if(Math.abs(c)>180){const a=l.convertToMonotonicLng2([[o,e[r].lat],[i,e[r+1].lat]]);let d,u;t?(d=g.lineString(a),u=g.lineString([[c>0?180:-180,89],[c>0?180:-180,-89]])):(d=g.greatCircle(a[0],a[1]),u=g.greatCircle([c>0?180:-180,89],[c>0?180:-180,-89]));const h=g.lineIntersect(d,u);let f;if(h.features.length){const v=g.getCoord(h.features[0]);f=l.roundPrecision(v[1],8)}else f=e[r].lat;c>0?(n.push([180-1e-6,f]),s.push([...n]),n=[],n.push([-(180-1e-6),f])):(n.push([-(180-1e-6),f]),s.push([...n]),n=[],n.push([180-1e-6,f]))}r===e.length-2&&n.push([i,e[r+1].lat])}return s.push(n),s}static deduplicateRoute(e){const t=[];for(const n of e){const s=n.reduce((o,i)=>(o.findIndex(r=>r[0]===i[0]&&r[1]===i[1])===-1&&o.push(i),o),[]);t.push(s)}return t}static deduplicateCoordinates(e){return e.reduce((t,n)=>(t.findIndex(s=>s.lat===n.lat&&s.lng===n.lng)===-1&&t.push(n),t),[])}static removeCoordinateFromRoute(e,t){e.lng=l.convertToStdLng(e.lng,8);for(const n of t)for(let s=n.length-1;s>=0;s--)l.roundPrecision(n[s][0],8)===e.lng&&l.roundPrecision(n[s][1],8)===l.roundPrecision(e.lat,8)&&n.splice(s,1);return t}static removeCoordinateFromWaypoints(e,t){e.lng=l.convertToStdLng(e.lng,8);for(let n=t.length-1;n>=0;n--)l.roundPrecision(t[n].lng,8)===e.lng&&l.roundPrecision(t[n].lat,8)===l.roundPrecision(e.lat,8)&&t.splice(n,1);return t}static mergeCoordinateToRoute(e,t){e.lng=l.convertToStdLng(e.lng,8);let n=Number.MAX_VALUE,s=0,o=0,i,r;return t.forEach((c,a)=>{for(let d=0;d<c.length-1;d++){const u={lng:c[d][0],lat:c[d][1]},h={lng:c[d+1][0],lat:c[d+1][1]},f=this.calculatePointToLineDistance(e,u,h);n>f&&(n=f,o=d,s=a,i=this.calculateDistance(u,e),r=this.calculateDistance(h,e))}}),i!==0&&r!==0?t[s].splice(o+1,0,[e.lng,e.lat]):i===0?t[s].splice(o,1,[e.lng,e.lat]):r===0&&t[s].splice(o+1,1,[e.lng,e.lat]),t}static appendCoordinateToRoute(e,t){e.lng=l.convertToStdLng(e.lng,8);const n=T.convertRouteToCoordinates(t);return n.push(e),T.divideAccordingToLng(n)}static unshiftCoordinateToRoute(e,t){const n=T.convertRouteToCoordinates(t);return n.unshift(e),T.divideAccordingToLng(n)}static mergeWaypointsToRoute(e,t){for(const n of e)t=this.mergeCoordinateToRoute(n,t);return t}static calculateRangeRoute(e,t,n){n=this.mergeWaypointsToRoute([e,t],n);const s=[];let o=0;return n.forEach(i=>{if(o===2)return;const r=[];for(const c of i){if(l.roundPrecision(t.lng,8)===l.roundPrecision(c[0],8)&&l.roundPrecision(t.lat,8)===l.roundPrecision(c[1],8)){r.push(c),o===0&&r.push([e.lng,e.lat]),o=2;break}o===1?r.push(c):l.roundPrecision(e.lng,8)===l.roundPrecision(c[0],8)&&l.roundPrecision(e.lat,8)===l.roundPrecision(c[1],8)&&(o=1,r.push(c))}r.length&&s.push(r)}),s}static calculateRangeWaypoints(e,t,n,s=[]){const o=this.convertRouteToCoordinates(n,0),i=this.mergeCoordinatesToWaypoints([e,t,...s],o),r=i.findIndex(d=>l.roundPrecision(e.lng,8)===l.roundPrecision(d.lng,8)&&l.roundPrecision(e.lat,8)===l.roundPrecision(d.lat,8)),c=i.findIndex(d=>l.roundPrecision(t.lng,8)===l.roundPrecision(d.lng,8)&&l.roundPrecision(t.lat,8)===l.roundPrecision(d.lat,8));return i.filter((d,u)=>u>=r&&u<=c)}static calculateMinDistanceToRoute(e,t){let n=Number.MAX_VALUE,s=0,o=0;return t.forEach((i,r)=>{for(let c=0;c<i.length-1;c++){const a={lng:i[c][0],lat:i[c][1]},d={lng:i[c+1][0],lat:i[c+1][1]},u=this.calculatePointToLineDistance(e,a,d);n>u&&(n=u,s=c,o=r)}}),{minDist:n,segIndex:o,minIndex:s}}static calculateSubRoute(e,t){const{segIndex:n,minIndex:s}=this.calculateMinDistanceToRoute({...e},t);e.lng=l.convertToStdLng(e.lng);const o=[];let i=!0;for(let r=n;r<t.length;r++)if(i){const c=[];c.push([e.lng,e.lat]);for(let a=s+1;a<t[r].length;a++)e.lng===t[r][a][0]&&e.lat===t[r][a][1]||c.push(t[r][a]);o.push(c),i=!1}else o.push([...t[r]]);return o}static calculateSubWaypoints(e,t){let n=Number.MAX_VALUE,s=0;for(let i=0;i<t.length-1;i++){const r=t[i],c=t[i+1];if(this.calculateDistance(e,r)===0)return t;if(this.calculateDistance(e,c)===0)return t.filter((d,u)=>u>0);const a=this.calculatePointToLineDistance(e,r,c);n>a&&(n=a,s=i)}e.lng=l.convertToStdLng(e.lng);const o=[e];for(let i=s+1;i<t.length;i++)o.push(t[i]);return o}static calculatePointToLineDistance(e,t,n,s={units:"nauticalmiles",method:"geodesic"}){e.lng=l.convertToStdLng(e.lng,8),t={...t},n={...n},t.lng=l.convertToStdLng(t.lng,8),n.lng=l.convertToStdLng(n.lng,8);const o=l.convertToMonotonicLng([t,n]);t=o[0],n=o[1];const i=g.lineString([[t.lng,t.lat],[n.lng,n.lat]]),r=g.pointToLineDistance(g.point([e.lng,e.lat]),i,s),c=g.pointToLineDistance(g.point([e.lng>0?e.lng-360:e.lng+360,e.lat]),i,s);return l.roundPrecision(Math.min(r,c),6)}static calculateWaypointsPropInRoute(e,t){t=this.mergeWaypointsToRoute(e,t);for(let n=0;n<e.length-1;n++){const s=e[n],o=e[n+1],i=this.calculateRangeRoute(s,o,t);n===0&&(s.distanceFromPrevious=0,s.distanceFromStart=0),o.distanceFromPrevious=this.calculateRouteDistance(i),o.distanceFromStart=l.roundPrecision((s.distanceFromStart||0)+o.distanceFromPrevious)}return e}static mergeCoordinatesToWaypoints(e,t,n=!0){for(const s of e)this.mergeCoordinateToWaypoints(s,t,n);return t}static mergeCoordinateToWaypoints(e,t,n=!0){e.lng=l.convertToStdLng(e.lng,8);let s=Number.MAX_VALUE,o=0,i=0,r=0;for(let c=0;c<t.length-1;c++){const a={lng:t[c].lng,lat:t[c].lat},d={lng:t[c+1].lng,lat:t[c+1].lat},u=this.calculatePointToLineDistance(e,a,d);s>=u&&(s=u,o=c,i=this.calculateDistance(a,e,!1,6),r=this.calculateDistance(d,e,!1,6))}return i!==0&&r!==0?i<s||i===s&&o===0?t.unshift(e):r<s||r===s&&o===t.length-2?t.push(e):t.splice(o+1,0,e):i===0?n&&t.splice(o,1,e):r===0&&n&&t.splice(o+1,1,e),t.map(c=>(c.lng=l.convertToStdLng(c.lng),c))}static generateRouteAccordingToWaypoints(e){const t=[];for(let n=1;n<e.length;n++){const s=e[n-1],o=e[n];if(n===1&&t.push(s),o.gcToPrevious){const i=this.interpolateCoordinates(s,o,200,!1,!0,"nauticalmiles");t.push(...i)}else t.push(o)}return this.divideAccordingToLng(t,!0)}static nearestCoordinateInRoute(e,t){const n=g.point([e.lng,e.lat]),o=this.convertRouteToCoordinates(t).map(a=>[a.lng,a.lat]),i=g.lineString(o),r=g.nearestPointOnLine(i,n),c=g.getCoord(r);return{lng:l.roundPrecision(c[0],8),lat:l.roundPrecision(c[1],8)}}static calculatePrevWaypoint(e,t){let n=0;this.mergeCoordinateToWaypoints(e,t);for(let s=0;s<t.length-1;s++){const o=t[s],i=t[s+1];if(this.calculateDistance(e,o)===0){n=s;break}if(this.calculateDistance(e,i)===0){n=s+1;break}}return t[n===0?0:n-1]}static calculateNextCoordinateAlongRoute(e,t,n,s="nauticalmiles"){var h;const o=e.speed||12,i=[];let r=[],c=!1,a=0,d=0,u;if(t&&n.length?(i.push(e),n.forEach((f,v)=>{if(c)r.push(f);else{const m=[];let C;for(let D=0;D<f.length;D++)if(u)m.push(f[D]);else{C={lng:f[D][0],lat:f[D][1]};const N=this.calculateDistance(e,C,!0,8,s);if(a+=N,a<t)d+=N,i.push(C),e=C;else{if(d=t,a===t)u=C,m.push([u.lng,u.lat]);else{const S=a-t,p=this.calculateBearing(C,e);u=this.calculateCoordinate(C,p,S,s),m.push([u.lng,u.lat]),m.push([C.lng,C.lat])}c=!0}}m.length&&r.push(m),v===n.length-1&&!u&&(u=C)}})):(r=n,u={...e}),u)if(i.push(u),u.distanceFromPrevious=d,u.hourFromPrevious=Math.round(d/o*1e4)/1e4,((h=r[0])==null?void 0:h.length)>1){const f={lng:r[0][1][0],lat:r[0][1][1]};u.bearing=this.calculateBearing(u,f)}else u.bearing=0;return{coordinate:u,nextRoute:r,prevRoute:i}}static nearestCoordinateInLine(e,t,n){const s=l.convertToStdLng(e.lng,6),o=g.point([s,e.lat]),i=l.convertToStdLng(t.lng,6),r=l.convertToStdLng(n.lng,6),c=g.lineString([[i,t.lat],[r,n.lat]]),a=g.nearestPointOnLine(c,o),d=g.getCoord(a),u=l.roundPrecision(d[0],6),h=l.roundPrecision(d[1],6);return{lng:u,lat:h,inline:!(u===i&&h===t.lat)&&!(u===r&&h===n.lat)}}static convertRouteToCoordinates(e,t=0){const n=[];let s,o;return e.forEach(i=>{i.forEach(r=>{const c={lng:l.roundPrecision(r[0],8),lat:l.roundPrecision(r[1],8)};if(!o)n.push(c),o=c;else if(o.bearing===void 0)o.bearing=this.calculateBearing(o,c,!0);else{const a=this.calculateDistance(s,c,!0);a&&a>=t&&(s.bearing=this.calculateBearing(s,c,!0),n.push(s),o=s)}s=c})}),s&&n.push(s),n}static simplifyRouteToCoordinates(e,t,n=1){let s=this.convertRouteToCoordinates(e,n);return s=this.simplifyGCCoordinates(s,t),s}static simplifyGCCoordinates(e,t){t.forEach(s=>{this.mergeCoordinateToWaypoints(s,e,!0)});for(let s=1;s<t.length;s++){const o=t[s-1],i=t[s];if(i.gcToPrevious){const r=e.findIndex(a=>a.lng===o.lng&&a.lat===o.lat),c=e.findIndex(a=>a.lng===i.lng&&a.lat===i.lat);for(let a=c-1;a>r;a--)e.splice(a,1)}}let n=0;for(let s=1;s<e.length;s++){const o=e[s-1],i=e[s];i.gcToPrevious?(o.bearing=this.calculateBearing(o,i,!1),i.distanceFromPrevious=this.calculateDistance(o,i,!1)):(o.bearing=this.calculateBearing(o,i,!0),i.distanceFromPrevious=this.calculateDistance(o,i,!0)),n=l.roundPrecision(n+i.distanceFromPrevious),i.distanceFromStart=n}return e.map(s=>(s.lng=l.convertToStdLng(s.lng),s))}static calculateCenter(e){const t=[];for(const r of e)for(const c of r)t.push(c);const n=g.featureCollection([]),s=l.convertToMonotonicLng2(t);for(const r of s)n.features.push(g.point(r));const i=g.center(n).geometry.coordinates;return{lng:l.convertToStdLng(i[0],8),lat:l.roundPrecision(i[1],8)}}static calculateCenter2(e){const t=this.generateRouteAccordingToWaypoints(e);return this.calculateCenter(t)}static calculateBBox(e){const t=[];for(const o of e)for(const i of o)t.push(i);const n=l.convertToMonotonicLng2(t),s=g.lineString(n);return g.bbox(s)}static calculateBBox2(e){const t=this.generateRouteAccordingToWaypoints(e);return this.calculateBBox(t)}}let b;try{b=W.getLogger("vessel")}catch{}finally{}class E{static convert2Geojson(e){var n;const t=g.featureCollection([]);for(const s of e){if(s.forecasts){const o=(n=s.history)==null?void 0:n[0];for(const i of s.forecasts){const r=[],c=R(i.date).utc(),a=`${s.name}-${i.model}`;if(o){const d=R(o.updated).utc(),u=g.point([o.lng,o.lat],{model:i.model,name:s.name,date:d.format(),hour:0,format:d.format("MMM-DD/HHmm[Z]"),pressure:o.pressure>1e4?l.roundPrecision(o.pressure/100,0):l.roundPrecision(o.pressure,0),wind:{kts:o.kts,spd:o.speed||o.spd},category:a,type:"forecast"});t.features.push(u),r.push(u.geometry.coordinates)}for(const d in i==null?void 0:i.hours){const u=i.hours[d];u.wind.spd=u.wind.spd||u.wind.speed;const h=c.clone().add(Number(d),"hour"),f=g.point([u.lng,u.lat],{model:i.model,name:s.name,date:h.format(),hour:Number(d),format:h.format("MMM-DD/HHmm[Z]"),pressure:u.pressure>1e4?l.roundPrecision(u.pressure/100,0):l.roundPrecision(u.pressure,0),gusts:u.gusts,wind:u.wind||{},movement:u.movement,category:a,type:"forecast"});t.features.push(f),r.push(f.geometry.coordinates)}if((r==null?void 0:r.length)>1){const d=g.lineString(l.convertToMonotonicLng2(r),{date:i.date,id:s.id||s.name,model:i.model,name:s.name,category:a,type:"forecast"});t.features.push(d)}}}if(s.history){const o=[];for(const r of s.history){const c=R(r.updated).utc(),a=g.point([r.lng,r.lat],{name:s.name,date:c.format(),format:c.format("MMM-DD/HHmm[Z]"),pressure:r.pressure>1e4?l.roundPrecision(r.pressure/100,0):l.roundPrecision(r.pressure,0),spd:r.speed||r.spd,kts:r.kts,source:r.source,level:r.type,type:"history",category:`${s.name}-history`});t.features.push(a),o.push(a.geometry.coordinates)}const i=s.history[0];if(o.length===1&&o.push(o[0]),o.length>1){const r=g.lineString(l.convertToMonotonicLng2(o),{name:s.name,type:"history",updated:i==null?void 0:i.updated,pressure:(i==null?void 0:i.pressure)>1e4?l.roundPrecision((i==null?void 0:i.pressure)/100,0):l.roundPrecision(i==null?void 0:i.pressure,0),spd:(i==null?void 0:i.speed)||(i==null?void 0:i.spd),kts:i==null?void 0:i.kts,source:i==null?void 0:i.source,level:i==null?void 0:i.type});t.features.push(r)}}}return t}static interpolate(e,t=3){var o,i,r,c;const n=(o=e==null?void 0:e.data)==null?void 0:o.features.filter(a=>a.geometry.type==="LineString"&&a.properties.type==="forecast"),s=[];for(const a of n){const d=a.properties.name,u=a.properties.model,h=a.properties.showCircle,f=a.properties.disabled,v=R(a.properties.date).utc();let m=t*60-(v.get("hour")*60+v.get("minute"))%(t*60);const C=(i=e==null?void 0:e.data)==null?void 0:i.features.filter(S=>S.geometry.type==="Point"&&S.properties.type==="forecast"&&S.properties.category===`${d}-${u}`);let D,N=v.clone().add(m,"minute").set({minute:0,second:0,millisecond:0});for(;D=this.pickIndex(C,N),D<=C.length-1;){if(D>0){const S=C[D],p=D===0?void 0:C[D-1],y=(m/60-((r=p==null?void 0:p.properties)==null?void 0:r.hour))/(S.properties.hour-((c=p==null?void 0:p.properties)==null?void 0:c.hour)),F=this.computeNumber(p==null?void 0:p.geometry.coordinates[0],S.geometry.coordinates[0],y),A=this.computeNumber(p==null?void 0:p.geometry.coordinates[1],S.geometry.coordinates[1],y),B=g.point([F,A],{name:d,model:u,category:S==null?void 0:S.properties.category,date:N.format(),format:N.format("MMM-DD/HHmm[Z]"),gusts:this.computeNumber(p==null?void 0:p.properties.gusts,S.properties.gusts,y),hour:this.computeNumber(p==null?void 0:p.properties.hour,S.properties.hour,y),movement:this.computeNumber(p==null?void 0:p.properties.movement,S.properties.movement,y),pressure:this.computeNumber(p==null?void 0:p.properties.pressure,S.properties.pressure,y),wind:this.computeNumber(p==null?void 0:p.properties.wind,S.properties.wind,y),type:"forecast",disabled:f,showCircle:h});s.push(B)}m+=t*60,N=v.clone().add(m,"minute").set({minute:0,second:0,millisecond:0})}}return s}static accelPassageAt(e,t){const{t1:n,t2:s,hr:o,hours:i}=this.tropicalCenterTwin(e,24,t);return{t1:n,t2:s,hr:o,hours:i}}static diversionPassageAt(e,t,n,s={}){const{t1:o,t2:i,hr:r,hours:c}=this.tropicalCenterTwin(t,24,s);if(o&&i){if(!s.debug){const v=T.calculateDistance(e,o),m=T.calculateDistance(e,i);if(v>2*n&&m>2*n)return b==null||b.info("[%s] the distance between from and t1(%d) and t2(%d) is enough, no need diversion: %j",s.requestId,v,m,{from:e,t1:o,t2:i,hr:r}),{}}const a=T.calculateBearing(e,o),d=T.calculateBearing(o,i),u=Math.abs(a-d);let h=0;u<180?h=u+90:u>=180&&(h=u-90);const f=T.calculateCoordinate(o,h,n);return b==null||b.info("[%s] the right tangent position: %j",s.requestId,{from:e,t1:o,t2:i,radius:n,bearing1:a,bearing2:d,right:f}),{at:f,t1:o,t2:i,hr:Number(r),hours:c}}return{}}static driftPassageAt(e,t,n,s={}){const{t1:o,t2:i,hr:r,hours:c}=this.tropicalCenterTwin(t,24,s);if(o&&i){if(!s.debug){const f=T.calculateDistance(e,o),v=T.calculateDistance(e,i);if(f>2*n&&v>2*n)return b==null||b.info("[%s] the distance between from and t1(%d) and t2(%d) is enough, no need drifting: %j",s.requestId,f,v,{from:e,t1:o,t2:i,hr:r}),{}}const a=T.calculateBearing(e,o),d=T.calculateBearing(o,i),u=T.calculateDistance(e,o);return{at:T.calculateCoordinate(o,a-d+180,n<u?n:u),t1:o,t2:i,hr:Number(r),hours:c}}else return b==null||b.info("[%s] no need drift: %j",s.requestId,{from:e,t1:o,t2:i,hr:r}),{}}static tropicalCenterTwin(e,t=24,n={}){var d,u,h,f,v;let s={};(d=e.forecasts)==null||d.forEach(m=>{s={...m.hours,...s}});const o=((u=e==null?void 0:e.history)==null?void 0:u[0])||(s==null?void 0:s[(h=Object.keys(s))==null?void 0:h[0]]);b==null||b.info("[%s] the first tropical center: %j",n.requestId,o);let i=(f=Object.keys(s||{}).filter(m=>Number(m)<=(t<0?24:t)))==null?void 0:f.at(-1);i||(i=(v=Object.keys(s||{}).filter(m=>Number(m)<=(t<0?24:2*t)))==null?void 0:v.at(-1));const r=s==null?void 0:s[i||-1];b==null||b.info("[%s] the second tropical center: %j in %d hrs",n.requestId,r,i);const c=Object.keys(s||{}).filter(m=>Number(m)<=Number(i)),a={0:o};for(const m of c)a[m]=s[m];return{t1:o,t2:r,hr:Number(i),hours:a}}static pickIndex(e,t){let n=0;for(const s of e){if(R(s.properties.date).isAfter(t))return n===0?-1:n;n++}return n}static computeNumber(e,t,n){if(e)if(t){if(isNaN(e)&&isNaN(t)&&typeof e!="string"&&typeof t!="string"){const s={};for(const o in e)s[o]=this.computeNumber(e[o],t[o],n);return s}return Math.round((e+(t-e)*n)*100)/100}else return e;else return t}}M.LaneHelper=T,M.LngLatHelper=l,M.TropicalHelper=E,Object.defineProperty(M,Symbol.toStringTag,{value:"Module"})});
1
+ (function(M,$){typeof exports=="object"&&typeof module<"u"?$(exports,require("@turf/turf"),require("moment"),require("moment-timezone"),require("tz-lookup")):typeof define=="function"&&define.amd?define(["exports","@turf/turf","moment","moment-timezone","tz-lookup"],$):(M=typeof globalThis<"u"?globalThis:M||self,$(M["idm-plugin-rabbitmq"]={},M["@turf/turf"],M.moment,M["moment-timezone"],M["tz-lookup"]))})(this,function(M,$,R,z,O){"use strict";function W(v){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(v){for(const t in v)if(t!=="default"){const n=Object.getOwnPropertyDescriptor(v,t);Object.defineProperty(e,t,n.get?n:{enumerable:!0,get:()=>v[t]})}}return e.default=v,Object.freeze(e)}const g=W($);function L(v){return v&&v.__esModule&&Object.prototype.hasOwnProperty.call(v,"default")?v.default:v}class j{log(){}isLevelEnabled(){return!1}addContext(){}removeContext(){}clearContext(){}}["Trace","Debug","Info","Warn","Error","Fatal","Mark"].forEach(v=>{j.prototype[v.toLowerCase()]=()=>{},j.prototype[`is${v}Enabled`]=()=>!1});const k=(()=>{try{return require("log4js")}catch{return null}})();var A={getLogger:k?k.getLogger:()=>new j};const E=L(A);class l{static guessTimeZoneOffset(e,t){const n=O(t,e),s=R().tz(n).utcOffset();return this.roundPrecision(s/60,1)}static prettyTimeZoneOffset(e){let t=Math.floor(Math.abs(e)),n=Math.round((Math.abs(e)-t)*60);return n=n>9?n:`0${n}`,t=t>9?t:`0${t}`,e>0?`+${t}:${n}`:`-${t}:${n}`}static lng2pretty(e,t=6,n="H°M′"){e=l.convertToStdLng(e,t);let s="E";e<0&&(s="W"),e=Math.abs(e),n=n.toUpperCase();let o=e*3600,i,r,c,d,a,u;i=o%3600%60,n.indexOf("S")!==-1&&(o=o-i,r=l.padNumber(i,2,2)),c=o/60%60,n.indexOf("M")!==-1&&(n.indexOf("S")!==-1?d=l.roundPrecision(c,t).toString().padStart(2,"0"):d=l.padNumber(c,2,2),o=o-c*60),a=o/3600,n.indexOf("M")!==-1?u=l.roundPrecision(a,t).toString().padStart(3,"0"):u=l.padNumber(a,3,2);const f=`${n.replace(/S+/gi,r).replace(/M+/gi,d).replace(/H+/gi,u)}${s}`;return{direction:s,degree:l.roundPrecision(a,t),minute:l.roundPrecision(c,t),second:l.roundPrecision(i,t),pretty:f}}static lat2pretty(e,t=6,n="H°M′"){e=e%180;let s="N";e<0&&(s="S"),e=Math.abs(e),n=n.toUpperCase();let o=e*3600,i,r,c,d,a,u;i=o%3600%60,n.indexOf("S")!==-1&&(o=o-i,r=l.padNumber(i,2,2)),c=o/60%60,n.indexOf("M")!==-1&&(n.indexOf("S")!==-1?d=l.roundPrecision(c,t).toString().padStart(2,"0"):d=l.padNumber(c,2,2),o=o-c*60),a=o/3600,n.indexOf("M")!==-1?u=l.roundPrecision(a,t).toString().padStart(2,"0"):u=l.padNumber(a,2,2);const f=`${n.replace(/S+/gi,r).replace(/M+/gi,d).replace(/H+/gi,u)}${s}`;return{direction:s,degree:l.roundPrecision(a,t),minute:l.roundPrecision(c,t),second:l.roundPrecision(i,t),pretty:f}}static str2Lng(e,t=6){let n;if(isNaN(e)){e=l.strReplace(e,"LNG");const s=e[e.length-1].toUpperCase();e=e.substring(0,e.length-1).trim();const o=e.split(" ").filter(c=>c!=="").map(c=>Number(c));let[i,r]=o;if(r=r>60?r/Math.pow(10,String(r).length-2):r,i>360&&!r){const c=this.roundPrecision(i/100,0);r=i-c*100,i=c}n=i+(r??0)/60,s==="W"&&(n=n*-1)}else n=Number(e);return l.convertToStdLng(n,t)}static str2Lat(e,t=6){let n;if(isNaN(e)){e=l.strReplace(e,"LAT");const s=e[e.length-1].toUpperCase();e=e.substring(0,e.length-1).trim();const o=e.split(" ").filter(c=>c!=="").map(c=>Number(c));let[i,r]=o;if(r=r>60?r/Math.pow(10,String(r).length-2):r,i>90&&!r){const c=this.roundPrecision(i/100,0);r=i-c*100,i=c}n=i+(r??0)/60,s==="S"&&(n=n*-1)}else n=Number(e);return l.roundPrecision(n,t)}static str2LngOrLat(e,t=6,n="LAT"){e=l.strReplace(e,n);const s=e[e.length-1].toUpperCase();return["N","S"].includes(s)?{lat:l.str2Lat(e,t)}:{lng:l.str2Lng(e,t)}}static convertToStdLng(e,t=6){return e>180?(e=e%360,e=e>180?e-360:e):e<-180&&(e=e%360,e=e<-180?e+360:e),l.roundPrecision(e,t)}static roundPrecision(e,t=4){if(typeof e=="number"){const n=Number("1".padEnd(t+1,"0"));return Math.round(e*n)/n}return e}static convertToMonotonicLng2(e){for(let t=1;t<e.length;t++)e[t][0]+=Math.round((e[t-1][0]-e[t][0])/360)*360;return e}static convertToMonotonicLng(e){for(let t=1;t<e.length;t++)e[t].lng+=Math.round((e[t-1].lng-e[t].lng)/360)*360;return e}static strReplace(e,t="LAT"){e=e.replace(/([0-9]+)\.([0-9]+\.[0-9]+)/g,"$1 $2").replace(/-/g," ").replace(/°/," ").replace(/'/g," ").replace(/′/g," ").replace(/"/g," ").replace(/∼/g," ").replace(/°/g," ").replace(/,/g,".").replace(/^ /g,"").replace(/ $/g,"").trim();const n=e[e.length-1].toUpperCase();if(!["N","S","E","W"].includes(n)){const s=e,o=Number(s.split(" ")[0]);if(isNaN(o))throw new Error(`invalid Lat/Lng: ${e}`);o>=90?e=`${s}E`:o<=-90?e=`${s}W`:["LAN","LNG"].includes(t==null?void 0:t.toUpperCase())?e=`${s}${o>0?"E":"W"}`:e=`${s}${o>0?"N":"S"}`}return e}static padNumber(e,t=2,n=2){const s=Math.trunc(e).toString().padStart(t,"0"),o=Math.trunc(l.roundPrecision(e-Math.trunc(e),n)*Math.pow(10,n)).toString().padStart(n,"0");return`${s}.${o}`}}class b{static calculateBearing(e,t,n=!0,s=4){const o=g.points([[e.lng,e.lat],[t.lng,t.lat]]);let i;return n?i=g.rhumbBearing(o.features[0],o.features[1]):i=g.bearing(o.features[0],o.features[1]),i<0&&(i+=360),l.roundPrecision(i,s)}static calculateDistance(e,t,n=!0,s=4,o="nauticalmiles"){e={...e},t={...t},e.lng=l.convertToStdLng(e.lng,s),t.lng=l.convertToStdLng(t.lng,s);const i=g.points([[e.lng,e.lat],[t.lng,t.lat]]);let r;return n?r=g.rhumbDistance(i.features[0],i.features[1],{units:o}):r=g.distance(i.features[0],i.features[1],{units:o}),l.roundPrecision(r,s)}static calculateRouteDistance(e,t=4,n="nauticalmiles"){let s=0,o;for(const i of e)for(let r=0;r<i.length-1;r++){const c={lng:i[r][0],lat:i[r][1]};r===0&&o&&(s+=this.calculateDistance(o,c,!0,t,n));const d={lng:i[r+1][0],lat:i[r+1][1]};s+=this.calculateDistance(c,d,!0,t,n),o=d}return l.roundPrecision(s,t)}static calculateCoordinate(e,t,n,s="nauticalmiles",o=!0){const i=g.point([e.lng,e.lat]);let r;o?r=g.rhumbDestination(i,n,t,{units:s}):r=g.destination(i,n,t,{units:s});const c=r.geometry.coordinates;return{lng:l.convertToStdLng(c[0],8),lat:l.roundPrecision(c[1],8)}}static interpolateCoordinates(e,t,n,s=!0,o=!0,i="nauticalmiles"){const r=[],c=this.calculateBearing(e,t,!1),d=this.calculateDistance(e,t,!1,8,i);s&&r.push({lng:e.lng,lat:e.lat});let a=0;for(;a<d;)a+=n,a<d&&r.push(this.calculateCoordinate(e,c,a,i,!1));return o&&r.push({lng:t.lng,lat:t.lat}),r}static divideAccordingToLng(e,t=!1){if((e==null?void 0:e.length)<2)return[];e=this.deduplicateCoordinates(e);let n=[];const s=[];let o,i;for(let r=0;r<e.length-1;r++){o=l.convertToStdLng(e[r].lng,8),i=l.convertToStdLng(e[r+1].lng,8),e[r].lat=l.roundPrecision(e[r].lat,8),e[r+1].lat=l.roundPrecision(e[r+1].lat,8),n.push([o,e[r].lat]);const c=o-i;if(Math.abs(c)>180){const d=l.convertToMonotonicLng2([[o,e[r].lat],[i,e[r+1].lat]]);let a,u;t?(a=g.lineString(d),u=g.lineString([[c>0?180:-180,89],[c>0?180:-180,-89]])):(a=g.greatCircle(d[0],d[1]),u=g.greatCircle([c>0?180:-180,89],[c>0?180:-180,-89]));const f=g.lineIntersect(a,u);let h;if(f.features.length){const C=g.getCoord(f.features[0]);h=l.roundPrecision(C[1],8)}else h=e[r].lat;c>0?(n.push([180-1e-6,h]),s.push([...n]),n=[],n.push([-(180-1e-6),h])):(n.push([-(180-1e-6),h]),s.push([...n]),n=[],n.push([180-1e-6,h]))}r===e.length-2&&n.push([i,e[r+1].lat])}return s.push(n),s}static deduplicateRoute(e){const t=[];for(const n of e){const s=n.reduce((o,i)=>(o.findIndex(r=>r[0]===i[0]&&r[1]===i[1])===-1&&o.push(i),o),[]);t.push(s)}return t}static deduplicateCoordinates(e){return e.reduce((t,n)=>(t.findIndex(s=>s.lat===n.lat&&s.lng===n.lng)===-1&&t.push(n),t),[])}static removeCoordinateFromRoute(e,t){e.lng=l.convertToStdLng(e.lng,8);for(const n of t)for(let s=n.length-1;s>=0;s--)l.roundPrecision(n[s][0],8)===e.lng&&l.roundPrecision(n[s][1],8)===l.roundPrecision(e.lat,8)&&n.splice(s,1);return t}static removeCoordinateFromWaypoints(e,t){e.lng=l.convertToStdLng(e.lng,8);for(let n=t.length-1;n>=0;n--)l.roundPrecision(t[n].lng,8)===e.lng&&l.roundPrecision(t[n].lat,8)===l.roundPrecision(e.lat,8)&&t.splice(n,1);return t}static mergeCoordinateToRoute(e,t){e.lng=l.convertToStdLng(e.lng,8);let n=Number.MAX_VALUE,s=0,o=0,i,r;return t.forEach((c,d)=>{for(let a=0;a<c.length-1;a++){const u={lng:c[a][0],lat:c[a][1]},f={lng:c[a+1][0],lat:c[a+1][1]},h=this.calculatePointToLineDistance(e,u,f);n>h&&(n=h,o=a,s=d,i=this.calculateDistance(u,e),r=this.calculateDistance(f,e))}}),i!==0&&r!==0?t[s].splice(o+1,0,[e.lng,e.lat]):i===0?t[s].splice(o,1,[e.lng,e.lat]):r===0&&t[s].splice(o+1,1,[e.lng,e.lat]),t}static appendCoordinateToRoute(e,t){e.lng=l.convertToStdLng(e.lng,8);const n=b.convertRouteToCoordinates(t);return n.push(e),b.divideAccordingToLng(n)}static unshiftCoordinateToRoute(e,t){const n=b.convertRouteToCoordinates(t);return n.unshift(e),b.divideAccordingToLng(n)}static mergeWaypointsToRoute(e,t){for(const n of e)t=this.mergeCoordinateToRoute(n,t);return t}static calculateRangeRoute(e,t,n){n=this.mergeWaypointsToRoute([e,t],n);const s=[];let o=0;return n.forEach(i=>{if(o===2)return;const r=[];for(const c of i){if(l.roundPrecision(t.lng,8)===l.roundPrecision(c[0],8)&&l.roundPrecision(t.lat,8)===l.roundPrecision(c[1],8)){r.push(c),o===0&&r.push([e.lng,e.lat]),o=2;break}o===1?r.push(c):l.roundPrecision(e.lng,8)===l.roundPrecision(c[0],8)&&l.roundPrecision(e.lat,8)===l.roundPrecision(c[1],8)&&(o=1,r.push(c))}r.length&&s.push(r)}),s}static calculateRangeWaypoints(e,t,n,s=[]){const o=this.convertRouteToCoordinates(n,0),i=this.mergeCoordinatesToWaypoints([e,t,...s],o),r=i.findIndex(a=>l.roundPrecision(e.lng,8)===l.roundPrecision(a.lng,8)&&l.roundPrecision(e.lat,8)===l.roundPrecision(a.lat,8)),c=i.findIndex(a=>l.roundPrecision(t.lng,8)===l.roundPrecision(a.lng,8)&&l.roundPrecision(t.lat,8)===l.roundPrecision(a.lat,8));return i.filter((a,u)=>u>=r&&u<=c)}static calculateMinDistanceToRoute(e,t){let n=Number.MAX_VALUE,s=0,o=0;return t.forEach((i,r)=>{for(let c=0;c<i.length-1;c++){const d={lng:i[c][0],lat:i[c][1]},a={lng:i[c+1][0],lat:i[c+1][1]},u=this.calculatePointToLineDistance(e,d,a);n>u&&(n=u,s=c,o=r)}}),{minDist:n,segIndex:o,minIndex:s}}static calculateSubRoute(e,t){const n=b.convertRouteToCoordinates(t);b.mergeCoordinateToWaypoints(e,n,!0),t=b.divideAccordingToLng(n);const{segIndex:s,minIndex:o}=this.calculateMinDistanceToRoute({...e},t);e.lng=l.convertToStdLng(e.lng);const i=[];let r=!0;for(let c=s;c<t.length;c++)if(r){const d=[];d.push([e.lng,e.lat]);for(let a=o+1;a<t[c].length;a++)e.lng===t[c][a][0]&&e.lat===t[c][a][1]||d.push(t[c][a]);i.push(d),r=!1}else i.push([...t[c]]);return i}static calculateSubWaypoints(e,t){let n=Number.MAX_VALUE,s=0;for(let i=0;i<t.length-1;i++){const r=t[i],c=t[i+1];if(this.calculateDistance(e,r)===0)return t;if(this.calculateDistance(e,c)===0)return t.filter((a,u)=>u>0);const d=this.calculatePointToLineDistance(e,r,c);n>d&&(n=d,s=i)}e.lng=l.convertToStdLng(e.lng);const o=[e];for(let i=s+1;i<t.length;i++)o.push(t[i]);return o}static calculatePointToLineDistance(e,t,n,s={units:"nauticalmiles",method:"geodesic"}){e.lng=l.convertToStdLng(e.lng,8),t={...t},n={...n},t.lng=l.convertToStdLng(t.lng,8),n.lng=l.convertToStdLng(n.lng,8);const o=l.convertToMonotonicLng([t,n]);t=o[0],n=o[1];const i=g.lineString([[t.lng,t.lat],[n.lng,n.lat]]),r=g.pointToLineDistance(g.point([e.lng,e.lat]),i,s),c=g.pointToLineDistance(g.point([e.lng>0?e.lng-360:e.lng+360,e.lat]),i,s);return l.roundPrecision(Math.min(r,c),6)}static calculateWaypointsPropInRoute(e,t){t=this.mergeWaypointsToRoute(e,t);for(let n=0;n<e.length-1;n++){const s=e[n],o=e[n+1],i=this.calculateRangeRoute(s,o,t);n===0&&(s.distanceFromPrevious=0,s.distanceFromStart=0),o.distanceFromPrevious=this.calculateRouteDistance(i),o.distanceFromStart=l.roundPrecision((s.distanceFromStart||0)+o.distanceFromPrevious)}return e}static mergeCoordinatesToWaypoints(e,t,n=!0){for(const s of e)this.mergeCoordinateToWaypoints(s,t,n);return t}static mergeCoordinateToWaypoints(e,t,n=!0){e.lng=l.convertToStdLng(e.lng,8);let s=Number.MAX_VALUE,o=0,i=0,r=0;for(let c=0;c<t.length-1;c++){const d={lng:t[c].lng,lat:t[c].lat},a={lng:t[c+1].lng,lat:t[c+1].lat},u=this.calculatePointToLineDistance(e,d,a);s>=u&&(s=u,o=c,i=this.calculateDistance(d,e,!1,6),r=this.calculateDistance(a,e,!1,6))}return i!==0&&r!==0?i<s||i===s&&o===0?t.unshift(e):r<s||r===s&&o===t.length-2?t.push(e):t.splice(o+1,0,e):i===0?n&&t.splice(o,1,e):r===0&&n&&t.splice(o+1,1,e),t.map(c=>(c.lng=l.convertToStdLng(c.lng),c))}static generateRouteAccordingToWaypoints(e){const t=[];for(let n=1;n<e.length;n++){const s=e[n-1],o=e[n];if(n===1&&t.push(s),o.gcToPrevious){const i=this.interpolateCoordinates(s,o,200,!1,!0,"nauticalmiles");t.push(...i)}else t.push(o)}return this.divideAccordingToLng(t,!0)}static nearestCoordinateInRoute(e,t){const n=g.point([e.lng,e.lat]),o=this.convertRouteToCoordinates(t).map(d=>[d.lng,d.lat]),i=g.lineString(o),r=g.nearestPointOnLine(i,n),c=g.getCoord(r);return{lng:l.roundPrecision(c[0],8),lat:l.roundPrecision(c[1],8)}}static calculatePrevWaypoint(e,t){let n=0;this.mergeCoordinateToWaypoints(e,t);for(let s=0;s<t.length-1;s++){const o=t[s],i=t[s+1];if(this.calculateDistance(e,o)===0){n=s;break}if(this.calculateDistance(e,i)===0){n=s+1;break}}return t[n===0?0:n-1]}static calculateNextCoordinateAlongRoute(e,t,n,s="nauticalmiles"){var f;const o=e.speed||12,i=[];let r=[],c=!1,d=0,a=0,u;if(t&&n.length?(i.push(e),n.forEach((h,C)=>{if(c)r.push(h);else{const m=[];let S;for(let D=0;D<h.length;D++)if(u)m.push(h[D]);else{S={lng:h[D][0],lat:h[D][1]};const I=this.calculateDistance(e,S,!0,8,s);if(d+=I,d<t)a+=I,i.push(S),e=S;else{if(a=t,d===t)u=S,m.push([u.lng,u.lat]);else{const N=d-t,x=this.calculateBearing(S,e);u=this.calculateCoordinate(S,x,N,s),m.push([u.lng,u.lat]),m.push([S.lng,S.lat])}c=!0}}m.length&&r.push(m),C===n.length-1&&!u&&(u=S)}})):(r=n,u={...e}),u)if(i.push(u),u.distanceFromPrevious=a,u.hourFromPrevious=Math.round(a/o*1e4)/1e4,((f=r[0])==null?void 0:f.length)>1){const h={lng:r[0][1][0],lat:r[0][1][1]};u.bearing=this.calculateBearing(u,h)}else u.bearing=0;return{coordinate:u,nextRoute:r,prevRoute:i}}static nearestCoordinateInLine(e,t,n){const s=l.convertToStdLng(e.lng,6),o=g.point([s,e.lat]),i=l.convertToStdLng(t.lng,6),r=l.convertToStdLng(n.lng,6),c=g.lineString([[i,t.lat],[r,n.lat]]),d=g.nearestPointOnLine(c,o),a=g.getCoord(d),u=l.roundPrecision(a[0],6),f=l.roundPrecision(a[1],6);return{lng:u,lat:f,inline:!(u===i&&f===t.lat)&&!(u===r&&f===n.lat)}}static convertRouteToCoordinates(e,t=0){const n=[];let s,o;return e.forEach(i=>{i.forEach(r=>{const c={lng:l.roundPrecision(r[0],8),lat:l.roundPrecision(r[1],8)};if(!o)n.push(c),o=c;else if(o.bearing===void 0)o.bearing=this.calculateBearing(o,c,!0);else{const d=this.calculateDistance(s,c,!0);d&&d>=t&&(s.bearing=this.calculateBearing(s,c,!0),n.push(s),o=s)}s=c})}),s&&n.push(s),n}static simplifyRouteToCoordinates(e,t,n=1){let s=this.convertRouteToCoordinates(e,n);return s=this.simplifyGCCoordinates(s,t),s}static simplifyGCCoordinates(e,t){t.forEach(s=>{this.mergeCoordinateToWaypoints(s,e,!0)});for(let s=1;s<t.length;s++){const o=t[s-1],i=t[s];if(i.gcToPrevious){const r=e.findIndex(d=>d.lng===o.lng&&d.lat===o.lat),c=e.findIndex(d=>d.lng===i.lng&&d.lat===i.lat);for(let d=c-1;d>r;d--)e.splice(d,1)}}let n=0;for(let s=1;s<e.length;s++){const o=e[s-1],i=e[s];i.gcToPrevious?(o.bearing=this.calculateBearing(o,i,!1),i.distanceFromPrevious=this.calculateDistance(o,i,!1)):(o.bearing=this.calculateBearing(o,i,!0),i.distanceFromPrevious=this.calculateDistance(o,i,!0)),n=l.roundPrecision(n+i.distanceFromPrevious),i.distanceFromStart=n}return e.map(s=>(s.lng=l.convertToStdLng(s.lng),s))}static calculateCenter(e){const t=[];for(const r of e)for(const c of r)t.push(c);const n=g.featureCollection([]),s=l.convertToMonotonicLng2(t);for(const r of s)n.features.push(g.point(r));const i=g.center(n).geometry.coordinates;return{lng:l.convertToStdLng(i[0],8),lat:l.roundPrecision(i[1],8)}}static calculateCenter2(e){const t=this.generateRouteAccordingToWaypoints(e);return this.calculateCenter(t)}static calculateBBox(e){const t=[];for(const o of e)for(const i of o)t.push(i);const n=l.convertToMonotonicLng2(t),s=g.lineString(n);return g.bbox(s)}static calculateBBox2(e){const t=this.generateRouteAccordingToWaypoints(e);return this.calculateBBox(t)}}let T;try{T=E.getLogger("vessel")}catch{}finally{}class F{static convert2Geojson(e){var n;const t=g.featureCollection([]);for(const s of e){if(s.forecasts){const o=(n=s.history)==null?void 0:n[0];for(const i of s.forecasts){const r=[],c=R(i.date).utc(),d=`${s.name}-${i.model}`;if(o){const a=R(o.updated).utc(),u=g.point([o.lng,o.lat],{model:i.model,name:s.name,date:a.format(),hour:0,format:a.format("MMM-DD/HHmm[Z]"),pressure:o.pressure>1e4?l.roundPrecision(o.pressure/100,0):l.roundPrecision(o.pressure,0),wind:{kts:o.kts,spd:o.speed||o.spd},category:d,type:"forecast"});t.features.push(u),r.push(u.geometry.coordinates)}for(const a in i==null?void 0:i.hours){const u=i.hours[a];u.wind.spd=u.wind.spd||u.wind.speed;const f=c.clone().add(Number(a),"hour"),h=g.point([u.lng,u.lat],{model:i.model,name:s.name,date:f.format(),hour:Number(a),format:f.format("MMM-DD/HHmm[Z]"),pressure:u.pressure>1e4?l.roundPrecision(u.pressure/100,0):l.roundPrecision(u.pressure,0),gusts:u.gusts,wind:u.wind||{},movement:u.movement,category:d,type:"forecast"});t.features.push(h),r.push(h.geometry.coordinates)}if((r==null?void 0:r.length)>1){const a=g.lineString(l.convertToMonotonicLng2(r),{date:i.date,id:s.id||s.name,model:i.model,name:s.name,category:d,type:"forecast"});t.features.push(a)}}}if(s.history){const o=[];for(const r of s.history){const c=R(r.updated).utc(),d=g.point([r.lng,r.lat],{name:s.name,date:c.format(),format:c.format("MMM-DD/HHmm[Z]"),pressure:r.pressure>1e4?l.roundPrecision(r.pressure/100,0):l.roundPrecision(r.pressure,0),spd:r.speed||r.spd,kts:r.kts,source:r.source,level:r.type,type:"history",category:`${s.name}-history`,wind:r.wind});t.features.push(d),o.push(d.geometry.coordinates)}const i=s.history[0];if(o.length===1&&o.push(o[0]),o.length>1){const r=g.lineString(l.convertToMonotonicLng2(o),{name:s.name,type:"history",updated:i==null?void 0:i.updated,pressure:(i==null?void 0:i.pressure)>1e4?l.roundPrecision((i==null?void 0:i.pressure)/100,0):l.roundPrecision(i==null?void 0:i.pressure,0),spd:(i==null?void 0:i.speed)||(i==null?void 0:i.spd),kts:i==null?void 0:i.kts,source:i==null?void 0:i.source,level:i==null?void 0:i.type});t.features.push(r)}}}return t}static interpolate(e,t=3){var o,i,r,c,d;const n=(o=e==null?void 0:e.data)==null?void 0:o.features.filter(a=>a.geometry.type==="LineString"&&a.properties.type==="forecast"),s=[];for(const a of n){const u=a.properties.name,f=a.properties.model,h=a.properties.showCircle,C=a.properties.disabled,m=R(a.properties.date).utc();let S=t*60-(m.get("hour")*60+m.get("minute"))%(t*60);const D=(i=e==null?void 0:e.data)==null?void 0:i.features.filter(P=>P.geometry.type==="Point"&&P.properties.type==="forecast"&&P.properties.category===`${u}-${f}`),I=(r=e==null?void 0:e.data)==null?void 0:r.features.filter(P=>P.geometry.type==="Point"&&P.properties.type==="history"&&P.properties.category===`${u}-history`);let N,x=m.clone().add(S,"minute").set({minute:0,second:0,millisecond:0});for(;N=this.pickIndex(D,x),N<=D.length-1;){if(N>0){const P=D[N],p=N===0?I==null?void 0:I[0]:D[N-1],y=(S/60-((c=p==null?void 0:p.properties)==null?void 0:c.hour))/(P.properties.hour-((d=p==null?void 0:p.properties)==null?void 0:d.hour)),B=this.computeNumber(p==null?void 0:p.geometry.coordinates[0],P.geometry.coordinates[0],y),q=this.computeNumber(p==null?void 0:p.geometry.coordinates[1],P.geometry.coordinates[1],y),U=g.point([B,q],{name:u,model:f,category:P==null?void 0:P.properties.category,date:x.format(),format:x.format("MMM-DD/HHmm[Z]"),gusts:this.computeNumber(p==null?void 0:p.properties.gusts,P.properties.gusts,y),hour:this.computeNumber(p==null?void 0:p.properties.hour,P.properties.hour,y),movement:this.computeNumber(p==null?void 0:p.properties.movement,P.properties.movement,y),pressure:this.computeNumber(p==null?void 0:p.properties.pressure,P.properties.pressure,y),wind:this.computeNumber(p==null?void 0:p.properties.wind,P.properties.wind,y),type:"forecast",disabled:C,showCircle:h});s.push(U)}S+=t*60,x=m.clone().add(S,"minute").set({minute:0,second:0,millisecond:0})}}return s}static accelPassageAt(e,t){const{t1:n,t2:s,hr:o,hours:i}=this.tropicalCenterTwin(e,24,t);return{t1:n,t2:s,hr:o,hours:i}}static diversionPassageAt(e,t,n,s={}){const{t1:o,t2:i,hr:r,hours:c}=this.tropicalCenterTwin(t,24,s);if(o&&i){if(!s.debug){const C=b.calculateDistance(e,o),m=b.calculateDistance(e,i);if(C>2*n&&m>2*n)return T==null||T.info("[%s] the distance between from and t1(%d) and t2(%d) is enough, no need diversion: %j",s.requestId,C,m,{from:e,t1:o,t2:i,hr:r}),{}}const d=b.calculateBearing(e,o),a=b.calculateBearing(o,i),u=Math.abs(d-a);let f=0;u<180?f=u+90:u>=180&&(f=u-90);const h=b.calculateCoordinate(o,f,n);return T==null||T.info("[%s] the right tangent position: %j",s.requestId,{from:e,t1:o,t2:i,radius:n,bearing1:d,bearing2:a,right:h}),{at:h,t1:o,t2:i,hr:Number(r),hours:c}}return{}}static driftPassageAt(e,t,n,s={}){const{t1:o,t2:i,hr:r,hours:c}=this.tropicalCenterTwin(t,24,s);if(o&&i){if(!s.debug){const h=b.calculateDistance(e,o),C=b.calculateDistance(e,i);if(h>2*n&&C>2*n)return T==null||T.info("[%s] the distance between from and t1(%d) and t2(%d) is enough, no need drifting: %j",s.requestId,h,C,{from:e,t1:o,t2:i,hr:r}),{}}const d=b.calculateBearing(e,o),a=b.calculateBearing(o,i),u=b.calculateDistance(e,o);return{at:b.calculateCoordinate(o,d-a+180,n<u?n:u),t1:o,t2:i,hr:Number(r),hours:c}}else return T==null||T.info("[%s] no need drift: %j",s.requestId,{from:e,t1:o,t2:i,hr:r}),{}}static tropicalCenterTwin(e,t=24,n={}){var a,u,f,h,C;let s={};(a=e.forecasts)==null||a.forEach(m=>{s={...m.hours,...s}});const o=((u=e==null?void 0:e.history)==null?void 0:u[0])||(s==null?void 0:s[(f=Object.keys(s))==null?void 0:f[0]]);T==null||T.info("[%s] the first tropical center: %j",n.requestId,o);let i=(h=Object.keys(s||{}).filter(m=>Number(m)<=(t<0?24:t)))==null?void 0:h.at(-1);i||(i=(C=Object.keys(s||{}).filter(m=>Number(m)<=(t<0?24:2*t)))==null?void 0:C.at(-1));const r=s==null?void 0:s[i||-1];T==null||T.info("[%s] the second tropical center: %j in %d hrs",n.requestId,r,i);const c=Object.keys(s||{}).filter(m=>Number(m)<=Number(i)),d={0:o};for(const m of c)d[m]=s[m];return{t1:o,t2:r,hr:Number(i),hours:d}}static pickIndex(e,t){let n=0;for(const s of e){if(R(s.properties.date).isAfter(t))return n===0?-1:n;n++}return n}static computeNumber(e,t,n){if(e)if(t){if(isNaN(e)&&isNaN(t)&&typeof e!="string"&&typeof t!="string"){const s={};for(const o in e)s[o]=this.computeNumber(e[o],t[o],n);return s}return Math.round((e+(t-e)*n)*100)/100}else return e;else return t}}M.LaneHelper=b,M.LngLatHelper=l,M.TropicalHelper=F,Object.defineProperty(M,Symbol.toStringTag,{value:"Module"})});
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@idm-plugin/geo",
3
3
  "private": false,
4
- "version": "1.3.5",
4
+ "version": "1.3.7",
5
5
  "description": "idm plugin for geo",
6
6
  "type": "module",
7
7
  "keywords": [