zhihao-ui 1.2.65 → 1.3.0

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 (99) hide show
  1. package/dist/es/{BaseInfo-VzgiaCKn.js → BaseInfo-DP7wB6Hy.js} +1 -1
  2. package/dist/es/{BaseItem-BtsARxvz.js → BaseItem-zKXAWw6X.js} +3 -3
  3. package/dist/es/{Button-Dw3i74l2.js → Button-D71UFKe2.js} +2 -2
  4. package/dist/es/DatePicker-ByaPDV8a.js +57 -0
  5. package/dist/es/{DetailHeader-C5LjDuTv.js → DetailHeader-BvwqbiHO.js} +3 -3
  6. package/dist/es/{DetailSubTitle-ak2l4HyV.js → DetailSubTitle-Brh4lgY7.js} +2 -2
  7. package/dist/es/{Dialog-Cw3E3ZU6.js → Dialog-Dfj9XSbZ.js} +3 -3
  8. package/dist/es/{DiyDataTable-Cgqys5z_.js → DiyDataTable-CyinC7X9.js} +4 -4
  9. package/dist/es/{EditInfoPair-8SWkyWJC.js → EditInfoPair-Bh8ExT4y.js} +3 -3
  10. package/dist/es/{FileWrapper-BKxBr28L.js → FileWrapper-Cr7F-CIS.js} +4 -4
  11. package/dist/es/{Grid-C8tYH4s7.js → Grid-CzmdTj41.js} +2 -2
  12. package/dist/es/{InfoPair-C3obQrjB.js → InfoPair-wZg9g-ul.js} +3 -3
  13. package/dist/es/{Input-C3HDYWCC.js → Input-DRtonb3d.js} +3 -3
  14. package/dist/es/{Loading-DfL7OJvd.js → Loading-CujO-NlL.js} +2 -2
  15. package/dist/es/Map-mRzxeRp6.js +1877 -0
  16. package/dist/es/{MessageBox-ByLWEDby.js → MessageBox-CRUoKQsc.js} +2 -2
  17. package/dist/es/{MoneyInput-CxngoHAe.js → MoneyInput-D1u6lU9a.js} +7 -7
  18. package/dist/es/{PageHeadPanel-d3ponlDx.js → PageHeadPanel-COhIV995.js} +2 -2
  19. package/dist/es/{Table-BufcZ4Wy.js → Table-BFbxIF3i.js} +5 -5
  20. package/dist/es/{ToolTips-D0FAOOvm.js → ToolTips-DNojIdT8.js} +7 -7
  21. package/dist/es/index.js +60 -74
  22. package/dist/es/{utils-BSQSj8Ii.js → utils-CVU4so-2.js} +1 -1
  23. package/dist/es/{vendor-DaYdW1_n.js → vendor-Cx2Ws2_l.js} +21548 -25505
  24. package/dist/index.css +1 -1
  25. package/dist/types/components/Map/components/zoomControl.vue.d.ts +1 -9
  26. package/dist/types/components/Map/config/index.d.ts +69 -0
  27. package/dist/types/components/Map/function/carTrack.d.ts +18 -0
  28. package/dist/types/components/Map/function/drawLine.d.ts +19 -0
  29. package/dist/types/components/Map/function/drawPolygon.d.ts +13 -0
  30. package/dist/types/components/Map/function/label.d.ts +9 -0
  31. package/dist/types/components/Map/function/layers.d.ts +7 -0
  32. package/dist/types/components/Map/function/map.d.ts +10 -0
  33. package/dist/types/components/Map/function/port.d.ts +10 -0
  34. package/dist/types/components/Map/function/ship/index.d.ts +9 -0
  35. package/dist/types/components/Map/function/ship/label.d.ts +5 -0
  36. package/dist/types/components/Map/function/ship/style.d.ts +7 -0
  37. package/dist/types/components/Map/function/ship.d.ts +34 -0
  38. package/dist/types/components/Map/function/shipLabel.d.ts +25 -0
  39. package/dist/types/components/Map/function/shipOverlay.d.ts +12 -0
  40. package/dist/types/components/Map/function/shipTrack.d.ts +15 -0
  41. package/dist/types/components/Map/interface/{entity/queryLicenseResponse.d.ts → carTrack.d.ts} +1 -17
  42. package/dist/types/components/Map/interface/index.d.ts +6 -13
  43. package/dist/types/components/Map/interface/label.d.ts +27 -0
  44. package/dist/types/components/Map/interface/mapProps.d.ts +14 -0
  45. package/dist/types/components/Map/interface/{entity/shipInfoVo.d.ts → shipInfoVo.d.ts} +17 -15
  46. package/dist/types/components/Map/interface/{entity/shipTrack.d.ts → shipTrack.d.ts} +2 -1
  47. package/dist/types/components/Map/interface/wharfEntity.d.ts +20 -0
  48. package/dist/types/components/Map/meta/index.d.ts +17 -0
  49. package/dist/types/components/Map/meta/ship.d.ts +26 -0
  50. package/dist/types/components/Map/types.d.ts +1 -13
  51. package/dist/types/components/Map/utils/cursor.d.ts +2 -0
  52. package/dist/types/components/Map/utils/events.d.ts +2 -0
  53. package/dist/types/components/Map/utils/rbush.d.ts +13 -0
  54. package/dist/types/components/Map/utils/track.d.ts +1 -0
  55. package/dist/umd/index.css +1 -1
  56. package/dist/umd/index.umd.cjs +124 -588
  57. package/package.json +1 -1
  58. package/dist/es/DatePicker-BCvYHlC7.js +0 -73
  59. package/dist/es/Map-BpqtL7_q.js +0 -2528
  60. package/dist/types/components/Map/Map.vue.d.ts +0 -156
  61. package/dist/types/components/Map/components/copyright.vue.d.ts +0 -36
  62. package/dist/types/components/Map/components/measure.vue.d.ts +0 -23
  63. package/dist/types/components/Map/components/toolPanel.vue.d.ts +0 -40
  64. package/dist/types/components/Map/config.d.ts +0 -32
  65. package/dist/types/components/Map/enum/car.d.ts +0 -5
  66. package/dist/types/components/Map/enum/device.d.ts +0 -8
  67. package/dist/types/components/Map/enum/index.d.ts +0 -5
  68. package/dist/types/components/Map/enum/openLayers.d.ts +0 -10
  69. package/dist/types/components/Map/enum/ship.d.ts +0 -50
  70. package/dist/types/components/Map/index.d.ts +0 -439
  71. package/dist/types/components/Map/interface/common/BaseEntity.d.ts +0 -29
  72. package/dist/types/components/Map/interface/common/page.d.ts +0 -34
  73. package/dist/types/components/Map/interface/entity/dashboard.d.ts +0 -16
  74. package/dist/types/components/Map/interface/entity/map.d.ts +0 -36
  75. package/dist/types/components/Map/interface/entity/point.d.ts +0 -10
  76. package/dist/types/components/Map/interface/entity/render.d.ts +0 -57
  77. package/dist/types/components/Map/interface/entity/ship.d.ts +0 -361
  78. package/dist/types/components/Map/interface/entity/shipMapData.d.ts +0 -27
  79. package/dist/types/components/Map/interface/entity/shipMarker.d.ts +0 -8
  80. package/dist/types/components/Map/interface/entity/vehicle.d.ts +0 -345
  81. package/dist/types/components/Map/interface/vo/vehicleVo.d.ts +0 -20
  82. package/dist/types/components/Map/render/canvasRender/canvasRender.d.ts +0 -15
  83. package/dist/types/components/Map/render/canvasRender/geometry.d.ts +0 -22
  84. package/dist/types/components/Map/render/canvasRender/renderCustomOverlay.d.ts +0 -5
  85. package/dist/types/components/Map/render/canvasRender/renderPointStyle.d.ts +0 -10
  86. package/dist/types/components/Map/render/canvasRender/renderShipStyle.d.ts +0 -5
  87. package/dist/types/components/Map/render/canvasRender/renderTrackStyle.d.ts +0 -12
  88. package/dist/types/components/Map/render/canvasRender/renderTruckStyle.d.ts +0 -3
  89. package/dist/types/components/Map/render/drawPolygon.d.ts +0 -10
  90. package/dist/types/components/Map/render/renderDashboard.d.ts +0 -12
  91. package/dist/types/components/Map/render/renderMarker.d.ts +0 -7
  92. package/dist/types/components/Map/render/renderPoint.d.ts +0 -80
  93. package/dist/types/components/Map/render/renderShip.d.ts +0 -20
  94. package/dist/types/components/Map/render/renderTrack.d.ts +0 -12
  95. package/dist/types/components/Map/render/renderTruck.d.ts +0 -10
  96. package/dist/types/components/Map/utils/common.d.ts +0 -27
  97. package/dist/types/components/Map/utils/format.d.ts +0 -10
  98. package/dist/types/components/Map/utils/store.d.ts +0 -32
  99. package/dist/types/components/Map/utils/transform.d.ts +0 -44
@@ -1,2528 +0,0 @@
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 { p as getArea, q as getLength, V as VectorSource, r as VectorLayer, S as Style, C as CircleStyle, F as Fill, s as Stroke, D as Draw, O as Overlay, u as unByKey, t as ElSelect, v as ElOption, w as getUid, x as fromLonLat, P as Point, y as transform, z as Feature, T as Text, I as Icon, A as Translate, B as toLonLat, i as cloneDeep, G as GeoJSON, W as WebGLPointsLayer, H as Circle, J as transformExtent, h as hooks, L as LineString, K as Polyline, M as getVectorContext, N as buffer, Q as ScaleLine$1, R as MultiPoint, U as getCenter, X as TileLayer, Y as XYZ, Z as Map$1, _ as View } from "./vendor-DaYdW1_n.js";
6
- import { _ as _export_sfc } from "./Button-Dw3i74l2.js";
7
- import { g as getForegroundColor } from "./DatePicker-BCvYHlC7.js";
8
- import { w as withInstall } from "./utils-BSQSj8Ii.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
- };