@idm-plugin/geo 1.3.2 → 1.3.3

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,9 +1,9 @@
1
1
  import * as g from "@turf/turf";
2
- import D from "moment";
2
+ import N from "moment";
3
3
  import "moment-timezone";
4
4
  import W from "tz-lookup";
5
- function E(v) {
6
- return v && v.__esModule && Object.prototype.hasOwnProperty.call(v, "default") ? v.default : v;
5
+ function E(C) {
6
+ return C && C.__esModule && Object.prototype.hasOwnProperty.call(C, "default") ? C.default : C;
7
7
  }
8
8
  class R {
9
9
  log() {
@@ -18,9 +18,9 @@ class R {
18
18
  clearContext() {
19
19
  }
20
20
  }
21
- ["Trace", "Debug", "Info", "Warn", "Error", "Fatal", "Mark"].forEach((v) => {
22
- R.prototype[v.toLowerCase()] = () => {
23
- }, R.prototype[`is${v}Enabled`] = () => !1;
21
+ ["Trace", "Debug", "Info", "Warn", "Error", "Fatal", "Mark"].forEach((C) => {
22
+ R.prototype[C.toLowerCase()] = () => {
23
+ }, R.prototype[`is${C}Enabled`] = () => !1;
24
24
  });
25
25
  const k = () => {
26
26
  try {
@@ -40,7 +40,7 @@ class l {
40
40
  * @param lat
41
41
  */
42
42
  static guessTimeZoneOffset(t, e) {
43
- const n = W(e, t), s = D().tz(n).utcOffset();
43
+ const n = W(e, t), s = N().tz(n).utcOffset();
44
44
  return this.roundPrecision(s / 60, 1);
45
45
  }
46
46
  /**
@@ -300,8 +300,8 @@ class S {
300
300
  const f = g.lineIntersect(d, u);
301
301
  let h;
302
302
  if (f.features.length) {
303
- const C = g.getCoord(f.features[0]);
304
- h = l.roundPrecision(C[1], 8);
303
+ const v = g.getCoord(f.features[0]);
304
+ h = l.roundPrecision(v[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]));
@@ -622,7 +622,7 @@ class S {
622
622
  var f;
623
623
  const o = t.speed || 12, i = [];
624
624
  let r = [], c = !1, a = 0, d = 0, u;
625
- if (e && n.length ? (i.push(t), n.forEach((h, C) => {
625
+ if (e && n.length ? (i.push(t), n.forEach((h, v) => {
626
626
  if (c)
627
627
  r.push(h);
628
628
  else {
@@ -633,20 +633,20 @@ class S {
633
633
  m.push(h[M]);
634
634
  else {
635
635
  P = { lng: h[M][0], lat: h[M][1] };
636
- const b = this.calculateDistance(t, P, !0, 8, s);
637
- if (a += b, a < e)
638
- d += b, i.push(P), t = P;
636
+ const T = this.calculateDistance(t, P, !0, 8, s);
637
+ if (a += T, a < e)
638
+ d += T, i.push(P), t = P;
639
639
  else {
640
640
  if (d = e, a === e)
641
641
  u = P, m.push([u.lng, u.lat]);
642
642
  else {
643
- const p = a - e, N = this.calculateBearing(P, t);
644
- u = this.calculateCoordinate(P, N, p, s), m.push([u.lng, u.lat]), m.push([P.lng, P.lat]);
643
+ const p = a - e, D = this.calculateBearing(P, t);
644
+ u = this.calculateCoordinate(P, D, p, s), m.push([u.lng, u.lat]), m.push([P.lng, P.lat]);
645
645
  }
646
646
  c = !0;
647
647
  }
648
648
  }
649
- m.length && r.push(m), C === n.length - 1 && !u && (u = P);
649
+ m.length && r.push(m), v === n.length - 1 && !u && (u = P);
650
650
  }
651
651
  })) : (r = n, u = { ...t }), u)
652
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) {
@@ -770,9 +770,9 @@ class S {
770
770
  return this.calculateBBox(e);
771
771
  }
772
772
  }
773
- let T;
773
+ let b;
774
774
  try {
775
- T = F.getLogger("vessel");
775
+ b = F.getLogger("vessel");
776
776
  } catch {
777
777
  } finally {
778
778
  }
@@ -788,9 +788,9 @@ class U {
788
788
  if (s.forecasts) {
789
789
  const o = (n = s.history) == null ? void 0 : n[0];
790
790
  for (const i of s.forecasts) {
791
- const r = [], c = D(i.date).utc(), a = `${s.name}-${i.model}`;
791
+ const r = [], c = N(i.date).utc(), a = `${s.name}-${i.model}`;
792
792
  if (o) {
793
- const d = D(o.updated).utc(), u = g.point([o.lng, o.lat], {
793
+ const d = N(o.updated).utc(), u = g.point([o.lng, o.lat], {
794
794
  model: i.model,
795
795
  name: s.name,
796
796
  date: d.format(),
@@ -837,7 +837,7 @@ class U {
837
837
  if (s.history) {
838
838
  const o = [];
839
839
  for (const r of s.history) {
840
- const c = D(r.updated).utc(), a = g.point([r.lng, r.lat], {
840
+ const c = N(r.updated).utc(), a = g.point([r.lng, r.lat], {
841
841
  name: s.name,
842
842
  date: c.format(),
843
843
  format: c.format("MMM-DD/HHmm[Z]"),
@@ -878,31 +878,31 @@ class U {
878
878
  var o, i, r, c;
879
879
  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
880
  for (const a of n) {
881
- const d = a.properties.name, u = a.properties.model, f = a.properties.showCircle, h = D(a.properties.date).utc();
882
- let C = e * 60 - (h.get("hour") * 60 + h.get("minute")) % (e * 60);
881
+ const d = a.properties.name, u = a.properties.model, f = a.properties.showCircle, h = N(a.properties.date).utc();
882
+ let v = e * 60 - (h.get("hour") * 60 + h.get("minute")) % (e * 60);
883
883
  const m = (i = t == null ? void 0 : t.data) == null ? void 0 : i.features.filter(
884
- (b) => b.geometry.type === "Point" && b.properties.type === "forecast" && b.properties.category === `${d}-${u}`
884
+ (T) => T.geometry.type === "Point" && T.properties.type === "forecast" && T.properties.category === `${d}-${u}`
885
885
  );
886
- let P, M = h.clone().add(C, "minute").set({ minute: 0, second: 0, millisecond: 0 });
886
+ let P, M = h.clone().add(v, "minute").set({ minute: 0, second: 0, millisecond: 0 });
887
887
  for (; P = this.pickIndex(m, M), P <= m.length - 1; ) {
888
888
  if (P > 0) {
889
- const b = m[P], p = P === 0 ? void 0 : m[P - 1], N = (C / 60 - ((r = p == null ? void 0 : p.properties) == null ? void 0 : r.hour)) / (b.properties.hour - ((c = p == null ? void 0 : p.properties) == null ? void 0 : c.hour)), x = this.computeNumber(p == null ? void 0 : p.geometry.coordinates[0], b.geometry.coordinates[0], N), I = this.computeNumber(p == null ? void 0 : p.geometry.coordinates[1], b.geometry.coordinates[1], N), $ = g.point([x, I], {
889
+ const T = m[P], p = P === 0 ? void 0 : m[P - 1], D = (v / 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)), x = this.computeNumber(p == null ? void 0 : p.geometry.coordinates[0], T.geometry.coordinates[0], D), I = this.computeNumber(p == null ? void 0 : p.geometry.coordinates[1], T.geometry.coordinates[1], D), $ = g.point([x, I], {
890
890
  name: d,
891
891
  model: u,
892
- category: b == null ? void 0 : b.properties.category,
892
+ category: T == null ? void 0 : T.properties.category,
893
893
  date: M.format(),
894
894
  format: M.format("MMM-DD/HHmm[Z]"),
895
- gusts: this.computeNumber(p == null ? void 0 : p.properties.gusts, b.properties.gusts, N),
896
- hour: this.computeNumber(p == null ? void 0 : p.properties.hour, b.properties.hour, N),
897
- movement: this.computeNumber(p == null ? void 0 : p.properties.movement, b.properties.movement, N),
898
- pressure: this.computeNumber(p == null ? void 0 : p.properties.pressure, b.properties.pressure, N),
899
- wind: this.computeNumber(p == null ? void 0 : p.properties.wind, b.properties.wind, N),
895
+ gusts: this.computeNumber(p == null ? void 0 : p.properties.gusts, T.properties.gusts, D),
896
+ hour: this.computeNumber(p == null ? void 0 : p.properties.hour, T.properties.hour, D),
897
+ movement: this.computeNumber(p == null ? void 0 : p.properties.movement, T.properties.movement, D),
898
+ pressure: this.computeNumber(p == null ? void 0 : p.properties.pressure, T.properties.pressure, D),
899
+ wind: this.computeNumber(p == null ? void 0 : p.properties.wind, T.properties.wind, D),
900
900
  type: "forecast",
901
901
  showCircle: f
902
902
  });
903
903
  s.push($);
904
904
  }
905
- C += e * 60, M = h.clone().add(C, "minute").set({ minute: 0, second: 0, millisecond: 0 });
905
+ v += e * 60, M = h.clone().add(v, "minute").set({ minute: 0, second: 0, millisecond: 0 });
906
906
  }
907
907
  }
908
908
  return s;
@@ -921,11 +921,21 @@ class U {
921
921
  static diversionPassageAt(t, e, n, s = {}) {
922
922
  const { t1: o, t2: i, hr: r, hours: c } = this.tropicalCenterTwin(e, 24, s);
923
923
  if (o && i) {
924
+ if (!s.debug) {
925
+ const v = S.calculateDistance(t, o), m = S.calculateDistance(t, i);
926
+ if (v > 2 * n && m > 2 * n)
927
+ 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, {
928
+ from: t,
929
+ t1: o,
930
+ t2: i,
931
+ hr: r
932
+ }), {};
933
+ }
924
934
  const a = S.calculateBearing(t, o), d = S.calculateBearing(o, i), u = Math.abs(a - d);
925
935
  let f = 0;
926
936
  u < 180 ? f = u + 90 : u >= 180 && (f = u - 90);
927
937
  const h = S.calculateCoordinate(o, f, n);
928
- return T == null || T.info("[%s] the right tangent position: %j", s.requestId, {
938
+ return b == null || b.info("[%s] the right tangent position: %j", s.requestId, {
929
939
  from: t,
930
940
  t1: o,
931
941
  t2: i,
@@ -950,30 +960,41 @@ class U {
950
960
  static driftPassageAt(t, e, n, s = {}) {
951
961
  const { t1: o, t2: i, hr: r, hours: c } = this.tropicalCenterTwin(e, 24, s);
952
962
  if (o && i) {
963
+ if (!s.debug) {
964
+ const h = S.calculateDistance(t, o), v = S.calculateDistance(t, i);
965
+ if (h > 2 * n && v > 2 * n)
966
+ 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, v, {
967
+ from: t,
968
+ t1: o,
969
+ t2: i,
970
+ hr: r
971
+ }), {};
972
+ }
953
973
  const a = S.calculateBearing(t, o), d = S.calculateBearing(o, i), u = S.calculateDistance(t, o);
954
974
  return { at: S.calculateCoordinate(o, a - d + 180, n < u ? n : u), t1: o, t2: i, hr: Number(r), hours: c };
955
975
  } else
956
- return T == null || T.info("[%s] no need drift: %j", s.requestId, { from: t, t1: o, t2: i, hr: r }), {};
976
+ return b == null || b.info("[%s] no need drift: %j", s.requestId, { from: t, t1: o, t2: i, hr: r }), {};
957
977
  }
958
978
  /**
959
979
  * 获取台风中心点对
960
980
  * @param tropical { history: any[], forecasts: any[] }
961
981
  * @param hrs 未来小时数,默认24
962
982
  * @param options
983
+ * @returns { t1: 当前台风中心点, t2: 未来hr小时台风中心点, hr: 未来台风中心点与当前台风中心点之间的时间差, hours: 未来24小时内所有台风中心点 }
963
984
  * @private
964
985
  */
965
986
  static tropicalCenterTwin(t, e = 24, n = {}) {
966
- var d, u, f, h, C;
987
+ var d, u, f, h, v;
967
988
  let s = {};
968
989
  (d = t.forecasts) == null || d.forEach((m) => {
969
990
  s = { ...m.hours, ...s };
970
991
  });
971
992
  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]]);
972
- T == null || T.info("[%s] the first tropical center: %j", n.requestId, o);
993
+ b == null || b.info("[%s] the first tropical center: %j", n.requestId, o);
973
994
  let i = (h = Object.keys(s || {}).filter((m) => Number(m) <= (e < 0 ? 24 : e))) == null ? void 0 : h.at(-1);
974
- i || (i = (C = Object.keys(s || {}).filter((m) => Number(m) <= (e < 0 ? 24 : 2 * e))) == null ? void 0 : C.at(-1));
995
+ i || (i = (v = Object.keys(s || {}).filter((m) => Number(m) <= (e < 0 ? 24 : 2 * e))) == null ? void 0 : v.at(-1));
975
996
  const r = s == null ? void 0 : s[i || -1];
976
- T == null || T.info("[%s] the second tropical center: %j in %d hrs", n.requestId, r, i);
997
+ b == null || b.info("[%s] the second tropical center: %j in %d hrs", n.requestId, r, i);
977
998
  const c = Object.keys(s || {}).filter((m) => Number(m) <= Number(i)), a = { 0: o };
978
999
  for (const m of c)
979
1000
  a[m] = s[m];
@@ -982,7 +1003,7 @@ class U {
982
1003
  static pickIndex(t, e) {
983
1004
  let n = 0;
984
1005
  for (const s of t) {
985
- if (D(s.properties.date).isAfter(e))
1006
+ if (N(s.properties.date).isAfter(e))
986
1007
  return n === 0 ? -1 : n;
987
1008
  n++;
988
1009
  }
@@ -1 +1 @@
1
- (function(C,R){typeof exports=="object"&&typeof module<"u"?R(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"],R):(C=typeof globalThis<"u"?globalThis:C||self,R(C["idm-plugin-rabbitmq"]={},C["@turf/turf"],C.moment,C["moment-timezone"],C["tz-lookup"]))})(this,function(C,R,y,B,$){"use strict";function k(b){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(b){for(const t in b)if(t!=="default"){const n=Object.getOwnPropertyDescriptor(b,t);Object.defineProperty(e,t,n.get?n:{enumerable:!0,get:()=>b[t]})}}return e.default=b,Object.freeze(e)}const g=k(R);function L(b){return b&&b.__esModule&&Object.prototype.hasOwnProperty.call(b,"default")?b.default:b}class x{log(){}isLevelEnabled(){return!1}addContext(){}removeContext(){}clearContext(){}}["Trace","Debug","Info","Warn","Error","Fatal","Mark"].forEach(b=>{x.prototype[b.toLowerCase()]=()=>{},x.prototype[`is${b}Enabled`]=()=>!1});const I=(()=>{try{return require("log4js")}catch{return null}})();var O={getLogger:I?I.getLogger:()=>new x};const j=L(O);class l{static guessTimeZoneOffset(e,t){const n=$(t,e),o=y().tz(n).utcOffset();return this.roundPrecision(o/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 o="E";e<0&&(o="W"),e=Math.abs(e),n=n.toUpperCase();let s=e*3600,i,r,c,a,d,u;i=s%3600%60,n.indexOf("S")!==-1&&(s=s-i,r=l.padNumber(i,2,2)),c=s/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),s=s-c*60),d=s/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)}${o}`;return{direction:o,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 o="N";e<0&&(o="S"),e=Math.abs(e),n=n.toUpperCase();let s=e*3600,i,r,c,a,d,u;i=s%3600%60,n.indexOf("S")!==-1&&(s=s-i,r=l.padNumber(i,2,2)),c=s/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),s=s-c*60),d=s/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)}${o}`;return{direction:o,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 o=e[e.length-1].toUpperCase();e=e.substring(0,e.length-1).trim();const s=e.split(" ").filter(c=>c!=="").map(c=>Number(c));let[i,r]=s;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,o==="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 o=e[e.length-1].toUpperCase();e=e.substring(0,e.length-1).trim();const s=e.split(" ").filter(c=>c!=="").map(c=>Number(c));let[i,r]=s;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,o==="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 o=e[e.length-1].toUpperCase();return["N","S"].includes(o)?{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 o=e,s=Number(o.split(" ")[0]);if(isNaN(s))throw new Error(`invalid Lat/Lng: ${e}`);s>=90?e=`${o}E`:s<=-90?e=`${o}W`:["LAN","LNG"].includes(t==null?void 0:t.toUpperCase())?e=`${o}${s>0?"E":"W"}`:e=`${o}${s>0?"N":"S"}`}return e}static padNumber(e,t=2,n=2){const o=Math.trunc(e).toString().padStart(t,"0"),s=Math.trunc(l.roundPrecision(e-Math.trunc(e),n)*Math.pow(10,n)).toString().padStart(n,"0");return`${o}.${s}`}}class v{static calculateBearing(e,t,n=!0,o=4){const s=g.points([[e.lng,e.lat],[t.lng,t.lat]]);let i;return n?i=g.rhumbBearing(s.features[0],s.features[1]):i=g.bearing(s.features[0],s.features[1]),i<0&&(i+=360),l.roundPrecision(i,o)}static calculateDistance(e,t,n=!0,o=4,s="nauticalmiles"){e={...e},t={...t},e.lng=l.convertToStdLng(e.lng,o),t.lng=l.convertToStdLng(t.lng,o);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:s}):r=g.distance(i.features[0],i.features[1],{units:s}),l.roundPrecision(r,o)}static calculateRouteDistance(e,t=4,n="nauticalmiles"){let o=0,s;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&&s&&(o+=this.calculateDistance(s,c,!0,t,n));const a={lng:i[r+1][0],lat:i[r+1][1]};o+=this.calculateDistance(c,a,!0,t,n),s=a}return l.roundPrecision(o,t)}static calculateCoordinate(e,t,n,o="nauticalmiles",s=!0){const i=g.point([e.lng,e.lat]);let r;s?r=g.rhumbDestination(i,n,t,{units:o}):r=g.destination(i,n,t,{units:o});const c=r.geometry.coordinates;return{lng:l.convertToStdLng(c[0],8),lat:l.roundPrecision(c[1],8)}}static interpolateCoordinates(e,t,n,o=!0,s=!0,i="nauticalmiles"){const r=[],c=this.calculateBearing(e,t,!1),a=this.calculateDistance(e,t,!1,8,i);o&&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 s&&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 o=[];let s,i;for(let r=0;r<e.length-1;r++){s=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([s,e[r].lat]);const c=s-i;if(Math.abs(c)>180){const a=l.convertToMonotonicLng2([[s,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 M=g.getCoord(h.features[0]);f=l.roundPrecision(M[1],8)}else f=e[r].lat;c>0?(n.push([180-1e-6,f]),o.push([...n]),n=[],n.push([-(180-1e-6),f])):(n.push([-(180-1e-6),f]),o.push([...n]),n=[],n.push([180-1e-6,f]))}r===e.length-2&&n.push([i,e[r+1].lat])}return o.push(n),o}static deduplicateRoute(e){const t=[];for(const n of e){const o=n.reduce((s,i)=>(s.findIndex(r=>r[0]===i[0]&&r[1]===i[1])===-1&&s.push(i),s),[]);t.push(o)}return t}static deduplicateCoordinates(e){return e.reduce((t,n)=>(t.findIndex(o=>o.lat===n.lat&&o.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 o=n.length-1;o>=0;o--)l.roundPrecision(n[o][0],8)===e.lng&&l.roundPrecision(n[o][1],8)===l.roundPrecision(e.lat,8)&&n.splice(o,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,o=0,s=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,s=d,o=a,i=this.calculateDistance(u,e),r=this.calculateDistance(h,e))}}),i!==0&&r!==0?t[o].splice(s+1,0,[e.lng,e.lat]):i===0?t[o].splice(s,1,[e.lng,e.lat]):r===0&&t[o].splice(s+1,1,[e.lng,e.lat]),t}static appendCoordinateToRoute(e,t){e.lng=l.convertToStdLng(e.lng,8);const n=v.convertRouteToCoordinates(t);return n.push(e),v.divideAccordingToLng(n)}static unshiftCoordinateToRoute(e,t){const n=v.convertRouteToCoordinates(t);return n.unshift(e),v.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 o=[];let s=0;return n.forEach(i=>{if(s===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),s===0&&r.push([e.lng,e.lat]),s=2;break}s===1?r.push(c):l.roundPrecision(e.lng,8)===l.roundPrecision(c[0],8)&&l.roundPrecision(e.lat,8)===l.roundPrecision(c[1],8)&&(s=1,r.push(c))}r.length&&o.push(r)}),o}static calculateRangeWaypoints(e,t,n,o=[]){const s=this.convertRouteToCoordinates(n,0),i=this.mergeCoordinatesToWaypoints([e,t,...o],s),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,o=0,s=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,o=c,s=r)}}),{minDist:n,segIndex:s,minIndex:o}}static calculateSubRoute(e,t){const{segIndex:n,minIndex:o}=this.calculateMinDistanceToRoute({...e},t);e.lng=l.convertToStdLng(e.lng);const s=[];let i=!0;for(let r=n;r<t.length;r++)if(i){const c=[];c.push([e.lng,e.lat]);for(let a=o+1;a<t[r].length;a++)e.lng===t[r][a][0]&&e.lat===t[r][a][1]||c.push(t[r][a]);s.push(c),i=!1}else s.push([...t[r]]);return s}static calculateSubWaypoints(e,t){let n=Number.MAX_VALUE,o=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,o=i)}e.lng=l.convertToStdLng(e.lng);const s=[e];for(let i=o+1;i<t.length;i++)s.push(t[i]);return s}static calculatePointToLineDistance(e,t,n,o={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 s=l.convertToMonotonicLng([t,n]);t=s[0],n=s[1];const i=g.lineString([[t.lng,t.lat],[n.lng,n.lat]]),r=g.pointToLineDistance(g.point([e.lng,e.lat]),i,o),c=g.pointToLineDistance(g.point([e.lng>0?e.lng-360:e.lng+360,e.lat]),i,o);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 o=e[n],s=e[n+1],i=this.calculateRangeRoute(o,s,t);n===0&&(o.distanceFromPrevious=0,o.distanceFromStart=0),s.distanceFromPrevious=this.calculateRouteDistance(i),s.distanceFromStart=l.roundPrecision((o.distanceFromStart||0)+s.distanceFromPrevious)}return e}static mergeCoordinatesToWaypoints(e,t,n=!0){for(const o of e)this.mergeCoordinateToWaypoints(o,t,n);return t}static mergeCoordinateToWaypoints(e,t,n=!0){e.lng=l.convertToStdLng(e.lng,8);let o=Number.MAX_VALUE,s=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);o>=u&&(o=u,s=c,i=this.calculateDistance(a,e,!1,6),r=this.calculateDistance(d,e,!1,6))}return i!==0&&r!==0?i<o||i===o&&s===0?t.unshift(e):r<o||r===o&&s===t.length-2?t.push(e):t.splice(s+1,0,e):i===0?n&&t.splice(s,1,e):r===0&&n&&t.splice(s+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 o=e[n-1],s=e[n];if(n===1&&t.push(o),s.gcToPrevious){const i=this.interpolateCoordinates(o,s,200,!1,!0,"nauticalmiles");t.push(...i)}else t.push(s)}return this.divideAccordingToLng(t,!0)}static nearestCoordinateInRoute(e,t){const n=g.point([e.lng,e.lat]),s=this.convertRouteToCoordinates(t).map(a=>[a.lng,a.lat]),i=g.lineString(s),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 o=0;o<t.length-1;o++){const s=t[o],i=t[o+1];if(this.calculateDistance(e,s)===0){n=o;break}if(this.calculateDistance(e,i)===0){n=o+1;break}}return t[n===0?0:n-1]}static calculateNextCoordinateAlongRoute(e,t,n,o="nauticalmiles"){var h;const s=e.speed||12,i=[];let r=[],c=!1,a=0,d=0,u;if(t&&n.length?(i.push(e),n.forEach((f,M)=>{if(c)r.push(f);else{const m=[];let P;for(let D=0;D<f.length;D++)if(u)m.push(f[D]);else{P={lng:f[D][0],lat:f[D][1]};const T=this.calculateDistance(e,P,!0,8,o);if(a+=T,a<t)d+=T,i.push(P),e=P;else{if(d=t,a===t)u=P,m.push([u.lng,u.lat]);else{const p=a-t,N=this.calculateBearing(P,e);u=this.calculateCoordinate(P,N,p,o),m.push([u.lng,u.lat]),m.push([P.lng,P.lat])}c=!0}}m.length&&r.push(m),M===n.length-1&&!u&&(u=P)}})):(r=n,u={...e}),u)if(i.push(u),u.distanceFromPrevious=d,u.hourFromPrevious=Math.round(d/s*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 o=l.convertToStdLng(e.lng,6),s=g.point([o,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,s),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 o,s;return e.forEach(i=>{i.forEach(r=>{const c={lng:l.roundPrecision(r[0],8),lat:l.roundPrecision(r[1],8)};if(!s)n.push(c),s=c;else if(s.bearing===void 0)s.bearing=this.calculateBearing(s,c,!0);else{const a=this.calculateDistance(o,c,!0);a&&a>=t&&(o.bearing=this.calculateBearing(o,c,!0),n.push(o),s=o)}o=c})}),o&&n.push(o),n}static simplifyRouteToCoordinates(e,t,n=1){let o=this.convertRouteToCoordinates(e,n);return o=this.simplifyGCCoordinates(o,t),o}static simplifyGCCoordinates(e,t){t.forEach(o=>{this.mergeCoordinateToWaypoints(o,e,!0)});for(let o=1;o<t.length;o++){const s=t[o-1],i=t[o];if(i.gcToPrevious){const r=e.findIndex(a=>a.lng===s.lng&&a.lat===s.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 o=1;o<e.length;o++){const s=e[o-1],i=e[o];i.gcToPrevious?(s.bearing=this.calculateBearing(s,i,!1),i.distanceFromPrevious=this.calculateDistance(s,i,!1)):(s.bearing=this.calculateBearing(s,i,!0),i.distanceFromPrevious=this.calculateDistance(s,i,!0)),n=l.roundPrecision(n+i.distanceFromPrevious),i.distanceFromStart=n}return e.map(o=>(o.lng=l.convertToStdLng(o.lng),o))}static calculateCenter(e){const t=[];for(const r of e)for(const c of r)t.push(c);const n=g.featureCollection([]),o=l.convertToMonotonicLng2(t);for(const r of o)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 s of e)for(const i of s)t.push(i);const n=l.convertToMonotonicLng2(t),o=g.lineString(n);return g.bbox(o)}static calculateBBox2(e){const t=this.generateRouteAccordingToWaypoints(e);return this.calculateBBox(t)}}let S;try{S=j.getLogger("vessel")}catch{}finally{}class W{static convert2Geojson(e){var n;const t=g.featureCollection([]);for(const o of e){if(o.forecasts){const s=(n=o.history)==null?void 0:n[0];for(const i of o.forecasts){const r=[],c=y(i.date).utc(),a=`${o.name}-${i.model}`;if(s){const d=y(s.updated).utc(),u=g.point([s.lng,s.lat],{model:i.model,name:o.name,date:d.format(),hour:0,format:d.format("MMM-DD/HHmm[Z]"),pressure:s.pressure>1e4?l.roundPrecision(s.pressure/100,0):l.roundPrecision(s.pressure,0),wind:{kts:s.kts,spd:s.speed||s.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:o.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:o.id||o.name,model:i.model,name:o.name,category:a,type:"forecast"});t.features.push(d)}}}if(o.history){const s=[];for(const r of o.history){const c=y(r.updated).utc(),a=g.point([r.lng,r.lat],{name:o.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:`${o.name}-history`});t.features.push(a),s.push(a.geometry.coordinates)}const i=o.history[0];if(s.length===1&&s.push(s[0]),s.length>1){const r=g.lineString(l.convertToMonotonicLng2(s),{name:o.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 s,i,r,c;const n=(s=e==null?void 0:e.data)==null?void 0:s.features.filter(a=>a.geometry.type==="LineString"&&a.properties.type==="forecast"),o=[];for(const a of n){const d=a.properties.name,u=a.properties.model,h=a.properties.showCircle,f=y(a.properties.date).utc();let M=t*60-(f.get("hour")*60+f.get("minute"))%(t*60);const m=(i=e==null?void 0:e.data)==null?void 0:i.features.filter(T=>T.geometry.type==="Point"&&T.properties.type==="forecast"&&T.properties.category===`${d}-${u}`);let P,D=f.clone().add(M,"minute").set({minute:0,second:0,millisecond:0});for(;P=this.pickIndex(m,D),P<=m.length-1;){if(P>0){const T=m[P],p=P===0?void 0:m[P-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)),E=this.computeNumber(p==null?void 0:p.geometry.coordinates[0],T.geometry.coordinates[0],N),F=this.computeNumber(p==null?void 0:p.geometry.coordinates[1],T.geometry.coordinates[1],N),A=g.point([E,F],{name:d,model:u,category:T==null?void 0:T.properties.category,date:D.format(),format:D.format("MMM-DD/HHmm[Z]"),gusts:this.computeNumber(p==null?void 0:p.properties.gusts,T.properties.gusts,N),hour:this.computeNumber(p==null?void 0:p.properties.hour,T.properties.hour,N),movement:this.computeNumber(p==null?void 0:p.properties.movement,T.properties.movement,N),pressure:this.computeNumber(p==null?void 0:p.properties.pressure,T.properties.pressure,N),wind:this.computeNumber(p==null?void 0:p.properties.wind,T.properties.wind,N),type:"forecast",showCircle:h});o.push(A)}M+=t*60,D=f.clone().add(M,"minute").set({minute:0,second:0,millisecond:0})}}return o}static diversionPassageAt(e,t,n,o={}){const{t1:s,t2:i,hr:r,hours:c}=this.tropicalCenterTwin(t,24,o);if(s&&i){const a=v.calculateBearing(e,s),d=v.calculateBearing(s,i),u=Math.abs(a-d);let h=0;u<180?h=u+90:u>=180&&(h=u-90);const f=v.calculateCoordinate(s,h,n);return S==null||S.info("[%s] the right tangent position: %j",o.requestId,{from:e,t1:s,t2:i,radius:n,bearing1:a,bearing2:d,right:f}),{at:f,t1:s,t2:i,hr:Number(r),hours:c}}return{}}static driftPassageAt(e,t,n,o={}){const{t1:s,t2:i,hr:r,hours:c}=this.tropicalCenterTwin(t,24,o);if(s&&i){const a=v.calculateBearing(e,s),d=v.calculateBearing(s,i),u=v.calculateDistance(e,s);return{at:v.calculateCoordinate(s,a-d+180,n<u?n:u),t1:s,t2:i,hr:Number(r),hours:c}}else return S==null||S.info("[%s] no need drift: %j",o.requestId,{from:e,t1:s,t2:i,hr:r}),{}}static tropicalCenterTwin(e,t=24,n={}){var d,u,h,f,M;let o={};(d=e.forecasts)==null||d.forEach(m=>{o={...m.hours,...o}});const s=((u=e==null?void 0:e.history)==null?void 0:u[0])||(o==null?void 0:o[(h=Object.keys(o))==null?void 0:h[0]]);S==null||S.info("[%s] the first tropical center: %j",n.requestId,s);let i=(f=Object.keys(o||{}).filter(m=>Number(m)<=(t<0?24:t)))==null?void 0:f.at(-1);i||(i=(M=Object.keys(o||{}).filter(m=>Number(m)<=(t<0?24:2*t)))==null?void 0:M.at(-1));const r=o==null?void 0:o[i||-1];S==null||S.info("[%s] the second tropical center: %j in %d hrs",n.requestId,r,i);const c=Object.keys(o||{}).filter(m=>Number(m)<=Number(i)),a={0:s};for(const m of c)a[m]=o[m];return{t1:s,t2:r,hr:i,hours:a}}static pickIndex(e,t){let n=0;for(const o of e){if(y(o.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 o={};for(const s in e)o[s]=this.computeNumber(e[s],t[s],n);return o}return Math.round((e+(t-e)*n)*100)/100}else return e;else return t}}C.LaneHelper=v,C.LngLatHelper=l,C.TropicalHelper=W,Object.defineProperty(C,Symbol.toStringTag,{value:"Module"})});
1
+ (function(M,R){typeof exports=="object"&&typeof module<"u"?R(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"],R):(M=typeof globalThis<"u"?globalThis:M||self,R(M["idm-plugin-rabbitmq"]={},M["@turf/turf"],M.moment,M["moment-timezone"],M["tz-lookup"]))})(this,function(M,R,y,B,$){"use strict";function j(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=j(R);function k(P){return P&&P.__esModule&&Object.prototype.hasOwnProperty.call(P,"default")?P.default:P}class I{log(){}isLevelEnabled(){return!1}addContext(){}removeContext(){}clearContext(){}}["Trace","Debug","Info","Warn","Error","Fatal","Mark"].forEach(P=>{I.prototype[P.toLowerCase()]=()=>{},I.prototype[`is${P}Enabled`]=()=>!1});const x=(()=>{try{return require("log4js")}catch{return null}})();var L={getLogger:x?x.getLogger:()=>new I};const O=k(L);class l{static guessTimeZoneOffset(e,t){const n=$(t,e),s=y().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 S{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 C=g.getCoord(h.features[0]);f=l.roundPrecision(C[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=S.convertRouteToCoordinates(t);return n.push(e),S.divideAccordingToLng(n)}static unshiftCoordinateToRoute(e,t){const n=S.convertRouteToCoordinates(t);return n.unshift(e),S.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,C)=>{if(c)r.push(f);else{const m=[];let T;for(let D=0;D<f.length;D++)if(u)m.push(f[D]);else{T={lng:f[D][0],lat:f[D][1]};const v=this.calculateDistance(e,T,!0,8,s);if(a+=v,a<t)d+=v,i.push(T),e=T;else{if(d=t,a===t)u=T,m.push([u.lng,u.lat]);else{const p=a-t,N=this.calculateBearing(T,e);u=this.calculateCoordinate(T,N,p,s),m.push([u.lng,u.lat]),m.push([T.lng,T.lat])}c=!0}}m.length&&r.push(m),C===n.length-1&&!u&&(u=T)}})):(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=O.getLogger("vessel")}catch{}finally{}class W{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=y(i.date).utc(),a=`${s.name}-${i.model}`;if(o){const d=y(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=y(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=y(a.properties.date).utc();let C=t*60-(f.get("hour")*60+f.get("minute"))%(t*60);const m=(i=e==null?void 0:e.data)==null?void 0:i.features.filter(v=>v.geometry.type==="Point"&&v.properties.type==="forecast"&&v.properties.category===`${d}-${u}`);let T,D=f.clone().add(C,"minute").set({minute:0,second:0,millisecond:0});for(;T=this.pickIndex(m,D),T<=m.length-1;){if(T>0){const v=m[T],p=T===0?void 0:m[T-1],N=(C/60-((r=p==null?void 0:p.properties)==null?void 0:r.hour))/(v.properties.hour-((c=p==null?void 0:p.properties)==null?void 0:c.hour)),E=this.computeNumber(p==null?void 0:p.geometry.coordinates[0],v.geometry.coordinates[0],N),F=this.computeNumber(p==null?void 0:p.geometry.coordinates[1],v.geometry.coordinates[1],N),A=g.point([E,F],{name:d,model:u,category:v==null?void 0:v.properties.category,date:D.format(),format:D.format("MMM-DD/HHmm[Z]"),gusts:this.computeNumber(p==null?void 0:p.properties.gusts,v.properties.gusts,N),hour:this.computeNumber(p==null?void 0:p.properties.hour,v.properties.hour,N),movement:this.computeNumber(p==null?void 0:p.properties.movement,v.properties.movement,N),pressure:this.computeNumber(p==null?void 0:p.properties.pressure,v.properties.pressure,N),wind:this.computeNumber(p==null?void 0:p.properties.wind,v.properties.wind,N),type:"forecast",showCircle:h});s.push(A)}C+=t*60,D=f.clone().add(C,"minute").set({minute:0,second:0,millisecond:0})}}return s}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=S.calculateDistance(e,o),m=S.calculateDistance(e,i);if(C>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,C,m,{from:e,t1:o,t2:i,hr:r}),{}}const a=S.calculateBearing(e,o),d=S.calculateBearing(o,i),u=Math.abs(a-d);let h=0;u<180?h=u+90:u>=180&&(h=u-90);const f=S.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=S.calculateDistance(e,o),C=S.calculateDistance(e,i);if(f>2*n&&C>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,C,{from:e,t1:o,t2:i,hr:r}),{}}const a=S.calculateBearing(e,o),d=S.calculateBearing(o,i),u=S.calculateDistance(e,o);return{at:S.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,C;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=(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];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:i,hours:a}}static pickIndex(e,t){let n=0;for(const s of e){if(y(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=S,M.LngLatHelper=l,M.TropicalHelper=W,Object.defineProperty(M,Symbol.toStringTag,{value:"Module"})});
@@ -45,7 +45,14 @@ export declare class TropicalHelper {
45
45
  lng: number;
46
46
  }, tropical: any, radius: number, options?: {
47
47
  requestId?: string;
48
+ debug?: boolean;
48
49
  }): {
50
+ at?: undefined;
51
+ t1?: undefined;
52
+ t2?: undefined;
53
+ hr?: undefined;
54
+ hours?: undefined;
55
+ } | {
49
56
  at: {
50
57
  lng: number;
51
58
  lat: number;
@@ -54,12 +61,6 @@ export declare class TropicalHelper {
54
61
  t2: any;
55
62
  hr: number;
56
63
  hours: any;
57
- } | {
58
- at?: undefined;
59
- t1?: undefined;
60
- t2?: undefined;
61
- hr?: undefined;
62
- hours?: undefined;
63
64
  };
64
65
  /**
65
66
  * 计算最佳漂航点
@@ -76,7 +77,14 @@ export declare class TropicalHelper {
76
77
  lng: number;
77
78
  }, tropical: any, radius: number, options?: {
78
79
  requestId?: string;
80
+ debug?: boolean;
79
81
  }): {
82
+ at?: undefined;
83
+ t1?: undefined;
84
+ t2?: undefined;
85
+ hr?: undefined;
86
+ hours?: undefined;
87
+ } | {
80
88
  at: {
81
89
  lng: number;
82
90
  lat: number;
@@ -85,18 +93,13 @@ export declare class TropicalHelper {
85
93
  t2: any;
86
94
  hr: number;
87
95
  hours: any;
88
- } | {
89
- at?: undefined;
90
- t1?: undefined;
91
- t2?: undefined;
92
- hr?: undefined;
93
- hours?: undefined;
94
96
  };
95
97
  /**
96
98
  * 获取台风中心点对
97
99
  * @param tropical { history: any[], forecasts: any[] }
98
100
  * @param hrs 未来小时数,默认24
99
101
  * @param options
102
+ * @returns { t1: 当前台风中心点, t2: 未来hr小时台风中心点, hr: 未来台风中心点与当前台风中心点之间的时间差, hours: 未来24小时内所有台风中心点 }
100
103
  * @private
101
104
  */
102
105
  private static tropicalCenterTwin;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@idm-plugin/geo",
3
3
  "private": false,
4
- "version": "1.3.2",
4
+ "version": "1.3.3",
5
5
  "description": "idm plugin for geo",
6
6
  "type": "module",
7
7
  "keywords": [