@fleet-frontend/mower-maps 0.0.9-beta.5 → 0.0.9-beta.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/dist/config/constants.d.ts +2 -25
  2. package/dist/config/constants.d.ts.map +1 -1
  3. package/dist/config/styles.d.ts +1 -1
  4. package/dist/config/styles.d.ts.map +1 -1
  5. package/dist/index.d.ts +2 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.esm.js +386 -230
  8. package/dist/index.js +386 -230
  9. package/dist/processor/MapDataProcessor.d.ts +1 -1
  10. package/dist/processor/MapDataProcessor.d.ts.map +1 -1
  11. package/dist/processor/PathDataProcessor.d.ts +2 -21
  12. package/dist/processor/PathDataProcessor.d.ts.map +1 -1
  13. package/dist/processor/builder/AntennaDataBuilder.d.ts +2 -1
  14. package/dist/processor/builder/AntennaDataBuilder.d.ts.map +1 -1
  15. package/dist/processor/builder/BoundaryDataBuilder.d.ts +1 -1
  16. package/dist/processor/builder/BoundaryDataBuilder.d.ts.map +1 -1
  17. package/dist/processor/builder/ChannelDataBuilder.d.ts +1 -1
  18. package/dist/processor/builder/ChannelDataBuilder.d.ts.map +1 -1
  19. package/dist/processor/builder/ChargingPileDataBuilder.d.ts +1 -1
  20. package/dist/processor/builder/ChargingPileDataBuilder.d.ts.map +1 -1
  21. package/dist/processor/builder/ObstacleDataBuilder.d.ts +2 -1
  22. package/dist/processor/builder/ObstacleDataBuilder.d.ts.map +1 -1
  23. package/dist/processor/builder/PathDataBuilder.d.ts +1 -1
  24. package/dist/processor/builder/PathDataBuilder.d.ts.map +1 -1
  25. package/dist/processor/builder/PointDataBuilder.d.ts +2 -1
  26. package/dist/processor/builder/PointDataBuilder.d.ts.map +1 -1
  27. package/dist/processor/builder/SvgElementDataBuilder.d.ts +1 -1
  28. package/dist/processor/builder/SvgElementDataBuilder.d.ts.map +1 -1
  29. package/dist/processor/builder/VisionOffDataBuilder.d.ts +2 -1
  30. package/dist/processor/builder/VisionOffDataBuilder.d.ts.map +1 -1
  31. package/dist/processor/index.d.ts +2 -1
  32. package/dist/processor/index.d.ts.map +1 -1
  33. package/dist/render/BoundaryLabelsManager.d.ts +1 -1
  34. package/dist/render/BoundaryLabelsManager.d.ts.map +1 -1
  35. package/dist/render/MowerMapOverlay.d.ts +2 -2
  36. package/dist/render/MowerMapOverlay.d.ts.map +1 -1
  37. package/dist/render/MowerMapRenderer.d.ts.map +1 -1
  38. package/dist/render/MowerPositionManager.d.ts.map +1 -1
  39. package/dist/render/SvgMapView.d.ts.map +1 -1
  40. package/dist/render/layers/BoundaryBorderLayer.d.ts +2 -2
  41. package/dist/render/layers/BoundaryBorderLayer.d.ts.map +1 -1
  42. package/dist/render/layers/ChannelLayer.d.ts.map +1 -1
  43. package/dist/render/layers/DrawLayer.d.ts +1 -1
  44. package/dist/render/layers/DrawLayer.d.ts.map +1 -1
  45. package/dist/render/layers/PathLayer.d.ts.map +1 -1
  46. package/dist/render/layers/SvgElementLayer.d.ts.map +1 -1
  47. package/dist/render/layers/types.d.ts +1 -38
  48. package/dist/render/layers/types.d.ts.map +1 -1
  49. package/dist/store/processMowingState.d.ts +1 -5
  50. package/dist/store/processMowingState.d.ts.map +1 -1
  51. package/dist/store/useSubBoundaryBorderStore.d.ts +9 -5
  52. package/dist/store/useSubBoundaryBorderStore.d.ts.map +1 -1
  53. package/dist/types/constants.d.ts +38 -0
  54. package/dist/types/constants.d.ts.map +1 -0
  55. package/dist/types/index.d.ts +6 -0
  56. package/dist/types/index.d.ts.map +1 -1
  57. package/dist/types/layers.d.ts +50 -0
  58. package/dist/types/layers.d.ts.map +1 -0
  59. package/dist/types/processor.d.ts +26 -0
  60. package/dist/types/processor.d.ts.map +1 -0
  61. package/dist/types/realTime.d.ts +8 -1
  62. package/dist/types/realTime.d.ts.map +1 -1
  63. package/dist/types/renderer.d.ts +3 -3
  64. package/dist/types/renderer.d.ts.map +1 -1
  65. package/dist/types/store.d.ts +22 -0
  66. package/dist/types/store.d.ts.map +1 -0
  67. package/dist/types/utils.d.ts +102 -0
  68. package/dist/types/utils.d.ts.map +1 -0
  69. package/dist/utils/boundaryUtils.d.ts +1 -29
  70. package/dist/utils/boundaryUtils.d.ts.map +1 -1
  71. package/dist/utils/common.d.ts +1 -5
  72. package/dist/utils/common.d.ts.map +1 -1
  73. package/dist/utils/coordinates.d.ts +1 -7
  74. package/dist/utils/coordinates.d.ts.map +1 -1
  75. package/dist/utils/handleRealTime.d.ts +2 -7
  76. package/dist/utils/handleRealTime.d.ts.map +1 -1
  77. package/dist/utils/mapBounds.d.ts +1 -10
  78. package/dist/utils/mapBounds.d.ts.map +1 -1
  79. package/dist/utils/math.d.ts +2 -9
  80. package/dist/utils/math.d.ts.map +1 -1
  81. package/dist/utils/mower.d.ts +4 -4
  82. package/dist/utils/mower.d.ts.map +1 -1
  83. package/dist/utils/pathSegments.d.ts +1 -23
  84. package/dist/utils/pathSegments.d.ts.map +1 -1
  85. package/package.json +1 -1
package/dist/index.esm.js CHANGED
@@ -1,6 +1,135 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import React, { forwardRef, useState, useRef, useMemo, useCallback, useEffect, useImperativeHandle } from 'react';
3
3
 
4
+ /**
5
+ * 常量和枚举类型定义
6
+ */
7
+ /**
8
+ * 机器人状态枚举
9
+ */
10
+ var RobotStatus;
11
+ (function (RobotStatus) {
12
+ RobotStatus[RobotStatus["PARKED"] = 1] = "PARKED";
13
+ RobotStatus[RobotStatus["CHARGING"] = 2] = "CHARGING";
14
+ RobotStatus[RobotStatus["STANDBY"] = 3] = "STANDBY";
15
+ RobotStatus[RobotStatus["MOWING"] = 4] = "MOWING";
16
+ RobotStatus[RobotStatus["WORKING"] = 5] = "WORKING";
17
+ RobotStatus[RobotStatus["MAPPING"] = 6] = "MAPPING";
18
+ RobotStatus[RobotStatus["ERROR"] = 7] = "ERROR";
19
+ RobotStatus[RobotStatus["UPGRADING"] = 8] = "UPGRADING";
20
+ RobotStatus[RobotStatus["DISCONNECTED"] = 9] = "DISCONNECTED";
21
+ RobotStatus[RobotStatus["UNKNOWN"] = -1] = "UNKNOWN";
22
+ RobotStatus[RobotStatus["TASK_DELAY"] = 10] = "TASK_DELAY";
23
+ })(RobotStatus || (RobotStatus = {}));
24
+ /**
25
+ * RTK状态枚举
26
+ */
27
+ var RTK_STATE;
28
+ (function (RTK_STATE) {
29
+ RTK_STATE[RTK_STATE["LOW_RTK"] = 1] = "LOW_RTK";
30
+ RTK_STATE[RTK_STATE["MIDDLE_RTK"] = 2] = "MIDDLE_RTK";
31
+ RTK_STATE[RTK_STATE["HIGH_RTK"] = 3] = "HIGH_RTK";
32
+ RTK_STATE[RTK_STATE["NO_POSTURE"] = 10] = "NO_POSTURE";
33
+ RTK_STATE[RTK_STATE["OUT_OF_RANGE"] = 11] = "OUT_OF_RANGE";
34
+ RTK_STATE[RTK_STATE["OFF_LINE"] = 19] = "OFF_LINE";
35
+ })(RTK_STATE || (RTK_STATE = {}));
36
+ /**
37
+ * 实时数据类型枚举
38
+ */
39
+ var REAL_TIME_DATA_TYPE;
40
+ (function (REAL_TIME_DATA_TYPE) {
41
+ REAL_TIME_DATA_TYPE[REAL_TIME_DATA_TYPE["LOCATION"] = 1] = "LOCATION";
42
+ REAL_TIME_DATA_TYPE[REAL_TIME_DATA_TYPE["PROCESS"] = 2] = "PROCESS";
43
+ })(REAL_TIME_DATA_TYPE || (REAL_TIME_DATA_TYPE = {}));
44
+
45
+ /**
46
+ * 地图渲染相关常量配置
47
+ */
48
+ /**
49
+ * 缩放因子 - 将米转换为像素
50
+ * 与Python代码中的SVG比例一致
51
+ */
52
+ const SCALE_FACTOR = 50; // 50像素/米
53
+ /**
54
+ * 默认线宽设置
55
+ */
56
+ const DEFAULT_LINE_WIDTHS = {
57
+ OBSTACLE: 2,
58
+ CHARGING_PILE: 2,
59
+ CHANNEL: 2,
60
+ PATH: 20,
61
+ VISION_OFF_AREA: 2,
62
+ TIME_LIMIT_OBSTACLE: 1,
63
+ };
64
+ /**
65
+ * 默认透明度设置
66
+ */
67
+ const DEFAULT_OPACITIES = {
68
+ FULL: 1.0,
69
+ HIGH: 0.7,
70
+ LOW: 0.4};
71
+ /**
72
+ * 默认半径设置
73
+ */
74
+ const DEFAULT_RADII = {
75
+ CHARGING_PILE: 12};
76
+ /**
77
+ * 图层等级
78
+ */
79
+ const LAYER_LEVELS = {
80
+ BOUNDARY: 2,
81
+ BOUNDARY_BORDER: 4};
82
+ /**
83
+ * 图层默认id
84
+ */
85
+ const LAYER_DEFAULT_TYPE = {
86
+ CHANNEL: 'channel',
87
+ BOUNDARY: 'boundary',
88
+ PATH: 'path',
89
+ BOUNDARY_BORDER: 'boundary_border',
90
+ OBSTACLE: 'obstacle',
91
+ CHARGING_PILE: 'charging_pile',
92
+ POINT: 'point',
93
+ SVG: 'svg',
94
+ VISION_OFF_AREA: 'vision_off_area',
95
+ ANTENNA: 'antenna',
96
+ };
97
+ const ISOLATED_BOUNDARY_SVG = `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
98
+ <g opacity="0.6">
99
+ <rect width="24" height="24" rx="12" fill="#1E1E1F" fill-opacity="0.5"/>
100
+ <path d="M8.20573 12.4961C6.739 11.1707 4.85775 11.2284 3.60938 11.1707C6.17744 13.0156 6.05584 15.7887 5.67404 16.9446H14.327C13.837 13.1673 15.5321 10.1289 16.4408 9.08187C15.0342 9.46118 13.5794 10.8303 13.0278 11.4674C12.8102 8.94572 13.992 5.97489 14.61 4.80469C12.5235 5.92214 11.0501 8.26056 10.4938 9.56261C9.22803 7.5947 6.83894 7.17806 5.883 6.9432C8.20573 10.2373 8.00039 11.1707 8.20573 12.4961Z" fill="white"/>
101
+ <mask id="path-3-outside-1_9822_43516" maskUnits="userSpaceOnUse" x="13.2344" y="7.20545" width="12.0208" height="12.0208" fill="black">
102
+ <rect fill="white" x="13.2344" y="7.20545" width="12.0208" height="12.0208"/>
103
+ <path d="M20.6852 11.1208C19.9042 10.3398 18.6378 10.3398 17.8568 11.1208L17.2733 11.7043C16.6707 12.3069 16.5358 13.1973 16.8631 13.9319L17.5916 13.2034C17.5657 12.9181 17.6619 12.6236 17.8803 12.4052L18.5674 11.7181C18.9579 11.3276 19.5911 11.3276 19.9816 11.7181L20.4056 12.1421C20.7959 12.5326 20.796 13.1658 20.4056 13.5563L19.7185 14.2434C19.5128 14.449 19.2393 14.5457 18.9699 14.5348L18.2235 15.2812C18.9538 15.596 19.8325 15.4565 20.429 14.86L21.0125 14.2765C21.7935 13.4955 21.7936 12.2291 21.0125 11.4481L20.6852 11.1208Z"/>
104
+ </mask>
105
+ <path d="M20.6852 11.1208C19.9042 10.3398 18.6378 10.3398 17.8568 11.1208L17.2733 11.7043C16.6707 12.3069 16.5358 13.1973 16.8631 13.9319L17.5916 13.2034C17.5657 12.9181 17.6619 12.6236 17.8803 12.4052L18.5674 11.7181C18.9579 11.3276 19.5911 11.3276 19.9816 11.7181L20.4056 12.1421C20.7959 12.5326 20.796 13.1658 20.4056 13.5563L19.7185 14.2434C19.5128 14.449 19.2393 14.5457 18.9699 14.5348L18.2235 15.2812C18.9538 15.596 19.8325 15.4565 20.429 14.86L21.0125 14.2765C21.7935 13.4955 21.7936 12.2291 21.0125 11.4481L20.6852 11.1208Z" fill="white"/>
106
+ <path d="M20.6852 11.1208L21.7458 10.0601L21.7459 10.0601L20.6852 11.1208ZM17.8568 11.1208L16.7961 10.0601L16.7962 10.0601L17.8568 11.1208ZM17.2733 11.7043L16.2126 10.6437L16.2126 10.6436L17.2733 11.7043ZM16.8631 13.9319L17.9238 14.9926L16.381 16.5354L15.493 14.5425L16.8631 13.9319ZM17.5916 13.2034L19.0855 13.0678L19.149 13.7674L18.6523 14.2641L17.5916 13.2034ZM20.4056 12.1421L21.4662 11.0814L21.4665 11.0817L20.4056 12.1421ZM18.9699 14.5348L17.9093 13.4741L18.3741 13.0093L19.0309 13.036L18.9699 14.5348ZM18.2235 15.2812L17.6298 16.6587L15.5997 15.7837L17.1628 14.2206L18.2235 15.2812ZM20.429 14.86L21.4897 15.9207L21.4897 15.9207L20.429 14.86ZM21.0125 14.2765L22.0732 15.3371L22.0732 15.3372L21.0125 14.2765ZM20.6852 11.1208L19.6246 12.1815C19.4294 11.9862 19.1127 11.9863 18.9174 12.1815L17.8568 11.1208L16.7962 10.0601C18.163 8.69337 20.379 8.6934 21.7458 10.0601L20.6852 11.1208ZM17.8568 11.1208L18.9175 12.1814L18.334 12.7649L17.2733 11.7043L16.2126 10.6436L16.7961 10.0601L17.8568 11.1208ZM17.2733 11.7043L18.334 12.7649C18.1877 12.9112 18.1488 13.1318 18.2333 13.3214L16.8631 13.9319L15.493 14.5425C14.9228 13.2629 15.1537 11.7026 16.2126 10.6437L17.2733 11.7043ZM16.8631 13.9319L15.8025 12.8713L16.531 12.1428L17.5916 13.2034L18.6523 14.2641L17.9238 14.9926L16.8631 13.9319ZM17.5916 13.2034L16.0978 13.339C16.0334 12.6302 16.2727 11.8914 16.8196 11.3445L17.8803 12.4052L18.9409 13.4658C19.051 13.3558 19.098 13.206 19.0855 13.0678L17.5916 13.2034ZM17.8803 12.4052L16.8196 11.3445L17.5067 10.6574L18.5674 11.7181L19.628 12.7788L18.9409 13.4658L17.8803 12.4052ZM18.5674 11.7181L17.5067 10.6574C18.483 9.68112 20.0659 9.68112 21.0422 10.6574L19.9816 11.7181L18.9209 12.7788C19.1162 12.974 19.4328 12.974 19.628 12.7788L18.5674 11.7181ZM19.9816 11.7181L21.0422 10.6574L21.4662 11.0814L20.4056 12.1421L19.3449 13.2027L18.9209 12.7788L19.9816 11.7181ZM20.4056 12.1421L21.4665 11.0817C22.4419 12.0577 22.4428 13.6404 21.4662 14.617L20.4056 13.5563L19.3449 12.4956C19.1493 12.6913 19.1498 13.0076 19.3446 13.2024L20.4056 12.1421ZM20.4056 13.5563L21.4662 14.617L20.7791 15.304L19.7185 14.2434L18.6578 13.1827L19.3449 12.4956L20.4056 13.5563ZM19.7185 14.2434L20.7791 15.304C20.2628 15.8204 19.5762 16.0607 18.909 16.0335L18.9699 14.5348L19.0309 13.036C18.9025 13.0308 18.7629 13.0777 18.6578 13.1827L19.7185 14.2434ZM18.9699 14.5348L20.0306 15.5954L19.2841 16.3419L18.2235 15.2812L17.1628 14.2206L17.9093 13.4741L18.9699 14.5348ZM18.2235 15.2812L18.8172 13.9037C19.0042 13.9843 19.2223 13.9455 19.3684 13.7993L20.429 14.86L21.4897 15.9207C20.4427 16.9676 18.9034 17.2077 17.6298 16.6587L18.2235 15.2812ZM20.429 14.86L19.3684 13.7994L19.9519 13.2159L21.0125 14.2765L22.0732 15.3372L21.4897 15.9207L20.429 14.86ZM21.0125 14.2765L19.9518 13.2159C20.1471 13.0206 20.1471 12.704 19.9519 12.5088L21.0125 11.4481L22.0732 10.3874C23.4401 11.7543 23.4399 13.9703 22.0732 15.3371L21.0125 14.2765ZM21.0125 11.4481L19.9519 12.5088L19.6246 12.1814L20.6852 11.1208L21.7459 10.0601L22.0732 10.3874L21.0125 11.4481Z" fill="#8E8E8F" mask="url(#path-3-outside-1_9822_43516)"/>
107
+ <mask id="path-5-outside-2_9822_43516" maskUnits="userSpaceOnUse" x="9.22265" y="10.388" width="12.7279" height="12.7279" fill="black">
108
+ <rect fill="white" x="9.22265" y="10.388" width="12.7279" height="12.7279"/>
109
+ <path d="M16.1708 14.5077C15.4353 14.1778 14.5422 14.3133 13.9383 14.9172L13.3548 15.5007C12.574 16.2818 12.5738 17.5481 13.3548 18.3291L13.6821 18.6564C14.4631 19.4374 15.7295 19.4373 16.5105 18.6564L17.094 18.0729C17.6895 17.4775 17.8299 16.6003 17.5173 15.8708L16.7743 16.6138C16.7828 16.8803 16.6863 17.1494 16.4829 17.3527L15.7952 18.0405C15.4046 18.4309 14.7714 18.431 14.3809 18.0405L13.957 17.6165C13.5667 17.226 13.5666 16.5927 13.957 16.2023L14.6447 15.5145C14.8654 15.2939 15.1639 15.1979 15.452 15.2266L16.1708 14.5077Z"/>
110
+ </mask>
111
+ <path d="M16.1708 14.5077C15.4353 14.1778 14.5422 14.3133 13.9383 14.9172L13.3548 15.5007C12.574 16.2818 12.5738 17.5481 13.3548 18.3291L13.6821 18.6564C14.4631 19.4374 15.7295 19.4373 16.5105 18.6564L17.094 18.0729C17.6895 17.4775 17.8299 16.6003 17.5173 15.8708L16.7743 16.6138C16.7828 16.8803 16.6863 17.1494 16.4829 17.3527L15.7952 18.0405C15.4046 18.4309 14.7714 18.431 14.3809 18.0405L13.957 17.6165C13.5667 17.226 13.5666 16.5927 13.957 16.2023L14.6447 15.5145C14.8654 15.2939 15.1639 15.1979 15.452 15.2266L16.1708 14.5077Z" fill="white"/>
112
+ <path d="M16.1708 14.5077L16.7847 13.1391L18.7701 14.0297L17.2315 15.5684L16.1708 14.5077ZM13.3548 15.5007L12.294 14.4402L12.2941 14.44L13.3548 15.5007ZM16.5105 18.6564L17.5712 19.7171L17.5711 19.7172L16.5105 18.6564ZM17.5173 15.8708L16.4567 14.8102L18.0236 13.2433L18.8962 15.2802L17.5173 15.8708ZM16.7743 16.6138L15.2751 16.6613L15.2545 16.0123L15.7137 15.5532L16.7743 16.6138ZM15.7952 18.0405L16.8558 19.1011L16.8556 19.1013L15.7952 18.0405ZM13.957 17.6165L12.8963 18.6772L12.8959 18.6767L13.957 17.6165ZM13.957 16.2023L12.8961 15.1418L12.8963 15.1416L13.957 16.2023ZM15.452 15.2266L16.5126 16.2872L16.0102 16.7896L15.3032 16.7192L15.452 15.2266ZM16.1708 14.5077L15.5569 15.8763C15.3688 15.792 15.1469 15.8299 14.999 15.9779L13.9383 14.9172L12.8776 13.8565C13.9375 12.7967 15.5018 12.5636 16.7847 13.1391L16.1708 14.5077ZM13.9383 14.9172L14.999 15.9779L14.4155 16.5614L13.3548 15.5007L12.2941 14.44L12.8776 13.8565L13.9383 14.9172ZM13.3548 15.5007L14.4156 16.5612C14.2202 16.7567 14.2204 17.0734 14.4155 17.2685L13.3548 18.3291L12.2941 19.3898C10.9272 18.0229 10.9277 15.8069 12.294 14.4402L13.3548 15.5007ZM13.3548 18.3291L14.4155 17.2685L14.7428 17.5958L13.6821 18.6564L12.6215 19.7171L12.2941 19.3898L13.3548 18.3291ZM13.6821 18.6564L14.7428 17.5958C14.9378 17.7908 15.2546 17.791 15.45 17.5956L16.5105 18.6564L17.5711 19.7172C16.2044 21.0836 13.9884 21.084 12.6215 19.7171L13.6821 18.6564ZM16.5105 18.6564L15.4499 17.5958L16.0334 17.0123L17.094 18.0729L18.1547 19.1336L17.5712 19.7171L16.5105 18.6564ZM17.094 18.0729L16.0334 17.0123C16.1795 16.8662 16.2185 16.6481 16.1385 16.4615L17.5173 15.8708L18.8962 15.2802C19.4413 16.5526 19.1996 18.0887 18.1547 19.1336L17.094 18.0729ZM17.5173 15.8708L18.578 16.9315L17.835 17.6745L16.7743 16.6138L15.7137 15.5532L16.4567 14.8102L17.5173 15.8708ZM16.7743 16.6138L18.2736 16.5664C18.2945 17.226 18.0544 17.9026 17.5436 18.4134L16.4829 17.3527L15.4223 16.2921C15.3182 16.3961 15.2711 16.5346 15.2751 16.6613L16.7743 16.6138ZM16.4829 17.3527L17.5436 18.4134L16.8558 19.1011L15.7952 18.0405L14.7345 16.9798L15.4223 16.2921L16.4829 17.3527ZM15.7952 18.0405L16.8556 19.1013C15.8795 20.0771 14.2967 20.0776 13.3203 19.1011L14.3809 18.0405L15.4416 16.9798C15.2461 16.7844 14.9297 16.7847 14.7347 16.9797L15.7952 18.0405ZM14.3809 18.0405L13.3203 19.1011L12.8963 18.6772L13.957 17.6165L15.0176 16.5558L15.4416 16.9798L14.3809 18.0405ZM13.957 17.6165L12.8959 18.6767C11.9207 17.7008 11.92 16.1182 12.8961 15.1418L13.957 16.2023L15.0178 17.2628C15.2133 17.0672 15.2128 16.7512 15.018 16.5563L13.957 17.6165ZM13.957 16.2023L12.8963 15.1416L13.5841 14.4539L14.6447 15.5145L15.7054 16.5752L15.0176 17.2629L13.957 16.2023ZM14.6447 15.5145L13.5841 14.4539C14.1364 13.9015 14.8848 13.6626 15.6007 13.734L15.452 15.2266L15.3032 16.7192C15.443 16.7331 15.5943 16.6862 15.7054 16.5752L14.6447 15.5145ZM15.452 15.2266L14.3913 14.1659L15.1101 13.4471L16.1708 14.5077L17.2315 15.5684L16.5126 16.2872L15.452 15.2266Z" fill="#8E8E8F" mask="url(#path-5-outside-2_9822_43516)"/>
113
+ <path d="M20.6852 11.1208C19.9042 10.3398 18.6378 10.3398 17.8568 11.1208L17.2733 11.7043C16.6707 12.3069 16.5358 13.1973 16.8631 13.9319L17.5916 13.2034C17.5657 12.9181 17.6619 12.6236 17.8803 12.4052L18.5674 11.7181C18.9579 11.3276 19.5911 11.3276 19.9816 11.7181L20.4056 12.1421C20.7959 12.5326 20.796 13.1658 20.4056 13.5563L19.7185 14.2434C19.5128 14.449 19.2393 14.5457 18.9699 14.5348L18.2235 15.2812C18.9538 15.596 19.8325 15.4565 20.429 14.86L21.0125 14.2765C21.7935 13.4955 21.7936 12.2291 21.0125 11.4481L20.6852 11.1208Z" fill="white"/>
114
+ <rect width="2.59942" height="2.97264" rx="1" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 21.1133 12.8486)" fill="#8E8E8F"/>
115
+ <rect width="1.91578" height="4.24403" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 19.6992 13.8066)" fill="#8E8E8F"/>
116
+ <rect width="2.59942" height="2.97264" rx="1" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 17.3125 16.6455)" fill="#8E8E8F"/>
117
+ </g>
118
+ </svg>`;
119
+ /**
120
+ * 遍历割草任务,下述四个字段可以在路径中唯一确定遍历的位置(当前区域、当前块、当前行、在当前行上的路程)
121
+ */
122
+ const ACTION_BLOCK_COVER = 5;
123
+ /**
124
+ * 遍历割草块转移任务(在同一区域中的一个块转移到下一个块),下述四个字段可以在路径中唯一确定转移的位置(当前区域、前置块、当前转移路径线序号、在当前线上的路程)
125
+ */
126
+ const ACTION_BLOCK_TRANSFER = 6;
127
+ /**
128
+ * 边界割草任务(割草任务内部的巡边任务)
129
+ */
130
+ const ACTION_BOUNDARY_TASK = 8;
131
+ const SVG_MAP_VIEW_ID = 'fleet-maps-svg-map-view';
132
+
4
133
  /**
5
134
  * SVG基础MapView
6
135
  * 使用真正的矢量SVG渲染替代Canvas位图渲染
@@ -56,6 +185,7 @@ class SvgMapView {
56
185
  this.svg.setAttribute('shape-rendering', 'geometricPrecision');
57
186
  this.svg.setAttribute('text-rendering', 'geometricPrecision');
58
187
  this.svg.setAttribute('image-rendering', 'optimizeQuality');
188
+ this.svg.setAttribute('id', SVG_MAP_VIEW_ID);
59
189
  }
60
190
  /**
61
191
  * 创建SVG组元素
@@ -118,7 +248,7 @@ class SvgMapView {
118
248
  * 设置自适应视图变换 - 让SVG刚好包裹住图形
119
249
  */
120
250
  fitToView(bounds) {
121
- const padding = 10; // 添加一些边距以避免内容贴边
251
+ const padding = 20; // 添加一些边距以避免内容贴边
122
252
  const boundWidth = bounds.maxX - bounds.minX;
123
253
  const boundHeight = bounds.maxY - bounds.minY;
124
254
  // 防止宽高为0的情况
@@ -141,9 +271,10 @@ class SvgMapView {
141
271
  this.viewBox = {
142
272
  x: bounds.minX - padding,
143
273
  y: bounds.minY - padding,
144
- width: boundWidth + padding,
145
- height: boundHeight + padding,
274
+ width: boundWidth + padding * 2,
275
+ height: boundHeight + padding * 2,
146
276
  };
277
+ console.log('viewbox->', this.viewBox);
147
278
  // 根据宽高比选择合适的preserveAspectRatio设置
148
279
  if (Math.abs(contentAspectRatio - containerAspectRatio) < 0.01) {
149
280
  // 宽高比接近,使用slice填满容器
@@ -266,7 +397,7 @@ class SvgMapView {
266
397
  // const layerType = layerIdParts.slice(1, -1).join('-'); // 处理类型名中可能包含连字符的情况
267
398
  // const layerLevel = parseInt(layerIdParts[layerIdParts.length - 1]);
268
399
  // // 查找对应的图层对象
269
- // const targetLayer = this.layers.find(layer =>
400
+ // const targetLayer = this.layers.find(layer =>
270
401
  // layer.getType() === layerType && layer.getLevel() === layerLevel
271
402
  // );
272
403
  // if (targetLayer && targetLayer.isVisible()) {
@@ -649,8 +780,6 @@ const create = (createState) => createState ? createImpl(createState) : createIm
649
780
 
650
781
  const useSubBoundaryBorderStore = create((set, get) => ({
651
782
  subBoundaryBorder: {},
652
- // 覆盖所有数据
653
- setSubBoundaryBorder: (subBoundaryBorder) => set({ subBoundaryBorder }),
654
783
  // 追加单个数据
655
784
  addSubBoundaryBorder: (key, element) => set((state) => ({
656
785
  subBoundaryBorder: {
@@ -658,134 +787,28 @@ const useSubBoundaryBorderStore = create((set, get) => ({
658
787
  [key]: element,
659
788
  },
660
789
  })),
661
- // 追加多个数据
662
- addMultipleSubBoundaryBorders: (borders) => set((state) => ({
663
- subBoundaryBorder: {
664
- ...state.subBoundaryBorder,
665
- ...borders,
666
- },
667
- })),
668
790
  // 清空所有数据
669
791
  clearSubBoundaryBorder: () => set({ subBoundaryBorder: {} }),
792
+ // 障碍物
793
+ obstacles: {},
794
+ addObstacles: (key, element) => set((state) => ({
795
+ obstacles: {
796
+ ...state.obstacles,
797
+ [key]: element,
798
+ },
799
+ })),
800
+ clearObstacles: () => set({ obstacles: {} }),
801
+ // svg数据
802
+ svgElements: {},
803
+ addSvgElements: (key, element) => set((state) => ({
804
+ svgElements: {
805
+ ...state.svgElements,
806
+ [key]: element,
807
+ },
808
+ })),
809
+ clearSvgElements: () => set({ svgElements: {} }),
670
810
  }));
671
811
 
672
- /**
673
- * 地图渲染相关常量配置
674
- */
675
- /**
676
- * 缩放因子 - 将米转换为像素
677
- * 与Python代码中的SVG比例一致
678
- */
679
- const SCALE_FACTOR = 50; // 50像素/米
680
- /**
681
- * 默认线宽设置
682
- */
683
- const DEFAULT_LINE_WIDTHS = {
684
- OBSTACLE: 2,
685
- CHARGING_PILE: 2,
686
- CHANNEL: 2,
687
- PATH: 20,
688
- VISION_OFF_AREA: 2,
689
- TIME_LIMIT_OBSTACLE: 1,
690
- };
691
- /**
692
- * 默认透明度设置
693
- */
694
- const DEFAULT_OPACITIES = {
695
- FULL: 1.0,
696
- HIGH: 0.7,
697
- LOW: 0.4};
698
- /**
699
- * 默认半径设置
700
- */
701
- const DEFAULT_RADII = {
702
- CHARGING_PILE: 12};
703
- /**
704
- * 图层等级
705
- */
706
- const LAYER_LEVELS = {
707
- BOUNDARY: 2,
708
- BOUNDARY_BORDER: 4};
709
- /**
710
- * 图层默认id
711
- */
712
- const LAYER_DEFAULT_TYPE = {
713
- CHANNEL: 'channel',
714
- BOUNDARY: 'boundary',
715
- PATH: 'path',
716
- BOUNDARY_BORDER: 'boundary_border',
717
- OBSTACLE: 'obstacle',
718
- CHARGING_PILE: 'charging_pile',
719
- POINT: 'point',
720
- SVG: 'svg',
721
- VISION_OFF_AREA: 'vision_off_area',
722
- ANTENNA: 'antenna',
723
- };
724
- var RobotStatus;
725
- (function (RobotStatus) {
726
- RobotStatus[RobotStatus["PARKED"] = 1] = "PARKED";
727
- RobotStatus[RobotStatus["CHARGING"] = 2] = "CHARGING";
728
- RobotStatus[RobotStatus["STANDBY"] = 3] = "STANDBY";
729
- RobotStatus[RobotStatus["MOWING"] = 4] = "MOWING";
730
- RobotStatus[RobotStatus["WORKING"] = 5] = "WORKING";
731
- RobotStatus[RobotStatus["MAPPING"] = 6] = "MAPPING";
732
- RobotStatus[RobotStatus["ERROR"] = 7] = "ERROR";
733
- RobotStatus[RobotStatus["UPGRADING"] = 8] = "UPGRADING";
734
- RobotStatus[RobotStatus["DISCONNECTED"] = 9] = "DISCONNECTED";
735
- RobotStatus[RobotStatus["UNKNOWN"] = -1] = "UNKNOWN";
736
- RobotStatus[RobotStatus["TASK_DELAY"] = 10] = "TASK_DELAY";
737
- // WAITING = 'Waiting',
738
- })(RobotStatus || (RobotStatus = {}));
739
- // RTK状态
740
- var RTK_STATE;
741
- (function (RTK_STATE) {
742
- RTK_STATE[RTK_STATE["LOW_RTK"] = 1] = "LOW_RTK";
743
- RTK_STATE[RTK_STATE["MIDDLE_RTK"] = 2] = "MIDDLE_RTK";
744
- RTK_STATE[RTK_STATE["HIGH_RTK"] = 3] = "HIGH_RTK";
745
- RTK_STATE[RTK_STATE["NO_POSTURE"] = 10] = "NO_POSTURE";
746
- RTK_STATE[RTK_STATE["OUT_OF_RANGE"] = 11] = "OUT_OF_RANGE";
747
- RTK_STATE[RTK_STATE["OFF_LINE"] = 19] = "OFF_LINE";
748
- })(RTK_STATE || (RTK_STATE = {}));
749
- var REAL_TIME_DATA_TYPE;
750
- (function (REAL_TIME_DATA_TYPE) {
751
- REAL_TIME_DATA_TYPE[REAL_TIME_DATA_TYPE["LOCATION"] = 1] = "LOCATION";
752
- REAL_TIME_DATA_TYPE[REAL_TIME_DATA_TYPE["PROCESS"] = 2] = "PROCESS";
753
- })(REAL_TIME_DATA_TYPE || (REAL_TIME_DATA_TYPE = {}));
754
- const ISOLATED_BOUNDARY_SVG = `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
755
- <g opacity="0.6">
756
- <rect width="24" height="24" rx="12" fill="#1E1E1F" fill-opacity="0.5"/>
757
- <path d="M8.20573 12.4961C6.739 11.1707 4.85775 11.2284 3.60938 11.1707C6.17744 13.0156 6.05584 15.7887 5.67404 16.9446H14.327C13.837 13.1673 15.5321 10.1289 16.4408 9.08187C15.0342 9.46118 13.5794 10.8303 13.0278 11.4674C12.8102 8.94572 13.992 5.97489 14.61 4.80469C12.5235 5.92214 11.0501 8.26056 10.4938 9.56261C9.22803 7.5947 6.83894 7.17806 5.883 6.9432C8.20573 10.2373 8.00039 11.1707 8.20573 12.4961Z" fill="white"/>
758
- <mask id="path-3-outside-1_9822_43516" maskUnits="userSpaceOnUse" x="13.2344" y="7.20545" width="12.0208" height="12.0208" fill="black">
759
- <rect fill="white" x="13.2344" y="7.20545" width="12.0208" height="12.0208"/>
760
- <path d="M20.6852 11.1208C19.9042 10.3398 18.6378 10.3398 17.8568 11.1208L17.2733 11.7043C16.6707 12.3069 16.5358 13.1973 16.8631 13.9319L17.5916 13.2034C17.5657 12.9181 17.6619 12.6236 17.8803 12.4052L18.5674 11.7181C18.9579 11.3276 19.5911 11.3276 19.9816 11.7181L20.4056 12.1421C20.7959 12.5326 20.796 13.1658 20.4056 13.5563L19.7185 14.2434C19.5128 14.449 19.2393 14.5457 18.9699 14.5348L18.2235 15.2812C18.9538 15.596 19.8325 15.4565 20.429 14.86L21.0125 14.2765C21.7935 13.4955 21.7936 12.2291 21.0125 11.4481L20.6852 11.1208Z"/>
761
- </mask>
762
- <path d="M20.6852 11.1208C19.9042 10.3398 18.6378 10.3398 17.8568 11.1208L17.2733 11.7043C16.6707 12.3069 16.5358 13.1973 16.8631 13.9319L17.5916 13.2034C17.5657 12.9181 17.6619 12.6236 17.8803 12.4052L18.5674 11.7181C18.9579 11.3276 19.5911 11.3276 19.9816 11.7181L20.4056 12.1421C20.7959 12.5326 20.796 13.1658 20.4056 13.5563L19.7185 14.2434C19.5128 14.449 19.2393 14.5457 18.9699 14.5348L18.2235 15.2812C18.9538 15.596 19.8325 15.4565 20.429 14.86L21.0125 14.2765C21.7935 13.4955 21.7936 12.2291 21.0125 11.4481L20.6852 11.1208Z" fill="white"/>
763
- <path d="M20.6852 11.1208L21.7458 10.0601L21.7459 10.0601L20.6852 11.1208ZM17.8568 11.1208L16.7961 10.0601L16.7962 10.0601L17.8568 11.1208ZM17.2733 11.7043L16.2126 10.6437L16.2126 10.6436L17.2733 11.7043ZM16.8631 13.9319L17.9238 14.9926L16.381 16.5354L15.493 14.5425L16.8631 13.9319ZM17.5916 13.2034L19.0855 13.0678L19.149 13.7674L18.6523 14.2641L17.5916 13.2034ZM20.4056 12.1421L21.4662 11.0814L21.4665 11.0817L20.4056 12.1421ZM18.9699 14.5348L17.9093 13.4741L18.3741 13.0093L19.0309 13.036L18.9699 14.5348ZM18.2235 15.2812L17.6298 16.6587L15.5997 15.7837L17.1628 14.2206L18.2235 15.2812ZM20.429 14.86L21.4897 15.9207L21.4897 15.9207L20.429 14.86ZM21.0125 14.2765L22.0732 15.3371L22.0732 15.3372L21.0125 14.2765ZM20.6852 11.1208L19.6246 12.1815C19.4294 11.9862 19.1127 11.9863 18.9174 12.1815L17.8568 11.1208L16.7962 10.0601C18.163 8.69337 20.379 8.6934 21.7458 10.0601L20.6852 11.1208ZM17.8568 11.1208L18.9175 12.1814L18.334 12.7649L17.2733 11.7043L16.2126 10.6436L16.7961 10.0601L17.8568 11.1208ZM17.2733 11.7043L18.334 12.7649C18.1877 12.9112 18.1488 13.1318 18.2333 13.3214L16.8631 13.9319L15.493 14.5425C14.9228 13.2629 15.1537 11.7026 16.2126 10.6437L17.2733 11.7043ZM16.8631 13.9319L15.8025 12.8713L16.531 12.1428L17.5916 13.2034L18.6523 14.2641L17.9238 14.9926L16.8631 13.9319ZM17.5916 13.2034L16.0978 13.339C16.0334 12.6302 16.2727 11.8914 16.8196 11.3445L17.8803 12.4052L18.9409 13.4658C19.051 13.3558 19.098 13.206 19.0855 13.0678L17.5916 13.2034ZM17.8803 12.4052L16.8196 11.3445L17.5067 10.6574L18.5674 11.7181L19.628 12.7788L18.9409 13.4658L17.8803 12.4052ZM18.5674 11.7181L17.5067 10.6574C18.483 9.68112 20.0659 9.68112 21.0422 10.6574L19.9816 11.7181L18.9209 12.7788C19.1162 12.974 19.4328 12.974 19.628 12.7788L18.5674 11.7181ZM19.9816 11.7181L21.0422 10.6574L21.4662 11.0814L20.4056 12.1421L19.3449 13.2027L18.9209 12.7788L19.9816 11.7181ZM20.4056 12.1421L21.4665 11.0817C22.4419 12.0577 22.4428 13.6404 21.4662 14.617L20.4056 13.5563L19.3449 12.4956C19.1493 12.6913 19.1498 13.0076 19.3446 13.2024L20.4056 12.1421ZM20.4056 13.5563L21.4662 14.617L20.7791 15.304L19.7185 14.2434L18.6578 13.1827L19.3449 12.4956L20.4056 13.5563ZM19.7185 14.2434L20.7791 15.304C20.2628 15.8204 19.5762 16.0607 18.909 16.0335L18.9699 14.5348L19.0309 13.036C18.9025 13.0308 18.7629 13.0777 18.6578 13.1827L19.7185 14.2434ZM18.9699 14.5348L20.0306 15.5954L19.2841 16.3419L18.2235 15.2812L17.1628 14.2206L17.9093 13.4741L18.9699 14.5348ZM18.2235 15.2812L18.8172 13.9037C19.0042 13.9843 19.2223 13.9455 19.3684 13.7993L20.429 14.86L21.4897 15.9207C20.4427 16.9676 18.9034 17.2077 17.6298 16.6587L18.2235 15.2812ZM20.429 14.86L19.3684 13.7994L19.9519 13.2159L21.0125 14.2765L22.0732 15.3372L21.4897 15.9207L20.429 14.86ZM21.0125 14.2765L19.9518 13.2159C20.1471 13.0206 20.1471 12.704 19.9519 12.5088L21.0125 11.4481L22.0732 10.3874C23.4401 11.7543 23.4399 13.9703 22.0732 15.3371L21.0125 14.2765ZM21.0125 11.4481L19.9519 12.5088L19.6246 12.1814L20.6852 11.1208L21.7459 10.0601L22.0732 10.3874L21.0125 11.4481Z" fill="#8E8E8F" mask="url(#path-3-outside-1_9822_43516)"/>
764
- <mask id="path-5-outside-2_9822_43516" maskUnits="userSpaceOnUse" x="9.22265" y="10.388" width="12.7279" height="12.7279" fill="black">
765
- <rect fill="white" x="9.22265" y="10.388" width="12.7279" height="12.7279"/>
766
- <path d="M16.1708 14.5077C15.4353 14.1778 14.5422 14.3133 13.9383 14.9172L13.3548 15.5007C12.574 16.2818 12.5738 17.5481 13.3548 18.3291L13.6821 18.6564C14.4631 19.4374 15.7295 19.4373 16.5105 18.6564L17.094 18.0729C17.6895 17.4775 17.8299 16.6003 17.5173 15.8708L16.7743 16.6138C16.7828 16.8803 16.6863 17.1494 16.4829 17.3527L15.7952 18.0405C15.4046 18.4309 14.7714 18.431 14.3809 18.0405L13.957 17.6165C13.5667 17.226 13.5666 16.5927 13.957 16.2023L14.6447 15.5145C14.8654 15.2939 15.1639 15.1979 15.452 15.2266L16.1708 14.5077Z"/>
767
- </mask>
768
- <path d="M16.1708 14.5077C15.4353 14.1778 14.5422 14.3133 13.9383 14.9172L13.3548 15.5007C12.574 16.2818 12.5738 17.5481 13.3548 18.3291L13.6821 18.6564C14.4631 19.4374 15.7295 19.4373 16.5105 18.6564L17.094 18.0729C17.6895 17.4775 17.8299 16.6003 17.5173 15.8708L16.7743 16.6138C16.7828 16.8803 16.6863 17.1494 16.4829 17.3527L15.7952 18.0405C15.4046 18.4309 14.7714 18.431 14.3809 18.0405L13.957 17.6165C13.5667 17.226 13.5666 16.5927 13.957 16.2023L14.6447 15.5145C14.8654 15.2939 15.1639 15.1979 15.452 15.2266L16.1708 14.5077Z" fill="white"/>
769
- <path d="M16.1708 14.5077L16.7847 13.1391L18.7701 14.0297L17.2315 15.5684L16.1708 14.5077ZM13.3548 15.5007L12.294 14.4402L12.2941 14.44L13.3548 15.5007ZM16.5105 18.6564L17.5712 19.7171L17.5711 19.7172L16.5105 18.6564ZM17.5173 15.8708L16.4567 14.8102L18.0236 13.2433L18.8962 15.2802L17.5173 15.8708ZM16.7743 16.6138L15.2751 16.6613L15.2545 16.0123L15.7137 15.5532L16.7743 16.6138ZM15.7952 18.0405L16.8558 19.1011L16.8556 19.1013L15.7952 18.0405ZM13.957 17.6165L12.8963 18.6772L12.8959 18.6767L13.957 17.6165ZM13.957 16.2023L12.8961 15.1418L12.8963 15.1416L13.957 16.2023ZM15.452 15.2266L16.5126 16.2872L16.0102 16.7896L15.3032 16.7192L15.452 15.2266ZM16.1708 14.5077L15.5569 15.8763C15.3688 15.792 15.1469 15.8299 14.999 15.9779L13.9383 14.9172L12.8776 13.8565C13.9375 12.7967 15.5018 12.5636 16.7847 13.1391L16.1708 14.5077ZM13.9383 14.9172L14.999 15.9779L14.4155 16.5614L13.3548 15.5007L12.2941 14.44L12.8776 13.8565L13.9383 14.9172ZM13.3548 15.5007L14.4156 16.5612C14.2202 16.7567 14.2204 17.0734 14.4155 17.2685L13.3548 18.3291L12.2941 19.3898C10.9272 18.0229 10.9277 15.8069 12.294 14.4402L13.3548 15.5007ZM13.3548 18.3291L14.4155 17.2685L14.7428 17.5958L13.6821 18.6564L12.6215 19.7171L12.2941 19.3898L13.3548 18.3291ZM13.6821 18.6564L14.7428 17.5958C14.9378 17.7908 15.2546 17.791 15.45 17.5956L16.5105 18.6564L17.5711 19.7172C16.2044 21.0836 13.9884 21.084 12.6215 19.7171L13.6821 18.6564ZM16.5105 18.6564L15.4499 17.5958L16.0334 17.0123L17.094 18.0729L18.1547 19.1336L17.5712 19.7171L16.5105 18.6564ZM17.094 18.0729L16.0334 17.0123C16.1795 16.8662 16.2185 16.6481 16.1385 16.4615L17.5173 15.8708L18.8962 15.2802C19.4413 16.5526 19.1996 18.0887 18.1547 19.1336L17.094 18.0729ZM17.5173 15.8708L18.578 16.9315L17.835 17.6745L16.7743 16.6138L15.7137 15.5532L16.4567 14.8102L17.5173 15.8708ZM16.7743 16.6138L18.2736 16.5664C18.2945 17.226 18.0544 17.9026 17.5436 18.4134L16.4829 17.3527L15.4223 16.2921C15.3182 16.3961 15.2711 16.5346 15.2751 16.6613L16.7743 16.6138ZM16.4829 17.3527L17.5436 18.4134L16.8558 19.1011L15.7952 18.0405L14.7345 16.9798L15.4223 16.2921L16.4829 17.3527ZM15.7952 18.0405L16.8556 19.1013C15.8795 20.0771 14.2967 20.0776 13.3203 19.1011L14.3809 18.0405L15.4416 16.9798C15.2461 16.7844 14.9297 16.7847 14.7347 16.9797L15.7952 18.0405ZM14.3809 18.0405L13.3203 19.1011L12.8963 18.6772L13.957 17.6165L15.0176 16.5558L15.4416 16.9798L14.3809 18.0405ZM13.957 17.6165L12.8959 18.6767C11.9207 17.7008 11.92 16.1182 12.8961 15.1418L13.957 16.2023L15.0178 17.2628C15.2133 17.0672 15.2128 16.7512 15.018 16.5563L13.957 17.6165ZM13.957 16.2023L12.8963 15.1416L13.5841 14.4539L14.6447 15.5145L15.7054 16.5752L15.0176 17.2629L13.957 16.2023ZM14.6447 15.5145L13.5841 14.4539C14.1364 13.9015 14.8848 13.6626 15.6007 13.734L15.452 15.2266L15.3032 16.7192C15.443 16.7331 15.5943 16.6862 15.7054 16.5752L14.6447 15.5145ZM15.452 15.2266L14.3913 14.1659L15.1101 13.4471L16.1708 14.5077L17.2315 15.5684L16.5126 16.2872L15.452 15.2266Z" fill="#8E8E8F" mask="url(#path-5-outside-2_9822_43516)"/>
770
- <path d="M20.6852 11.1208C19.9042 10.3398 18.6378 10.3398 17.8568 11.1208L17.2733 11.7043C16.6707 12.3069 16.5358 13.1973 16.8631 13.9319L17.5916 13.2034C17.5657 12.9181 17.6619 12.6236 17.8803 12.4052L18.5674 11.7181C18.9579 11.3276 19.5911 11.3276 19.9816 11.7181L20.4056 12.1421C20.7959 12.5326 20.796 13.1658 20.4056 13.5563L19.7185 14.2434C19.5128 14.449 19.2393 14.5457 18.9699 14.5348L18.2235 15.2812C18.9538 15.596 19.8325 15.4565 20.429 14.86L21.0125 14.2765C21.7935 13.4955 21.7936 12.2291 21.0125 11.4481L20.6852 11.1208Z" fill="white"/>
771
- <rect width="2.59942" height="2.97264" rx="1" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 21.1133 12.8486)" fill="#8E8E8F"/>
772
- <rect width="1.91578" height="4.24403" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 19.6992 13.8066)" fill="#8E8E8F"/>
773
- <rect width="2.59942" height="2.97264" rx="1" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 17.3125 16.6455)" fill="#8E8E8F"/>
774
- </g>
775
- </svg>`;
776
- /**
777
- * 遍历割草任务,下述四个字段可以在路径中唯一确定遍历的位置(当前区域、当前块、当前行、在当前行上的路程)
778
- */
779
- const ACTION_BLOCK_COVER = 5;
780
- /**
781
- * 遍历割草块转移任务(在同一区域中的一个块转移到下一个块),下述四个字段可以在路径中唯一确定转移的位置(当前区域、前置块、当前转移路径线序号、在当前线上的路程)
782
- */
783
- const ACTION_BLOCK_TRANSFER = 6;
784
- /**
785
- * 边界割草任务(割草任务内部的巡边任务)
786
- */
787
- const ACTION_BOUNDARY_TASK = 8;
788
-
789
812
  /**
790
813
  * 路径图层
791
814
  * 专门处理路径元素的渲染
@@ -836,51 +859,90 @@ class ChannelLayer extends BaseLayer {
836
859
  }
837
860
  // �� 修改:计算包含所有分区和通道的边界框
838
861
  let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
839
- // 1. 先计算所有分区的边界
840
- for (const partitionId in subBoundaryBorder) {
841
- const boundaryData = subBoundaryBorder[partitionId];
842
- if (boundaryData && boundaryData.coordinates && boundaryData.coordinates.length > 0) {
843
- for (const coord of boundaryData.coordinates) {
844
- minX = Math.min(minX, coord[0]);
845
- minY = Math.min(minY, coord[1]);
846
- maxX = Math.max(maxX, coord[0]);
847
- maxY = Math.max(maxY, coord[1]);
862
+ // 1. 先计算所有分区的边界,如果能拿到边界的svg的大小,就使用这个如果拿不到,就根据分区去计算
863
+ const svg = document.getElementById(SVG_MAP_VIEW_ID);
864
+ if (svg && svg instanceof SVGSVGElement && svg.viewBox) {
865
+ const viewBox = svg.viewBox.baseVal;
866
+ minX = viewBox.x;
867
+ minY = viewBox.y;
868
+ maxX = viewBox.x + viewBox.width;
869
+ maxY = viewBox.y + viewBox.height;
870
+ }
871
+ else {
872
+ for (const partitionId in subBoundaryBorder) {
873
+ const boundaryData = subBoundaryBorder[partitionId];
874
+ if (boundaryData && boundaryData.coordinates && boundaryData.coordinates.length > 0) {
875
+ for (const coord of boundaryData.coordinates) {
876
+ minX = Math.min(minX, coord[0]);
877
+ minY = Math.min(minY, coord[1]);
878
+ maxX = Math.max(maxX, coord[0]);
879
+ maxY = Math.max(maxY, coord[1]);
880
+ }
848
881
  }
849
882
  }
850
883
  }
851
884
  // 2. 再计算所有通道的边界
852
885
  for (const element of this.elements) {
853
- const tunnelConnection = element.originalData?.connection;
854
- if (tunnelConnection && Array.isArray(tunnelConnection)) {
855
- const clipPathId = `channel-exclude-${element.originalData?.id || Math.random().toString(36).substr(2, 9)}`;
856
- // 检查是否已存在该 clipPath
857
- const existingClipPath = defs.querySelector(`#${clipPathId}`);
858
- if (existingClipPath)
859
- continue;
860
- // 创建 clipPath
861
- const clipPath = document.createElementNS('http://www.w3.org/2000/svg', 'clipPath');
862
- clipPath.setAttribute('id', clipPathId);
863
- clipPath.setAttribute('clipPathUnits', 'userSpaceOnUse');
864
- // === 合成一个 path ===
865
- let d = `M ${minX} ${minY} L ${maxX} ${minY} L ${maxX} ${maxY} L ${minX} ${maxY} Z`;
866
- for (const partitionId of tunnelConnection) {
867
- const boundaryData = subBoundaryBorder[partitionId];
868
- if (boundaryData && boundaryData.coordinates.length >= 3) {
869
- d += ` M ${boundaryData.coordinates[0][0]} ${boundaryData.coordinates[0][1]}`;
870
- for (let i = 1; i < boundaryData.coordinates.length; i++) {
871
- d += ` L ${boundaryData.coordinates[i][0]} ${boundaryData.coordinates[i][1]}`;
872
- }
873
- d += ' Z';
886
+ // const tunnelConnection = element.originalData?.connection;
887
+ // if (tunnelConnection && Array.isArray(tunnelConnection)) {
888
+ // const clipPathId = `channel-exclude-${
889
+ // element.originalData?.id || Math.random().toString(36).substr(2, 9)
890
+ // }`;
891
+ // // 检查是否已存在该 clipPath
892
+ // const existingClipPath = defs.querySelector(`#${clipPathId}`);
893
+ // if (existingClipPath) continue;
894
+ // // 创建 clipPath
895
+ // const clipPath = document.createElementNS('http://www.w3.org/2000/svg', 'clipPath');
896
+ // clipPath.setAttribute('id', clipPathId);
897
+ // clipPath.setAttribute('clipPathUnits', 'userSpaceOnUse');
898
+ // // === 合成一个 path ===
899
+ // let d = `M ${minX} ${minY} L ${maxX} ${minY} L ${maxX} ${maxY} L ${minX} ${maxY} Z`;
900
+ // for (const partitionId of tunnelConnection) {
901
+ // const boundaryData = subBoundaryBorder[partitionId];
902
+ // if (boundaryData && boundaryData.coordinates.length >= 3) {
903
+ // d += ` M ${boundaryData.coordinates[0][0]} ${boundaryData.coordinates[0][1]}`;
904
+ // for (let i = 1; i < boundaryData.coordinates.length; i++) {
905
+ // d += ` L ${boundaryData.coordinates[i][0]} ${boundaryData.coordinates[i][1]}`;
906
+ // }
907
+ // d += ' Z';
908
+ // }
909
+ // }
910
+ // const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');
911
+ // path.setAttribute('d', d);
912
+ // path.setAttribute('clip-rule', 'evenodd'); // 关键
913
+ // clipPath.appendChild(path);
914
+ // defs.appendChild(clipPath);
915
+ // clipPathIdsMap[element.originalData?.id.toString()] = clipPathId;
916
+ // } else {
917
+ const clipPathId = `channel-exclude-all-${element.originalData?.id || Math.random().toString(36).substr(2, 9)}`;
918
+ // 检查是否已存在该 clipPath
919
+ const existingClipPath = defs.querySelector(`#${clipPathId}`);
920
+ if (existingClipPath)
921
+ continue;
922
+ // 创建 clipPath
923
+ const clipPath = document.createElementNS('http://www.w3.org/2000/svg', 'clipPath');
924
+ clipPath.setAttribute('id', clipPathId);
925
+ clipPath.setAttribute('clipPathUnits', 'userSpaceOnUse');
926
+ // === 合成一个 path ===
927
+ let d = `M ${minX} ${minY} L ${maxX} ${minY} L ${maxX} ${maxY} L ${minX} ${maxY} Z`;
928
+ for (const partitionId in subBoundaryBorder) {
929
+ const boundaryData = subBoundaryBorder[partitionId];
930
+ if (boundaryData && boundaryData.coordinates.length >= 3) {
931
+ d += ` M ${boundaryData.coordinates[0][0]} ${boundaryData.coordinates[0][1]}`;
932
+ for (let i = 1; i < boundaryData.coordinates.length; i++) {
933
+ d += ` L ${boundaryData.coordinates[i][0]} ${boundaryData.coordinates[i][1]}`;
874
934
  }
935
+ d += ' Z';
875
936
  }
876
- const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');
877
- path.setAttribute('d', d);
878
- path.setAttribute('clip-rule', 'evenodd'); // 关键
879
- clipPath.appendChild(path);
880
- defs.appendChild(clipPath);
881
- clipPathIdsMap[element.originalData?.id.toString()] = clipPathId;
882
937
  }
938
+ const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');
939
+ path.setAttribute('d', d);
940
+ path.setAttribute('clip-rule', 'evenodd'); // 关键
941
+ clipPath.appendChild(path);
942
+ defs.appendChild(clipPath);
943
+ clipPathIdsMap[element.originalData?.id.toString()] = clipPathId;
883
944
  }
945
+ // }
884
946
  return clipPathIdsMap;
885
947
  }
886
948
  /**
@@ -951,7 +1013,7 @@ class PathLayer extends BaseLayer {
951
1013
  * 创建所有分区并集的 clipPath
952
1014
  */
953
1015
  createUnionClipPath(svgGroup) {
954
- const { subBoundaryBorder } = useSubBoundaryBorderStore.getState();
1016
+ const { subBoundaryBorder, obstacles, svgElements } = useSubBoundaryBorderStore.getState();
955
1017
  // 确保 defs 元素存在
956
1018
  let defs = svgGroup.querySelector('defs');
957
1019
  if (!defs) {
@@ -965,7 +1027,7 @@ class PathLayer extends BaseLayer {
965
1027
  defs.removeChild(existing);
966
1028
  // 合成所有分区的 path
967
1029
  let d = '';
968
- // 合成所有边界
1030
+ // 1. 外圈(主边界,顺时针)
969
1031
  Object.values(subBoundaryBorder).forEach((item) => {
970
1032
  const bCoords = item.coordinates;
971
1033
  if (bCoords.length >= 3) {
@@ -976,6 +1038,27 @@ class PathLayer extends BaseLayer {
976
1038
  d += ' Z ';
977
1039
  }
978
1040
  });
1041
+ // 2. 内圈(禁区,逆时针)
1042
+ Object.values(obstacles).forEach((item) => {
1043
+ const bCoords = item.coordinates;
1044
+ if (bCoords.length >= 3) {
1045
+ d += `M ${bCoords[bCoords.length - 1][0]} ${bCoords[bCoords.length - 1][1]}`;
1046
+ for (let i = bCoords.length - 2; i >= 0; i--) {
1047
+ d += ` L ${bCoords[i][0]} ${bCoords[i][1]}`;
1048
+ }
1049
+ d += ' Z ';
1050
+ }
1051
+ });
1052
+ console.error('svgElements----', svgElements);
1053
+ // 3. svgElements(直接拼接path字符串,建议逆时针)
1054
+ if (Array.isArray(svgElements)) {
1055
+ svgElements.forEach((svgPath) => {
1056
+ const svgPathString = svgPath?.metadata?.svg;
1057
+ if (svgPathString && typeof svgPathString === 'string' && svgPathString.trim()) {
1058
+ d += svgPathString + ' ';
1059
+ }
1060
+ });
1061
+ }
979
1062
  const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');
980
1063
  path.setAttribute('d', d);
981
1064
  const clipPath = document.createElementNS('http://www.w3.org/2000/svg', 'clipPath');
@@ -1148,7 +1231,7 @@ class ObstacleLayer extends BaseLayer {
1148
1231
  }
1149
1232
  }
1150
1233
 
1151
- var chargingPileImage = "data:image/png;base64,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";
1234
+ var chargingPileImage = "data:image/png;base64,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";
1152
1235
 
1153
1236
  /**
1154
1237
  * 充电桩图层
@@ -1338,7 +1421,7 @@ class SvgElementLayer extends BaseLayer {
1338
1421
  // 在transformGroup上应用变换:平移到中心,旋转,缩放,然后居中SVG
1339
1422
  const transform = [
1340
1423
  `translate(${center[0]}, ${center[1]})`,
1341
- `rotate(${(direction * 180) / Math.PI})`,
1424
+ `rotate(${-(direction * 180) / Math.PI})`,
1342
1425
  `scale(${userScale})`,
1343
1426
  `translate(${-originalWidth / 2}, ${-originalHeight / 2})`,
1344
1427
  ].join(' ');
@@ -1540,15 +1623,6 @@ function convertCoordinate(x, y) {
1540
1623
  };
1541
1624
  }
1542
1625
 
1543
- /**
1544
- * 路径段类型
1545
- */
1546
- var PathSegmentType;
1547
- (function (PathSegmentType) {
1548
- PathSegmentType["EDGE"] = "edge";
1549
- PathSegmentType["MOWING"] = "mowing";
1550
- PathSegmentType["TRANS"] = "trans";
1551
- })(PathSegmentType || (PathSegmentType = {}));
1552
1626
  /**
1553
1627
  * 按Python逻辑创建路径段:根据连续的两点之间的关系确定线段类型
1554
1628
  */
@@ -1877,6 +1951,14 @@ function generateBoundaryData(mapData, pathData) {
1877
1951
  return boundaryData;
1878
1952
  }
1879
1953
 
1954
+ var RealTimeDataType;
1955
+ (function (RealTimeDataType) {
1956
+ RealTimeDataType[RealTimeDataType["LOCATION"] = 1] = "LOCATION";
1957
+ RealTimeDataType[RealTimeDataType["PROCESS"] = 2] = "PROCESS";
1958
+ RealTimeDataType[RealTimeDataType["PARTITION"] = 3] = "PARTITION";
1959
+ RealTimeDataType[RealTimeDataType["STATUS"] = 4] = "STATUS";
1960
+ })(RealTimeDataType || (RealTimeDataType = {}));
1961
+
1880
1962
  /**
1881
1963
  * 射线法判断点是否在多边形内部
1882
1964
  * @param x 点的x坐标
@@ -2046,7 +2128,7 @@ const getProcessMowingDataFromRealTimeData = ({ realTimeData, isMowing, pathData
2046
2128
  let newMowingStatus = isMowing;
2047
2129
  let newPathData = pathData || {};
2048
2130
  // 找到返回的第一个实时进度的点
2049
- const firstProcessData = realTimeData.find((item) => item.type === REAL_TIME_DATA_TYPE.PROCESS);
2131
+ const firstProcessData = realTimeData.find((item) => item.type === RealTimeDataType.PROCESS);
2050
2132
  if (firstProcessData) {
2051
2133
  // console.log('firstProcessData==', firstProcessData);
2052
2134
  const { action, subAction, currentMowBoundary, currentMowProgress } = firstProcessData;
@@ -4594,6 +4676,36 @@ var merge = createAssigner(function(object, source, srcIndex) {
4594
4676
  */
4595
4677
  var round = createRound('round');
4596
4678
 
4679
+ /**
4680
+ * 工具模块类型定义
4681
+ */
4682
+ /**
4683
+ * 路径段类型枚举
4684
+ */
4685
+ var PathSegmentType;
4686
+ (function (PathSegmentType) {
4687
+ PathSegmentType["EDGE"] = "edge";
4688
+ PathSegmentType["MOWING"] = "mowing";
4689
+ PathSegmentType["TRANS"] = "trans";
4690
+ })(PathSegmentType || (PathSegmentType = {}));
4691
+ /**
4692
+ * 单位类型枚举
4693
+ */
4694
+ var UnitsType;
4695
+ (function (UnitsType) {
4696
+ UnitsType["Metric"] = "metric";
4697
+ UnitsType["Imperial"] = "imperial";
4698
+ })(UnitsType || (UnitsType = {}));
4699
+ /**
4700
+ * 面积单位类型枚举
4701
+ */
4702
+ var UnitsAreaType;
4703
+ (function (UnitsAreaType) {
4704
+ UnitsAreaType["SQUARE_METER"] = "m\u00B2";
4705
+ UnitsAreaType["SQUARE_FOOT"] = "ft\u00B2";
4706
+ UnitsAreaType["ACRE"] = "ac";
4707
+ })(UnitsAreaType || (UnitsAreaType = {}));
4708
+
4597
4709
  /**
4598
4710
  * 默认航向相对于canvas的偏移角度: 航向默认是东
4599
4711
  */
@@ -4667,17 +4779,6 @@ function formatNumberWithMetricPrefix(value, round = true, decimals = 2) {
4667
4779
  return `${mathFn(value / 1000000000, decimals)}B`;
4668
4780
  }
4669
4781
  }
4670
- var UnitsType;
4671
- (function (UnitsType) {
4672
- UnitsType["Metric"] = "metric";
4673
- UnitsType["Imperial"] = "imperial";
4674
- })(UnitsType || (UnitsType = {}));
4675
- var UnitsAreaType;
4676
- (function (UnitsAreaType) {
4677
- UnitsAreaType["SQUARE_METER"] = "m\u00B2";
4678
- UnitsAreaType["SQUARE_FOOT"] = "ft\u00B2";
4679
- UnitsAreaType["ACRE"] = "ac";
4680
- })(UnitsAreaType || (UnitsAreaType = {}));
4681
4782
  /**
4682
4783
  * 转换割草面积的方法
4683
4784
  * @param area 面积数值(单位:m²)
@@ -4873,7 +4974,12 @@ class BoundaryBorderLayer extends BaseLayer {
4873
4974
  * 设置当前割草任务的边界
4874
4975
  */
4875
4976
  setMowingBoundarys(mowingBoundarys) {
4876
- this.mowingBoundarys = mowingBoundarys;
4977
+ if (!mowingBoundarys) {
4978
+ this.mowingBoundarys = this.elements?.map(item => item?.originalData?.id);
4979
+ }
4980
+ else {
4981
+ this.mowingBoundarys = mowingBoundarys;
4982
+ }
4877
4983
  }
4878
4984
  /**
4879
4985
  * SVG渲染方法
@@ -5301,6 +5407,14 @@ class BoundaryDataBuilder {
5301
5407
  * 创建边界元素数据
5302
5408
  */
5303
5409
  static create(type, coordinates, style) {
5410
+ const len = coordinates?.length || 0;
5411
+ const firstPoint = coordinates?.[0];
5412
+ const lastPoint = coordinates?.[len - 1];
5413
+ const isClosed = firstPoint?.[0] === lastPoint?.[0] && firstPoint?.[1] === lastPoint?.[1];
5414
+ // 如果地图没有闭合,则手动新增闭合点,避免border最后一部分没有闭合的情况
5415
+ if (!isClosed) {
5416
+ coordinates.push([firstPoint?.[0], firstPoint?.[1], lastPoint?.[2]]);
5417
+ }
5304
5418
  return {
5305
5419
  type,
5306
5420
  coordinates,
@@ -5703,8 +5817,13 @@ class MapDataProcessor {
5703
5817
  // 为ObstacleData创建兼容的MapElement接口
5704
5818
  const mapElement = element;
5705
5819
  const obstacleElement = ObstacleDataBuilder.fromMapElement(mapElement, this.mapConfig.obstacle);
5706
- if (obstacleElement)
5820
+ if (obstacleElement) {
5707
5821
  result.push(obstacleElement);
5822
+ const { addObstacles } = useSubBoundaryBorderStore.getState();
5823
+ addObstacles(`obstacle-${obstacleElement.originalData.id}`, {
5824
+ ...obstacleElement,
5825
+ });
5826
+ }
5708
5827
  }
5709
5828
  catch (error) {
5710
5829
  console.warn(`Error processing OBSTACLE element:`, element, error);
@@ -5765,8 +5884,13 @@ class MapDataProcessor {
5765
5884
  element.direction !== undefined) {
5766
5885
  const mapElement = element;
5767
5886
  const svgElement = SvgElementDataBuilder.fromMapElement(mapElement, this.mapConfig.doodle);
5768
- if (svgElement)
5887
+ if (svgElement) {
5769
5888
  result.push(svgElement);
5889
+ const { addSvgElements } = useSubBoundaryBorderStore.getState();
5890
+ addSvgElements(`time-limit-obstacle-${svgElement.originalData.id}`, {
5891
+ ...svgElement,
5892
+ });
5893
+ }
5770
5894
  }
5771
5895
  // 如果有points数据,按传统方式绘制
5772
5896
  else if ('points' in element &&
@@ -5775,8 +5899,13 @@ class MapDataProcessor {
5775
5899
  element.points.length >= 3) {
5776
5900
  const mapElement = element;
5777
5901
  const polygonElement = ObstacleDataBuilder.createTimeLimitObstacle(mapElement, this.mapConfig.obstacle);
5778
- if (polygonElement)
5902
+ if (polygonElement) {
5779
5903
  result.push(polygonElement);
5904
+ const { addObstacles } = useSubBoundaryBorderStore.getState();
5905
+ addObstacles(`time-limit-obstacle-${polygonElement.originalData.id}`, {
5906
+ ...polygonElement,
5907
+ });
5908
+ }
5780
5909
  }
5781
5910
  }
5782
5911
  catch (error) {
@@ -6113,7 +6242,6 @@ class BoundaryLabelsManager {
6113
6242
  this.collapseOtherLabels(boundaryId);
6114
6243
  // 展开当前标签
6115
6244
  extendedContent.style.display = 'block';
6116
- labelDiv.style.whiteSpace = 'normal';
6117
6245
  this.currentExpandedBoundaryId = boundaryId;
6118
6246
  }
6119
6247
  /**
@@ -6614,7 +6742,7 @@ class ChargingPileManager {
6614
6742
  }
6615
6743
  // 简化的层级定义 - 充电桩只需要一个固定层级
6616
6744
  ChargingPileManager.Z_INDEX = {
6617
- CHARGING_PILE: 800, // 充电桩图标固定层级
6745
+ CHARGING_PILE: 750, // 充电桩图标固定层级
6618
6746
  };
6619
6747
 
6620
6748
  /**
@@ -7026,7 +7154,7 @@ class AntennaManager {
7026
7154
  }
7027
7155
  // 简化的层级定义
7028
7156
  AntennaManager.Z_INDEX = {
7029
- DEFAULT: 750, // 默认层级
7157
+ DEFAULT: 800, // 默认层级
7030
7158
  ACTIVE: 9999, // 点击激活时的高层级
7031
7159
  };
7032
7160
 
@@ -7173,9 +7301,10 @@ class MowerPositionManager {
7173
7301
  return;
7174
7302
  this.mowerPositionConfig = chargingPilesPositionConfig;
7175
7303
  const lastPosition = this.lastPosition;
7176
- const postureX = chargingPilesPositionConfig.postureX ?? chargingPilesPositionConfig.lastPostureX ?? lastPosition?.x ?? 0;
7177
- const postureY = chargingPilesPositionConfig.postureY ?? chargingPilesPositionConfig.lastPostureY ?? lastPosition?.y ?? 0;
7178
- const postureTheta = chargingPilesPositionConfig.postureTheta ?? chargingPilesPositionConfig.lastPostureTheta ?? lastPosition?.rotation ?? 0;
7304
+ const postureX = chargingPilesPositionConfig.postureX || chargingPilesPositionConfig.lastPostureX || lastPosition?.x || 0;
7305
+ const postureY = chargingPilesPositionConfig.postureY || chargingPilesPositionConfig.lastPostureY || lastPosition?.y || 0;
7306
+ const postureTheta = chargingPilesPositionConfig.postureTheta || chargingPilesPositionConfig.lastPostureTheta || lastPosition?.rotation || 0;
7307
+ console.log('updatePositionByLastPosition->', postureX, postureY, postureTheta, chargingPilesPositionConfig);
7179
7308
  // 检查是否需要更新图片
7180
7309
  this.updateMowerImage(chargingPilesPositionConfig);
7181
7310
  // 立即更新位置
@@ -7189,10 +7318,10 @@ class MowerPositionManager {
7189
7318
  this.updateMowerImage(positionConfig);
7190
7319
  // 更新配置
7191
7320
  this.mowerPositionConfig = positionConfig;
7192
- const postureX = positionConfig?.postureX ?? this.lastPosition?.x;
7193
- const postureY = positionConfig?.postureY ?? this.lastPosition?.y;
7194
- const postureTheta = positionConfig?.postureTheta ?? this.lastPosition?.rotation;
7195
- console.log('updatePosition manager', positionConfig, this.lastPosition);
7321
+ const postureX = positionConfig?.postureX || this.lastPosition?.x || 0;
7322
+ const postureY = positionConfig?.postureY || this.lastPosition?.y || 0;
7323
+ const postureTheta = positionConfig?.postureTheta || this.lastPosition?.rotation || 0;
7324
+ console.log('updatePosition manager', JSON.stringify(this.currentPosition), this.currentPosition, !this.currentPosition, positionConfig, this.lastPosition, animationTime);
7196
7325
  // 停止当前动画(如果有)
7197
7326
  this.stopAnimation();
7198
7327
  // 第一个点
@@ -7202,6 +7331,7 @@ class MowerPositionManager {
7202
7331
  y: postureY,
7203
7332
  rotation: postureTheta,
7204
7333
  };
7334
+ console.log('updatePosition first->', this.currentPosition);
7205
7335
  this.setElementPosition(this.currentPosition.x, this.currentPosition.y, this.currentPosition.rotation);
7206
7336
  return;
7207
7337
  }
@@ -7251,7 +7381,7 @@ class MowerPositionManager {
7251
7381
  if (!positonOutOfRange && !positionValid) {
7252
7382
  this.lastPosition = { x, y, rotation: theta };
7253
7383
  }
7254
- // console.log('setElementPosition', x, y, targetRotation, positonOutOfRange, positionValid, targetPixelPosition);
7384
+ // console.log('setElementPosition', x, y, theta, targetRotation, positonOutOfRange, positionValid, targetPixelPosition);
7255
7385
  if (!this.mowerElement)
7256
7386
  return;
7257
7387
  this.mowerElement.style.left = `${targetPixelPosition?.x}px`;
@@ -7305,10 +7435,12 @@ class MowerPositionManager {
7305
7435
  y: this.onlyUpdateTheta ? 0 : this.targetPosition.y - this.startPosition.y,
7306
7436
  rotation: radNormalize(targetTheta - startTheta),
7307
7437
  };
7438
+ console.log('startAnimationToPosition-->', this.deltaPosition, this.onlyUpdateTheta, this.targetPosition, this.startPosition);
7308
7439
  // 开始动画循环
7309
7440
  this.animateStep();
7310
7441
  }
7311
7442
  forceUpdatePosition() {
7443
+ console.log('forceUpdatePosition-->', this.currentPosition, this.targetPosition, this.startPosition);
7312
7444
  this.animateStep();
7313
7445
  }
7314
7446
  /**
@@ -7335,6 +7467,7 @@ class MowerPositionManager {
7335
7467
  vehicleState: this.mowerPositionConfig?.vehicleState,
7336
7468
  });
7337
7469
  }
7470
+ // console.log('animateStep-->', this.startPosition, this.deltaPosition, this.targetPosition, easedProgress)
7338
7471
  // 继续动画或结束
7339
7472
  if (progress < 1) {
7340
7473
  // 设置当前位置
@@ -8621,13 +8754,6 @@ class MowerMapOverlay {
8621
8754
  }
8622
8755
  }
8623
8756
 
8624
- var RealTimeDataType;
8625
- (function (RealTimeDataType) {
8626
- RealTimeDataType[RealTimeDataType["LOCATION"] = 1] = "LOCATION";
8627
- RealTimeDataType[RealTimeDataType["PROCESS"] = 2] = "PROCESS";
8628
- RealTimeDataType[RealTimeDataType["PARTITION"] = 3] = "PARTITION";
8629
- })(RealTimeDataType || (RealTimeDataType = {}));
8630
-
8631
8757
  // 获取车辆状态的中文文案
8632
8758
  const getVehicleStateText = (vehicleState) => {
8633
8759
  switch (vehicleState) {
@@ -8747,7 +8873,7 @@ const MowerMapRenderer = forwardRef(({ mapConfig, modelType, mapRef, mapJson, pa
8747
8873
  // const mapRef = useMap();
8748
8874
  const [isGoogleMapsReady, setIsGoogleMapsReady] = useState(false);
8749
8875
  const [hasInitializedBounds, setHasInitializedBounds] = useState(false);
8750
- const { clearSubBoundaryBorder } = useSubBoundaryBorderStore();
8876
+ const { clearSubBoundaryBorder, clearObstacles } = useSubBoundaryBorderStore();
8751
8877
  const currentProcessMowingStatusRef = useRef(false);
8752
8878
  const { updateProcessStateIsMowing, processStateIsMowing } = useProcessMowingState();
8753
8879
  const [mowPartitionData, setMowPartitionData] = useState(null);
@@ -8801,8 +8927,12 @@ const MowerMapRenderer = forwardRef(({ mapConfig, modelType, mapRef, mapJson, pa
8801
8927
  lastPostureTheta: currentPositionData?.lastPostureTheta
8802
8928
  ? Number(currentPositionData.lastPostureTheta)
8803
8929
  : 0,
8804
- lastPostureX: currentPositionData?.lastPostureX ? Number(currentPositionData.lastPostureX) : 0,
8805
- lastPostureY: currentPositionData?.lastPostureY ? Number(currentPositionData.lastPostureY) : 0,
8930
+ lastPostureX: currentPositionData?.lastPostureX
8931
+ ? Number(currentPositionData.lastPostureX)
8932
+ : 0,
8933
+ lastPostureY: currentPositionData?.lastPostureY
8934
+ ? Number(currentPositionData.lastPostureY)
8935
+ : 0,
8806
8936
  vehicleState: currentPositionData?.vehicleState || RobotStatus.CHARGING,
8807
8937
  };
8808
8938
  }, [realTimeData, modelType]);
@@ -8895,12 +9025,26 @@ const MowerMapRenderer = forwardRef(({ mapConfig, modelType, mapRef, mapJson, pa
8895
9025
  handleError(`初始化Google Maps叠加层失败: ${error instanceof Error ? error.message : String(error)}`);
8896
9026
  }
8897
9027
  };
9028
+ const resetInCharginPie = useCallback(() => {
9029
+ const elements = MapDataProcessor.processMapData(mapJson, mergedMapConfig);
9030
+ const chargingPiles = elements.find((element) => element.type === 'charging_pile');
9031
+ if (!overlayRef.current)
9032
+ return;
9033
+ // 如果在充电桩上,则直接更新位置到充电桩的位置
9034
+ overlayRef.current.updatePosition({
9035
+ ...mowerPositionData,
9036
+ postureX: chargingPiles?.originalData.position[0],
9037
+ postureY: chargingPiles?.originalData.position[1],
9038
+ postureTheta: chargingPiles?.originalData.direction - Math.PI || 0,
9039
+ }, 0);
9040
+ }, [mapJson]);
8898
9041
  // 初始化效果
8899
9042
  useEffect(() => {
8900
9043
  initializeGoogleMapsOverlay();
8901
9044
  // 清理函数
8902
9045
  return () => {
8903
9046
  clearSubBoundaryBorder();
9047
+ clearObstacles();
8904
9048
  updateProcessStateIsMowing(false);
8905
9049
  currentProcessMowingStatusRef.current = false;
8906
9050
  if (overlayRef.current) {
@@ -8997,12 +9141,12 @@ const MowerMapRenderer = forwardRef(({ mapConfig, modelType, mapRef, mapJson, pa
8997
9141
  // 计算左下角和右上角坐标
8998
9142
  sw: {
8999
9143
  x: viewBoxInfo.x / SCALE_FACTOR,
9000
- y: viewBoxInfo.y / SCALE_FACTOR
9144
+ y: viewBoxInfo.y / SCALE_FACTOR,
9001
9145
  },
9002
9146
  ne: {
9003
9147
  x: (viewBoxInfo.x + viewBoxInfo.width) / SCALE_FACTOR,
9004
- y: (viewBoxInfo.y + viewBoxInfo.height) / SCALE_FACTOR
9005
- }
9148
+ y: (viewBoxInfo.y + viewBoxInfo.height) / SCALE_FACTOR,
9149
+ },
9006
9150
  };
9007
9151
  }
9008
9152
  }
@@ -9016,7 +9160,7 @@ const MowerMapRenderer = forwardRef(({ mapConfig, modelType, mapRef, mapJson, pa
9016
9160
  lastY: mowerPositionData.lastPostureY || 0,
9017
9161
  lastTheta: mowerPositionData.lastPostureTheta || 0,
9018
9162
  vehicleState: mowerPositionData.vehicleState || RobotStatus.UNKNOWN,
9019
- vehicleStateText: getVehicleStateText(mowerPositionData.vehicleState || RobotStatus.UNKNOWN)
9163
+ vehicleStateText: getVehicleStateText(mowerPositionData.vehicleState || RobotStatus.UNKNOWN),
9020
9164
  };
9021
9165
  }
9022
9166
  // 获取当前割草地块数据
@@ -9024,9 +9168,6 @@ const MowerMapRenderer = forwardRef(({ mapConfig, modelType, mapRef, mapJson, pa
9024
9168
  setDebugInfo(newDebugInfo);
9025
9169
  };
9026
9170
  updateDebugInfo();
9027
- // 设置定时更新(仅在没有数据变化时使用)
9028
- const interval = setInterval(updateDebugInfo, 1000);
9029
- return () => clearInterval(interval);
9030
9171
  }, [debug, mapJson, mowerPositionData, mowPartitionData, defaultTransform]);
9031
9172
  // 当关键数据变化时立即更新debug信息
9032
9173
  useEffect(() => {
@@ -9055,12 +9196,12 @@ const MowerMapRenderer = forwardRef(({ mapConfig, modelType, mapRef, mapJson, pa
9055
9196
  // 计算左下角和右上角坐标
9056
9197
  sw: {
9057
9198
  x: viewBoxInfo.x / SCALE_FACTOR,
9058
- y: viewBoxInfo.y / SCALE_FACTOR
9199
+ y: viewBoxInfo.y / SCALE_FACTOR,
9059
9200
  },
9060
9201
  ne: {
9061
9202
  x: (viewBoxInfo.x + viewBoxInfo.width) / SCALE_FACTOR,
9062
- y: (viewBoxInfo.y + viewBoxInfo.height) / SCALE_FACTOR
9063
- }
9203
+ y: (viewBoxInfo.y + viewBoxInfo.height) / SCALE_FACTOR,
9204
+ },
9064
9205
  };
9065
9206
  }
9066
9207
  }
@@ -9074,7 +9215,7 @@ const MowerMapRenderer = forwardRef(({ mapConfig, modelType, mapRef, mapJson, pa
9074
9215
  lastY: mowerPositionData.lastPostureY || 0,
9075
9216
  lastTheta: mowerPositionData.lastPostureTheta || 0,
9076
9217
  vehicleState: mowerPositionData.vehicleState || RobotStatus.UNKNOWN,
9077
- vehicleStateText: getVehicleStateText(mowerPositionData.vehicleState || RobotStatus.UNKNOWN)
9218
+ vehicleStateText: getVehicleStateText(mowerPositionData.vehicleState || RobotStatus.UNKNOWN),
9078
9219
  };
9079
9220
  }
9080
9221
  // 获取当前割草地块数据
@@ -9088,12 +9229,26 @@ const MowerMapRenderer = forwardRef(({ mapConfig, modelType, mapRef, mapJson, pa
9088
9229
  return;
9089
9230
  }
9090
9231
  console.log('usefeect realTimeData----->', realTimeData, mapJson, pathJson, overlayRef.current);
9232
+ let curMowPartitionData = mowPartitionData;
9091
9233
  // realtime中包含当前割草任务的数据,根据数据进行path路径和边界的高亮操作,
9092
9234
  const mowingPartition = realTimeData.find((item) => item.type === RealTimeDataType.PARTITION);
9093
9235
  if (mowingPartition) {
9094
9236
  setMowPartitionData(mowingPartition);
9237
+ curMowPartitionData = mowingPartition;
9238
+ }
9239
+ const statusData = realTimeData?.find(item => item?.type === RealTimeDataType.STATUS);
9240
+ if (statusData) {
9241
+ // 车辆回桩不会回传最后的park的位置,所以根据实时数据的状态数据判断车辆回到桩上
9242
+ if ([RobotStatus.CHARGING, RobotStatus.PARKED].includes(statusData?.vehicleState || RobotStatus.UNKNOWN)) {
9243
+ resetInCharginPie();
9244
+ }
9245
+ else if (statusData?.vehicleState === RobotStatus.WORKING) {
9246
+ // 兜底收不到割草地块的实时数据,使用状态来兜底
9247
+ overlayRef.current.resetBorderLayerHighlight();
9248
+ setMowPartitionData({});
9249
+ curMowPartitionData = {};
9250
+ }
9095
9251
  }
9096
- const curMowPartitionData = mowingPartition || mowPartitionData;
9097
9252
  if (!mapJson ||
9098
9253
  !pathJson ||
9099
9254
  !overlayRef.current)
@@ -9209,8 +9364,9 @@ const MowerMapRenderer = forwardRef(({ mapConfig, modelType, mapRef, mapJson, pa
9209
9364
  fontFamily: 'monospace',
9210
9365
  zIndex: 10000,
9211
9366
  maxWidth: '300px',
9212
- lineHeight: '1.4'
9213
- }, children: [jsx("div", { style: { fontWeight: 'bold', marginBottom: '8px' }, children: "\uD83D\uDC1B Debug Info" }), debugInfo.mapBounds && (jsxs("div", { style: { marginBottom: '6px' }, children: [jsx("div", { style: { fontWeight: 'bold' }, children: "\uD83D\uDCCD Map GPS Bounds:" }), jsxs("div", { children: ["SW: [", debugInfo.mapBounds.sw[0].toFixed(6), ", ", debugInfo.mapBounds.sw[1].toFixed(6), "]"] }), jsxs("div", { children: ["NE: [", debugInfo.mapBounds.ne[0].toFixed(6), ", ", debugInfo.mapBounds.ne[1].toFixed(6), "]"] })] })), debugInfo.viewBox && (jsxs("div", { style: { marginBottom: '6px' }, children: [jsx("div", { style: { fontWeight: 'bold' }, children: "\uD83D\uDCD0 SVG ViewBox (meters):" }), jsxs("div", { children: ["SW: [", debugInfo.viewBox.sw.x.toFixed(2), ", ", debugInfo.viewBox.sw.y.toFixed(2), "]"] }), jsxs("div", { children: ["NE: [", debugInfo.viewBox.ne.x.toFixed(2), ", ", debugInfo.viewBox.ne.y.toFixed(2), "]"] }), jsxs("div", { children: ["Size: ", debugInfo.viewBox.width.toFixed(2), "m \u00D7 ", debugInfo.viewBox.height.toFixed(2), "m"] }), jsxs("div", { children: ["Scale: 1:", debugInfo.viewBox.scale] })] })), debugInfo.mowerPosition && (jsxs("div", { style: { marginBottom: '6px' }, children: [jsx("div", { style: { fontWeight: 'bold' }, children: "\uD83D\uDE9C Mower Position:" }), jsxs("div", { children: ["Current: X=", debugInfo.mowerPosition.x.toFixed(2), ", Y=", debugInfo.mowerPosition.y.toFixed(2)] }), jsxs("div", { children: ["Theta: ", (debugInfo.mowerPosition.theta * 180 / Math.PI).toFixed(1), "\u00B0"] }), jsxs("div", { children: ["Last: X=", debugInfo.mowerPosition.lastX.toFixed(2), ", Y=", debugInfo.mowerPosition.lastY.toFixed(2)] }), jsxs("div", { children: ["Last Theta: ", (debugInfo.mowerPosition.lastTheta * 180 / Math.PI).toFixed(1), "\u00B0"] }), jsxs("div", { children: ["Status: ", debugInfo.mowerPosition.vehicleStateText, " (", debugInfo.mowerPosition.vehicleState, ")"] })] })), debugInfo.partitionData && (jsxs("div", { style: { marginBottom: '6px' }, children: [jsx("div", { style: { fontWeight: 'bold' }, children: "\uD83D\uDD32 Mow Partition Data:" }), jsxs("div", { children: ["Type: ", debugInfo.partitionData.type || 'N/A'] }), debugInfo.partitionData.partitionIds && debugInfo.partitionData.partitionIds.length > 0 ? (jsxs("div", { children: ["Active IDs: [", debugInfo.partitionData.partitionIds.join(', '), "]"] })) : (jsx("div", { children: "No active partitions" })), debugInfo.partitionData.time && (jsxs("div", { children: ["Updated: ", new Date(debugInfo.partitionData.time).toLocaleTimeString()] }))] })), !debugInfo.partitionData && (jsxs("div", { style: { marginBottom: '6px' }, children: [jsx("div", { style: { fontWeight: 'bold' }, children: "\uD83D\uDD32 Mow Partition Data:" }), jsx("div", { style: { color: '#888' }, children: "No partition data available" })] }))] }));
9367
+ lineHeight: '1.4',
9368
+ }, children: [jsx("div", { style: { fontWeight: 'bold', marginBottom: '8px' }, children: "\uD83D\uDC1B Debug Info" }), debugInfo.mapBounds && (jsxs("div", { style: { marginBottom: '6px' }, children: [jsx("div", { style: { fontWeight: 'bold' }, children: "\uD83D\uDCCD Map GPS Bounds:" }), jsxs("div", { children: ["SW: [", debugInfo.mapBounds.sw[0].toFixed(6), ", ", debugInfo.mapBounds.sw[1].toFixed(6), "]"] }), jsxs("div", { children: ["NE: [", debugInfo.mapBounds.ne[0].toFixed(6), ", ", debugInfo.mapBounds.ne[1].toFixed(6), "]"] })] })), debugInfo.viewBox && (jsxs("div", { style: { marginBottom: '6px' }, children: [jsx("div", { style: { fontWeight: 'bold' }, children: "\uD83D\uDCD0 SVG ViewBox (meters):" }), jsxs("div", { children: ["SW: [", debugInfo.viewBox.sw.x.toFixed(2), ", ", debugInfo.viewBox.sw.y.toFixed(2), "]"] }), jsxs("div", { children: ["NE: [", debugInfo.viewBox.ne.x.toFixed(2), ", ", debugInfo.viewBox.ne.y.toFixed(2), "]"] }), jsxs("div", { children: ["Size: ", debugInfo.viewBox.width.toFixed(2), "m \u00D7 ", debugInfo.viewBox.height.toFixed(2), "m"] }), jsxs("div", { children: ["Scale: 1:", debugInfo.viewBox.scale] })] })), debugInfo.mowerPosition && (jsxs("div", { style: { marginBottom: '6px' }, children: [jsx("div", { style: { fontWeight: 'bold' }, children: "\uD83D\uDE9C Mower Position:" }), jsxs("div", { children: ["Current: X=", debugInfo.mowerPosition.x.toFixed(2), ", Y=", debugInfo.mowerPosition.y.toFixed(2)] }), jsxs("div", { children: ["Theta: ", ((debugInfo.mowerPosition.theta * 180) / Math.PI).toFixed(1), "\u00B0"] }), jsxs("div", { children: ["Last: X=", debugInfo.mowerPosition.lastX.toFixed(2), ", Y=", debugInfo.mowerPosition.lastY.toFixed(2)] }), jsxs("div", { children: ["Last Theta: ", ((debugInfo.mowerPosition.lastTheta * 180) / Math.PI).toFixed(1), "\u00B0"] }), jsxs("div", { children: ["Status: ", debugInfo.mowerPosition.vehicleStateText, " (", debugInfo.mowerPosition.vehicleState, ")"] })] })), debugInfo.partitionData && (jsxs("div", { style: { marginBottom: '6px' }, children: [jsx("div", { style: { fontWeight: 'bold' }, children: "\uD83D\uDD32 Mow Partition Data:" }), jsxs("div", { children: ["Type: ", debugInfo.partitionData.type || 'N/A'] }), debugInfo.partitionData.partitionIds &&
9369
+ debugInfo.partitionData.partitionIds.length > 0 ? (jsxs("div", { children: ["Active IDs: [", debugInfo.partitionData.partitionIds.join(', '), "]"] })) : (jsx("div", { children: "No active partitions" })), debugInfo.partitionData.time && (jsxs("div", { children: ["Updated: ", new Date(debugInfo.partitionData.time).toLocaleTimeString()] }))] })), !debugInfo.partitionData && (jsxs("div", { style: { marginBottom: '6px' }, children: [jsx("div", { style: { fontWeight: 'bold' }, children: "\uD83D\uDD32 Mow Partition Data:" }), jsx("div", { style: { color: '#888' }, children: "No partition data available" })] }))] }));
9214
9370
  };
9215
9371
  // 错误显示
9216
9372
  if (currentError) {