zhihao-ui 1.2.68 → 1.2.70

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.
Files changed (81) hide show
  1. package/dist/es/{BaseInfo-BhnEjLKF.js → BaseInfo-BQ9mgGZQ.js} +1 -1
  2. package/dist/es/{BaseItem-C4NJy1i4.js → BaseItem-ByAS3S8w.js} +3 -3
  3. package/dist/es/{Button-CGndQwez.js → Button-BdGo3Kfv.js} +2 -2
  4. package/dist/es/CascaderLoadMore-B3dBPBJz.js +243 -0
  5. package/dist/es/DatePicker-C-2zM1dY.js +73 -0
  6. package/dist/es/{DetailHeader-DaabNj_4.js → DetailHeader-Dd_oHefQ.js} +3 -3
  7. package/dist/es/{DetailSubTitle-CzFZPXeE.js → DetailSubTitle-1YWi0mX_.js} +2 -2
  8. package/dist/es/{Dialog-BUW6ag1B.js → Dialog-Cib_m5sM.js} +3 -3
  9. package/dist/es/DiyDataTable-beBJdlLe.js +364 -0
  10. package/dist/es/{EditInfoPair-B2f6zoGY.js → EditInfoPair-BCbIIBEP.js} +3 -3
  11. package/dist/es/{FileWrapper-D4IxJemr.js → FileWrapper-ClTHhvQU.js} +4 -4
  12. package/dist/es/{Grid-DIs695lY.js → Grid-DvrmAWyU.js} +2 -2
  13. package/dist/es/{InfoPair-Ce7nDfxD.js → InfoPair-Bf-X09VT.js} +3 -3
  14. package/dist/es/{Input-C5X2X_YD.js → Input-uOt745UZ.js} +14 -14
  15. package/dist/es/{Loading-BgoEv5qE.js → Loading-C_6ERpeb.js} +2 -2
  16. package/dist/es/Map-XWdLIa5C.js +2528 -0
  17. package/dist/es/{MessageBox-DiGH5x51.js → MessageBox-h_sFrr4D.js} +2 -2
  18. package/dist/es/{MoneyInput-D0kYiOfP.js → MoneyInput-D8V7_PZq.js} +8 -8
  19. package/dist/es/{PageHeadPanel-C6IdOq6I.js → PageHeadPanel-DLs1xYME.js} +2 -2
  20. package/dist/es/Table-DgS42Pzw.js +1167 -0
  21. package/dist/es/{ToolTips-CiQHxGrw.js → ToolTips-CSVL9wbb.js} +6 -6
  22. package/dist/es/index.js +77 -60
  23. package/dist/es/{utils-D2wHR1YB.js → utils-UjENBVnX.js} +1 -1
  24. package/dist/es/{vendor-D2mv9LHk.js → vendor-9390iK3y.js} +30756 -26238
  25. package/dist/index.css +1 -1
  26. package/dist/types/components/BaseItem/index.d.ts +9 -9
  27. package/dist/types/components/Dialog/Dialog.vue.d.ts +16 -16
  28. package/dist/types/components/Dialog/index.d.ts +24 -24
  29. package/dist/types/components/DiyDataTable/DiyDataTable.vue.d.ts +18 -1
  30. package/dist/types/components/DiyDataTable/index.d.ts +30 -0
  31. package/dist/types/components/DiyDataTable/type.d.ts +17 -1
  32. package/dist/types/components/Map/Map.vue.d.ts +138 -101
  33. package/dist/types/components/Map/components/scaleLine.vue.d.ts +1 -2
  34. package/dist/types/components/Map/components/zoomControl.vue.d.ts +3 -7
  35. package/dist/types/components/Map/index.d.ts +390 -324
  36. package/dist/types/components/Map/interface/index.d.ts +13 -6
  37. package/dist/types/components/Map/types.d.ts +13 -1
  38. package/dist/types/components/Table/types.d.ts +1 -0
  39. package/dist/types/components/ToolTips/index.d.ts +12 -12
  40. package/dist/types/components/index.d.ts +1 -0
  41. package/dist/umd/index.css +1 -1
  42. package/dist/umd/index.umd.cjs +604 -130
  43. package/package.json +1 -1
  44. package/dist/es/DatePicker-Dy1K1cJQ.js +0 -57
  45. package/dist/es/DiyDataTable-D-UZVciZ.js +0 -331
  46. package/dist/es/Map-DbbD377l.js +0 -2235
  47. package/dist/es/Table-B_3YA1mb.js +0 -1155
  48. package/dist/types/components/Map/config/global.d.ts +0 -2
  49. package/dist/types/components/Map/config/index.d.ts +0 -2
  50. package/dist/types/components/Map/config/map.d.ts +0 -22
  51. package/dist/types/components/Map/function/carTrack.d.ts +0 -11
  52. package/dist/types/components/Map/function/drawLine.d.ts +0 -12
  53. package/dist/types/components/Map/function/drawPolygon.d.ts +0 -9
  54. package/dist/types/components/Map/function/event.d.ts +0 -9
  55. package/dist/types/components/Map/function/layers.d.ts +0 -10
  56. package/dist/types/components/Map/function/map.d.ts +0 -18
  57. package/dist/types/components/Map/function/port.d.ts +0 -10
  58. package/dist/types/components/Map/function/position.d.ts +0 -8
  59. package/dist/types/components/Map/function/props.d.ts +0 -7
  60. package/dist/types/components/Map/function/ship/index.d.ts +0 -16
  61. package/dist/types/components/Map/function/ship/label.d.ts +0 -5
  62. package/dist/types/components/Map/function/ship/style.d.ts +0 -23
  63. package/dist/types/components/Map/function/shipOverlay.d.ts +0 -12
  64. package/dist/types/components/Map/function/shipTrack.d.ts +0 -16
  65. package/dist/types/components/Map/interface/carTrack.d.ts +0 -70
  66. package/dist/types/components/Map/interface/label.d.ts +0 -27
  67. package/dist/types/components/Map/interface/mapProps.d.ts +0 -15
  68. package/dist/types/components/Map/interface/position.d.ts +0 -7
  69. package/dist/types/components/Map/interface/shipInfoVo.d.ts +0 -214
  70. package/dist/types/components/Map/interface/shipTrack.d.ts +0 -57
  71. package/dist/types/components/Map/interface/wharfEntity.d.ts +0 -20
  72. package/dist/types/components/Map/meta/index.d.ts +0 -17
  73. package/dist/types/components/Map/meta/ship.d.ts +0 -26
  74. package/dist/types/components/Map/useMap.d.ts +0 -17
  75. package/dist/types/components/Map/utils/cursor.d.ts +0 -3
  76. package/dist/types/components/Map/utils/events.d.ts +0 -4
  77. package/dist/types/components/Map/utils/overlay.d.ts +0 -5
  78. package/dist/types/components/Map/utils/rbush.d.ts +0 -13
  79. package/dist/types/components/Map/utils/shipOverlay.d.ts +0 -12
  80. package/dist/types/components/Map/utils/track.d.ts +0 -45
  81. package/dist/types/components/Map/utils/util.d.ts +0 -42
@@ -0,0 +1,2528 @@
1
+ var G = Object.defineProperty;
2
+ var _ = (e, t, o) => t in e ? G(e, t, { enumerable: !0, configurable: !0, writable: !0, value: o }) : e[t] = o;
3
+ var C = (e, t, o) => _(e, typeof t != "symbol" ? t + "" : t, o);
4
+ import { ref, defineComponent, inject, useModel, watch, openBlock, createElementBlock, createElementVNode, createVNode, unref, withCtx, Fragment, renderList, toDisplayString, createCommentVNode, mergeModels, nextTick, onMounted, normalizeClass, renderSlot, createBlock, useCssVars, computed, provide } from "vue";
5
+ import { t as getArea, u as getLength, V as VectorSource, v as VectorLayer, S as Style, C as CircleStyle, F as Fill, w as Stroke, D as Draw, O as Overlay, x as unByKey, f as ElSelect, g as ElOption, y as getUid, z as fromLonLat, P as Point, A as transform, B as Feature, T as Text, I as Icon, G as Translate, H as toLonLat, e as cloneDeep, J as GeoJSON, W as WebGLPointsLayer, K as Circle, L as transformExtent, j as hooks, M as LineString, N as Polyline, Q as getVectorContext, R as buffer, U as ScaleLine$1, X as MultiPoint, Y as getCenter, Z as TileLayer, _ as XYZ, $ as Map$1, a0 as View } from "./vendor-9390iK3y.js";
6
+ import { _ as _export_sfc } from "./Button-BdGo3Kfv.js";
7
+ import { g as getForegroundColor } from "./DatePicker-C-2zM1dY.js";
8
+ import { w as withInstall } from "./utils-UjENBVnX.js";
9
+ var BaseMapType = /* @__PURE__ */ ((e) => (e[e.vector = 0] = "vector", e[e.satellite = 1] = "satellite", e))(BaseMapType || {}), SEARCH_TYPE = /* @__PURE__ */ ((e) => (e[e.SEARCH_SHIP = 0] = "SEARCH_SHIP", e[e.SEARCH_PORT = 1] = "SEARCH_PORT", e[e.SEARCH_CUSTOM = 2] = "SEARCH_CUSTOM", e))(SEARCH_TYPE || {}), COPY_RIGHT_TYPE = /* @__PURE__ */ ((e) => (e[e.HORIZONTAL = 0] = "HORIZONTAL", e[e.VERTICAL = 1] = "VERTICAL", e))(COPY_RIGHT_TYPE || {}), CAR_COLOR = /* @__PURE__ */ ((e) => (e[e.BLUE = 1] = "BLUE", e[e.YELLOW = 2] = "YELLOW", e[e.Y_GREEN = 3] = "Y_GREEN", e))(CAR_COLOR || {}), DEVICE_TYPE = /* @__PURE__ */ ((e) => (e[e.HOST = 1] = "HOST", e[e.TALK = 2] = "TALK", e[e.STORAGE = 3] = "STORAGE", e[e.INTERNET = 4] = "INTERNET", e[e.CAMERA = 5] = "CAMERA", e[e.LOAD = 6] = "LOAD", e))(DEVICE_TYPE || {}), LENGTH_UNIT = /* @__PURE__ */ ((e) => (e[e.M = 1] = "M", e[e.KM = 2] = "KM", e[e.NM = 3] = "NM", e))(LENGTH_UNIT || {}), SWITCH_BTN = /* @__PURE__ */ ((e) => (e.Camera = "camera", e.Mobile = "mobile", e.WaterGauge = "waterGauge", e))(SWITCH_BTN || {}), SHIP_SAIL_STATUS = /* @__PURE__ */ ((e) => (e[e.发动机使用中 = 0] = "发动机使用中", e[e.锚泊 = 1] = "锚泊", e[e.未操作 = 2] = "未操作", e[e.操纵能力受限 = 3] = "操纵能力受限", e[e.吃水受限 = 4] = "吃水受限", e[e.系泊 = 5] = "系泊", e[e.搁浅 = 6] = "搁浅", e[e.从事捕捞 = 7] = "从事捕捞", e[e.航行中 = 8] = "航行中", e[e.留作将来修正导航状态 = 9] = "留作将来修正导航状态", e[e.高速船留用 = 10] = "高速船留用", e[e.机动船尾推作业 = 11] = "机动船尾推作业", e[e.机动船顶推或侧推作业 = 12] = "机动船顶推或侧推作业", e[e.飞翼船留用 = 13] = "飞翼船留用", e[e.现行的 = 14] = "现行的", e[e.未定义 = 15] = "未定义", e))(SHIP_SAIL_STATUS || {});
10
+ class ShipMapData {
11
+ constructor(t, o, n, i, r, l, c, s, m, d, u, f, p, h, v, g, k, M, I, E, V, F, $, y) {
12
+ C(this, "id");
13
+ // mmsi
14
+ C(this, "mmsi");
15
+ // 船舶三角形填充色
16
+ C(this, "fill");
17
+ // 船类型 "7": "货船",
18
+ C(this, "shipType");
19
+ // 船名
20
+ C(this, "name");
21
+ // 长度
22
+ C(this, "length");
23
+ // 宽度
24
+ C(this, "breadth");
25
+ // 经度
26
+ C(this, "lon");
27
+ // 纬度
28
+ C(this, "lat");
29
+ // 时间
30
+ C(this, "createdAt");
31
+ // 速度
32
+ C(this, "speed");
33
+ // 来源
34
+ C(this, "from");
35
+ // 船状态 "stop":"静止","sail":"航行","work":"作业","danger":"危险","other":"其他"
36
+ C(this, "sailStatus");
37
+ // 船艏向
38
+ C(this, "hdg");
39
+ // 航迹向
40
+ C(this, "cog");
41
+ // 设备定位类型
42
+ C(this, "posType");
43
+ C(this, "type");
44
+ // 航向角度
45
+ C(this, "angle");
46
+ // 左侧是否显示色块
47
+ C(this, "leftIconColor");
48
+ C(this, "existDevice");
49
+ C(this, "existMobile");
50
+ C(this, "existWaterGauge");
51
+ C(this, "selected");
52
+ C(this, "blinkColors");
53
+ this.id = t, this.mmsi = o, this.fill = n, this.shipType = i, this.name = r, this.length = l, this.breadth = c, this.lon = s, this.lat = m, this.createdAt = d, this.speed = u, this.from = f, this.sailStatus = p, this.hdg = h, this.cog = v, this.posType = g, this.type = k, this.angle = M, this.leftIconColor = I, this.existDevice = E, this.existMobile = V, this.existWaterGauge = F, this.selected = $, this.blinkColors = y;
54
+ }
55
+ }
56
+ const formatLength = function(e, t) {
57
+ const n = getLength(e);
58
+ let i = "";
59
+ switch (t) {
60
+ case LENGTH_UNIT.M:
61
+ i = Math.round(n * 100) / 100 + " m";
62
+ break;
63
+ case LENGTH_UNIT.KM:
64
+ i = Math.round(n / 1e3 * 100) / 100 + " km";
65
+ break;
66
+ case LENGTH_UNIT.NM:
67
+ i = (Math.round(n / 1e3 * 100) / 100 / 1.852).toFixed(2) + " nm";
68
+ break;
69
+ }
70
+ return i;
71
+ }, convertSixHundredThousandToLatLng = function(e, t) {
72
+ const o = Number(t) / 6e5;
73
+ return [Number(e) / 6e5, o];
74
+ }, formatArea = (e, t) => {
75
+ const n = getArea(e);
76
+ let i;
77
+ switch (t) {
78
+ case LENGTH_UNIT.KM:
79
+ n > 1e4 ? i = Math.round(n / 1e6 * 100) / 100 + " km<sup>2</sup>" : i = Math.round(n * 100) / 100 + " m<sup>2</sup>";
80
+ break;
81
+ case LENGTH_UNIT.NM:
82
+ const r = Math.pow(1.852, 2);
83
+ n > 1e4 ? i = Math.round(n / 1e6 / r * 100) / 100 + " nm<sup>2</sup>" : i = Math.round(n * 100) / 100 + " m<sup>2</sup>";
84
+ break;
85
+ }
86
+ return i;
87
+ }, convertShipMapData = (e) => {
88
+ const t = (o) => new ShipMapData(
89
+ o.id,
90
+ o.id,
91
+ // 船舶三角形填充色
92
+ o.fill || "#04C900",
93
+ "70",
94
+ (o.cnname || o.enname || o.name || o.id) + `${o.existName ? o.existName : ""}`,
95
+ o.len || o.length,
96
+ o.wid || o.breadth,
97
+ o.lon,
98
+ o.lat,
99
+ (/* @__PURE__ */ new Date()).getTime(),
100
+ o.spd,
101
+ o.from,
102
+ o.status,
103
+ Number(o.hdg),
104
+ o.cog,
105
+ Number(o.postype),
106
+ "other",
107
+ o.cog,
108
+ o.leftIconColor,
109
+ o.existDevice,
110
+ o.existMobile,
111
+ o.existWaterGauge,
112
+ o.selected,
113
+ o.blinkColors
114
+ );
115
+ return Array.isArray(e) ? e.map((o) => t(o)) : t(e);
116
+ }, formatUtils = {
117
+ formatLength,
118
+ convertSixHundredThousandToLatLng,
119
+ formatArea
120
+ }, mapInstance$9 = ref(), shipsLayer = ref(), largeAmountShipsLayer = ref(), selectShipsLayer = ref(), allShips = ref([]), selectSingleShipData = ref();
121
+ ref();
122
+ const trucksLayer = ref(), shipTrackLineFeatures = ref([]), trackLineVectorSource = ref(), shipTrackVectorLayer = ref();
123
+ ref();
124
+ ref();
125
+ const shipLabels = ref([]), trackLabels = ref([]), showTrackLayer = ref(!1), allTracks = ref([]), currentTrackId = ref(""), showTrackAnimatMarker = ref(!1), hiddenOrther = ref(!1), showDrawLayer = ref(!1), _hoisted_1$4 = {
126
+ key: 0,
127
+ class: "measure-panel"
128
+ }, _hoisted_2$2 = { class: "d-flex justify-content-between align-content-start w-100" }, _hoisted_3$1 = { class: "measure-history-list" }, _hoisted_4 = { class: "left-panel" }, _hoisted_5 = { class: "text index" }, _hoisted_6 = { class: "text" }, _hoisted_7 = ["onClick"], _sfc_main$5 = /* @__PURE__ */ defineComponent({
129
+ __name: "measure",
130
+ props: /* @__PURE__ */ mergeModels({
131
+ viewMode: {}
132
+ }, {
133
+ visible: { type: Boolean },
134
+ visibleModifiers: {}
135
+ }),
136
+ emits: /* @__PURE__ */ mergeModels(["close"], ["update:visible"]),
137
+ setup(e, { expose: t, emit: o }) {
138
+ const n = inject("mapInstance"), i = o, r = useModel(e, "visible"), l = ref("3"), c = ref([]), s = ref(!1), m = new VectorSource();
139
+ let d, u, f, p, h;
140
+ const v = new VectorLayer({
141
+ source: m,
142
+ style: {
143
+ "fill-color": "rgba(255, 255, 255, 0.2)",
144
+ "stroke-color": "#ffcc33",
145
+ "stroke-width": 2,
146
+ "circle-radius": 7,
147
+ "circle-fill-color": "#ffcc33"
148
+ }
149
+ }), g = function(S) {
150
+ if (S.dragging)
151
+ return;
152
+ let T = "点击选择起点";
153
+ d && (T = "单击继续,双击结束"), u && (u.innerHTML = T, f.setPosition(S.coordinate), u.classList.remove("hidden"));
154
+ }, k = () => {
155
+ var S, T;
156
+ n != null && n.value && ((S = n == null ? void 0 : n.value) == null || S.on("pointermove", g), (T = n == null ? void 0 : n.value) == null || T.getViewport().addEventListener("mouseout", function() {
157
+ var b;
158
+ (b = u == null ? void 0 : u.classList) == null || b.add("hidden");
159
+ }), s.value = !0);
160
+ };
161
+ let M;
162
+ const I = new Style({
163
+ fill: new Fill({
164
+ color: "rgba(255, 255, 255, 0.2)"
165
+ }),
166
+ stroke: new Stroke({
167
+ color: "rgba(255,204,51)",
168
+ lineDash: [10, 10],
169
+ width: 2
170
+ }),
171
+ image: new CircleStyle({
172
+ radius: 5,
173
+ stroke: new Stroke({
174
+ color: "rgba(0, 0, 0, 0.7)"
175
+ }),
176
+ fill: new Fill({
177
+ color: "rgba(255, 255, 255, 0.2)"
178
+ })
179
+ })
180
+ });
181
+ function E() {
182
+ var S, T;
183
+ if (n != null && n.value) {
184
+ if (showDrawLayer.value = !1, c.value = [], document.querySelectorAll(".ol-tooltip.ol-tooltip-static").forEach((b) => {
185
+ var P;
186
+ (P = b == null ? void 0 : b.parentNode) == null || P.removeChild(b);
187
+ }), m.clear(), M) {
188
+ const b = n.value.getInteractions().getArray().find((P) => getUid(P) === getUid(M));
189
+ b && ((S = n.value) == null || S.removeInteraction(b));
190
+ }
191
+ (T = n.value) == null || T.removeLayer(v), u != null && u.parentNode && u.parentNode.removeChild(u), p != null && p.parentNode && p.parentNode.removeChild(p);
192
+ }
193
+ }
194
+ function V() {
195
+ var T, b;
196
+ E(), (T = n == null ? void 0 : n.value) == null || T.addLayer(v), showDrawLayer.value = !0, M = new Draw({
197
+ source: m,
198
+ type: "LineString",
199
+ style: function() {
200
+ return I;
201
+ },
202
+ // 添加条件函数,判断是否应该触发绘制
203
+ condition: function(P) {
204
+ return P.originalEvent.target.tagName !== "DIV";
205
+ }
206
+ }), (b = n == null ? void 0 : n.value) == null || b.addInteraction(M), $(), F();
207
+ let S;
208
+ M.on("drawstart", function(P) {
209
+ var N;
210
+ d = P.feature, d.set("randomId", w());
211
+ let x;
212
+ S = (N = d.getGeometry()) == null ? void 0 : N.on("change", function(R) {
213
+ const B = R.target;
214
+ let D = formatUtils.formatLength(B, Number(l.value));
215
+ x = B.getLastCoordinate(), p && D && (p.innerHTML = D), h.setPosition(x);
216
+ });
217
+ }), M.on("drawend", function() {
218
+ var P;
219
+ if (p && (p.className = "ol-tooltip ol-tooltip-static ol-tooltip-measure"), p != null && p.innerHTML) {
220
+ const x = (d == null ? void 0 : d.get("randomId")) || w();
221
+ c.value.push({ id: x, value: p == null ? void 0 : p.innerHTML }), p.innerHTML = `${p.innerHTML}<div class="ol-tooltip-delete-button" data-id="${x}"><i class="map-iconfont icon-delete"></i></div>`;
222
+ }
223
+ (P = document.querySelector(".ol-selectable:has(.ol-tooltip-delete-button):last-child .ol-tooltip-delete-button")) == null || P.addEventListener("click", (x) => {
224
+ var R;
225
+ x.preventDefault(), x.stopPropagation();
226
+ const N = (R = x.target) == null ? void 0 : R.getAttribute("data-id");
227
+ N && y(N);
228
+ }), h.setOffset([0, -7]), d = null, p = null, $(), S && unByKey(S);
229
+ });
230
+ }
231
+ function F() {
232
+ var S;
233
+ u != null && u.parentNode && u.parentNode.removeChild(u), u = document.createElement("div"), u.className = "ol-tooltip hidden", f = new Overlay({
234
+ element: u,
235
+ offset: [15, 0],
236
+ positioning: "center-left"
237
+ }), (S = n == null ? void 0 : n.value) == null || S.addOverlay(f);
238
+ }
239
+ function $() {
240
+ var S;
241
+ p != null && p.parentNode && p.parentNode.removeChild(p), p = document.createElement("div"), p.className = "ol-tooltip ol-tooltip-measure", h = new Overlay({
242
+ element: p,
243
+ offset: [0, -15],
244
+ positioning: "bottom-center",
245
+ stopEvent: !1,
246
+ insertFirst: !1
247
+ }), (S = n == null ? void 0 : n.value) == null || S.addOverlay(h);
248
+ }
249
+ const y = (S) => {
250
+ var b, P;
251
+ const T = c.value.findIndex((x) => x.id === S);
252
+ if (T !== -1) {
253
+ c.value.splice(T, 1);
254
+ const x = document.querySelectorAll(".ol-tooltip.ol-tooltip-static.ol-tooltip-measure");
255
+ x[T] && ((P = (b = x[T]) == null ? void 0 : b.parentNode) == null || P.removeChild(x[T]));
256
+ const N = m.getFeatures();
257
+ N[T] && m.removeFeature(N[T]);
258
+ }
259
+ }, L = () => {
260
+ i("close");
261
+ }, w = () => Math.random().toString(36).substring(2, 9);
262
+ return watch(() => r, () => {
263
+ r.value && !s.value && (k(), V());
264
+ }, { deep: !0, immediate: !0 }), t({
265
+ addInteraction: V,
266
+ removeInteraction: E
267
+ }), (S, T) => r.value && S.viewMode !== "WxMiniprogram" ? (openBlock(), createElementBlock("div", _hoisted_1$4, [
268
+ createElementVNode("div", { class: "header" }, [
269
+ T[1] || (T[1] = createElementVNode("div", { class: "title" }, "测量", -1)),
270
+ createElementVNode("i", {
271
+ onClick: L,
272
+ class: "map-iconfont icon-close"
273
+ })
274
+ ]),
275
+ createElementVNode("div", _hoisted_2$2, [
276
+ T[2] || (T[2] = createElementVNode("div", { class: "tips" }, "在地图上点击多个点测量距离,距离单位", -1)),
277
+ createVNode(unref(ElSelect), {
278
+ class: "select-length-unit",
279
+ modelValue: l.value,
280
+ "onUpdate:modelValue": T[0] || (T[0] = (b) => l.value = b)
281
+ }, {
282
+ default: withCtx(() => [
283
+ createVNode(unref(ElOption), {
284
+ label: "m",
285
+ value: "1"
286
+ }),
287
+ createVNode(unref(ElOption), {
288
+ label: "km",
289
+ value: "2"
290
+ }),
291
+ createVNode(unref(ElOption), {
292
+ label: "nm",
293
+ value: "3"
294
+ })
295
+ ]),
296
+ _: 1
297
+ }, 8, ["modelValue"])
298
+ ]),
299
+ createElementVNode("div", _hoisted_3$1, [
300
+ (openBlock(!0), createElementBlock(Fragment, null, renderList(c.value, (b, P) => (openBlock(), createElementBlock("div", {
301
+ class: "measure-history-item",
302
+ key: b.id
303
+ }, [
304
+ createElementVNode("div", _hoisted_4, [
305
+ T[3] || (T[3] = createElementVNode("i", { class: "map-iconfont icon-line" }, null, -1)),
306
+ createElementVNode("span", _hoisted_5, "线段" + toDisplayString(P + 1), 1),
307
+ createElementVNode("span", _hoisted_6, toDisplayString(b.value), 1)
308
+ ]),
309
+ createElementVNode("div", {
310
+ class: "delete-button",
311
+ onClick: (x) => y(b.id)
312
+ }, T[4] || (T[4] = [
313
+ createElementVNode("i", { class: "map-iconfont icon-delete" }, null, -1)
314
+ ]), 8, _hoisted_7)
315
+ ]))), 128))
316
+ ])
317
+ ])) : createCommentVNode("", !0);
318
+ }
319
+ }), Measure = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["__scopeId", "data-v-3277433d"]]), mapInstance$8 = ref(), renderMarkerSetInstance = (e) => mapInstance$8.value = e, markerPosition = ref(""), marker = ref(), createIconStyle = (e) => new Style({
320
+ image: new Icon({
321
+ src: CDN_URL + "map/poi-marker-default.png",
322
+ anchor: [0.5, 1]
323
+ }),
324
+ text: new Text({
325
+ text: e,
326
+ offsetY: -90,
327
+ // 调整文本位置,使其位于标记上方
328
+ font: "12px",
329
+ fill: new Fill({
330
+ color: "#000"
331
+ }),
332
+ stroke: new Stroke({
333
+ color: "#fff",
334
+ width: 2
335
+ }),
336
+ backgroundFill: new Fill({
337
+ color: "#fff"
338
+ // 设置文本背景填充颜色
339
+ }),
340
+ backgroundStroke: new Stroke({
341
+ color: "#000",
342
+ // 设置文本背景描边颜色
343
+ width: 1
344
+ }),
345
+ padding: [2, 2, 2, 2]
346
+ // 设置文本背景的内边距
347
+ })
348
+ }), renderMarker = (e, t = !0, o = !0) => {
349
+ var d;
350
+ if (!mapInstance$8.value || !e || e.split(",").length !== 2) return;
351
+ const [n, i] = e.split(",").map(Number);
352
+ marker.value = new Feature({
353
+ geometry: new Point(fromLonLat([n, i]))
354
+ });
355
+ const r = o ? `${n}, ${i}` : "";
356
+ (d = marker.value) == null || d.setStyle(createIconStyle(r));
357
+ const l = new VectorSource({
358
+ features: [marker.value]
359
+ }), c = new VectorLayer({
360
+ source: l
361
+ }), s = mapInstance$8.value.getView();
362
+ if (mapInstance$8.value.addLayer(c), t) {
363
+ const u = new Translate({
364
+ layers: [c]
365
+ });
366
+ u.on("translating", function(f) {
367
+ var v;
368
+ const p = f.features.item(0).getGeometry().getCoordinates(), h = toLonLat(p);
369
+ markerPosition.value = `${h[0].toFixed(6)}, ${h[1].toFixed(6)}`, (v = marker.value) == null || v.setStyle(createIconStyle(markerPosition.value));
370
+ }), mapInstance$8.value.addInteraction(u);
371
+ }
372
+ const m = new Point([n, i]);
373
+ s.setCenter(transform(m.getCoordinates(), projection.data, projection.mercator)), s.setZoom(mapZoom.findShip);
374
+ }, setMarkerPosition = (e) => {
375
+ var i, r;
376
+ if (!mapInstance$8.value) return;
377
+ const t = mapInstance$8.value.getView(), o = e.split(",").map(Number);
378
+ (r = (i = marker.value) == null ? void 0 : i.getGeometry()) == null || r.setCoordinates(fromLonLat([o[0], o[1]]));
379
+ const n = new Point([o[0], o[1]]);
380
+ t.setCenter(transform(n.getCoordinates(), projection.data, projection.mercator)), t.setZoom(mapZoom.markerPosition);
381
+ }, CDN_URL = "https://static.zhihaoscm.cn/", tiandituKey = "a6e8f78974f2581f2ca00485b40c948f", zhongkeKey = "15c81cc0a191a232e0a0ca1a51c3ca81", baseMap = {
382
+ // 矢量底图
383
+ // zhongkeTile: `https://api.open.geovisearth.com/map/v1/vec/{z}/{x}/{y}?token=${zhongkeKey}&format=png&tmsIds=w`,
384
+ tiandituTile: `https://t0.tianditu.gov.cn/vec_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=vec&TILEMATRIXSET=w&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=${tiandituKey}`,
385
+ // 矢量注记
386
+ tiandituTileMark: `https://t0.tianditu.gov.cn/cva_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cva&TILEMATRIXSET=w&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=${tiandituKey}`,
387
+ // 影像底图
388
+ // zhongkeImgTile: `https://api.open.geovisearth.com/map/v1/img/{z}/{x}/{y}?token=${zhongkeKey}&format=webp&tmsIds=w`,
389
+ tiandituImgTile: `https://t0.tianditu.gov.cn/img_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&TILEMATRIXSET=w&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=${tiandituKey}`,
390
+ // 影像注记
391
+ tiandituImgTileMark: `https://t0.tianditu.gov.cn/cia_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cia&TILEMATRIXSET=w&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=${tiandituKey}`,
392
+ // 绿点图
393
+ greenTile: `${CDN_URL}/map/tile/{z}/{x}/{y}.png`
394
+ }, mapZoom = {
395
+ // 地图默认层级
396
+ default: 6,
397
+ // 地图缩放最小层级
398
+ min: 3,
399
+ // 地图缩放最大层级
400
+ max: 18,
401
+ // 查看船舶详情时地图缩放层级
402
+ findShipMin: 10,
403
+ findShip: 13,
404
+ // 查看车辆详情时地图缩放层级
405
+ findTruck: 14,
406
+ // 船舶绿点图最大显示层级
407
+ shipGreenDotMax: 11,
408
+ // 查车图标显示层级
409
+ truckDefault: 14,
410
+ // 统计图标显示层级
411
+ truckStatistics: 8,
412
+ // 船形图标最小渲染层级
413
+ shipModelMin: 13,
414
+ // 船形图标最大渲染层级
415
+ shipModelMax: 18,
416
+ markerPosition: 14
417
+ }, renderShipsLimit = 200, mapDefaultCenter = [114.84, 30.52], projection = {
418
+ // 经纬度 源数据 地理坐标 WGS84
419
+ data: "EPSG:4326",
420
+ // 墨卡托投影坐标 渲染坐标
421
+ mercator: "EPSG:3857"
422
+ }, LOG_DATE_FORMAT = "YYYY-MM-DD HH:mm:ss", DEFAULT_VALUE = "--";
423
+ function getIconFont(unicode = "") {
424
+ return unicode.indexOf("&amp;") !== -1 && (unicode = unicode.replace("&amp;", "&")), unicode.indexOf("&amp") !== -1 && (unicode = unicode.replace("&amp", "&")), eval('("' + unicode.replace("&#x", "\\u").replace(";", "") + '")');
425
+ }
426
+ const multiplyPixelRatio = (e) => {
427
+ const t = window.devicePixelRatio || 1;
428
+ return e.map((o) => o.map((n) => n * t));
429
+ }, adjustBounds = (e, t) => t.length === 2 ? [e[0] - t[0], e[1] - t[1], e[2] + t[0], e[3] + t[1]] : [e[0] + t[0], e[1] + t[1], e[2] + t[2], e[3] + t[3]], isOverlapping = (e, t) => e[0] <= t[2] && e[2] >= t[0] && e[1] <= t[3] && e[3] >= t[1], getIconStyle = (e) => new Style({
430
+ text: new Text({
431
+ font: "Normal 14px map-iconfont",
432
+ text: getIconFont(e),
433
+ fill: new Fill({ color: "#fff" }),
434
+ offsetY: -14
435
+ }),
436
+ zIndex: 100
437
+ }), getRotation = (e, t, o) => {
438
+ function n(u) {
439
+ return 180 * (u % (2 * Math.PI)) / Math.PI;
440
+ }
441
+ function i(u) {
442
+ return u % 360 * Math.PI / 180;
443
+ }
444
+ function r(u) {
445
+ if (!u) throw new Error("Coordinate is required");
446
+ if (!Array.isArray(u)) {
447
+ if (u.type === "Feature" && u.geometry !== null && u.geometry.type === "Point")
448
+ return u.geometry.coordinates;
449
+ if (u.type === "Point") return u.coordinates;
450
+ }
451
+ if (Array.isArray(u) && u.length >= 2 && !Array.isArray(u[0]) && !Array.isArray(u[1]))
452
+ return u;
453
+ throw new Error(
454
+ "Coordinate must be GeoJSON Point or an Array of numbers"
455
+ );
456
+ }
457
+ function l(u, f, p = {}) {
458
+ if (p.final)
459
+ return function(F, $) {
460
+ return (l($, F) + 180) % 360;
461
+ }(u, f);
462
+ const h = r(u), v = r(f), g = i(h[0]), k = i(v[0]), M = i(h[1]), I = i(v[1]), E = Math.sin(k - g) * Math.cos(I), V = Math.cos(M) * Math.sin(I) - Math.sin(M) * Math.cos(I) * Math.cos(k - g);
463
+ return n(Math.atan2(E, V));
464
+ }
465
+ function c(u) {
466
+ return !isNaN(u) && u !== null && !Array.isArray(u);
467
+ }
468
+ function s(u, f = {}, p = {}) {
469
+ return u || console.log("Coordinates are required"), Array.isArray(u) || console.log("Coordinates must be an Array"), u.length < 2 && console.log("Coordinates must be at least 2 numbers long"), (!c(u[0]) || !c(u[1])) && console.log("Coordinates must contain numbers"), m({ type: "Point", coordinates: u }, f, p);
470
+ }
471
+ function m(u, f = {}, p = {}) {
472
+ const h = { type: "Feature" };
473
+ return p.id !== void 0 && (h.id = p.id), p.bbox && (h.bbox = p.bbox), h.properties = f || {}, h.geometry = u, h;
474
+ }
475
+ const d = l(s(e), s(t), o);
476
+ return d < 0 ? 360 + d : d;
477
+ }, triangleModel = multiplyPixelRatio([
478
+ [0, -8],
479
+ [5, 8],
480
+ [-5, 8]
481
+ ]), shipShapeModel = multiplyPixelRatio([
482
+ [0, -4.545],
483
+ [-0.56, -3.909],
484
+ [-1, -2.727],
485
+ [-1, 3.636],
486
+ [-0.8, 4.545],
487
+ [0.8, 4.545],
488
+ [1, 3.636],
489
+ [1, -2.727],
490
+ [0.56, -3.909],
491
+ [0, -4.545]
492
+ ]), shipDirectPath = {
493
+ left: {
494
+ 0: [
495
+ [0, 0],
496
+ [0, -8],
497
+ [-4, -8]
498
+ ],
499
+ 1: [
500
+ [0, 0],
501
+ [0, -16],
502
+ [-6, -16]
503
+ ],
504
+ 2: [
505
+ [0, 0],
506
+ [0, -24],
507
+ [-8, -24]
508
+ ]
509
+ },
510
+ right: {
511
+ 0: [
512
+ [0, 0],
513
+ [0, -8],
514
+ [-4, -8]
515
+ ],
516
+ 1: [
517
+ [0, 0],
518
+ [0, -16],
519
+ [-6, -16]
520
+ ],
521
+ 2: [
522
+ [0, 0],
523
+ [0, -24],
524
+ [-8, -24]
525
+ ]
526
+ },
527
+ front: {
528
+ 0: [
529
+ [0, 0],
530
+ [0, -8]
531
+ ],
532
+ 1: [
533
+ [0, 0],
534
+ [0, -16]
535
+ ],
536
+ 2: [
537
+ [0, 0],
538
+ [0, -24]
539
+ ]
540
+ }
541
+ }, setBlankStyle = () => new Style({
542
+ image: new CircleStyle({
543
+ radius: 0
544
+ })
545
+ }), isMapMoving = ref(!1), mapInstance$7 = ref(), renderShipStyleSetInstance = (e) => {
546
+ mapInstance$7.value = e, e.on("movestart", () => {
547
+ isMapMoving.value = !0;
548
+ }), e.on("moveend", () => {
549
+ isMapMoving.value = !1, e.render();
550
+ });
551
+ }, speedCondition = [[1, 10], [10, 20], [20, 1 / 0]], drawShipModelByZoom = { 14: [200, 30], 15: [115, 15], 16: [55, 8], 17: [25, 5], 18: [1, 1] }, setShipStyle = (e, t = !1) => new Style({
552
+ renderer: (o, n) => {
553
+ var c, s;
554
+ o = o;
555
+ const i = n.context, r = n.feature.get("data");
556
+ if (!r) return;
557
+ const l = n.feature.get("index");
558
+ (l === 0 || l === void 0) && (shipLabels.value = []);
559
+ try {
560
+ const m = drawShipBody(i, r, o, t);
561
+ m && (drawHeading(i, r, m, t), r.selected = e, !isMapMoving.value && e && (drawSelectBounds(i, m), (s = (c = trackLineVectorSource.value) == null ? void 0 : c.getFeatures()) != null && s.some((u) => {
562
+ const f = u.get("data");
563
+ return (f == null ? void 0 : f.id) === r.id;
564
+ }) || setTimeout(() => {
565
+ drawSelectBounds(i, m);
566
+ }, 1))), drawShipLabel(i, r, o), e && setTimeout(() => {
567
+ drawShipLabel(i, r, o);
568
+ }, 1);
569
+ } catch {
570
+ return !1;
571
+ }
572
+ }
573
+ }), drawShipBody = (e, t, o, n) => {
574
+ if (!mapInstance$7.value) return;
575
+ const i = Math.round(Number(mapInstance$7.value.getView().getZoom()));
576
+ if (!i) return;
577
+ let r = [];
578
+ const [l, c] = drawShipModelByZoom[i] || [0, 0], [s, m] = o;
579
+ if (i <= mapZoom.shipModelMax && i > mapZoom.shipModelMin && t.length >= l && t.breadth >= c)
580
+ r = rotateShapeModel(drawCurrentShipShapeModel(t, i), t.angle).map((u) => {
581
+ const [f, p] = u;
582
+ return [s + f, m + p];
583
+ });
584
+ else {
585
+ const d = rotateShapeModel(triangleModel, t.angle);
586
+ o.length === 2 && (r = d.map((u) => {
587
+ const [f, p] = u;
588
+ return [s + f, m + p];
589
+ }));
590
+ }
591
+ if (!(r.length > 2)) return !1;
592
+ if (t != null && t.length) {
593
+ const d = r.length === 3 ? 30 : t.length * 0.4;
594
+ e.beginPath(), e.arc(
595
+ o[0],
596
+ o[1],
597
+ d,
598
+ 0,
599
+ 2 * Math.PI
600
+ ), e.fillStyle = "rgba(255, 255, 255, 0.001)", e.fill();
601
+ }
602
+ e.save(), e.beginPath(), e.moveTo(r[0][0], r[0][1]);
603
+ for (let d = 1; d < r.length; d++)
604
+ e.lineTo(r[d][0], r[d][1]);
605
+ return e.closePath(), e.strokeStyle = n ? "#ff0000" : "#000", e.lineWidth = n ? 2 : 1, e.stroke(), e.fillStyle = t.fill, e.fill(), e.restore(), r;
606
+ }, drawHeading = (e, t, o, n) => {
607
+ const [i, r] = o[0], l = getShipDirectPath(t);
608
+ if (l) {
609
+ const c = l.map(function(s) {
610
+ const [m, d] = s;
611
+ return [m + i, d + r];
612
+ });
613
+ if (e.save(), e.beginPath(), t.angle > 0) {
614
+ e.translate(i, r);
615
+ const s = t.angle * Math.PI / 180;
616
+ e.rotate(s), e.translate(-i, -r);
617
+ }
618
+ e.moveTo(i, r);
619
+ for (let s = 1; s < c.length; s++) {
620
+ const [m, d] = c[s];
621
+ e.lineTo(m, d);
622
+ }
623
+ e.strokeStyle = n ? "#ff0000" : "#000", e.lineWidth = n ? 2 : 1, e.stroke(), e.restore();
624
+ }
625
+ }, drawSelectBounds = (e, t) => {
626
+ let [o, n, i, r] = getPixelFromCoordinate(t);
627
+ const l = window.devicePixelRatio || 1, c = 4;
628
+ o -= c, n -= c, i += c, r += c, e.save(), e.strokeStyle = "#ff0000", e.lineWidth = 4 * l;
629
+ const s = 8 * l;
630
+ e.beginPath(), e.moveTo(o + s, r), e.lineTo(o, r), e.lineTo(o, r - s), e.moveTo(o, n + s), e.lineTo(o, n), e.lineTo(o + s, n), e.moveTo(i - s, n), e.lineTo(i, n), e.lineTo(i, n + s), e.moveTo(i, r - s), e.lineTo(i, r), e.lineTo(i - s, r), e.stroke(), e.restore();
631
+ }, drawShipLabel = (e, t, o) => {
632
+ if (!t.selected && shipLabels.value.find((u) => u.id === t.id)) return;
633
+ const [n, i] = o, r = n, l = i, c = t.name;
634
+ let s;
635
+ t.leftIconColor && (s = { color: t.leftIconColor, icon: "&#xe599;" });
636
+ const m = getShipCustomIcon(t), d = {
637
+ id: t.id,
638
+ center: [r, l],
639
+ text: c,
640
+ fill: t.fill,
641
+ color: "#fff",
642
+ textColor: "#000",
643
+ bgColor: "#fff",
644
+ leftIcon: s,
645
+ rightIcons: m,
646
+ selected: t.selected,
647
+ blinkColors: t.blinkColors,
648
+ type: "ShipName"
649
+ };
650
+ mapInstance$7.value && drawLabel(e, d, shipLabels.value, mapInstance$7.value);
651
+ }, drawCurrentShipShapeModel = (e, t) => {
652
+ let o = 0;
653
+ t <= 14 ? o = 0.058 : t === 15 ? o = 0.12 : t === 16 ? o = 0.22 : t === 17 ? o = 0.435 : t === 18 && (o = 0.857);
654
+ const n = e.length / 4 * o, i = e.breadth * o;
655
+ let r = cloneDeep(shipShapeModel);
656
+ return r = r.map(([l, c]) => [l * i, c * n]), r;
657
+ }, getShipDirectPath = (e) => {
658
+ const { speed: t, hdg: o, cog: n } = e;
659
+ let i = "", r = null;
660
+ if (t && t > 1 && (o !== null && o != 511 && n !== null ? n - o >= 3 ? i = "left" : n - o <= -3 ? i = "right" : i = "front" : i = "front", i && t))
661
+ for (let l = 0; l < speedCondition.length; l++) {
662
+ const c = speedCondition[l];
663
+ if (t >= c[0] && t < c[1]) {
664
+ r = shipDirectPath[i][l];
665
+ break;
666
+ }
667
+ }
668
+ return r;
669
+ }, getShipCustomIcon = (e) => {
670
+ const t = [];
671
+ return e.existDevice && t.push("&#xe687;"), e.existMobile && t.push("&#xe688;"), e.existWaterGauge && t.push("&#xe686;"), t || [];
672
+ }, mapInstance$6 = ref(), renderShipSetInstance = (e) => mapInstance$6.value = e;
673
+ let shipsMarkerList = [], shipsVectorSource, largeAmountShipsSource;
674
+ const selectedShipData = ref(null), selectedShips = ref([]);
675
+ let selectShipsVectorSource, hoveredFeature = null, hoveredFeatures = [];
676
+ const renderShips = (e) => {
677
+ var i, r, l, c;
678
+ if (!mapInstance$6.value || showTrackLayer.value) return;
679
+ const t = e.reduce((s, m) => (s.some((d) => d.id === m.id) || s.push(m), s), []), o = Math.round(Number(mapInstance$6.value.getView().getZoom()));
680
+ if (selectedShipData.value && nextTick(() => {
681
+ selectSingleShipMarker(selectedShipData.value);
682
+ }).then((s) => {
683
+ }), !o || o < mapZoom.shipGreenDotMax) return;
684
+ const n = [...t, ...selectedShips.value].reduce((s, m) => (s.some((d) => d.id === m.id) || s.push(m), s), []);
685
+ if (allShips.value.forEach((s) => {
686
+ var m;
687
+ !n.some((d) => d.id === s.id) && ((m = s.blinkColors) != null && m.length) && checkBlinkLabelExist(mapInstance$6.value, shipLabels.value, s.id);
688
+ }), allShips.value = n, !hiddenOrther.value)
689
+ return o >= mapZoom.shipGreenDotMax && o < mapZoom.shipModelMin ? ((i = shipsLayer.value) == null || i.setVisible(!1), (r = largeAmountShipsLayer.value) == null || r.setVisible(!0), renderLargeAmountShips(allShips.value)) : ((l = largeAmountShipsLayer.value) == null || l.setVisible(!1), (c = shipsLayer.value) == null || c.setVisible(!0), renderShipsMarker(allShips.value));
690
+ }, renderLargeAmountShips = (e) => {
691
+ if (!mapInstance$6.value) return;
692
+ const t = e.map((o) => ({
693
+ type: "Feature",
694
+ geometry: {
695
+ type: "Point",
696
+ coordinates: [o.lon, o.lat]
697
+ },
698
+ properties: o
699
+ }));
700
+ return largeAmountShipsSource == null || largeAmountShipsSource.clear(), largeAmountShipsSource = new VectorSource({
701
+ features: new GeoJSON().readFeatures({
702
+ type: "FeatureCollection",
703
+ features: t
704
+ }, {
705
+ featureProjection: projection.mercator
706
+ })
707
+ }), largeAmountShipsLayer.value = new WebGLPointsLayer({
708
+ source: largeAmountShipsSource,
709
+ style: {
710
+ "shape-points": 3,
711
+ "shape-radius": 9,
712
+ "shape-fill-color": [
713
+ "case",
714
+ ["==", ["get", "fill"], "#D9001C"],
715
+ "#D9001C",
716
+ // 如果 fill 是 #D9001C,返回红色
717
+ ["==", ["get", "fill"], "#04C900"],
718
+ "#04C900",
719
+ // 如果 fill 是 #04C900,返回绿色
720
+ "#04C900"
721
+ // 默认颜色(绿色)
722
+ ],
723
+ "shape-rotate-with-view": !1,
724
+ "shape-rotation": [
725
+ "+",
726
+ ["get", "cog"],
727
+ // 获取 'cog' 属性值
728
+ 180
729
+ // 将值旋转 180 度
730
+ ],
731
+ "shape-scale": [0.8, 1.2],
732
+ // 边框颜色为条件判断,悬浮时显示红色,否则黑色
733
+ "shape-stroke-color": [
734
+ "case",
735
+ ["==", ["get", "hover"], 0],
736
+ "#000000",
737
+ ["==", ["get", "hover"], 1],
738
+ "#FF0000",
739
+ "#000000"
740
+ // 默认颜色(黑色)
741
+ ],
742
+ "shape-stroke-width": 0.5
743
+ }
744
+ }), mapInstance$6.value.addLayer(largeAmountShipsLayer.value), largeAmountShipsLayer.value;
745
+ }, renderShipsMarker = (e) => {
746
+ var o;
747
+ if (!mapInstance$6.value) return;
748
+ deleteAllShipMarkers();
749
+ let t = convertShipMapData(e);
750
+ if (t = customFilterShips(t), !!(t != null && t.length))
751
+ return t.forEach((n, i) => {
752
+ const r = [n.lon, n.lat], l = new Feature({
753
+ geometry: new Point(fromLonLat(r))
754
+ }), c = 1;
755
+ l.set("clickGeometry", new Circle(fromLonLat(r), c)), l.set("data", n), l.set("index", i), l.setStyle(
756
+ setShipStyle(!1)
757
+ ), shipsMarkerList.push({
758
+ ship: n,
759
+ lonlat: r,
760
+ feature: l
761
+ });
762
+ }), shipsVectorSource = new VectorSource({
763
+ features: shipsMarkerList.map((n) => n.feature)
764
+ }), shipsLayer.value = new VectorLayer({
765
+ source: shipsVectorSource,
766
+ zIndex: 100
767
+ }), (o = mapInstance$6.value) == null || o.addLayer(shipsLayer.value), shipsLayer.value;
768
+ }, onShipsMarkerHover = () => {
769
+ var o;
770
+ let e = 0;
771
+ const t = 300;
772
+ (o = mapInstance$6.value) == null || o.on("pointermove", function(n) {
773
+ var c, s, m;
774
+ if (showDrawLayer.value) return;
775
+ const i = Date.now();
776
+ if (i - e < t)
777
+ return;
778
+ e = i;
779
+ const r = (c = mapInstance$6.value) == null ? void 0 : c.forEachFeatureAtPixel(n.pixel, (d) => d), l = (s = mapInstance$6.value) == null ? void 0 : s.getTargetElement();
780
+ if (l && (l.style.cursor = r ? "pointer" : ""), hoveredFeature !== r) {
781
+ if (hoveredFeature) {
782
+ hoveredFeature.set("hover", 0);
783
+ const d = hoveredFeature.get("data");
784
+ d != null && d.mmsi && hoveredFeature.setStyle(
785
+ setShipStyle(!1, !1)
786
+ ), hoveredFeature = null;
787
+ }
788
+ if (r) {
789
+ hoveredFeature = r, r.set("hover", 1);
790
+ const d = r.get("data");
791
+ if (!(d != null && d.mmsi)) return;
792
+ hoveredFeatures.push(r), r.setStyle(
793
+ setShipStyle(((m = selectedShipData.value) == null ? void 0 : m.id) === d.id, !0)
794
+ );
795
+ } else
796
+ hoveredFeatures.forEach((d) => {
797
+ var f;
798
+ d.set("hover", 0);
799
+ const u = d.get("data");
800
+ u != null && u.mmsi && d.setStyle(
801
+ setShipStyle(((f = selectedShipData.value) == null ? void 0 : f.id) === u.id, !1)
802
+ );
803
+ }), hoveredFeatures = [];
804
+ }
805
+ });
806
+ }, customFilterShips = (e) => {
807
+ let t = cloneDeep(e);
808
+ return t = t.filter((o) => {
809
+ var i;
810
+ const n = getFilterItem(o).every(({ btnShow: r, value: l }) => r ? !!l : !0);
811
+ return (switchBtnShow.value.camera || switchBtnShow.value.mobile || switchBtnShow.value.waterGauge) && ((i = selectedShipData.value) == null ? void 0 : i.id) === o.id && clearSelectFeature(), n;
812
+ }), t;
813
+ }, getFilterItem = (e) => [
814
+ { btnShow: switchBtnShow.value.camera, value: e == null ? void 0 : e.existDevice },
815
+ { btnShow: switchBtnShow.value.mobile, value: e == null ? void 0 : e.existMobile },
816
+ { btnShow: switchBtnShow.value.waterGauge, value: e == null ? void 0 : e.existWaterGauge }
817
+ ], deleteAllShipMarkers = () => {
818
+ shipsMarkerList.forEach((e) => {
819
+ e.feature && (shipsVectorSource == null || shipsVectorSource.removeFeature(e.feature));
820
+ }), clearAllInterval(), shipsMarkerList = [];
821
+ }, selectSingleShipMarker = (e) => {
822
+ var r;
823
+ if (!mapInstance$6.value) return;
824
+ const t = cloneDeep(selectSingleShipData.value);
825
+ selectSingleShipData.value = convertShipMapData(e);
826
+ const o = [selectSingleShipData.value.lon, selectSingleShipData.value.lat], n = new Feature({
827
+ geometry: new Point(fromLonLat(o))
828
+ });
829
+ if (n.set("data", selectSingleShipData.value), shipsLayer.value) {
830
+ const l = shipsLayer.value.getSource();
831
+ l && l.forEachFeature((c) => {
832
+ var s, m;
833
+ ((s = c.get("data")) == null ? void 0 : s.id) === ((m = selectSingleShipData.value) == null ? void 0 : m.id) && c.set("data", selectSingleShipData.value);
834
+ });
835
+ }
836
+ n.setStyle(
837
+ setShipStyle(!0)
838
+ ), shipsMarkerList.push({
839
+ ship: selectSingleShipData.value,
840
+ lonlat: o,
841
+ feature: n
842
+ }), selectShipsVectorSource == null || selectShipsVectorSource.clear(), selectShipsVectorSource = new VectorSource({
843
+ features: [n]
844
+ }), selectShipsLayer.value = new VectorLayer({
845
+ source: selectShipsVectorSource,
846
+ updateWhileInteracting: !0
847
+ }), shipsVectorSource && setVisibleFeatureById(shipsVectorSource, selectSingleShipData.value.id, !0);
848
+ const i = (r = shipsLayer.value) == null ? void 0 : r.getSource();
849
+ return i && (t && setVisibleFeatureById(i, t.id, !0), setVisibleFeatureById(i, selectSingleShipData.value.id, !1)), mapInstance$6.value.addLayer(selectShipsLayer.value), selectShipsLayer.value.setVisible(!0), hideAllHoveredShips(), selectShipsLayer.value;
850
+ }, hideAllHoveredShips = () => {
851
+ hoveredFeatures == null || hoveredFeatures.forEach((e) => {
852
+ var o;
853
+ const t = e == null ? void 0 : e.get("data");
854
+ t && e && e.setStyle(
855
+ setShipStyle(((o = selectedShipData.value) == null ? void 0 : o.id) === t.id, !1)
856
+ );
857
+ });
858
+ }, setVisibleFeatureById = (e, t, o) => {
859
+ e && e.forEachFeature((n) => {
860
+ const i = n.get("data");
861
+ i && i.id === t && n.setStyle(o ? setShipStyle(!1, !1) : setBlankStyle());
862
+ });
863
+ }, findShip = (e, t, o = !0) => {
864
+ var i, r, l, c, s;
865
+ if (!e || !mapInstance$6.value) return;
866
+ const n = (l = (r = (i = shipsLayer.value) == null ? void 0 : i.getSource()) == null ? void 0 : r.getFeatures()) == null ? void 0 : l.find((m) => {
867
+ var d;
868
+ return ((d = m.get("data")) == null ? void 0 : d.id) === e;
869
+ });
870
+ if (n)
871
+ selectedShipData.value = n.get("data");
872
+ else if (t && t.lon && t.lat)
873
+ selectedShipData.value = t;
874
+ else {
875
+ console.error("找不到船舶");
876
+ return;
877
+ }
878
+ if (selectedShips.value.some((m) => {
879
+ var d;
880
+ return m.id === ((d = selectedShipData.value) == null ? void 0 : d.id);
881
+ }) || selectedShips.value.push(selectedShipData.value), o && ((c = selectedShipData.value) != null && c.lon) && ((s = selectedShipData.value) != null && s.lat)) {
882
+ const m = mapInstance$6.value.getView(), d = new Point([selectedShipData.value.lon, selectedShipData.value.lat]);
883
+ m.setCenter(transform(d.getCoordinates(), projection.data, projection.mercator));
884
+ const u = m.getZoom(), f = u < mapZoom.findShipMin ? mapZoom.findShip : u;
885
+ m.setZoom(f);
886
+ }
887
+ return setTimeout(() => {
888
+ t && selectSingleShipMarker(t);
889
+ }, 50), n;
890
+ }, clearSelectFeature = () => {
891
+ var e;
892
+ if (selectedShipData.value && shipsVectorSource && selectSingleShipData.value) {
893
+ setVisibleFeatureById(shipsVectorSource, selectSingleShipData.value.id, !1);
894
+ const t = (e = shipsLayer.value) == null ? void 0 : e.getSource();
895
+ t && setVisibleFeatureById(t, selectSingleShipData.value.id, !0);
896
+ }
897
+ selectedShipData.value = null, selectedShips.value = [], mapInstance$6.value && (selectShipsVectorSource == null || selectShipsVectorSource.clear(), selectShipsLayer.value = new VectorLayer({
898
+ source: selectShipsVectorSource
899
+ }), mapInstance$6.value.addLayer(selectShipsLayer.value), selectShipsLayer.value.setVisible(!1));
900
+ }, hiddenAllShips = () => {
901
+ var e, t;
902
+ (e = shipsLayer.value) == null || e.setVisible(!1), (t = largeAmountShipsLayer.value) == null || t.setVisible(!1), clearAllInterval();
903
+ }, switchBtnShow = ref({
904
+ // 船舶摄像头过滤开关
905
+ [SWITCH_BTN.Camera]: !1,
906
+ // 船舶联系方式过滤开关
907
+ [SWITCH_BTN.Mobile]: !1,
908
+ // 船舶水尺过滤开关
909
+ [SWITCH_BTN.WaterGauge]: !1
910
+ }), switchFilterItem = (e, t) => {
911
+ switchBtnShow.value[e] = t, renderShips(allShips.value);
912
+ }, rerenderShip = () => {
913
+ renderShips(allShips.value);
914
+ }, clearShipData = (e = !0) => {
915
+ shipsVectorSource == null || shipsVectorSource.clear(), shipsMarkerList = [], selectedShips.value = [], shipLabels.value = [], e && (selectShipsVectorSource == null || selectShipsVectorSource.clear());
916
+ }, labelAlpha = 0.8, pixelRatio = window.devicePixelRatio || 1, labelFont = `500 ${12 * pixelRatio}px Arial`, labelOutSize = 2 * pixelRatio, labelHeight = 10 * pixelRatio, fillRectRadius = (e, t, o, n, i, r, l = 4) => {
917
+ e.beginPath(), e.moveTo(t + l, o), e.arcTo(t + n, o, t + n, o + l, l), e.arcTo(t + n, o + i, t + n - l, o + i, l), e.arcTo(t, o + i, t, o + i - l, l), e.arcTo(t, o, t + l, o, l), e.closePath(), e.fillStyle = r, e.fill();
918
+ }, getPixelFromCoordinate = (e) => {
919
+ if (!e || e.length === 0)
920
+ throw new Error("Points array is empty or invalid.");
921
+ let t = 1 / 0, o = 1 / 0, n = -1 / 0, i = -1 / 0;
922
+ for (const [r, l] of e)
923
+ r < t && (t = r), l < o && (o = l), r > n && (n = r), l > i && (i = l);
924
+ return [t, o, n, i];
925
+ }, calculatePolygonCentroid = (e) => {
926
+ if (!Array.isArray(e) || e.length < 3)
927
+ throw new Error("A polygon must have at least 3 coordinates.");
928
+ let t = 0, o = 0, n = 0;
929
+ const i = e.length;
930
+ for (let c = 0; c < i - 1; c++) {
931
+ const [s, m] = e[c], [d, u] = e[c + 1], f = s * u - d * m;
932
+ n += f, t += (s + d) * f, o += (m + u) * f;
933
+ }
934
+ if (n *= 0.5, n === 0)
935
+ throw new Error("多边形面积为零");
936
+ const r = t / (6 * n), l = o / (6 * n);
937
+ return [r, l];
938
+ }, rotateShapeModel = (e, t) => {
939
+ const [o, n] = calculatePolygonCentroid(e), i = t * Math.PI / 180, r = Math.cos(i), l = Math.sin(i);
940
+ return e.map(([c, s]) => {
941
+ const m = c - o, d = s - n, u = m * r - d * l + o, f = m * l + d * r + n;
942
+ return [u, f];
943
+ });
944
+ }, getTopLeftPoint = (e) => [e[0], e[3]], getBottomLeftPoint = (e) => [e[2], e[3]], getBottomRightPoint = (e) => [e[2], e[1]], getTopRighttPoint = (e) => [e[0], e[1]];
945
+ function calculateBounds(e, t, o, n, i) {
946
+ let r, l, c, s;
947
+ const m = e[0], d = e[1];
948
+ switch (t) {
949
+ case 0:
950
+ r = m + i, l = r + o, s = d - i, c = s - n;
951
+ break;
952
+ case 1:
953
+ r = m + i, l = r + o, s = d + n / 2, c = s - n;
954
+ break;
955
+ case 2:
956
+ r = m + i, l = r + o, s = d + i + n, c = s - n;
957
+ break;
958
+ case 3:
959
+ r = m - o / 2, l = r + o, s = d + i + n, c = s - n;
960
+ break;
961
+ case 4:
962
+ l = m, r = l - o, s = d + i + n, c = s - n;
963
+ break;
964
+ case 5:
965
+ l = m - i, r = l - o, s = d + n / 2, c = s - n;
966
+ break;
967
+ case 6:
968
+ l = m, r = l - o, s = d - i, c = s - n;
969
+ break;
970
+ case 7:
971
+ r = m - o / 2, l = r + o, s = d - i, c = s - n;
972
+ }
973
+ if (!(!r || !c || !l || !s))
974
+ return [Math.min(r, l), Math.min(c, s), Math.max(r, l), Math.max(c, s) + 1];
975
+ }
976
+ function calculateAnchorPoint(e, t, o = 70, n = 20, i = 20) {
977
+ const r = [0, 0];
978
+ switch (t) {
979
+ case 0:
980
+ r[0] = e[0] + i, r[1] = e[1] - i - n / 2;
981
+ break;
982
+ case 1:
983
+ r[0] = e[0] + i, r[1] = e[1];
984
+ break;
985
+ case 2:
986
+ r[0] = e[0] + i, r[1] = e[1] + i + n / 2;
987
+ break;
988
+ case 3:
989
+ r[0] = e[0], r[1] = e[1] + i + n / 4;
990
+ break;
991
+ case 4:
992
+ r[0] = Math.max(e[0] - i, e[0] - o / 2), r[1] = e[1] + i + n / 4;
993
+ break;
994
+ case 5:
995
+ r[0] = e[0] - i, r[1] = e[1];
996
+ break;
997
+ case 6:
998
+ r[0] = Math.max(e[0] - i, e[0] - o / 2), r[1] = e[1] - i - n / 4;
999
+ break;
1000
+ case 7:
1001
+ r[0] = e[0], r[1] = e[1] - i - n / 4;
1002
+ }
1003
+ return r;
1004
+ }
1005
+ function drawLabelBody(e, t, o) {
1006
+ if (!e) return;
1007
+ const {
1008
+ font: n,
1009
+ labelOutSize: i = 2,
1010
+ labelHeight: r,
1011
+ center: l,
1012
+ text: c,
1013
+ id: s,
1014
+ leftIcon: m,
1015
+ shipColor: d,
1016
+ lineLength: u = 20,
1017
+ selected: f,
1018
+ blinkColors: p
1019
+ } = o;
1020
+ e.save(), n && (e.font = n);
1021
+ let h = e.measureText(c).width + 4 * i;
1022
+ (m || d) && (h += r + 6 * i), e.restore();
1023
+ let v, g = 20, k = -1, M = r + 3 * i;
1024
+ if (u)
1025
+ for (let I = 0; I < 8; I++) {
1026
+ v = calculateBounds(l, I, h, M, u);
1027
+ let E = !1;
1028
+ for (let V = 0; V < t.length; ++V) {
1029
+ let F = t[V].bounds, $ = [
1030
+ F[0] - g,
1031
+ F[1] - g,
1032
+ F[2] + g,
1033
+ F[3] + g
1034
+ ];
1035
+ if (v && isOverlapping(v, $)) {
1036
+ E = !0;
1037
+ break;
1038
+ }
1039
+ }
1040
+ if (!E) {
1041
+ k = I;
1042
+ break;
1043
+ }
1044
+ }
1045
+ else
1046
+ k = 0, v = calculateBounds(l, k, h, M, u);
1047
+ if (((p == null ? void 0 : p.length) > 1 || f) && (k = 0, v = calculateBounds(l, k, h, M, u)), v && k > -1) {
1048
+ let I = getBottomLeftPoint(v), E = getTopRighttPoint(v);
1049
+ return {
1050
+ center: l,
1051
+ x: calculateAnchorPoint(l, k, h, M, u),
1052
+ l: E,
1053
+ r: I,
1054
+ bounds: v,
1055
+ position: k,
1056
+ name: c,
1057
+ id: s
1058
+ };
1059
+ } else
1060
+ return null;
1061
+ }
1062
+ const drawText = (e, t) => {
1063
+ if (!e) return;
1064
+ const { center: o, text: n, textColor: i, leftIcon: r, rightIcons: l, font: c } = t;
1065
+ e.save(), e.setTransform(1, 0, 0, 1, 0, 0);
1066
+ let [s, m] = o;
1067
+ if (r) {
1068
+ e.font = `${18 * pixelRatio}px map-iconfont`;
1069
+ let d = getIconFont(r.icon);
1070
+ e.fillStyle = r.color, e.fillText(d, s + labelOutSize - 3 * pixelRatio, m + 2.6 * pixelRatio), s += 23 * pixelRatio;
1071
+ }
1072
+ if (l != null && l.length) {
1073
+ e.font = `${12 * pixelRatio}px map-iconfont`, e.fillStyle = "#3370ff";
1074
+ const d = e.measureText(n).width + 6 * pixelRatio;
1075
+ l.forEach((u, f) => {
1076
+ const p = getIconFont(u), h = 20 * pixelRatio * f;
1077
+ e.fillText(p, s + d + h, m);
1078
+ });
1079
+ }
1080
+ e.font = c || labelFont, e.fillStyle = i, e.fillText(n, s + 2, m), e.restore();
1081
+ }, drawPolygon = (e, t) => {
1082
+ let {
1083
+ points: o,
1084
+ strokeColor: n,
1085
+ fillColor: i,
1086
+ shouldClosePath: r,
1087
+ translation: l,
1088
+ rotation: c,
1089
+ rotationCenter: s,
1090
+ scale: m,
1091
+ globalAlpha: d
1092
+ } = t;
1093
+ if (d || (d = 1), o && e) {
1094
+ e.save(), e.beginPath(), c && c !== 0 && s == null && e.rotate(c), l && e.translate(l[0], l[1]), c && (s != null && s.length) && e.rotate(c), m && e.scale(m, m), e.moveTo(o[0][0], o[0][1]);
1095
+ for (let u = 1; u < o.length; u++)
1096
+ e.lineTo(o[u][0], o[u][1]);
1097
+ r && e.closePath(), n && (e.strokeStyle = n, e.stroke()), i && r && (d && (e.globalAlpha = d), e.fillStyle = i, e.fill()), e.restore();
1098
+ }
1099
+ }, intervalIds = {}, drawLabel = (e, t, o, n) => {
1100
+ var h, v, g, k, M, I, E, V;
1101
+ let { center: i, id: r, text: l, color: c, textColor: s, bgColor: m, leftIcon: d, rightIcons: u, type: f, blinkColors: p } = t;
1102
+ if (i && l) {
1103
+ const F = {
1104
+ font: labelFont,
1105
+ labelOutSize,
1106
+ labelHeight,
1107
+ center: i,
1108
+ text: l,
1109
+ id: r,
1110
+ leftIcon: d,
1111
+ blinkColors: p,
1112
+ selected: t.selected
1113
+ };
1114
+ (h = t.blinkColors) != null && h.length && t.fill && (m = t.fill, s = getForegroundColor(t.fill));
1115
+ const $ = drawLabelBody(e, o, F);
1116
+ if ($) {
1117
+ const { x: y, bounds: L, l: w } = $, S = [getTopLeftPoint(L), getBottomLeftPoint(L), getBottomRightPoint(L), getTopRighttPoint(L)];
1118
+ o.find((R) => R.name === l) || o.push($), drawPolygon(e, {
1119
+ points: [i, w],
1120
+ strokeColor: c,
1121
+ fillColor: "#000",
1122
+ shouldClosePath: !0,
1123
+ translation: void 0,
1124
+ rotation: void 0,
1125
+ rotationCenter: void 0,
1126
+ scale: void 0,
1127
+ globalAlpha: labelAlpha
1128
+ }), u != null && u.length && u.forEach(() => {
1129
+ S[1][0] += pixelRatio * 18, S[2][0] += pixelRatio * 18;
1130
+ });
1131
+ const b = {
1132
+ points: S,
1133
+ strokeColor: c,
1134
+ fillColor: m,
1135
+ shouldClosePath: !0
1136
+ }, [P, x] = w, N = {
1137
+ center: [P, x + labelOutSize + labelHeight + 1],
1138
+ text: l,
1139
+ textColor: s,
1140
+ leftIcon: d,
1141
+ rightIcons: u,
1142
+ blinkColors: t.blinkColors
1143
+ };
1144
+ if (drawPolygon(e, b), drawText(e, N), t != null && t.blinkColors && t.blinkColors.length > 0) {
1145
+ let R = Date.now(), B = 0;
1146
+ const D = t.blinkColors;
1147
+ !!!((k = (g = (v = selectShipsLayer.value) == null ? void 0 : v.getSource()) == null ? void 0 : g.getFeatures()) != null && k.find((A) => {
1148
+ var O;
1149
+ return ((O = A.get("data")) == null ? void 0 : O.id) === t.id;
1150
+ }) || (E = (I = (M = shipsLayer.value) == null ? void 0 : M.getSource()) == null ? void 0 : I.getFeatures()) != null && E.find((A) => {
1151
+ var O;
1152
+ return ((O = A.get("data")) == null ? void 0 : O.id) === t.id;
1153
+ })) || hiddenOrther.value && ((V = selectSingleShipData.value) == null ? void 0 : V.id) !== t.id ? deleteLabelFromArray(o, t.id) : (intervalIds[t.id] && clearInterval(intervalIds[t.id]), intervalIds[t.id] = window.setInterval(() => {
1154
+ const A = Date.now();
1155
+ A - R >= 500 && (B = (B + 1) % D.length, R = A, b.fillColor = D[B], drawPolygon(e, b), N.textColor = getForegroundColor(b.fillColor), drawText(e, N)), checkBlinkLabelExist(n, o, t.id);
1156
+ }, 500));
1157
+ } else
1158
+ shipLabels.value.find((B) => B.name === l) && (clearInterval(intervalIds[t.id]), drawPolygon(e, b), drawText(e, N));
1159
+ }
1160
+ }
1161
+ return null;
1162
+ }, checkBlinkLabelExist = (e, t, o) => {
1163
+ var l, c, s, m, d, u, f;
1164
+ const n = shipsMarkerList == null ? void 0 : shipsMarkerList.some((p) => {
1165
+ var h, v, g;
1166
+ return ((h = p.ship) == null ? void 0 : h.id) === o && ((g = (v = p.ship) == null ? void 0 : v.blinkColors) == null ? void 0 : g.length) > 0;
1167
+ }), i = [
1168
+ ...((c = (l = shipsLayer.value) == null ? void 0 : l.getSource()) == null ? void 0 : c.getFeatures()) || [],
1169
+ ...((m = (s = selectShipsLayer.value) == null ? void 0 : s.getSource()) == null ? void 0 : m.getFeatures()) || []
1170
+ ].some((p) => {
1171
+ const h = p.get("data");
1172
+ if ((h == null ? void 0 : h.id) === o) {
1173
+ const v = e == null ? void 0 : e.getView().calculateExtent();
1174
+ if (!v) return !1;
1175
+ const g = fromLonLat([h.lon, h.lat]);
1176
+ return g[0] >= v[0] && g[0] <= v[2] && g[1] >= v[1] && g[1] <= v[3];
1177
+ }
1178
+ return !1;
1179
+ }), r = (u = (d = trackLineVectorSource.value) == null ? void 0 : d.getFeatures()) == null ? void 0 : u.some((p) => {
1180
+ const h = p.get("data");
1181
+ return (h == null ? void 0 : h.id) === o;
1182
+ });
1183
+ (((f = shipsLayer.value) == null ? void 0 : f.getVisible()) === !1 && t.some((p) => {
1184
+ var h;
1185
+ return p.id !== ((h = selectSingleShipData.value) == null ? void 0 : h.id) && p.id === o;
1186
+ }) || (!r || !i) && (!i || !n)) && deleteLabelFromArray(e, t, o);
1187
+ }, clearAllInterval = () => {
1188
+ Object.keys(intervalIds).forEach((e) => {
1189
+ clearInterval(e);
1190
+ });
1191
+ }, deleteLabelFromArray = (e, t, o) => {
1192
+ var i, r, l, c, s, m, d, u;
1193
+ clearInterval(intervalIds[o]);
1194
+ const n = t.findIndex((f) => f.id === o);
1195
+ if (n !== -1) {
1196
+ t.splice(n, 1);
1197
+ const f = (r = (i = shipsLayer.value) == null ? void 0 : i.getSource()) == null ? void 0 : r.getFeatures().find((h) => {
1198
+ var v;
1199
+ return ((v = h.get("data")) == null ? void 0 : v.id) === o;
1200
+ });
1201
+ f && ((c = (l = shipsLayer.value) == null ? void 0 : l.getSource()) == null || c.removeFeature(f));
1202
+ const p = (m = (s = selectShipsLayer.value) == null ? void 0 : s.getSource()) == null ? void 0 : m.getFeatures().find((h) => {
1203
+ var v;
1204
+ return ((v = h.get("data")) == null ? void 0 : v.id) === o;
1205
+ });
1206
+ p && ((u = (d = selectShipsLayer.value) == null ? void 0 : d.getSource()) == null || u.removeFeature(p)), e && e.render();
1207
+ }
1208
+ }, deleteLabelFromArrayById = () => {
1209
+ mapInstance$9.value && selectSingleShipData.value && deleteLabelFromArray(mapInstance$9.value, shipLabels.value, selectSingleShipData.value.id);
1210
+ }, PI = Math.PI, a = 6378245, ee = 0.006693421622965943;
1211
+ function transformLat(e, t) {
1212
+ let o = -100 + 2 * e + 3 * t + 0.2 * t * t + 0.1 * e * t + 0.2 * Math.sqrt(Math.abs(e));
1213
+ return o += (20 * Math.sin(6 * e * PI) + 20 * Math.sin(2 * e * PI)) * 2 / 3, o += (20 * Math.sin(t * PI) + 40 * Math.sin(t / 3 * PI)) * 2 / 3, o += (160 * Math.sin(t / 12 * PI) + 320 * Math.sin(t * PI / 30)) * 2 / 3, o;
1214
+ }
1215
+ function transformLng(e, t) {
1216
+ let o = 300 + e + 2 * t + 0.1 * e * e + 0.1 * e * t + 0.1 * Math.sqrt(Math.abs(e));
1217
+ return o += (20 * Math.sin(6 * e * PI) + 20 * Math.sin(2 * e * PI)) * 2 / 3, o += (20 * Math.sin(e * PI) + 40 * Math.sin(e / 3 * PI)) * 2 / 3, o += (150 * Math.sin(e / 12 * PI) + 300 * Math.sin(e / 30 * PI)) * 2 / 3, o;
1218
+ }
1219
+ function outOfChina(e, t) {
1220
+ return !(e > 73.66 && e < 135.05 && t > 3.86 && t < 53.55);
1221
+ }
1222
+ function gcj02ToWgs84(e) {
1223
+ const [t, o] = e.split(",").map(Number);
1224
+ if (outOfChina(t, o))
1225
+ return `${t.toFixed(6)}, ${o.toFixed(6)}`;
1226
+ {
1227
+ let n = transformLat(t - 105, o - 35), i = transformLng(t - 105, o - 35);
1228
+ const r = o / 180 * PI;
1229
+ let l = Math.sin(r);
1230
+ l = 1 - ee * l * l;
1231
+ const c = Math.sqrt(l);
1232
+ n = n * 180 / (a * (1 - ee) / (l * c) * PI), i = i * 180 / (a / c * Math.cos(r) * PI);
1233
+ const s = o + n, m = t + i;
1234
+ return `${(t * 2 - m).toFixed(6)}, ${(o * 2 - s).toFixed(6)}`;
1235
+ }
1236
+ }
1237
+ function calculateCirclePoints(e, t) {
1238
+ const o = fromLonLat(e), n = t * 1e3, i = [
1239
+ o[0] - n,
1240
+ o[1] - n,
1241
+ o[0] + n,
1242
+ o[1] + n
1243
+ ], r = transformExtent(i, projection.mercator, projection.data);
1244
+ return {
1245
+ leftTopPoint: { lng: r[0], lat: r[3] },
1246
+ rightTopPoint: { lng: r[2], lat: r[3] },
1247
+ rightBottomPoint: { lng: r[2], lat: r[1] },
1248
+ leftBottomPoint: { lng: r[0], lat: r[1] }
1249
+ };
1250
+ }
1251
+ const equatorialCircumference = 2003750834e-2;
1252
+ function lonLatToMercator(e) {
1253
+ const t = e[0] * equatorialCircumference / 180;
1254
+ let o = Math.log(Math.tan((90 + e[1]) * Math.PI / 360)) / (Math.PI / 180);
1255
+ return o = o * equatorialCircumference / 180, [t, o];
1256
+ }
1257
+ function mercatorToLonLat(e, t = "lonlat") {
1258
+ const o = { lon: 0, lat: 0 }, n = e[0] / equatorialCircumference * 180;
1259
+ let i = e[1] / equatorialCircumference * 180;
1260
+ return i = 180 / Math.PI * (2 * Math.atan(Math.exp(i * Math.PI / 180)) - Math.PI / 2), o.lon = n, o.lat = i, t === "lonlat" ? o : [n, i];
1261
+ }
1262
+ function calculateBoundingBox(e) {
1263
+ let t = 1 / 0, o = -1 / 0, n = 1 / 0, i = -1 / 0;
1264
+ e.forEach((v) => {
1265
+ const [g, k] = v;
1266
+ t = Math.min(t, k), o = Math.max(o, k), n = Math.min(n, g), i = Math.max(i, g);
1267
+ });
1268
+ const r = i - n, l = o - t, c = Math.max(r, l), s = (n + i) / 2, m = (t + o) / 2, d = c / 2, u = s - d, f = s + d, p = m - d, h = m + d;
1269
+ return [f, p, u, h];
1270
+ }
1271
+ const transformUtils = {
1272
+ gcj02ToWgs84,
1273
+ calculateCirclePoints,
1274
+ lonLatToMercator,
1275
+ mercatorToLonLat,
1276
+ calculateBoundingBox,
1277
+ transform
1278
+ }, mapInstance$5 = ref(), renderTrackStyleSetInstance = (e) => mapInstance$5.value = e, stopIcon = "&#xe6e2;", stopColor = "#E31818", slowIcon = "&#xe703;", slowColor = "#1890FF", dropletsIcon = "&#xe6d2", trackList$1 = ref([]), renderTrackLine = (e, t, o, n) => {
1279
+ var s, m, d;
1280
+ const i = e[t];
1281
+ if (!i) return;
1282
+ allTracks.value[t] = i, trackList$1.value = [];
1283
+ const r = Math.max(1, Math.floor(i.length / n)), l = i.filter((u, f) => f % r === 0);
1284
+ trackList$1.value = l.map((u, f) => {
1285
+ if (Number(u.lon) > 180 || Number(u.lat) > 180) {
1286
+ const [p, h] = formatUtils.convertSixHundredThousandToLatLng(u.lon, u.lat);
1287
+ u.lon = p, u.lat = h;
1288
+ }
1289
+ return u.center = [u.lon, u.lat], u.centerPoint = transformUtils.lonLatToMercator(u.center), u.id = t, u.index = f, u.time = hooks(u.createdAt).format("YYYY-MM-DD HH:mm:ss"), u;
1290
+ });
1291
+ const c = trackList$1.value.map((u) => u.centerPoint);
1292
+ if (c.length >= 2) {
1293
+ const u = new LineString(c), f = new Feature({ geometry: u });
1294
+ f.setStyle(
1295
+ new Style({
1296
+ stroke: new Stroke({
1297
+ color: o,
1298
+ width: 2
1299
+ })
1300
+ })
1301
+ ), f.setId(t), f.set("type", "line"), (m = (s = shipTrackVectorLayer.value) == null ? void 0 : s.getSource()) == null || m.clear(), shipTrackLineFeatures.value = [];
1302
+ const p = shipTrackLineFeatures.value.findIndex((h) => h.getId() === t);
1303
+ p >= 0 ? shipTrackLineFeatures.value[p] = f : shipTrackLineFeatures.value.push(f), createAnimatedIconFeature(o, c), trackLineVectorSource.value = new VectorSource({
1304
+ features: [...shipTrackLineFeatures.value]
1305
+ }), shipTrackVectorLayer.value = new VectorLayer({
1306
+ source: trackLineVectorSource.value,
1307
+ zIndex: 102,
1308
+ updateWhileInteracting: !0
1309
+ }), renderPoint(o), (d = mapInstance$5.value) == null || d.addLayer(shipTrackVectorLayer.value);
1310
+ }
1311
+ }, handlePlay = (e, t) => {
1312
+ const o = allTracks.value[String(e)];
1313
+ playAnimation(o.map((n) => [n.lon, n.lat]), t);
1314
+ }, removeShipTrackLineFeatureByIndex = (e, t) => {
1315
+ e >= 0 && e < shipTrackLineFeatures.value.length && (shipTrackLineFeatures.value.splice(e, 1), delete allTracks.value[t]), trackLineVectorSource.value = new VectorSource({
1316
+ features: [...shipTrackLineFeatures.value]
1317
+ }), shipTrackVectorLayer.value && shipTrackVectorLayer.value.setSource(trackLineVectorSource.value);
1318
+ }, createAnimatedIconFeature = (e, t) => {
1319
+ const o = new Feature({
1320
+ geometry: new Point(fromLonLat([t[0][0], t[0][1]]))
1321
+ // 初始位置
1322
+ }), n = new Style({
1323
+ text: new Text({
1324
+ font: "700 14px map-iconfont",
1325
+ text: getIconFont("&#xe6bc;"),
1326
+ fill: new Fill({ color: e })
1327
+ })
1328
+ });
1329
+ return o.setStyle(n), o;
1330
+ }, geoMarkerStyle = new Style({
1331
+ text: new Text({
1332
+ font: "700 20px map-iconfont",
1333
+ text: getIconFont("&#xe657;"),
1334
+ fill: new Fill({ color: "#ff0000" }),
1335
+ rotation: 0
1336
+ // 初始旋转角度
1337
+ })
1338
+ });
1339
+ let polyline, linePath, startMarker, position, geoMarker, vectorLayer;
1340
+ const trackAnimating = ref(!1);
1341
+ let distance = 0, lastTime = Date.now(), moveFeatureHandler = null;
1342
+ const moveFeature = (e, t) => {
1343
+ var u, f, p;
1344
+ const o = Number(50 * t), n = ((u = e.frameState) == null ? void 0 : u.time) ?? Date.now(), i = n - lastTime;
1345
+ if (distance = (distance + o * i / 1e6) % 2, lastTime = n, distance >= 1) {
1346
+ stopAnimation();
1347
+ return;
1348
+ }
1349
+ const r = linePath.getCoordinateAt(
1350
+ distance > 1 ? 2 - distance : distance
1351
+ ), l = linePath.getCoordinateAt(
1352
+ distance > 1 ? distance - 0.01 : distance
1353
+ ), c = linePath.getCoordinateAt(
1354
+ distance > 1 ? 2 - distance : distance + 0.01
1355
+ ), m = getRotation(
1356
+ transformUtils.mercatorToLonLat(l, "array"),
1357
+ transformUtils.mercatorToLonLat(c, "array")
1358
+ ) * Math.PI / 180;
1359
+ (f = geoMarkerStyle.getText()) == null || f.setRotation(m), position.setCoordinates(r);
1360
+ const d = getVectorContext(e);
1361
+ d.context_.save(), d.setStyle(geoMarkerStyle), d.drawGeometry(position), d.context_.restore(), (p = mapInstance$5.value) == null || p.render();
1362
+ }, startAnimation = () => {
1363
+ var e;
1364
+ trackAnimating.value = !0, showTrackAnimatMarker.value = !0, lastTime = Date.now(), distance = 0, position = ((e = startMarker.getGeometry()) == null ? void 0 : e.clone()) || new Point([0, 0]), moveFeatureHandler && (vectorLayer == null || vectorLayer.on("postrender", moveFeatureHandler)), geoMarker == null || geoMarker.setGeometry(void 0);
1365
+ }, stopAnimation = () => {
1366
+ var e;
1367
+ trackAnimating.value && (trackAnimating.value = !1, geoMarker == null || geoMarker.setGeometry(void 0), moveFeatureHandler && vectorLayer && vectorLayer.un("postrender", moveFeatureHandler), vectorLayer && ((e = mapInstance$5.value) == null || e.removeLayer(vectorLayer)), vectorLayer = null, geoMarker = null);
1368
+ }, playAnimation = (e, t) => {
1369
+ var n;
1370
+ trackAnimating.value && stopAnimation(), polyline = new Polyline({
1371
+ factor: 1e6
1372
+ }).writeGeometry(new LineString(e)), linePath = new Polyline({
1373
+ factor: 1e6
1374
+ }).readGeometry(polyline, {
1375
+ dataProjection: projection.data,
1376
+ featureProjection: projection.mercator
1377
+ }), startMarker = new Feature({
1378
+ type: "icon",
1379
+ geometry: new Point(linePath.getFirstCoordinate())
1380
+ });
1381
+ const o = startMarker.getGeometry();
1382
+ position = o ? o.clone() : new Point([0, 0]), geoMarker = new Feature({
1383
+ type: "geoMarker",
1384
+ style: geoMarkerStyle,
1385
+ geometry: position
1386
+ }), vectorLayer = new VectorLayer({
1387
+ source: new VectorSource({
1388
+ features: [geoMarker]
1389
+ })
1390
+ }), (n = mapInstance$5.value) == null || n.addLayer(vectorLayer), moveFeatureHandler = (i) => moveFeature(i, t), startAnimation();
1391
+ }, renderPoint = (e) => {
1392
+ if (!mapInstance$5.value) return;
1393
+ const t = trackList$1.value || [];
1394
+ if (!(t && t.length > 1)) return [];
1395
+ const o = { 16: 24, 17: 15, default: 4 }, n = [], i = t.length;
1396
+ for (let c = 0; c < i; c++) {
1397
+ t[c].index = c;
1398
+ const s = mapInstance$5.value.getPixelFromCoordinate(t[c].centerPoint);
1399
+ if (s) {
1400
+ let m = s.concat(s);
1401
+ m = adjustBounds(m, [20, 20]);
1402
+ const d = mapInstance$5.value.getView().getZoom();
1403
+ if (!d) return;
1404
+ if (d > 15) {
1405
+ const f = o[d] || o.default;
1406
+ m = adjustBounds(m, [f, f]);
1407
+ }
1408
+ let u = !0;
1409
+ if (t[c].state !== "0") {
1410
+ for (let f = 0; f < n.length; f++)
1411
+ if (isOverlapping(m, n[f].bounds)) {
1412
+ u = !1;
1413
+ break;
1414
+ }
1415
+ }
1416
+ u && (t[c].bounds = m, n.push(t[c]));
1417
+ }
1418
+ }
1419
+ const r = getIconStyle(stopIcon), l = getIconStyle(slowIcon);
1420
+ n.forEach((c, s) => {
1421
+ var u, f;
1422
+ const m = new Feature({
1423
+ geometry: new Point(c.centerPoint)
1424
+ });
1425
+ m.set("type", "track_point"), m.set("data", c), m.setStyle([
1426
+ new Style({
1427
+ // 扩大交互热区
1428
+ image: new CircleStyle({
1429
+ stroke: new Stroke({ color: "rgba(0, 0, 0, 0.01)", width: 20 }),
1430
+ radius: 3
1431
+ })
1432
+ }),
1433
+ new Style({
1434
+ // 轨迹点样式
1435
+ image: new CircleStyle({
1436
+ fill: new Fill({ color: e }),
1437
+ stroke: new Stroke({ color: "#fff", width: 2 }),
1438
+ radius: 3
1439
+ })
1440
+ })
1441
+ ]), trackLineVectorSource.value.addFeature(m);
1442
+ const d = new Feature({
1443
+ geometry: new Point(fromLonLat(c.center))
1444
+ });
1445
+ if (d.set("type", "track_label"), d.set("track_label_index", s), d.setStyle(
1446
+ setTrackLabelStyle(c, e)
1447
+ ), trackLineVectorSource.value.addFeature(d), typeof c == "object" && c.hasOwnProperty("state")) {
1448
+ const p = new Feature({
1449
+ geometry: new Point(c.centerPoint)
1450
+ });
1451
+ p.set("type", "track_icon");
1452
+ const h = new Style({
1453
+ text: new Text({
1454
+ font: "Normal 22px map-iconfont",
1455
+ text: getIconFont(dropletsIcon),
1456
+ offsetY: -10
1457
+ }),
1458
+ zIndex: 99
1459
+ }), v = [];
1460
+ Number(c.state) === 0 ? ((u = h.getText()) == null || u.setFill(new Fill({ color: stopColor })), v.push(r)) : Number(c.state) === 1 && ((f = h.getText()) == null || f.setFill(new Fill({ color: slowColor })), v.push(l)), v.push(h), p.setStyle(v), trackLineVectorSource.value.addFeature(p);
1461
+ }
1462
+ }), renderArrow(n, e), renderIconPoint();
1463
+ }, renderArrow = (e, t) => {
1464
+ const o = e.length;
1465
+ o || (e.push(trackList$1.value[0]), e.push(trackList$1.value[trackList$1.value.length - 1]));
1466
+ for (let n = 0; n < o - 1; n++) {
1467
+ let i;
1468
+ const r = e[n], l = (e[n + 1].index + r.index) / 2;
1469
+ if (l % 2 === 0)
1470
+ i = trackList$1.value[l].centerPoint;
1471
+ else {
1472
+ const c = trackList$1.value[Math.floor(l)], s = trackList$1.value[Math.ceil(l)];
1473
+ if (c && s) {
1474
+ const [m, d] = c.centerPoint, [u, f] = s.centerPoint;
1475
+ i = [(m + u) / 2, (d + f) / 2];
1476
+ }
1477
+ }
1478
+ if (i) {
1479
+ const c = new Feature({
1480
+ geometry: new Point(i)
1481
+ });
1482
+ c.set("type", "track_arrow"), c.setStyle(
1483
+ new Style({
1484
+ text: new Text({
1485
+ font: "700 14px map-iconfont",
1486
+ text: getIconFont("&#xe6bc;"),
1487
+ fill: new Fill({ color: t }),
1488
+ // 设置箭头旋转 角度转为弧度
1489
+ rotation: getRotation(
1490
+ e[n].center,
1491
+ e[n + 1].center
1492
+ ) * (Math.PI / 180)
1493
+ })
1494
+ })
1495
+ ), trackLineVectorSource.value.addFeature(c);
1496
+ }
1497
+ }
1498
+ }, renderIconPoint = () => {
1499
+ const e = "&#xe69b;", t = "#fcdc3f", o = "#ff0000";
1500
+ (trackList$1.value.length < 2 ? [trackList$1.value[0]] : [trackList$1.value[0], trackList$1.value[trackList$1.value.length - 1]]).forEach((i) => {
1501
+ const r = new Feature({
1502
+ geometry: new Point(i.centerPoint)
1503
+ });
1504
+ r.set("type", "track_begin"), r.set("data", i);
1505
+ const l = i.index === 0 && trackList$1.value.length >= 2 ? t : o;
1506
+ r.setStyle(
1507
+ new Style({
1508
+ text: new Text({
1509
+ font: "Normal 14px map-iconfont",
1510
+ text: getIconFont(e),
1511
+ fill: new Fill({ color: l })
1512
+ }),
1513
+ zIndex: 101
1514
+ })
1515
+ ), trackLineVectorSource.value.addFeature(r);
1516
+ });
1517
+ }, setTrackLabelStyle = (e, t) => new Style({
1518
+ renderer: (o, n) => {
1519
+ const i = n.context, c = {
1520
+ id: e.id || "",
1521
+ center: o,
1522
+ text: e.time,
1523
+ color: t,
1524
+ textColor: "#000",
1525
+ bgColor: "rgba(255,255,255,.8)",
1526
+ selected: !0,
1527
+ type: "TrackTime"
1528
+ };
1529
+ drawLabel(i, c, trackLabels.value, mapInstance$5.value);
1530
+ }
1531
+ }), mapInstance$4 = ref(), renderCustomOverlaySetInstance = (e) => mapInstance$4.value = e, drawCustomContent = (e, t, o, n = "top-left", i = !1, r = !0) => {
1532
+ var u, f;
1533
+ if (!t || !mapInstance$4.value) return;
1534
+ r && document.querySelectorAll(".truck-custom-content").forEach((p) => {
1535
+ var h;
1536
+ return (h = p.parentNode) == null ? void 0 : h.removeChild(p);
1537
+ });
1538
+ const l = document.createElement("div");
1539
+ l.innerHTML = o;
1540
+ const c = new Overlay({
1541
+ element: l,
1542
+ position: t,
1543
+ // 初始位置
1544
+ positioning: n,
1545
+ stopEvent: i
1546
+ // 设置不阻拦事件
1547
+ });
1548
+ if (i) {
1549
+ let p = !1, h = [0, 0], v = [0, 0], g = 0, k = 0;
1550
+ l.addEventListener("mousedown", function(M) {
1551
+ var E;
1552
+ p = !0, g = M.clientX, k = M.clientY;
1553
+ const I = (E = mapInstance$4.value) == null ? void 0 : E.getCoordinateFromPixel([M.clientX - 200, M.clientY - 200]);
1554
+ I && (h = I), v = [
1555
+ M.clientX - l.getBoundingClientRect().left + 160,
1556
+ M.clientY - l.getBoundingClientRect().top + 84
1557
+ ], M.preventDefault(), console.log(e, g, k);
1558
+ }), document.addEventListener("mousemove", function(M) {
1559
+ var I;
1560
+ if (p) {
1561
+ const E = (I = mapInstance$4.value) == null ? void 0 : I.getCoordinateFromPixel([M.clientX - v[0], M.clientY - v[1]]), V = E[0] - h[0], F = E[1] - h[1];
1562
+ c.setPosition([h[0] + V, h[1] + F]);
1563
+ }
1564
+ }), document.addEventListener("mouseup", function() {
1565
+ p = !1;
1566
+ });
1567
+ }
1568
+ (u = mapInstance$4.value) == null || u.addOverlay(c);
1569
+ const s = l.querySelector(".close-button");
1570
+ s && s.addEventListener("click", () => {
1571
+ var p, h;
1572
+ (p = mapInstance$4.value) == null || p.removeOverlay(c), (h = l.parentNode) == null || h.removeChild(l);
1573
+ });
1574
+ const m = JSON.parse(JSON.stringify(t)), d = (f = mapInstance$4.value) == null ? void 0 : f.getCoordinateFromPixel(m);
1575
+ return c.setPosition(d), c;
1576
+ }, mapInstance$3 = ref(), renderTrackSetInstance = (e) => mapInstance$3.value = e, showTracks = ref([]), trackList = ref([]);
1577
+ ref(null);
1578
+ const trackId = ref(""), cursor = ref(0), renderTrack = (e, t, o, n, i = "ship", r) => {
1579
+ var u;
1580
+ if (console.log(i), nextTick(() => {
1581
+ hiddenAllShips(), clearShipData(!1);
1582
+ }).then((f) => {
1583
+ }), (t == null ? void 0 : t.length) < 2) {
1584
+ ((u = showTracks.value) == null ? void 0 : u.findIndex((f) => f.id === e)) < 0 && showTracks.value.push({ id: e, length: "" });
1585
+ return;
1586
+ }
1587
+ const l = {};
1588
+ t.forEach((f) => {
1589
+ f.state ? f.state = Number(f.state) : delete f.state;
1590
+ }), trackId.value = e, l[e] = t, trackList.value = t;
1591
+ const c = ["#ff0000", "#00ff00", "#0079ff", "#ffa500", "#800080", "#008080", "#ffc0cb", "#800000", "#000080", "#808000"], s = l[e].map(
1592
+ (f) => transform([f.lon, f.lat], projection.data, projection.mercator)
1593
+ ), m = new LineString(s), d = formatUtils.formatLength(m, n) || "--";
1594
+ nextTick(() => {
1595
+ var p, h;
1596
+ const f = (p = showTracks.value) == null ? void 0 : p.findIndex((v) => v.id === e);
1597
+ f < 0 ? showTracks.value.push({ id: e, length: d }) : showTracks.value[f].length = d, ++cursor.value, cursor.value > c.length && (cursor.value = 0), renderTrackLine(l, e, o, r), nextTick(() => {
1598
+ resetTrackView(e);
1599
+ }).then(() => {
1600
+ }), (h = mapInstance$3.value) == null || h.on("moveend", () => {
1601
+ showTrackLayer.value && (trackLabels.value = [], renderTrackLine(l, e, o, r));
1602
+ }), i === "ship" && renderTrackPointPopup();
1603
+ }).then(() => {
1604
+ });
1605
+ }, renderTrackPointPopup = () => {
1606
+ var t;
1607
+ const e = ref(null);
1608
+ (t = mapInstance$3.value) == null || t.on("pointermove", (o) => {
1609
+ var i, r, l, c;
1610
+ e.value && ((i = mapInstance$3.value) == null || i.removeOverlay(e.value));
1611
+ const n = (r = mapInstance$3.value) == null ? void 0 : r.forEachFeatureAtPixel(o.pixel, (s) => s);
1612
+ if (n) {
1613
+ const s = n.get("data");
1614
+ if (!(s != null && s.time)) return;
1615
+ let m = "";
1616
+ s != null && s.stayTime && (m = `
1617
+ <div class="item w-100">
1618
+ <div class="item-label">停泊时间约</div>
1619
+ <div class="item-item">${formatMinutesToDDHHMM(Number(s.stayTime))}</div>
1620
+ </div>
1621
+ `);
1622
+ const d = `
1623
+ <div class="track-point-popup">
1624
+ <div class="item">
1625
+ <div class="item-label">状态</div>
1626
+ <div class="item-item">${s != null && s.sailStatus ? SHIP_SAIL_STATUS[s.sailStatus] : DEFAULT_VALUE}</div>
1627
+ </div>
1628
+ <div class="item">
1629
+ <div class="item-label">航速</div>
1630
+ <div class="item-item">${s.speed || DEFAULT_VALUE}</div>
1631
+ </div>
1632
+ <div class="item">
1633
+ <div class="item-label">艏向</div>
1634
+ <div class="item-item">${s.hdg || DEFAULT_VALUE}</div>
1635
+ </div>
1636
+ <div class="item">
1637
+ <div class="item-label">航向</div>
1638
+ <div class="item-item">${s.cog || DEFAULT_VALUE}</div>
1639
+ </div>
1640
+ <div class="item">
1641
+ <div class="item-label">经度</div>
1642
+ <div class="item-item">${s.lon || DEFAULT_VALUE}</div>
1643
+ </div>
1644
+ <div class="item">
1645
+ <div class="item-label">纬度</div>
1646
+ <div class="item-item">${s.lat || DEFAULT_VALUE}</div>
1647
+ </div>
1648
+ <div class="item w-100">
1649
+ <div class="item-label">时间</div>
1650
+ <div class="item-item">${s.time}</div>
1651
+ </div>
1652
+ ${m ?? m}
1653
+ </div>`, u = (l = mapInstance$3.value) == null ? void 0 : l.getPixelFromCoordinate(o.coordinate);
1654
+ if (u) {
1655
+ const f = drawCustomContent(s.time, u, d, "top-left");
1656
+ f && (e.value = f);
1657
+ }
1658
+ } else
1659
+ e.value && ((c = mapInstance$3.value) == null || c.removeOverlay(e.value));
1660
+ });
1661
+ }, removeAllTrackLayer = () => {
1662
+ var e;
1663
+ showTracks.value = [], (e = trackLineVectorSource.value) == null || e.clear();
1664
+ }, playTrack = (e, t) => {
1665
+ handlePlay(String(e), t);
1666
+ }, resetTrackView = (e) => {
1667
+ var i;
1668
+ const t = mapInstance$3.value.getView(), o = e ? shipTrackLineFeatures.value.find((r) => r.getId() === e) : shipTrackLineFeatures.value[0];
1669
+ if (!o) return;
1670
+ const n = (i = o == null ? void 0 : o.getGeometry()) == null ? void 0 : i.getExtent();
1671
+ if (n != null && n.length)
1672
+ try {
1673
+ const r = buffer(n, Math.max(n[2] - n[0], n[3] - n[1]) * 0.02);
1674
+ t.fit(r);
1675
+ } catch (r) {
1676
+ console.log(r);
1677
+ }
1678
+ }, formatMinutesToDDHHMM = (e) => {
1679
+ const t = hooks.duration(e, "minutes"), o = Math.floor(t.asDays()), n = t.hours(), i = t.minutes();
1680
+ let r = `${String(i).padStart(2, "0")}分`;
1681
+ return n !== 0 && (r = `${String(n).padStart(2, "0")}时${r}`), o !== 0 && (r = `${String(o).padStart(2, "0")}天${r}`), r;
1682
+ }, _hoisted_1$3 = {
1683
+ key: 0,
1684
+ class: "more-tool-panel"
1685
+ }, _hoisted_2$1 = { class: "switch-buttons" }, _hoisted_3 = { class: "tool-components" }, _sfc_main$4 = /* @__PURE__ */ defineComponent({
1686
+ __name: "toolPanel",
1687
+ props: {
1688
+ vehicleMode: {},
1689
+ viewMode: {},
1690
+ disableGreenDot: { type: Boolean },
1691
+ showTrackLayer: { type: Boolean },
1692
+ mapTileMode: {}
1693
+ },
1694
+ emits: ["switchGreenDot", "switchMapTile"],
1695
+ setup(e, { emit: t }) {
1696
+ var p, h;
1697
+ const o = inject("mapInstance"), n = e, i = t, r = ref(((h = (p = o == null ? void 0 : o.value) == null ? void 0 : p.getView()) == null ? void 0 : h.getZoom()) || mapZoom.default), l = ref(!1), c = ref(null), s = ref(!0), m = () => {
1698
+ n.disableGreenDot || r.value >= mapZoom.shipGreenDotMax || (s.value = !s.value, i("switchGreenDot", s.value));
1699
+ }, d = () => {
1700
+ i("switchMapTile", n.mapTileMode === BaseMapType.vector ? BaseMapType.satellite : BaseMapType.vector);
1701
+ }, u = () => {
1702
+ var v, g;
1703
+ l.value ? (v = c.value) == null || v.removeInteraction() : (g = c.value) == null || g.addInteraction(), l.value = !l.value;
1704
+ }, f = () => {
1705
+ var v;
1706
+ (v = c.value) == null || v.removeInteraction(), l.value = !1;
1707
+ };
1708
+ return onMounted(() => {
1709
+ nextTick(() => {
1710
+ var v;
1711
+ (v = o == null ? void 0 : o.value) == null || v.on("moveend", () => {
1712
+ var k, M;
1713
+ const g = (M = (k = o == null ? void 0 : o.value) == null ? void 0 : k.getView()) == null ? void 0 : M.getZoom();
1714
+ g && (r.value = g);
1715
+ });
1716
+ });
1717
+ }), (v, g) => (openBlock(), createElementBlock(Fragment, null, [
1718
+ createElementVNode("div", {
1719
+ class: normalizeClass(`tool-panel ${v.viewMode}`)
1720
+ }, [
1721
+ v.viewMode === "WxMiniprogram" ? (openBlock(), createElementBlock("div", _hoisted_1$3, [
1722
+ createElementVNode("div", _hoisted_2$1, [
1723
+ v.vehicleMode === "ship" ? (openBlock(), createElementBlock("div", {
1724
+ key: 0,
1725
+ class: normalizeClass(["switch-btn", `${l.value && "active"}`]),
1726
+ onClick: u
1727
+ }, g[5] || (g[5] = [
1728
+ createElementVNode("i", { class: "map-iconfont icon-measure" }, null, -1),
1729
+ createElementVNode("div", { class: "button-text" }, "测距", -1)
1730
+ ]), 2)) : createCommentVNode("", !0),
1731
+ v.vehicleMode === "ship" ? (openBlock(), createElementBlock("div", {
1732
+ key: 1,
1733
+ class: normalizeClass(`switch-btn ${s.value && "active"} ${(v.disableGreenDot || r.value >= unref(mapZoom).shipGreenDotMax) && "disabled"}`),
1734
+ onClick: m
1735
+ }, g[6] || (g[6] = [
1736
+ createElementVNode("i", { class: "map-iconfont icon-ship" }, null, -1),
1737
+ createElementVNode("div", { class: "button-text" }, "绿点", -1)
1738
+ ]), 2)) : createCommentVNode("", !0),
1739
+ v.vehicleMode === "ship" ? (openBlock(), createElementBlock("div", {
1740
+ key: 2,
1741
+ class: normalizeClass(`switch-btn ${v.mapTileMode === unref(BaseMapType).satellite && "active"}`),
1742
+ onClick: g[0] || (g[0] = (k) => d())
1743
+ }, g[7] || (g[7] = [
1744
+ createElementVNode("i", { class: "map-iconfont icon-space" }, null, -1),
1745
+ createElementVNode("div", { class: "button-text" }, "图层", -1)
1746
+ ]), 2)) : createCommentVNode("", !0),
1747
+ v.vehicleMode === "truck" ? (openBlock(), createElementBlock("div", {
1748
+ key: 3,
1749
+ class: normalizeClass(`switch-btn ${v.mapTileMode === unref(BaseMapType).satellite && "active"}`),
1750
+ onClick: g[1] || (g[1] = (k) => d())
1751
+ }, g[8] || (g[8] = [
1752
+ createElementVNode("i", { class: "map-iconfont icon-space" }, null, -1),
1753
+ createElementVNode("div", { class: "button-text" }, "卫星", -1)
1754
+ ]), 2)) : createCommentVNode("", !0),
1755
+ v.showTrackLayer ? (openBlock(), createElementBlock(Fragment, { key: 4 }, [
1756
+ createElementVNode("div", {
1757
+ class: "switch-btn multiple",
1758
+ onClick: g[2] || (g[2] = (k) => unref(playTrack)(unref(currentTrackId), 1))
1759
+ }, g[9] || (g[9] = [
1760
+ createElementVNode("i", { class: "map-iconfont icon-play" }, null, -1),
1761
+ createElementVNode("div", { class: "button-text" }, "播放轨迹", -1)
1762
+ ])),
1763
+ createElementVNode("div", {
1764
+ class: "switch-btn multiple",
1765
+ onClick: g[3] || (g[3] = (k) => unref(resetTrackView)())
1766
+ }, g[10] || (g[10] = [
1767
+ createElementVNode("i", { class: "map-iconfont icon-center" }, null, -1),
1768
+ createElementVNode("div", { class: "button-text" }, "轨迹居中", -1)
1769
+ ]))
1770
+ ], 64)) : createCommentVNode("", !0),
1771
+ renderSlot(v.$slots, "toolPanel", {}, void 0, !0)
1772
+ ])
1773
+ ])) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
1774
+ v.vehicleMode === "ship" ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
1775
+ createElementVNode("div", {
1776
+ class: normalizeClass(["switch-btn", `${l.value && "active"}`]),
1777
+ onClick: u
1778
+ }, g[11] || (g[11] = [
1779
+ createElementVNode("i", { class: "map-iconfont icon-measure" }, null, -1),
1780
+ createElementVNode("div", { class: "button-text" }, "测距", -1)
1781
+ ]), 2),
1782
+ v.vehicleMode === "ship" ? (openBlock(), createElementBlock("div", {
1783
+ key: 0,
1784
+ class: normalizeClass(`switch-btn ${s.value && "active"} ${(v.disableGreenDot || r.value >= unref(mapZoom).shipGreenDotMax) && "disabled"}`),
1785
+ onClick: m
1786
+ }, g[12] || (g[12] = [
1787
+ createElementVNode("i", { class: "map-iconfont icon-ship" }, null, -1),
1788
+ createElementVNode("div", { class: "button-text" }, "绿点", -1)
1789
+ ]), 2)) : createCommentVNode("", !0)
1790
+ ], 64)) : createCommentVNode("", !0),
1791
+ createElementVNode("div", {
1792
+ class: normalizeClass(["switch-btn", { active: v.mapTileMode === unref(BaseMapType).satellite }]),
1793
+ onClick: d
1794
+ }, g[13] || (g[13] = [
1795
+ createElementVNode("i", { class: "map-iconfont icon-space" }, null, -1),
1796
+ createElementVNode("div", { class: "button-text" }, "卫星", -1)
1797
+ ]), 2)
1798
+ ], 64))
1799
+ ], 2),
1800
+ createElementVNode("div", _hoisted_3, [
1801
+ l.value ? (openBlock(), createBlock(Measure, {
1802
+ key: 0,
1803
+ ref_key: "measureRef",
1804
+ ref: c,
1805
+ visible: l.value,
1806
+ "onUpdate:visible": g[4] || (g[4] = (k) => l.value = k),
1807
+ onClose: f,
1808
+ "view-mode": v.viewMode
1809
+ }, null, 8, ["visible", "view-mode"])) : createCommentVNode("", !0)
1810
+ ])
1811
+ ], 64));
1812
+ }
1813
+ }), ToolPanel = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["__scopeId", "data-v-79266143"]]), _hoisted_1$2 = { id: "scale-line-container" }, _sfc_main$3 = /* @__PURE__ */ defineComponent({
1814
+ __name: "scaleLine",
1815
+ setup(e, { expose: t }) {
1816
+ const o = inject("mapInstance");
1817
+ return t({
1818
+ setScaleLine: (i) => {
1819
+ var c;
1820
+ i || (i = "metric");
1821
+ const r = new ScaleLine$1({
1822
+ units: i
1823
+ }), l = document.getElementById("scale-line-container");
1824
+ l && (r.setTarget(l), (c = o == null ? void 0 : o.value) == null || c.addControl(r));
1825
+ }
1826
+ }), (i, r) => (openBlock(), createElementBlock("div", _hoisted_1$2));
1827
+ }
1828
+ }), ScaleLine = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["__scopeId", "data-v-d666f80d"]]), _hoisted_1$1 = { class: "zoom" }, _sfc_main$2 = /* @__PURE__ */ defineComponent({
1829
+ __name: "zoomControl",
1830
+ props: {
1831
+ map: {
1832
+ type: Object
1833
+ }
1834
+ },
1835
+ setup(e) {
1836
+ const t = inject("mapInstance"), o = () => {
1837
+ if (!t.value) return;
1838
+ const i = t.value.getView(), r = i.getZoom();
1839
+ r && i.setZoom(r + 1);
1840
+ }, n = () => {
1841
+ if (!t.value) return;
1842
+ const i = t.value.getView(), r = i.getZoom();
1843
+ r && i.setZoom(r - 1);
1844
+ };
1845
+ return (i, r) => (openBlock(), createElementBlock("div", _hoisted_1$1, [
1846
+ createElementVNode("div", {
1847
+ onClick: o,
1848
+ class: "button big-button"
1849
+ }, "+"),
1850
+ createElementVNode("div", {
1851
+ onClick: n,
1852
+ class: "button small-button"
1853
+ }, "-")
1854
+ ]));
1855
+ }
1856
+ }), ZoomControl = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__scopeId", "data-v-ee822625"]]), _hoisted_1 = { class: "copyright" }, _hoisted_2 = ["src", "width"], _sfc_main$1 = /* @__PURE__ */ defineComponent({
1857
+ __name: "copyright",
1858
+ props: {
1859
+ type: { default: COPY_RIGHT_TYPE.HORIZONTAL },
1860
+ mapTile: { default: BaseMapType.satellite }
1861
+ },
1862
+ setup(e) {
1863
+ useCssVars((r) => ({
1864
+ "0d38823b": i.value
1865
+ }));
1866
+ const t = e, o = computed(() => t.type === COPY_RIGHT_TYPE.HORIZONTAL ? `map/tdt-copyright-h${t.mapTile === BaseMapType.satellite ? "-w" : ""}.svg` : `map/tdt-copyright-v${t.mapTile === BaseMapType.satellite ? "-w" : ""}.svg`), n = computed(() => t.type === COPY_RIGHT_TYPE.HORIZONTAL ? "400px" : "168px"), i = computed(() => t.type === COPY_RIGHT_TYPE.HORIZONTAL ? "auto auto 0 5px" : "0 auto auto 5px");
1867
+ return (r, l) => (openBlock(), createElementBlock("div", _hoisted_1, [
1868
+ createElementVNode("img", {
1869
+ src: unref(CDN_URL) + o.value,
1870
+ width: n.value,
1871
+ class: "logo",
1872
+ alt: ""
1873
+ }, null, 8, _hoisted_2)
1874
+ ]));
1875
+ }
1876
+ }), Copyright = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-15a296ba"]]), dotImage = new Image();
1877
+ dotImage.src = `${CDN_URL}/map/truck-dot.svg`;
1878
+ dotImage.crossOrigin = "anonymous";
1879
+ const dotActiveImage = new Image();
1880
+ dotActiveImage.src = `${CDN_URL}/map/truck-dot-active.svg`;
1881
+ dotActiveImage.crossOrigin = "anonymous";
1882
+ const cameraImage = new Image();
1883
+ cameraImage.src = `${CDN_URL}/map/map-camera.svg`;
1884
+ cameraImage.crossOrigin = "anonymous";
1885
+ const loadImage = new Image();
1886
+ loadImage.src = `${CDN_URL}/map/map-load.svg`;
1887
+ loadImage.crossOrigin = "anonymous";
1888
+ const setTruckStyle = (e, t, o, n) => new Style({
1889
+ renderer: (i, r) => {
1890
+ const l = r.context;
1891
+ l.save();
1892
+ let c = 1;
1893
+ l.scale(c, c);
1894
+ let [s, m] = i;
1895
+ s = Number(s) / c - 20, m = Number(m) / c;
1896
+ const d = s - 70, u = m - 68;
1897
+ let f = 180;
1898
+ const p = 56, h = "#FFFFFF";
1899
+ let v = 176;
1900
+ const g = 52;
1901
+ let k = "#164AFF", M = "#FFFFFF";
1902
+ o === CAR_COLOR.YELLOW ? (v = 176, k = "#FFC81E", M = "rgba(0,0,0,0.88)") : o === CAR_COLOR.Y_GREEN && (f = 200, v = 196, k = "#8FED7C", M = "rgba(0,0,0,0.88)"), n != null && n.length && (f += n.length * 56), fillRectRadius(l, d, u, f, p, h), fillRectRadius(l, d + 2, u + 2, v, g, k), o === CAR_COLOR.Y_GREEN && fillRectRadius(l, d + 2, u + 2, 68, g, "#FFC81E"), l.save(), l.restore(), l.fillStyle = M, l.font = "bold 28px Arial", l.textAlign = "left", l.textBaseline = "middle";
1903
+ const I = `${t.slice(0, 2) + " · " + t.slice(2)}`;
1904
+ if (l.fillText(I, d + 12, u + 32), l.save(), l.restore(), n != null && n.length) {
1905
+ const V = l.measureText(I).width + 12;
1906
+ let F = 0;
1907
+ n.forEach(($) => {
1908
+ $ === DEVICE_TYPE.CAMERA && (l.drawImage(cameraImage, s - 54 + V + F * 56, m - 64, 50, 50), ++F), $ === DEVICE_TYPE.LOAD && (l.drawImage(loadImage, s - 54 + V + F * 56, m - 64, 50, 50), ++F);
1909
+ });
1910
+ }
1911
+ const E = dotImage;
1912
+ l.drawImage(E, s + f / 2 - 90, m, 50 / c, 50 / c), l.restore();
1913
+ }
1914
+ }), mapInstance$2 = ref(), renderDashboardSetInstance = (e) => mapInstance$2.value = e;
1915
+ ref([]);
1916
+ let truckMarkerList = [], trucksVectorSource;
1917
+ const renderTrucksMarker = (e) => {
1918
+ if (deleteAllTruckMarkers(), !!mapInstance$2.value)
1919
+ return e.forEach((t) => {
1920
+ const o = formatUtils.convertSixHundredThousandToLatLng(t.lon, t.lat), n = new Feature({
1921
+ geometry: new Point(fromLonLat(o))
1922
+ });
1923
+ n.set("data", t), n.setStyle(
1924
+ setTruckStyle(!1, t.vno, t.vclColor ?? 0, t.icons ?? [])
1925
+ ), truckMarkerList.push({
1926
+ name: t.vno,
1927
+ lonlat: o,
1928
+ feature: n
1929
+ });
1930
+ }), trucksVectorSource = new VectorSource({
1931
+ features: truckMarkerList.map((t) => t.feature)
1932
+ }), trucksLayer.value = new VectorLayer({
1933
+ source: trucksVectorSource
1934
+ }), mapInstance$2.value.addLayer(trucksLayer.value), trucksLayer.value;
1935
+ }, deleteAllTruckMarkers = () => {
1936
+ truckMarkerList.forEach((e) => {
1937
+ e.feature && (trucksVectorSource == null || trucksVectorSource.removeFeature(e.feature));
1938
+ }), truckMarkerList = [];
1939
+ }, mapInstance$1 = ref(), renderTruckSetInstance = (e) => mapInstance$1.value = e, vehicle = ref(null), focusShipData = ref(), currentTruckOverlay = ref(null), findTruck = async (e, t) => {
1940
+ if (!mapInstance$1.value || (focusShipData.value = e, !(e != null && e.lon && (e != null && e.lat)))) return;
1941
+ const o = Math.abs(Number(e.lon)) > 180 ? formatUtils.convertSixHundredThousandToLatLng(e.lon, e.lat) : [e.lon, e.lat], n = mapInstance$1.value.getPixelFromCoordinate(transform(o, projection.data, projection.mercator));
1942
+ currentTruckOverlay.value = e ? drawTruckIcon(e.vno, n, (e == null ? void 0 : e.drc) ?? "", t) ?? null : null;
1943
+ const i = mapInstance$1.value.getView(), r = new Point(o);
1944
+ i.setCenter(transform(r.getCoordinates(), projection.data, projection.mercator));
1945
+ }, clearAllTruck = () => {
1946
+ vehicle.value.clearAllShip();
1947
+ }, drawTruckIcon = (e, t, o, n) => {
1948
+ let i = `<div id="${e}" class="ol-custom-content truck-custom-content" style="width: 80px; height: 80px; transform: rotate(${o}deg);">
1949
+ <img src="${CDN_URL}map/car-icon.gif" width="100%" height="100%" />
1950
+ </div>`;
1951
+ return n && (i += n), drawCustomContent(e, t, i, "center-center");
1952
+ }, removeTruckIcon = () => {
1953
+ var t;
1954
+ const e = (t = currentTruckOverlay.value) == null ? void 0 : t.getElement();
1955
+ e && (e.innerHTML = "");
1956
+ }, zoomTruckIcon = () => {
1957
+ var r;
1958
+ if (!mapInstance$1.value) return;
1959
+ const e = mapInstance$1.value.getView().getZoom(), t = 120, o = 60;
1960
+ function n(l) {
1961
+ return l < 14 ? o : l >= 14 && l <= 18 ? Math.round((l - 14) * (t - o) / 4 + o) : t;
1962
+ }
1963
+ const i = n(e);
1964
+ (r = document.querySelectorAll(".truck-custom-content")) == null || r.forEach((l) => {
1965
+ l.style.width = `${i}px`, l.style.height = `${i}px`;
1966
+ });
1967
+ }, mapInstance = ref(), drawPolygonSetInstance = (e) => mapInstance.value = e;
1968
+ let layerState = "drawn", drawnState = "undrawn";
1969
+ const source = new VectorSource();
1970
+ let sketch, helpTooltipElement, helpTooltip, measureTooltipElement, measureTooltip, circleStyle, drawVector, draw;
1971
+ const drawPolygonStyle = {
1972
+ // 渲染层 绘制结束
1973
+ drawend: new Style({
1974
+ stroke: new Stroke({
1975
+ color: "#fbcc33",
1976
+ width: 2
1977
+ })
1978
+ }),
1979
+ // 交互层 绘制中
1980
+ drawing: new Style({
1981
+ stroke: new Stroke({
1982
+ color: "rgba(255, 255, 255, 1)",
1983
+ width: 1.5,
1984
+ lineDash: [10, 10]
1985
+ }),
1986
+ fill: new Fill({
1987
+ color: "rgba(255, 255, 255, 0.25)"
1988
+ })
1989
+ })
1990
+ };
1991
+ function createMeasureTooltip() {
1992
+ var e;
1993
+ measureTooltipElement != null && measureTooltipElement.parentNode && measureTooltipElement.parentNode.removeChild(measureTooltipElement), measureTooltipElement = document.createElement("div"), measureTooltipElement.className = "ol-tooltip ol-tooltip-draw-polygon", measureTooltip = new Overlay({
1994
+ element: measureTooltipElement,
1995
+ offset: [0, -15],
1996
+ positioning: "bottom-center",
1997
+ stopEvent: !1,
1998
+ insertFirst: !1
1999
+ }), (e = mapInstance.value) == null || e.addOverlay(measureTooltip);
2000
+ }
2001
+ function createHelpTooltip() {
2002
+ var e;
2003
+ helpTooltipElement != null && helpTooltipElement.parentNode && helpTooltipElement.parentNode.removeChild(helpTooltipElement), helpTooltipElement = document.createElement("div"), helpTooltipElement.className = "ol-tooltip ol-help-tooltip hidden", helpTooltip = new Overlay({
2004
+ element: helpTooltipElement,
2005
+ offset: [15, 0],
2006
+ positioning: "center-left"
2007
+ }), (e = mapInstance.value) == null || e.addOverlay(helpTooltip);
2008
+ }
2009
+ let squareLimitError = !1, lineLimitError = !1;
2010
+ const validateSquareLimit = (e) => {
2011
+ let o = 1 / 0, n = -1 / 0, i = 1 / 0, r = -1 / 0;
2012
+ e == null || e.forEach((s) => {
2013
+ const m = transform(s, projection.mercator, projection.data), d = m[0], u = m[1];
2014
+ o = Math.min(o, u), n = Math.max(n, u), i = Math.min(i, d), r = Math.max(r, d);
2015
+ });
2016
+ const l = (n - o) * 111, c = (r - i) * 111;
2017
+ squareLimitError = l > 150 || c > 150;
2018
+ };
2019
+ let storeFeature, callbackFunction = null;
2020
+ const addInteraction = (e) => {
2021
+ var o, n;
2022
+ showDrawLayer.value = !0, e && (callbackFunction = e), drawVector || init(), drawnState = "undrawn", layerState = "drawn", drawVector && ((o = mapInstance.value) == null || o.addLayer(drawVector)), draw = new Draw({
2023
+ type: "Polygon",
2024
+ source,
2025
+ trace: !0,
2026
+ style: [drawPolygonStyle.drawing, circleStyle]
2027
+ }), storeFeature || ((n = mapInstance.value) == null || n.addInteraction(draw), createHelpTooltip()), createMeasureTooltip();
2028
+ let t;
2029
+ draw.on("drawstart", function(i) {
2030
+ var r;
2031
+ layerState = "drawn", sketch = i.feature, t = (r = sketch.getGeometry()) == null ? void 0 : r.on("change", function(l) {
2032
+ const c = l.target, s = formatUtils.formatArea(c, LENGTH_UNIT.NM), d = c.getCoordinates()[0], u = new LineString([d[d.length - 2], d[d.length - 1]]), f = formatUtils.formatLength(u, LENGTH_UNIT.NM);
2033
+ if (lineLimitError = Number(getLength(u) / 1e3) > 150, validateSquareLimit(d), measureTooltipElement && s && (measureTooltipElement.innerHTML = `
2034
+ <span class="text">面积:${s}${lineLimitError || squareLimitError ? '<span class="error pl-12">超出可以绘画的距离</span>' : ""}</span>
2035
+ `), helpTooltipElement && s) {
2036
+ let p = "";
2037
+ parseFloat(s) > 0 && (p = `
2038
+ <div class="text ${squareLimitError ? "error" : ""}">面积:${s}${squareLimitError ? '<span class="error pl-12">超出可以绘画的距离</span>' : ""}</div>`), helpTooltipElement.innerHTML = `${p}
2039
+ <span class="text ${lineLimitError ? "error" : ""}">线段${d.length - 2}:${f}${lineLimitError ? '<span class="error pl-4">超出可以绘画的距离</span>' : ""}</span>
2040
+ <div><span class="text">单击继续,双击结束</span></div>
2041
+ `;
2042
+ }
2043
+ }), drawnState = "drawing";
2044
+ }), draw.on("drawend", function(i) {
2045
+ if (i.feature.getGeometry()) {
2046
+ storeFeature = i.feature;
2047
+ const r = endFn(i.feature);
2048
+ r != null && r.length && callbackFunction && callbackFunction(r);
2049
+ }
2050
+ if (sketch = null, measureTooltipElement = null, createMeasureTooltip(), t && unByKey(t), drawnState = "drawend", draw && mapInstance.value) {
2051
+ const r = mapInstance.value.getInteractions().getArray().find((l) => getUid(l) === getUid(draw));
2052
+ r && mapInstance.value.removeInteraction(r), helpTooltipElement != null && helpTooltipElement.parentNode && helpTooltipElement.parentNode.removeChild(helpTooltipElement);
2053
+ }
2054
+ });
2055
+ }, removeInteraction = () => {
2056
+ var e, t, o;
2057
+ if (mapInstance.value) {
2058
+ if (showDrawLayer.value = !1, document.querySelectorAll(".ol-tooltip.ol-tooltip-draw-polygon").forEach((n) => {
2059
+ var i;
2060
+ (i = n == null ? void 0 : n.parentNode) == null || i.removeChild(n);
2061
+ }), source.clear(), drawVector && ((e = mapInstance.value) == null || e.removeLayer(drawVector)), helpTooltipElement != null && helpTooltipElement.parentNode && helpTooltipElement.parentNode.removeChild(helpTooltipElement), ((t = mapInstance.value) == null ? void 0 : t.getTargetElement()).style.cursor = "", document.querySelector("#map").style.cursor = "", draw) {
2062
+ const n = mapInstance.value.getInteractions().getArray().find((i) => getUid(i) === getUid(draw));
2063
+ n && ((o = mapInstance.value) == null || o.removeInteraction(n));
2064
+ }
2065
+ drawnState = "undrawn", layerState = "destroyed";
2066
+ }
2067
+ }, endFn = (e) => {
2068
+ var t, o, n;
2069
+ if (e.getGeometry()) {
2070
+ const i = [], l = e.getGeometry().getCoordinates();
2071
+ (t = l[0]) == null || t.forEach((s) => {
2072
+ i.push(transform(s, projection.mercator, projection.data));
2073
+ });
2074
+ const c = l[0][l[0].length - 2];
2075
+ if (c && measureTooltip.setPosition(c), measureTooltip.setOffset([10, 0]), measureTooltipElement && (measureTooltipElement.innerHTML += '<span class="delete-icon"><i class="map-iconfont icon-delete" /></div>'), (o = document.querySelector(".delete-icon")) == null || o.addEventListener("click", () => {
2076
+ reset();
2077
+ }), !lineLimitError && !squareLimitError)
2078
+ return i;
2079
+ draw && ((n = mapInstance.value) == null || n.removeInteraction(draw)), helpTooltipElement != null && helpTooltipElement.parentNode && helpTooltipElement.parentNode.removeChild(helpTooltipElement);
2080
+ }
2081
+ }, initFeature = (e) => {
2082
+ var t, o;
2083
+ if (e && (callbackFunction = e), layerState = "drawn", storeFeature) {
2084
+ const n = storeFeature.getGeometry();
2085
+ if (!n) return;
2086
+ const i = formatUtils.formatArea(n, LENGTH_UNIT.NM);
2087
+ measureTooltipElement && (measureTooltipElement.innerHTML = `
2088
+ <span class="text">面积:${i}${lineLimitError || squareLimitError ? '<span class="error pl-12">超出可以绘画的距离</span>' : ""}</span>
2089
+ `), drawVector && ((t = drawVector.getSource()) == null || t.addFeature(storeFeature));
2090
+ const r = endFn(storeFeature);
2091
+ r != null && r.length && callbackFunction && callbackFunction(r);
2092
+ const l = getCenter(storeFeature.getGeometry().getExtent());
2093
+ (o = mapInstance.value) == null || o.getView().setCenter(l);
2094
+ }
2095
+ }, pointerMoveHandler = function(e) {
2096
+ var o;
2097
+ if (e.dragging)
2098
+ return;
2099
+ let t = "点击选择起点";
2100
+ sketch && (t = "单击继续,双击结束"), helpTooltipElement && (helpTooltipElement.innerHTML = t, helpTooltip.setPosition(e.coordinate), helpTooltipElement.classList.remove("hidden")), layerState === "drawn" && (((o = mapInstance.value) == null ? void 0 : o.getTargetElement()).style.cursor = "crosshair");
2101
+ }, init = () => {
2102
+ mapInstance.value && (circleStyle = new Style({
2103
+ image: new CircleStyle({
2104
+ radius: 5,
2105
+ fill: new Fill({
2106
+ color: "rgb(51,112,255, 1)"
2107
+ })
2108
+ }),
2109
+ geometry: function(e) {
2110
+ const t = e.getGeometry().getCoordinates();
2111
+ return new MultiPoint(t);
2112
+ }
2113
+ }), drawVector = new VectorLayer({
2114
+ source,
2115
+ style: drawPolygonStyle.drawend
2116
+ }), mapInstance.value.on("pointermove", pointerMoveHandler), mapInstance.value.getViewport().addEventListener("mouseout", function() {
2117
+ var e;
2118
+ (e = helpTooltipElement == null ? void 0 : helpTooltipElement.classList) == null || e.add("hidden");
2119
+ }), mapInstance.value.on(["dblclick"], function(e) {
2120
+ drawnState !== "undrawn" && (e.stopPropagation(), e.preventDefault());
2121
+ }));
2122
+ }, destroy = () => {
2123
+ storeFeature = null, drawVector = null, removeInteraction();
2124
+ }, reset = () => {
2125
+ destroy(), addInteraction();
2126
+ }, drawPolygonTool = {
2127
+ addInteraction,
2128
+ removeInteraction,
2129
+ initFeature,
2130
+ reset,
2131
+ destroy
2132
+ }, setPointStyle = (e, t, o) => {
2133
+ const n = new Image();
2134
+ n.crossOrigin = "anonymous";
2135
+ const i = new Image();
2136
+ i.crossOrigin = "anonymous";
2137
+ const { color: r, url: l, activeUrl: c, activeColor: s, imgWidth: m, imgHeight: d } = o;
2138
+ return (c || l) && (e ? i.src = CDN_URL + (c || l) : n.src = CDN_URL + (l || c)), new Style({
2139
+ renderer: (u, f) => {
2140
+ const p = f.context;
2141
+ p.save();
2142
+ const h = window.devicePixelRatio || 1;
2143
+ let [v, g] = u;
2144
+ if (v = Number(v), g = Number(g), t) {
2145
+ p.font = `${12 * h}px Arial`;
2146
+ const k = p.measureText(t).width, M = v - k / 2 - (h <= 1 ? 10 : -3), I = g + (h <= 1 ? 0 : 10) + 6 * h, E = k + 4, V = 16 * h, F = e && s || r;
2147
+ fillRectRadius(p, M, I + (h <= 1 ? 6 : 13 * h), E, V, F), p.save(), p.restore(), p.fillStyle = e ? "#FFFFFF" : "#000000", p.textAlign = "center", p.textBaseline = "middle", p.fillText(t, M + (k + 4) / 2, I + (h <= 1 ? 15 : 22 * h)), p.save(), p.restore();
2148
+ }
2149
+ if (l || c) {
2150
+ const k = e ? i : n;
2151
+ p.drawImage(k, v - (m || k.width) / 2, g - (d || k.height) / 2, 30 * h, 30 * h);
2152
+ }
2153
+ p.restore();
2154
+ }
2155
+ });
2156
+ };
2157
+ class PointMarkerClass {
2158
+ /**
2159
+ * 地图实例
2160
+ * @param mapInstance
2161
+ * 配置渲染点的样式
2162
+ * @param options
2163
+ */
2164
+ constructor(t, o) {
2165
+ C(this, "mapInstance");
2166
+ // 渲染的数据
2167
+ C(this, "pointMarkerList", []);
2168
+ // 绘制点渲染层数据
2169
+ C(this, "pointsVectorSource");
2170
+ // 当前高亮的数据
2171
+ C(this, "highlightPoint");
2172
+ C(this, "pointLayer");
2173
+ // 颜色等其他设置
2174
+ C(this, "options");
2175
+ // 使用坐标点区域自动缩放地图层级
2176
+ C(this, "resetPointsView", (t, o = 0.02) => {
2177
+ var l;
2178
+ if (!this.mapInstance || t.length === 0) return;
2179
+ const n = (l = this.mapInstance) == null ? void 0 : l.getView();
2180
+ if (!n) return;
2181
+ const r = t.map(
2182
+ (c) => transform(c, projection.data, projection.mercator)
2183
+ ).reduce((c, s) => [
2184
+ Math.min(c[0], s[0]),
2185
+ Math.min(c[1], s[1]),
2186
+ Math.max(c[2], s[0]),
2187
+ Math.max(c[3], s[1])
2188
+ ], [1 / 0, 1 / 0, -1 / 0, -1 / 0]);
2189
+ try {
2190
+ const c = buffer(r, Math.max(r[2] - r[0], r[3] - r[1]) * o);
2191
+ n.fit(c);
2192
+ } catch (c) {
2193
+ console.error("Failed to zoom to points:", c);
2194
+ }
2195
+ });
2196
+ this.mapInstance = t, this.options = o;
2197
+ }
2198
+ /**
2199
+ * 渲染
2200
+ * @param list
2201
+ * 格式:
2202
+ * 获取数据的id
2203
+ * id
2204
+ * 地图显示
2205
+ * name
2206
+ * fullName,
2207
+ * 经纬度
2208
+ * lon,
2209
+ * lat,
2210
+ * 渲染点的数据类型,好通过这个判断点击地图获取到的类型, 任意字符串
2211
+ * pointType
2212
+ */
2213
+ renderPointMarker(t) {
2214
+ if (this.deleteAllPointMarkers(), !this.mapInstance) return;
2215
+ let o = {};
2216
+ t.forEach((n) => {
2217
+ var r;
2218
+ const i = [n.lon, n.lat];
2219
+ if (((r = this.highlightPoint) == null ? void 0 : r.id) === n.id)
2220
+ o = {
2221
+ id: n.id,
2222
+ name: n.name,
2223
+ lonlat: [Number(n.lon), Number(n.lat)],
2224
+ pointType: n.pointType
2225
+ };
2226
+ else {
2227
+ const l = this.getFeature(n, i);
2228
+ this.pointMarkerList.push({
2229
+ id: n.id,
2230
+ name: n.name,
2231
+ lonlat: [Number(n.lon), Number(n.lat)],
2232
+ feature: l,
2233
+ pointType: n.pointType
2234
+ });
2235
+ }
2236
+ }), o && o.lonlat && (o.feature = this.getFeature(o, o.lonlat), this.pointMarkerList.push(o)), this.pointsVectorSource = new VectorSource({
2237
+ features: [...this.pointMarkerList.map((n) => n.feature)]
2238
+ }), this.pointLayer = new VectorLayer({
2239
+ source: this.pointsVectorSource
2240
+ }), this.mapInstance.addLayer(this.pointLayer);
2241
+ }
2242
+ // 删除 未选中的渲染点
2243
+ deleteAllPointMarkers(t) {
2244
+ this.pointMarkerList.forEach((o) => {
2245
+ var n;
2246
+ o.feature && t !== o.id && ((n = this.pointsVectorSource) == null || n.removeFeature(o.feature));
2247
+ });
2248
+ }
2249
+ // 取消高亮
2250
+ cancelHighlightTruckMarker() {
2251
+ if (!this.highlightPoint)
2252
+ return;
2253
+ const { id: t, name: o } = this.highlightPoint;
2254
+ this.highlightPoint = void 0, this.pointMarkerList.find((n) => {
2255
+ n.id === t && n.feature.setStyle(
2256
+ setPointStyle(!1, o, this.options)
2257
+ );
2258
+ });
2259
+ }
2260
+ /**
2261
+ * 设置选中
2262
+ * 渲染
2263
+ * @param item
2264
+ * 格式:
2265
+ * 获取数据的id
2266
+ * id
2267
+ * 地图显示
2268
+ * name
2269
+ * fullName,
2270
+ * 经纬度
2271
+ * lon,
2272
+ * lat,
2273
+ * 渲染点的数据类型,好通过这个判断点击地图获取到的类型, 任意字符串
2274
+ * pointType
2275
+ */
2276
+ highlightPointMarker(t) {
2277
+ if (!this.mapInstance) return;
2278
+ const { id: o, name: n, fullName: i, lon: r, lat: l, pointType: c } = t, s = [Number(r), Number(l)];
2279
+ this.highlightPoint = {
2280
+ id: o,
2281
+ name: n,
2282
+ fullName: i,
2283
+ lonlat: s,
2284
+ pointType: c
2285
+ }, this.setPointCenter(s);
2286
+ }
2287
+ // 获取feature
2288
+ getFeature(t, o) {
2289
+ var i;
2290
+ const n = new Feature({
2291
+ geometry: new Point(fromLonLat(o))
2292
+ });
2293
+ return n.set("data", t), n.setStyle(
2294
+ setPointStyle(((i = this.highlightPoint) == null ? void 0 : i.id) === t.id, t.name, this.options)
2295
+ ), n;
2296
+ }
2297
+ /**
2298
+ *
2299
+ * @param lonlat 经纬度
2300
+ * @param options {
2301
+ * customZoom 自定义层级
2302
+ * type 0: 不改变地图大小 1: 等于customZoom 2: 地图当前zoom > 传入的customZoom(缩小地图) 3: 地图当前zoom < 传入的customZoom(放大地图)
2303
+ * }
2304
+ */
2305
+ setPointCenter(t, o = { customZoom: mapZoom.findShip, type: 1 }) {
2306
+ if (!this.mapInstance) return;
2307
+ const { customZoom: n = mapZoom.findShip, type: i = 1 } = o, r = this.mapInstance.getView(), l = r.getZoom();
2308
+ (i === 1 || l > n && i === 2 || l < n && i === 3) && r.setZoom(n);
2309
+ const c = new Point(t);
2310
+ r.setCenter(transform(c.getCoordinates(), projection.data, projection.mercator));
2311
+ }
2312
+ }
2313
+ const _sfc_main = /* @__PURE__ */ defineComponent({
2314
+ __name: "Map",
2315
+ props: {
2316
+ zoom: {},
2317
+ center: {},
2318
+ vehicleMode: {},
2319
+ viewMode: {},
2320
+ mmsi: {},
2321
+ shipData: {},
2322
+ logoType: {},
2323
+ showToolPanel: { type: Boolean }
2324
+ },
2325
+ emits: ["zoomChanged", "extentChanged"],
2326
+ setup(e, { expose: t, emit: o }) {
2327
+ const n = ref();
2328
+ provide("mapInstance", n);
2329
+ const i = ref(null), r = ref(null), l = ref(null), c = o, s = e, m = ref(s.zoom || mapZoom.default), d = ref(!1), u = ref(!0), f = ref(!0), p = ref(!0), h = {
2330
+ tiandituTile: new TileLayer({ source: new XYZ({ url: baseMap.tiandituTile }) }),
2331
+ tiandituTileMark: new TileLayer({ source: new XYZ({ url: baseMap.tiandituTileMark }) }),
2332
+ tiandituImgTile: new TileLayer({ source: new XYZ({ url: baseMap.tiandituImgTile }), visible: !1 }),
2333
+ tiandituImgTileMark: new TileLayer({ source: new XYZ({ url: baseMap.tiandituImgTileMark }), visible: !1 }),
2334
+ greenMark: new TileLayer({ source: new XYZ({ url: baseMap.greenTile }) })
2335
+ }, v = () => {
2336
+ var L, w;
2337
+ const y = {
2338
+ projection: projection.mercator,
2339
+ // 地图投影坐标系
2340
+ zoom: s.zoom || (s.vehicleMode === "ship" ? mapZoom.default : mapZoom.truckDefault),
2341
+ // 地图缩放级别(打开页面时默认级别)
2342
+ minZoom: mapZoom.min,
2343
+ // 地图缩放最小级别
2344
+ maxZoom: mapZoom.max,
2345
+ // 地图缩放最大级别
2346
+ center: transformUtils.lonLatToMercator(s.center || mapDefaultCenter),
2347
+ // 地图中心坐标
2348
+ constrainResolution: !0,
2349
+ // 需设为true禁用平滑缩放,zoom值为整数
2350
+ enableRotation: !1,
2351
+ // 禁用旋转
2352
+ multiWorld: !0
2353
+ };
2354
+ n.value = new Map$1({
2355
+ target: "map",
2356
+ // 对应页面里 id 为 map 的元素
2357
+ layers: [
2358
+ // 图层
2359
+ h.tiandituTile,
2360
+ h.tiandituTileMark,
2361
+ h.tiandituImgTile,
2362
+ h.tiandituImgTileMark,
2363
+ h.greenMark
2364
+ ],
2365
+ view: new View(y)
2366
+ }), g(), s.showToolPanel === void 0 ? p.value = !0 : p.value = s.showToolPanel, (L = r.value) == null || L.setScaleLine(s.vehicleMode === "ship" ? "nautical" : "metric"), (w = n.value) == null || w.on("moveend", E), k(y.zoom < mapZoom.shipGreenDotMax), I(s.vehicleMode === "ship" || s.viewMode === "findShip" ? BaseMapType.satellite : BaseMapType.vector), s.viewMode === "findShip" && s.mmsi && s.shipData && nextTick(() => {
2367
+ findShip(String(s.mmsi), s.shipData);
2368
+ }), onShipsMarkerHover();
2369
+ };
2370
+ onMounted(() => {
2371
+ v();
2372
+ });
2373
+ const g = () => {
2374
+ n.value && (renderCustomOverlaySetInstance(n.value), renderTruckSetInstance(n.value), drawPolygonSetInstance(n.value), renderShipStyleSetInstance(n.value), renderTrackStyleSetInstance(n.value), renderDashboardSetInstance(n.value), renderMarkerSetInstance(n.value), renderShipSetInstance(n.value), renderTrackSetInstance(n.value));
2375
+ }, k = (y) => {
2376
+ var L;
2377
+ s.vehicleMode !== "ship" && (y = !1), (L = n.value) == null || L.getLayers().forEach((w) => {
2378
+ getUid(w) === getUid(h.greenMark) && (w.setVisible(y), u.value = y);
2379
+ });
2380
+ }, M = ref(BaseMapType.satellite), I = (y) => {
2381
+ var L;
2382
+ M.value = y, (L = n.value) == null || L.getLayers().forEach((w) => {
2383
+ (getUid(w) === getUid(h.tiandituTile) || getUid(w) === getUid(h.tiandituTileMark) || getUid(w) === getUid(h.tiandituImgTile) || getUid(w) === getUid(h.tiandituImgTileMark)) && w.setVisible(!1), (y === BaseMapType.vector && (getUid(w) === getUid(h.tiandituTile) || getUid(w) === getUid(h.tiandituTileMark)) || y === BaseMapType.satellite && (getUid(w) === getUid(h.tiandituImgTile) || getUid(w) === getUid(h.tiandituImgTileMark))) && w.setVisible(!0);
2384
+ });
2385
+ }, E = () => {
2386
+ const y = n.value.getView(), L = y.getZoom();
2387
+ L && V(L);
2388
+ const w = y.calculateExtent(n.value.getSize());
2389
+ w && L && F(w, L);
2390
+ }, V = (y) => {
2391
+ var S, T, b, P, x;
2392
+ m.value = y, k(y < mapZoom.shipGreenDotMax);
2393
+ const L = (S = n.value) == null ? void 0 : S.getLayers(), w = s.vehicleMode === "ship" ? L == null ? void 0 : L.getArray().find((N) => getUid(N) === getUid(h.greenMark)) : void 0;
2394
+ showTrackLayer.value ? (f.value = !1, w == null || w.setVisible(!1), (T = shipsLayer.value) == null || T.setVisible(!1), (b = largeAmountShipsLayer.value) == null || b.setVisible(!1)) : !d.value && u.value && y <= mapZoom.shipGreenDotMax ? (f.value = !0, w == null || w.setVisible(!0), (P = shipsLayer.value) == null || P.setVisible(!1), (x = largeAmountShipsLayer.value) == null || x.setVisible(!1)) : (f.value = !1, w == null || w.setVisible(!1)), c("zoomChanged", y);
2395
+ }, F = (y, L) => {
2396
+ const w = transform([y[0], y[1]], projection.mercator, projection.data), S = transform([y[2], y[3]], projection.mercator, projection.data);
2397
+ c("extentChanged", { extent: [w, S], zoom: L });
2398
+ };
2399
+ return t({
2400
+ mapInstance: n,
2401
+ initMap: v,
2402
+ pointRender: (y, L) => new PointMarkerClass(y, L),
2403
+ renderTrucksMarker,
2404
+ renderShip: renderShips,
2405
+ renderTrack: (y, L, w, S = 200) => {
2406
+ var T, b;
2407
+ showDrawLayer.value = !0, currentTrackId.value = y, showTrackLayer.value = !0, d.value = !0, hiddenAllShips(), (b = (T = largeAmountShipsLayer.value) == null ? void 0 : T.getSource()) == null || b.clear(), renderTrack(y, s.vehicleMode === "ship" ? L.reverse() : L, w, LENGTH_UNIT.NM, "ship", S);
2408
+ },
2409
+ findTruck,
2410
+ removeTruckIcon,
2411
+ clearAllTruck,
2412
+ closeTrack: (y = !1) => {
2413
+ var L, w, S;
2414
+ showDrawLayer.value = !1, showTrackLayer.value = !1, (L = shipTrackVectorLayer.value) == null || L.setVisible(!1), (w = selectShipsLayer.value) == null || w.setVisible(!0), d.value = !1, k(m.value < mapZoom.shipGreenDotMax), y && (allTracks.value = [], (S = trackLineVectorSource.value) == null || S.clear()), stopAnimation();
2415
+ },
2416
+ closeTruckTrack: () => {
2417
+ var y, L;
2418
+ showTrackLayer.value = !1, (y = shipTrackVectorLayer.value) == null || y.setVisible(!1), (L = selectShipsLayer.value) == null || L.setVisible(!0), stopAnimation();
2419
+ },
2420
+ resetTrackView,
2421
+ playTrack,
2422
+ clearSelectFeature,
2423
+ findShip,
2424
+ focusShip: (y, L, w = !0) => {
2425
+ var S, T;
2426
+ hiddenOrther.value = w, (S = shipsLayer.value) == null || S.setVisible(!w), w || rerenderShip(), (T = largeAmountShipsLayer.value) == null || T.setVisible(!1), findShip(y, L);
2427
+ },
2428
+ clearShipData,
2429
+ showTracks,
2430
+ removeAllTrackLayer,
2431
+ switchFilterItem,
2432
+ rerenderShip,
2433
+ switchGreenDot: () => k(!1),
2434
+ zoomTruckIcon,
2435
+ renderTruckTrack: (y, L, w, S = 1e3) => {
2436
+ currentTrackId.value = y, showTrackLayer.value = !0, renderTrack(y, L, w, LENGTH_UNIT.KM, "truck", S);
2437
+ },
2438
+ drawCustomContent,
2439
+ removerLayer: removeShipTrackLineFeatureByIndex,
2440
+ renderMarker,
2441
+ setMarkerPosition: (y) => {
2442
+ d.value = !0, setMarkerPosition(y);
2443
+ },
2444
+ getZoomAndCenter: () => {
2445
+ var T;
2446
+ const y = (T = n.value) == null ? void 0 : T.getView();
2447
+ if (!y) return null;
2448
+ const L = Math.round(Number(y.getZoom())), { lon: w, lat: S } = transformUtils.mercatorToLonLat(y.getCenter());
2449
+ return { zoom: L, center: [w, S] };
2450
+ },
2451
+ setCenter: (y) => {
2452
+ var S;
2453
+ const L = (S = n.value) == null ? void 0 : S.getView();
2454
+ if (!L) return null;
2455
+ const w = new Point(y);
2456
+ L.setCenter(transform(w.getCoordinates(), projection.data, projection.mercator));
2457
+ },
2458
+ deleteLabelFromArray: deleteLabelFromArrayById,
2459
+ drawPolygonTool,
2460
+ setMapInstance: g,
2461
+ store: {
2462
+ showDrawLayer: () => showDrawLayer.value
2463
+ },
2464
+ config: {
2465
+ mapZoom,
2466
+ projection
2467
+ },
2468
+ utils: {
2469
+ transform: transformUtils,
2470
+ format: formatUtils
2471
+ }
2472
+ }), (y, L) => (openBlock(), createElementBlock("div", {
2473
+ class: "map-page map-container",
2474
+ ref_key: "pageRef",
2475
+ ref: i
2476
+ }, [
2477
+ L[0] || (L[0] = createElementVNode("div", {
2478
+ id: "map",
2479
+ class: "map"
2480
+ }, null, -1)),
2481
+ p.value ? (openBlock(), createBlock(ToolPanel, {
2482
+ key: 0,
2483
+ "vehicle-mode": y.vehicleMode,
2484
+ "view-mode": y.viewMode,
2485
+ "disable-green-dot": d.value,
2486
+ "show-track-layer": unref(showTrackLayer),
2487
+ "map-tile-mode": M.value,
2488
+ onSwitchGreenDot: k,
2489
+ onSwitchMapTile: I
2490
+ }, {
2491
+ toolPanel: withCtx(() => [
2492
+ renderSlot(y.$slots, "toolPanel", {}, void 0, !0)
2493
+ ]),
2494
+ _: 3
2495
+ }, 8, ["vehicle-mode", "view-mode", "disable-green-dot", "show-track-layer", "map-tile-mode"])) : createCommentVNode("", !0),
2496
+ y.viewMode !== "WxMiniprogram" ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [
2497
+ createVNode(ScaleLine, {
2498
+ ref_key: "scaleLineControl",
2499
+ ref: r
2500
+ }, null, 512),
2501
+ createVNode(ZoomControl, {
2502
+ ref_key: "zoomControl",
2503
+ ref: l
2504
+ }, null, 512)
2505
+ ], 64)) : createCommentVNode("", !0),
2506
+ createVNode(Copyright, {
2507
+ type: y.logoType,
2508
+ "map-tile": M.value
2509
+ }, null, 8, ["type", "map-tile"])
2510
+ ], 512));
2511
+ }
2512
+ }), Map = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-8b2af3a3"]]), ZhMap = withInstall(Map);
2513
+ export {
2514
+ BaseMapType as B,
2515
+ CDN_URL as C,
2516
+ DEFAULT_VALUE as D,
2517
+ LOG_DATE_FORMAT as L,
2518
+ SEARCH_TYPE as S,
2519
+ ZhMap as Z,
2520
+ mapDefaultCenter as a,
2521
+ baseMap as b,
2522
+ COPY_RIGHT_TYPE as c,
2523
+ mapZoom as m,
2524
+ projection as p,
2525
+ renderShipsLimit as r,
2526
+ tiandituKey as t,
2527
+ zhongkeKey as z
2528
+ };