@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.js CHANGED
@@ -3,6 +3,135 @@
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
4
  var React = require('react');
5
5
 
6
+ /**
7
+ * 常量和枚举类型定义
8
+ */
9
+ /**
10
+ * 机器人状态枚举
11
+ */
12
+ var RobotStatus;
13
+ (function (RobotStatus) {
14
+ RobotStatus[RobotStatus["PARKED"] = 1] = "PARKED";
15
+ RobotStatus[RobotStatus["CHARGING"] = 2] = "CHARGING";
16
+ RobotStatus[RobotStatus["STANDBY"] = 3] = "STANDBY";
17
+ RobotStatus[RobotStatus["MOWING"] = 4] = "MOWING";
18
+ RobotStatus[RobotStatus["WORKING"] = 5] = "WORKING";
19
+ RobotStatus[RobotStatus["MAPPING"] = 6] = "MAPPING";
20
+ RobotStatus[RobotStatus["ERROR"] = 7] = "ERROR";
21
+ RobotStatus[RobotStatus["UPGRADING"] = 8] = "UPGRADING";
22
+ RobotStatus[RobotStatus["DISCONNECTED"] = 9] = "DISCONNECTED";
23
+ RobotStatus[RobotStatus["UNKNOWN"] = -1] = "UNKNOWN";
24
+ RobotStatus[RobotStatus["TASK_DELAY"] = 10] = "TASK_DELAY";
25
+ })(RobotStatus || (RobotStatus = {}));
26
+ /**
27
+ * RTK状态枚举
28
+ */
29
+ var RTK_STATE;
30
+ (function (RTK_STATE) {
31
+ RTK_STATE[RTK_STATE["LOW_RTK"] = 1] = "LOW_RTK";
32
+ RTK_STATE[RTK_STATE["MIDDLE_RTK"] = 2] = "MIDDLE_RTK";
33
+ RTK_STATE[RTK_STATE["HIGH_RTK"] = 3] = "HIGH_RTK";
34
+ RTK_STATE[RTK_STATE["NO_POSTURE"] = 10] = "NO_POSTURE";
35
+ RTK_STATE[RTK_STATE["OUT_OF_RANGE"] = 11] = "OUT_OF_RANGE";
36
+ RTK_STATE[RTK_STATE["OFF_LINE"] = 19] = "OFF_LINE";
37
+ })(RTK_STATE || (RTK_STATE = {}));
38
+ /**
39
+ * 实时数据类型枚举
40
+ */
41
+ var REAL_TIME_DATA_TYPE;
42
+ (function (REAL_TIME_DATA_TYPE) {
43
+ REAL_TIME_DATA_TYPE[REAL_TIME_DATA_TYPE["LOCATION"] = 1] = "LOCATION";
44
+ REAL_TIME_DATA_TYPE[REAL_TIME_DATA_TYPE["PROCESS"] = 2] = "PROCESS";
45
+ })(REAL_TIME_DATA_TYPE || (REAL_TIME_DATA_TYPE = {}));
46
+
47
+ /**
48
+ * 地图渲染相关常量配置
49
+ */
50
+ /**
51
+ * 缩放因子 - 将米转换为像素
52
+ * 与Python代码中的SVG比例一致
53
+ */
54
+ const SCALE_FACTOR = 50; // 50像素/米
55
+ /**
56
+ * 默认线宽设置
57
+ */
58
+ const DEFAULT_LINE_WIDTHS = {
59
+ OBSTACLE: 2,
60
+ CHARGING_PILE: 2,
61
+ CHANNEL: 2,
62
+ PATH: 20,
63
+ VISION_OFF_AREA: 2,
64
+ TIME_LIMIT_OBSTACLE: 1,
65
+ };
66
+ /**
67
+ * 默认透明度设置
68
+ */
69
+ const DEFAULT_OPACITIES = {
70
+ FULL: 1.0,
71
+ HIGH: 0.7,
72
+ LOW: 0.4};
73
+ /**
74
+ * 默认半径设置
75
+ */
76
+ const DEFAULT_RADII = {
77
+ CHARGING_PILE: 12};
78
+ /**
79
+ * 图层等级
80
+ */
81
+ const LAYER_LEVELS = {
82
+ BOUNDARY: 2,
83
+ BOUNDARY_BORDER: 4};
84
+ /**
85
+ * 图层默认id
86
+ */
87
+ const LAYER_DEFAULT_TYPE = {
88
+ CHANNEL: 'channel',
89
+ BOUNDARY: 'boundary',
90
+ PATH: 'path',
91
+ BOUNDARY_BORDER: 'boundary_border',
92
+ OBSTACLE: 'obstacle',
93
+ CHARGING_PILE: 'charging_pile',
94
+ POINT: 'point',
95
+ SVG: 'svg',
96
+ VISION_OFF_AREA: 'vision_off_area',
97
+ ANTENNA: 'antenna',
98
+ };
99
+ const ISOLATED_BOUNDARY_SVG = `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
100
+ <g opacity="0.6">
101
+ <rect width="24" height="24" rx="12" fill="#1E1E1F" fill-opacity="0.5"/>
102
+ <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"/>
103
+ <mask id="path-3-outside-1_9822_43516" maskUnits="userSpaceOnUse" x="13.2344" y="7.20545" width="12.0208" height="12.0208" fill="black">
104
+ <rect fill="white" x="13.2344" y="7.20545" width="12.0208" height="12.0208"/>
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"/>
106
+ </mask>
107
+ <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"/>
108
+ <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)"/>
109
+ <mask id="path-5-outside-2_9822_43516" maskUnits="userSpaceOnUse" x="9.22265" y="10.388" width="12.7279" height="12.7279" fill="black">
110
+ <rect fill="white" x="9.22265" y="10.388" width="12.7279" height="12.7279"/>
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"/>
112
+ </mask>
113
+ <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"/>
114
+ <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)"/>
115
+ <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"/>
116
+ <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"/>
117
+ <rect width="1.91578" height="4.24403" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 19.6992 13.8066)" fill="#8E8E8F"/>
118
+ <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"/>
119
+ </g>
120
+ </svg>`;
121
+ /**
122
+ * 遍历割草任务,下述四个字段可以在路径中唯一确定遍历的位置(当前区域、当前块、当前行、在当前行上的路程)
123
+ */
124
+ const ACTION_BLOCK_COVER = 5;
125
+ /**
126
+ * 遍历割草块转移任务(在同一区域中的一个块转移到下一个块),下述四个字段可以在路径中唯一确定转移的位置(当前区域、前置块、当前转移路径线序号、在当前线上的路程)
127
+ */
128
+ const ACTION_BLOCK_TRANSFER = 6;
129
+ /**
130
+ * 边界割草任务(割草任务内部的巡边任务)
131
+ */
132
+ const ACTION_BOUNDARY_TASK = 8;
133
+ const SVG_MAP_VIEW_ID = 'fleet-maps-svg-map-view';
134
+
6
135
  /**
7
136
  * SVG基础MapView
8
137
  * 使用真正的矢量SVG渲染替代Canvas位图渲染
@@ -58,6 +187,7 @@ class SvgMapView {
58
187
  this.svg.setAttribute('shape-rendering', 'geometricPrecision');
59
188
  this.svg.setAttribute('text-rendering', 'geometricPrecision');
60
189
  this.svg.setAttribute('image-rendering', 'optimizeQuality');
190
+ this.svg.setAttribute('id', SVG_MAP_VIEW_ID);
61
191
  }
62
192
  /**
63
193
  * 创建SVG组元素
@@ -120,7 +250,7 @@ class SvgMapView {
120
250
  * 设置自适应视图变换 - 让SVG刚好包裹住图形
121
251
  */
122
252
  fitToView(bounds) {
123
- const padding = 10; // 添加一些边距以避免内容贴边
253
+ const padding = 20; // 添加一些边距以避免内容贴边
124
254
  const boundWidth = bounds.maxX - bounds.minX;
125
255
  const boundHeight = bounds.maxY - bounds.minY;
126
256
  // 防止宽高为0的情况
@@ -143,9 +273,10 @@ class SvgMapView {
143
273
  this.viewBox = {
144
274
  x: bounds.minX - padding,
145
275
  y: bounds.minY - padding,
146
- width: boundWidth + padding,
147
- height: boundHeight + padding,
276
+ width: boundWidth + padding * 2,
277
+ height: boundHeight + padding * 2,
148
278
  };
279
+ console.log('viewbox->', this.viewBox);
149
280
  // 根据宽高比选择合适的preserveAspectRatio设置
150
281
  if (Math.abs(contentAspectRatio - containerAspectRatio) < 0.01) {
151
282
  // 宽高比接近,使用slice填满容器
@@ -268,7 +399,7 @@ class SvgMapView {
268
399
  // const layerType = layerIdParts.slice(1, -1).join('-'); // 处理类型名中可能包含连字符的情况
269
400
  // const layerLevel = parseInt(layerIdParts[layerIdParts.length - 1]);
270
401
  // // 查找对应的图层对象
271
- // const targetLayer = this.layers.find(layer =>
402
+ // const targetLayer = this.layers.find(layer =>
272
403
  // layer.getType() === layerType && layer.getLevel() === layerLevel
273
404
  // );
274
405
  // if (targetLayer && targetLayer.isVisible()) {
@@ -651,8 +782,6 @@ const create = (createState) => createState ? createImpl(createState) : createIm
651
782
 
652
783
  const useSubBoundaryBorderStore = create((set, get) => ({
653
784
  subBoundaryBorder: {},
654
- // 覆盖所有数据
655
- setSubBoundaryBorder: (subBoundaryBorder) => set({ subBoundaryBorder }),
656
785
  // 追加单个数据
657
786
  addSubBoundaryBorder: (key, element) => set((state) => ({
658
787
  subBoundaryBorder: {
@@ -660,134 +789,28 @@ const useSubBoundaryBorderStore = create((set, get) => ({
660
789
  [key]: element,
661
790
  },
662
791
  })),
663
- // 追加多个数据
664
- addMultipleSubBoundaryBorders: (borders) => set((state) => ({
665
- subBoundaryBorder: {
666
- ...state.subBoundaryBorder,
667
- ...borders,
668
- },
669
- })),
670
792
  // 清空所有数据
671
793
  clearSubBoundaryBorder: () => set({ subBoundaryBorder: {} }),
794
+ // 障碍物
795
+ obstacles: {},
796
+ addObstacles: (key, element) => set((state) => ({
797
+ obstacles: {
798
+ ...state.obstacles,
799
+ [key]: element,
800
+ },
801
+ })),
802
+ clearObstacles: () => set({ obstacles: {} }),
803
+ // svg数据
804
+ svgElements: {},
805
+ addSvgElements: (key, element) => set((state) => ({
806
+ svgElements: {
807
+ ...state.svgElements,
808
+ [key]: element,
809
+ },
810
+ })),
811
+ clearSvgElements: () => set({ svgElements: {} }),
672
812
  }));
673
813
 
674
- /**
675
- * 地图渲染相关常量配置
676
- */
677
- /**
678
- * 缩放因子 - 将米转换为像素
679
- * 与Python代码中的SVG比例一致
680
- */
681
- const SCALE_FACTOR = 50; // 50像素/米
682
- /**
683
- * 默认线宽设置
684
- */
685
- const DEFAULT_LINE_WIDTHS = {
686
- OBSTACLE: 2,
687
- CHARGING_PILE: 2,
688
- CHANNEL: 2,
689
- PATH: 20,
690
- VISION_OFF_AREA: 2,
691
- TIME_LIMIT_OBSTACLE: 1,
692
- };
693
- /**
694
- * 默认透明度设置
695
- */
696
- const DEFAULT_OPACITIES = {
697
- FULL: 1.0,
698
- HIGH: 0.7,
699
- LOW: 0.4};
700
- /**
701
- * 默认半径设置
702
- */
703
- const DEFAULT_RADII = {
704
- CHARGING_PILE: 12};
705
- /**
706
- * 图层等级
707
- */
708
- const LAYER_LEVELS = {
709
- BOUNDARY: 2,
710
- BOUNDARY_BORDER: 4};
711
- /**
712
- * 图层默认id
713
- */
714
- const LAYER_DEFAULT_TYPE = {
715
- CHANNEL: 'channel',
716
- BOUNDARY: 'boundary',
717
- PATH: 'path',
718
- BOUNDARY_BORDER: 'boundary_border',
719
- OBSTACLE: 'obstacle',
720
- CHARGING_PILE: 'charging_pile',
721
- POINT: 'point',
722
- SVG: 'svg',
723
- VISION_OFF_AREA: 'vision_off_area',
724
- ANTENNA: 'antenna',
725
- };
726
- var RobotStatus;
727
- (function (RobotStatus) {
728
- RobotStatus[RobotStatus["PARKED"] = 1] = "PARKED";
729
- RobotStatus[RobotStatus["CHARGING"] = 2] = "CHARGING";
730
- RobotStatus[RobotStatus["STANDBY"] = 3] = "STANDBY";
731
- RobotStatus[RobotStatus["MOWING"] = 4] = "MOWING";
732
- RobotStatus[RobotStatus["WORKING"] = 5] = "WORKING";
733
- RobotStatus[RobotStatus["MAPPING"] = 6] = "MAPPING";
734
- RobotStatus[RobotStatus["ERROR"] = 7] = "ERROR";
735
- RobotStatus[RobotStatus["UPGRADING"] = 8] = "UPGRADING";
736
- RobotStatus[RobotStatus["DISCONNECTED"] = 9] = "DISCONNECTED";
737
- RobotStatus[RobotStatus["UNKNOWN"] = -1] = "UNKNOWN";
738
- RobotStatus[RobotStatus["TASK_DELAY"] = 10] = "TASK_DELAY";
739
- // WAITING = 'Waiting',
740
- })(RobotStatus || (RobotStatus = {}));
741
- // RTK状态
742
- var RTK_STATE;
743
- (function (RTK_STATE) {
744
- RTK_STATE[RTK_STATE["LOW_RTK"] = 1] = "LOW_RTK";
745
- RTK_STATE[RTK_STATE["MIDDLE_RTK"] = 2] = "MIDDLE_RTK";
746
- RTK_STATE[RTK_STATE["HIGH_RTK"] = 3] = "HIGH_RTK";
747
- RTK_STATE[RTK_STATE["NO_POSTURE"] = 10] = "NO_POSTURE";
748
- RTK_STATE[RTK_STATE["OUT_OF_RANGE"] = 11] = "OUT_OF_RANGE";
749
- RTK_STATE[RTK_STATE["OFF_LINE"] = 19] = "OFF_LINE";
750
- })(RTK_STATE || (RTK_STATE = {}));
751
- var REAL_TIME_DATA_TYPE;
752
- (function (REAL_TIME_DATA_TYPE) {
753
- REAL_TIME_DATA_TYPE[REAL_TIME_DATA_TYPE["LOCATION"] = 1] = "LOCATION";
754
- REAL_TIME_DATA_TYPE[REAL_TIME_DATA_TYPE["PROCESS"] = 2] = "PROCESS";
755
- })(REAL_TIME_DATA_TYPE || (REAL_TIME_DATA_TYPE = {}));
756
- const ISOLATED_BOUNDARY_SVG = `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
757
- <g opacity="0.6">
758
- <rect width="24" height="24" rx="12" fill="#1E1E1F" fill-opacity="0.5"/>
759
- <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"/>
760
- <mask id="path-3-outside-1_9822_43516" maskUnits="userSpaceOnUse" x="13.2344" y="7.20545" width="12.0208" height="12.0208" fill="black">
761
- <rect fill="white" x="13.2344" y="7.20545" width="12.0208" height="12.0208"/>
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"/>
763
- </mask>
764
- <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"/>
765
- <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)"/>
766
- <mask id="path-5-outside-2_9822_43516" maskUnits="userSpaceOnUse" x="9.22265" y="10.388" width="12.7279" height="12.7279" fill="black">
767
- <rect fill="white" x="9.22265" y="10.388" width="12.7279" height="12.7279"/>
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"/>
769
- </mask>
770
- <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"/>
771
- <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)"/>
772
- <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"/>
773
- <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"/>
774
- <rect width="1.91578" height="4.24403" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 19.6992 13.8066)" fill="#8E8E8F"/>
775
- <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"/>
776
- </g>
777
- </svg>`;
778
- /**
779
- * 遍历割草任务,下述四个字段可以在路径中唯一确定遍历的位置(当前区域、当前块、当前行、在当前行上的路程)
780
- */
781
- const ACTION_BLOCK_COVER = 5;
782
- /**
783
- * 遍历割草块转移任务(在同一区域中的一个块转移到下一个块),下述四个字段可以在路径中唯一确定转移的位置(当前区域、前置块、当前转移路径线序号、在当前线上的路程)
784
- */
785
- const ACTION_BLOCK_TRANSFER = 6;
786
- /**
787
- * 边界割草任务(割草任务内部的巡边任务)
788
- */
789
- const ACTION_BOUNDARY_TASK = 8;
790
-
791
814
  /**
792
815
  * 路径图层
793
816
  * 专门处理路径元素的渲染
@@ -838,51 +861,90 @@ class ChannelLayer extends BaseLayer {
838
861
  }
839
862
  // �� 修改:计算包含所有分区和通道的边界框
840
863
  let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
841
- // 1. 先计算所有分区的边界
842
- for (const partitionId in subBoundaryBorder) {
843
- const boundaryData = subBoundaryBorder[partitionId];
844
- if (boundaryData && boundaryData.coordinates && boundaryData.coordinates.length > 0) {
845
- for (const coord of boundaryData.coordinates) {
846
- minX = Math.min(minX, coord[0]);
847
- minY = Math.min(minY, coord[1]);
848
- maxX = Math.max(maxX, coord[0]);
849
- maxY = Math.max(maxY, coord[1]);
864
+ // 1. 先计算所有分区的边界,如果能拿到边界的svg的大小,就使用这个如果拿不到,就根据分区去计算
865
+ const svg = document.getElementById(SVG_MAP_VIEW_ID);
866
+ if (svg && svg instanceof SVGSVGElement && svg.viewBox) {
867
+ const viewBox = svg.viewBox.baseVal;
868
+ minX = viewBox.x;
869
+ minY = viewBox.y;
870
+ maxX = viewBox.x + viewBox.width;
871
+ maxY = viewBox.y + viewBox.height;
872
+ }
873
+ else {
874
+ for (const partitionId in subBoundaryBorder) {
875
+ const boundaryData = subBoundaryBorder[partitionId];
876
+ if (boundaryData && boundaryData.coordinates && boundaryData.coordinates.length > 0) {
877
+ for (const coord of boundaryData.coordinates) {
878
+ minX = Math.min(minX, coord[0]);
879
+ minY = Math.min(minY, coord[1]);
880
+ maxX = Math.max(maxX, coord[0]);
881
+ maxY = Math.max(maxY, coord[1]);
882
+ }
850
883
  }
851
884
  }
852
885
  }
853
886
  // 2. 再计算所有通道的边界
854
887
  for (const element of this.elements) {
855
- const tunnelConnection = element.originalData?.connection;
856
- if (tunnelConnection && Array.isArray(tunnelConnection)) {
857
- const clipPathId = `channel-exclude-${element.originalData?.id || Math.random().toString(36).substr(2, 9)}`;
858
- // 检查是否已存在该 clipPath
859
- const existingClipPath = defs.querySelector(`#${clipPathId}`);
860
- if (existingClipPath)
861
- continue;
862
- // 创建 clipPath
863
- const clipPath = document.createElementNS('http://www.w3.org/2000/svg', 'clipPath');
864
- clipPath.setAttribute('id', clipPathId);
865
- clipPath.setAttribute('clipPathUnits', 'userSpaceOnUse');
866
- // === 合成一个 path ===
867
- let d = `M ${minX} ${minY} L ${maxX} ${minY} L ${maxX} ${maxY} L ${minX} ${maxY} Z`;
868
- for (const partitionId of tunnelConnection) {
869
- const boundaryData = subBoundaryBorder[partitionId];
870
- if (boundaryData && boundaryData.coordinates.length >= 3) {
871
- d += ` M ${boundaryData.coordinates[0][0]} ${boundaryData.coordinates[0][1]}`;
872
- for (let i = 1; i < boundaryData.coordinates.length; i++) {
873
- d += ` L ${boundaryData.coordinates[i][0]} ${boundaryData.coordinates[i][1]}`;
874
- }
875
- d += ' Z';
888
+ // const tunnelConnection = element.originalData?.connection;
889
+ // if (tunnelConnection && Array.isArray(tunnelConnection)) {
890
+ // const clipPathId = `channel-exclude-${
891
+ // element.originalData?.id || Math.random().toString(36).substr(2, 9)
892
+ // }`;
893
+ // // 检查是否已存在该 clipPath
894
+ // const existingClipPath = defs.querySelector(`#${clipPathId}`);
895
+ // if (existingClipPath) continue;
896
+ // // 创建 clipPath
897
+ // const clipPath = document.createElementNS('http://www.w3.org/2000/svg', 'clipPath');
898
+ // clipPath.setAttribute('id', clipPathId);
899
+ // clipPath.setAttribute('clipPathUnits', 'userSpaceOnUse');
900
+ // // === 合成一个 path ===
901
+ // let d = `M ${minX} ${minY} L ${maxX} ${minY} L ${maxX} ${maxY} L ${minX} ${maxY} Z`;
902
+ // for (const partitionId of tunnelConnection) {
903
+ // const boundaryData = subBoundaryBorder[partitionId];
904
+ // if (boundaryData && boundaryData.coordinates.length >= 3) {
905
+ // d += ` M ${boundaryData.coordinates[0][0]} ${boundaryData.coordinates[0][1]}`;
906
+ // for (let i = 1; i < boundaryData.coordinates.length; i++) {
907
+ // d += ` L ${boundaryData.coordinates[i][0]} ${boundaryData.coordinates[i][1]}`;
908
+ // }
909
+ // d += ' Z';
910
+ // }
911
+ // }
912
+ // const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');
913
+ // path.setAttribute('d', d);
914
+ // path.setAttribute('clip-rule', 'evenodd'); // 关键
915
+ // clipPath.appendChild(path);
916
+ // defs.appendChild(clipPath);
917
+ // clipPathIdsMap[element.originalData?.id.toString()] = clipPathId;
918
+ // } else {
919
+ const clipPathId = `channel-exclude-all-${element.originalData?.id || Math.random().toString(36).substr(2, 9)}`;
920
+ // 检查是否已存在该 clipPath
921
+ const existingClipPath = defs.querySelector(`#${clipPathId}`);
922
+ if (existingClipPath)
923
+ continue;
924
+ // 创建 clipPath
925
+ const clipPath = document.createElementNS('http://www.w3.org/2000/svg', 'clipPath');
926
+ clipPath.setAttribute('id', clipPathId);
927
+ clipPath.setAttribute('clipPathUnits', 'userSpaceOnUse');
928
+ // === 合成一个 path ===
929
+ let d = `M ${minX} ${minY} L ${maxX} ${minY} L ${maxX} ${maxY} L ${minX} ${maxY} Z`;
930
+ for (const partitionId in subBoundaryBorder) {
931
+ const boundaryData = subBoundaryBorder[partitionId];
932
+ if (boundaryData && boundaryData.coordinates.length >= 3) {
933
+ d += ` M ${boundaryData.coordinates[0][0]} ${boundaryData.coordinates[0][1]}`;
934
+ for (let i = 1; i < boundaryData.coordinates.length; i++) {
935
+ d += ` L ${boundaryData.coordinates[i][0]} ${boundaryData.coordinates[i][1]}`;
876
936
  }
937
+ d += ' Z';
877
938
  }
878
- const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');
879
- path.setAttribute('d', d);
880
- path.setAttribute('clip-rule', 'evenodd'); // 关键
881
- clipPath.appendChild(path);
882
- defs.appendChild(clipPath);
883
- clipPathIdsMap[element.originalData?.id.toString()] = clipPathId;
884
939
  }
940
+ const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');
941
+ path.setAttribute('d', d);
942
+ path.setAttribute('clip-rule', 'evenodd'); // 关键
943
+ clipPath.appendChild(path);
944
+ defs.appendChild(clipPath);
945
+ clipPathIdsMap[element.originalData?.id.toString()] = clipPathId;
885
946
  }
947
+ // }
886
948
  return clipPathIdsMap;
887
949
  }
888
950
  /**
@@ -953,7 +1015,7 @@ class PathLayer extends BaseLayer {
953
1015
  * 创建所有分区并集的 clipPath
954
1016
  */
955
1017
  createUnionClipPath(svgGroup) {
956
- const { subBoundaryBorder } = useSubBoundaryBorderStore.getState();
1018
+ const { subBoundaryBorder, obstacles, svgElements } = useSubBoundaryBorderStore.getState();
957
1019
  // 确保 defs 元素存在
958
1020
  let defs = svgGroup.querySelector('defs');
959
1021
  if (!defs) {
@@ -967,7 +1029,7 @@ class PathLayer extends BaseLayer {
967
1029
  defs.removeChild(existing);
968
1030
  // 合成所有分区的 path
969
1031
  let d = '';
970
- // 合成所有边界
1032
+ // 1. 外圈(主边界,顺时针)
971
1033
  Object.values(subBoundaryBorder).forEach((item) => {
972
1034
  const bCoords = item.coordinates;
973
1035
  if (bCoords.length >= 3) {
@@ -978,6 +1040,27 @@ class PathLayer extends BaseLayer {
978
1040
  d += ' Z ';
979
1041
  }
980
1042
  });
1043
+ // 2. 内圈(禁区,逆时针)
1044
+ Object.values(obstacles).forEach((item) => {
1045
+ const bCoords = item.coordinates;
1046
+ if (bCoords.length >= 3) {
1047
+ d += `M ${bCoords[bCoords.length - 1][0]} ${bCoords[bCoords.length - 1][1]}`;
1048
+ for (let i = bCoords.length - 2; i >= 0; i--) {
1049
+ d += ` L ${bCoords[i][0]} ${bCoords[i][1]}`;
1050
+ }
1051
+ d += ' Z ';
1052
+ }
1053
+ });
1054
+ console.error('svgElements----', svgElements);
1055
+ // 3. svgElements(直接拼接path字符串,建议逆时针)
1056
+ if (Array.isArray(svgElements)) {
1057
+ svgElements.forEach((svgPath) => {
1058
+ const svgPathString = svgPath?.metadata?.svg;
1059
+ if (svgPathString && typeof svgPathString === 'string' && svgPathString.trim()) {
1060
+ d += svgPathString + ' ';
1061
+ }
1062
+ });
1063
+ }
981
1064
  const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');
982
1065
  path.setAttribute('d', d);
983
1066
  const clipPath = document.createElementNS('http://www.w3.org/2000/svg', 'clipPath');
@@ -1150,7 +1233,7 @@ class ObstacleLayer extends BaseLayer {
1150
1233
  }
1151
1234
  }
1152
1235
 
1153
- var chargingPileImage = "data:image/png;base64,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";
1236
+ var chargingPileImage = "data:image/png;base64,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";
1154
1237
 
1155
1238
  /**
1156
1239
  * 充电桩图层
@@ -1340,7 +1423,7 @@ class SvgElementLayer extends BaseLayer {
1340
1423
  // 在transformGroup上应用变换:平移到中心,旋转,缩放,然后居中SVG
1341
1424
  const transform = [
1342
1425
  `translate(${center[0]}, ${center[1]})`,
1343
- `rotate(${(direction * 180) / Math.PI})`,
1426
+ `rotate(${-(direction * 180) / Math.PI})`,
1344
1427
  `scale(${userScale})`,
1345
1428
  `translate(${-originalWidth / 2}, ${-originalHeight / 2})`,
1346
1429
  ].join(' ');
@@ -1542,15 +1625,6 @@ function convertCoordinate(x, y) {
1542
1625
  };
1543
1626
  }
1544
1627
 
1545
- /**
1546
- * 路径段类型
1547
- */
1548
- var PathSegmentType;
1549
- (function (PathSegmentType) {
1550
- PathSegmentType["EDGE"] = "edge";
1551
- PathSegmentType["MOWING"] = "mowing";
1552
- PathSegmentType["TRANS"] = "trans";
1553
- })(PathSegmentType || (PathSegmentType = {}));
1554
1628
  /**
1555
1629
  * 按Python逻辑创建路径段:根据连续的两点之间的关系确定线段类型
1556
1630
  */
@@ -1879,6 +1953,14 @@ function generateBoundaryData(mapData, pathData) {
1879
1953
  return boundaryData;
1880
1954
  }
1881
1955
 
1956
+ var RealTimeDataType;
1957
+ (function (RealTimeDataType) {
1958
+ RealTimeDataType[RealTimeDataType["LOCATION"] = 1] = "LOCATION";
1959
+ RealTimeDataType[RealTimeDataType["PROCESS"] = 2] = "PROCESS";
1960
+ RealTimeDataType[RealTimeDataType["PARTITION"] = 3] = "PARTITION";
1961
+ RealTimeDataType[RealTimeDataType["STATUS"] = 4] = "STATUS";
1962
+ })(RealTimeDataType || (RealTimeDataType = {}));
1963
+
1882
1964
  /**
1883
1965
  * 射线法判断点是否在多边形内部
1884
1966
  * @param x 点的x坐标
@@ -2048,7 +2130,7 @@ const getProcessMowingDataFromRealTimeData = ({ realTimeData, isMowing, pathData
2048
2130
  let newMowingStatus = isMowing;
2049
2131
  let newPathData = pathData || {};
2050
2132
  // 找到返回的第一个实时进度的点
2051
- const firstProcessData = realTimeData.find((item) => item.type === REAL_TIME_DATA_TYPE.PROCESS);
2133
+ const firstProcessData = realTimeData.find((item) => item.type === RealTimeDataType.PROCESS);
2052
2134
  if (firstProcessData) {
2053
2135
  // console.log('firstProcessData==', firstProcessData);
2054
2136
  const { action, subAction, currentMowBoundary, currentMowProgress } = firstProcessData;
@@ -4596,6 +4678,36 @@ var merge = createAssigner(function(object, source, srcIndex) {
4596
4678
  */
4597
4679
  var round = createRound('round');
4598
4680
 
4681
+ /**
4682
+ * 工具模块类型定义
4683
+ */
4684
+ /**
4685
+ * 路径段类型枚举
4686
+ */
4687
+ var PathSegmentType;
4688
+ (function (PathSegmentType) {
4689
+ PathSegmentType["EDGE"] = "edge";
4690
+ PathSegmentType["MOWING"] = "mowing";
4691
+ PathSegmentType["TRANS"] = "trans";
4692
+ })(PathSegmentType || (PathSegmentType = {}));
4693
+ /**
4694
+ * 单位类型枚举
4695
+ */
4696
+ var UnitsType;
4697
+ (function (UnitsType) {
4698
+ UnitsType["Metric"] = "metric";
4699
+ UnitsType["Imperial"] = "imperial";
4700
+ })(UnitsType || (UnitsType = {}));
4701
+ /**
4702
+ * 面积单位类型枚举
4703
+ */
4704
+ var UnitsAreaType;
4705
+ (function (UnitsAreaType) {
4706
+ UnitsAreaType["SQUARE_METER"] = "m\u00B2";
4707
+ UnitsAreaType["SQUARE_FOOT"] = "ft\u00B2";
4708
+ UnitsAreaType["ACRE"] = "ac";
4709
+ })(UnitsAreaType || (UnitsAreaType = {}));
4710
+
4599
4711
  /**
4600
4712
  * 默认航向相对于canvas的偏移角度: 航向默认是东
4601
4713
  */
@@ -4669,17 +4781,6 @@ function formatNumberWithMetricPrefix(value, round = true, decimals = 2) {
4669
4781
  return `${mathFn(value / 1000000000, decimals)}B`;
4670
4782
  }
4671
4783
  }
4672
- var UnitsType;
4673
- (function (UnitsType) {
4674
- UnitsType["Metric"] = "metric";
4675
- UnitsType["Imperial"] = "imperial";
4676
- })(UnitsType || (UnitsType = {}));
4677
- var UnitsAreaType;
4678
- (function (UnitsAreaType) {
4679
- UnitsAreaType["SQUARE_METER"] = "m\u00B2";
4680
- UnitsAreaType["SQUARE_FOOT"] = "ft\u00B2";
4681
- UnitsAreaType["ACRE"] = "ac";
4682
- })(UnitsAreaType || (UnitsAreaType = {}));
4683
4784
  /**
4684
4785
  * 转换割草面积的方法
4685
4786
  * @param area 面积数值(单位:m²)
@@ -4875,7 +4976,12 @@ class BoundaryBorderLayer extends BaseLayer {
4875
4976
  * 设置当前割草任务的边界
4876
4977
  */
4877
4978
  setMowingBoundarys(mowingBoundarys) {
4878
- this.mowingBoundarys = mowingBoundarys;
4979
+ if (!mowingBoundarys) {
4980
+ this.mowingBoundarys = this.elements?.map(item => item?.originalData?.id);
4981
+ }
4982
+ else {
4983
+ this.mowingBoundarys = mowingBoundarys;
4984
+ }
4879
4985
  }
4880
4986
  /**
4881
4987
  * SVG渲染方法
@@ -5303,6 +5409,14 @@ class BoundaryDataBuilder {
5303
5409
  * 创建边界元素数据
5304
5410
  */
5305
5411
  static create(type, coordinates, style) {
5412
+ const len = coordinates?.length || 0;
5413
+ const firstPoint = coordinates?.[0];
5414
+ const lastPoint = coordinates?.[len - 1];
5415
+ const isClosed = firstPoint?.[0] === lastPoint?.[0] && firstPoint?.[1] === lastPoint?.[1];
5416
+ // 如果地图没有闭合,则手动新增闭合点,避免border最后一部分没有闭合的情况
5417
+ if (!isClosed) {
5418
+ coordinates.push([firstPoint?.[0], firstPoint?.[1], lastPoint?.[2]]);
5419
+ }
5306
5420
  return {
5307
5421
  type,
5308
5422
  coordinates,
@@ -5705,8 +5819,13 @@ class MapDataProcessor {
5705
5819
  // 为ObstacleData创建兼容的MapElement接口
5706
5820
  const mapElement = element;
5707
5821
  const obstacleElement = ObstacleDataBuilder.fromMapElement(mapElement, this.mapConfig.obstacle);
5708
- if (obstacleElement)
5822
+ if (obstacleElement) {
5709
5823
  result.push(obstacleElement);
5824
+ const { addObstacles } = useSubBoundaryBorderStore.getState();
5825
+ addObstacles(`obstacle-${obstacleElement.originalData.id}`, {
5826
+ ...obstacleElement,
5827
+ });
5828
+ }
5710
5829
  }
5711
5830
  catch (error) {
5712
5831
  console.warn(`Error processing OBSTACLE element:`, element, error);
@@ -5767,8 +5886,13 @@ class MapDataProcessor {
5767
5886
  element.direction !== undefined) {
5768
5887
  const mapElement = element;
5769
5888
  const svgElement = SvgElementDataBuilder.fromMapElement(mapElement, this.mapConfig.doodle);
5770
- if (svgElement)
5889
+ if (svgElement) {
5771
5890
  result.push(svgElement);
5891
+ const { addSvgElements } = useSubBoundaryBorderStore.getState();
5892
+ addSvgElements(`time-limit-obstacle-${svgElement.originalData.id}`, {
5893
+ ...svgElement,
5894
+ });
5895
+ }
5772
5896
  }
5773
5897
  // 如果有points数据,按传统方式绘制
5774
5898
  else if ('points' in element &&
@@ -5777,8 +5901,13 @@ class MapDataProcessor {
5777
5901
  element.points.length >= 3) {
5778
5902
  const mapElement = element;
5779
5903
  const polygonElement = ObstacleDataBuilder.createTimeLimitObstacle(mapElement, this.mapConfig.obstacle);
5780
- if (polygonElement)
5904
+ if (polygonElement) {
5781
5905
  result.push(polygonElement);
5906
+ const { addObstacles } = useSubBoundaryBorderStore.getState();
5907
+ addObstacles(`time-limit-obstacle-${polygonElement.originalData.id}`, {
5908
+ ...polygonElement,
5909
+ });
5910
+ }
5782
5911
  }
5783
5912
  }
5784
5913
  catch (error) {
@@ -6115,7 +6244,6 @@ class BoundaryLabelsManager {
6115
6244
  this.collapseOtherLabels(boundaryId);
6116
6245
  // 展开当前标签
6117
6246
  extendedContent.style.display = 'block';
6118
- labelDiv.style.whiteSpace = 'normal';
6119
6247
  this.currentExpandedBoundaryId = boundaryId;
6120
6248
  }
6121
6249
  /**
@@ -6616,7 +6744,7 @@ class ChargingPileManager {
6616
6744
  }
6617
6745
  // 简化的层级定义 - 充电桩只需要一个固定层级
6618
6746
  ChargingPileManager.Z_INDEX = {
6619
- CHARGING_PILE: 800, // 充电桩图标固定层级
6747
+ CHARGING_PILE: 750, // 充电桩图标固定层级
6620
6748
  };
6621
6749
 
6622
6750
  /**
@@ -7028,7 +7156,7 @@ class AntennaManager {
7028
7156
  }
7029
7157
  // 简化的层级定义
7030
7158
  AntennaManager.Z_INDEX = {
7031
- DEFAULT: 750, // 默认层级
7159
+ DEFAULT: 800, // 默认层级
7032
7160
  ACTIVE: 9999, // 点击激活时的高层级
7033
7161
  };
7034
7162
 
@@ -7175,9 +7303,10 @@ class MowerPositionManager {
7175
7303
  return;
7176
7304
  this.mowerPositionConfig = chargingPilesPositionConfig;
7177
7305
  const lastPosition = this.lastPosition;
7178
- const postureX = chargingPilesPositionConfig.postureX ?? chargingPilesPositionConfig.lastPostureX ?? lastPosition?.x ?? 0;
7179
- const postureY = chargingPilesPositionConfig.postureY ?? chargingPilesPositionConfig.lastPostureY ?? lastPosition?.y ?? 0;
7180
- const postureTheta = chargingPilesPositionConfig.postureTheta ?? chargingPilesPositionConfig.lastPostureTheta ?? lastPosition?.rotation ?? 0;
7306
+ const postureX = chargingPilesPositionConfig.postureX || chargingPilesPositionConfig.lastPostureX || lastPosition?.x || 0;
7307
+ const postureY = chargingPilesPositionConfig.postureY || chargingPilesPositionConfig.lastPostureY || lastPosition?.y || 0;
7308
+ const postureTheta = chargingPilesPositionConfig.postureTheta || chargingPilesPositionConfig.lastPostureTheta || lastPosition?.rotation || 0;
7309
+ console.log('updatePositionByLastPosition->', postureX, postureY, postureTheta, chargingPilesPositionConfig);
7181
7310
  // 检查是否需要更新图片
7182
7311
  this.updateMowerImage(chargingPilesPositionConfig);
7183
7312
  // 立即更新位置
@@ -7191,10 +7320,10 @@ class MowerPositionManager {
7191
7320
  this.updateMowerImage(positionConfig);
7192
7321
  // 更新配置
7193
7322
  this.mowerPositionConfig = positionConfig;
7194
- const postureX = positionConfig?.postureX ?? this.lastPosition?.x;
7195
- const postureY = positionConfig?.postureY ?? this.lastPosition?.y;
7196
- const postureTheta = positionConfig?.postureTheta ?? this.lastPosition?.rotation;
7197
- console.log('updatePosition manager', positionConfig, this.lastPosition);
7323
+ const postureX = positionConfig?.postureX || this.lastPosition?.x || 0;
7324
+ const postureY = positionConfig?.postureY || this.lastPosition?.y || 0;
7325
+ const postureTheta = positionConfig?.postureTheta || this.lastPosition?.rotation || 0;
7326
+ console.log('updatePosition manager', JSON.stringify(this.currentPosition), this.currentPosition, !this.currentPosition, positionConfig, this.lastPosition, animationTime);
7198
7327
  // 停止当前动画(如果有)
7199
7328
  this.stopAnimation();
7200
7329
  // 第一个点
@@ -7204,6 +7333,7 @@ class MowerPositionManager {
7204
7333
  y: postureY,
7205
7334
  rotation: postureTheta,
7206
7335
  };
7336
+ console.log('updatePosition first->', this.currentPosition);
7207
7337
  this.setElementPosition(this.currentPosition.x, this.currentPosition.y, this.currentPosition.rotation);
7208
7338
  return;
7209
7339
  }
@@ -7253,7 +7383,7 @@ class MowerPositionManager {
7253
7383
  if (!positonOutOfRange && !positionValid) {
7254
7384
  this.lastPosition = { x, y, rotation: theta };
7255
7385
  }
7256
- // console.log('setElementPosition', x, y, targetRotation, positonOutOfRange, positionValid, targetPixelPosition);
7386
+ // console.log('setElementPosition', x, y, theta, targetRotation, positonOutOfRange, positionValid, targetPixelPosition);
7257
7387
  if (!this.mowerElement)
7258
7388
  return;
7259
7389
  this.mowerElement.style.left = `${targetPixelPosition?.x}px`;
@@ -7307,10 +7437,12 @@ class MowerPositionManager {
7307
7437
  y: this.onlyUpdateTheta ? 0 : this.targetPosition.y - this.startPosition.y,
7308
7438
  rotation: radNormalize(targetTheta - startTheta),
7309
7439
  };
7440
+ console.log('startAnimationToPosition-->', this.deltaPosition, this.onlyUpdateTheta, this.targetPosition, this.startPosition);
7310
7441
  // 开始动画循环
7311
7442
  this.animateStep();
7312
7443
  }
7313
7444
  forceUpdatePosition() {
7445
+ console.log('forceUpdatePosition-->', this.currentPosition, this.targetPosition, this.startPosition);
7314
7446
  this.animateStep();
7315
7447
  }
7316
7448
  /**
@@ -7337,6 +7469,7 @@ class MowerPositionManager {
7337
7469
  vehicleState: this.mowerPositionConfig?.vehicleState,
7338
7470
  });
7339
7471
  }
7472
+ // console.log('animateStep-->', this.startPosition, this.deltaPosition, this.targetPosition, easedProgress)
7340
7473
  // 继续动画或结束
7341
7474
  if (progress < 1) {
7342
7475
  // 设置当前位置
@@ -8623,13 +8756,6 @@ class MowerMapOverlay {
8623
8756
  }
8624
8757
  }
8625
8758
 
8626
- var RealTimeDataType;
8627
- (function (RealTimeDataType) {
8628
- RealTimeDataType[RealTimeDataType["LOCATION"] = 1] = "LOCATION";
8629
- RealTimeDataType[RealTimeDataType["PROCESS"] = 2] = "PROCESS";
8630
- RealTimeDataType[RealTimeDataType["PARTITION"] = 3] = "PARTITION";
8631
- })(RealTimeDataType || (RealTimeDataType = {}));
8632
-
8633
8759
  // 获取车辆状态的中文文案
8634
8760
  const getVehicleStateText = (vehicleState) => {
8635
8761
  switch (vehicleState) {
@@ -8749,7 +8875,7 @@ const MowerMapRenderer = React.forwardRef(({ mapConfig, modelType, mapRef, mapJs
8749
8875
  // const mapRef = useMap();
8750
8876
  const [isGoogleMapsReady, setIsGoogleMapsReady] = React.useState(false);
8751
8877
  const [hasInitializedBounds, setHasInitializedBounds] = React.useState(false);
8752
- const { clearSubBoundaryBorder } = useSubBoundaryBorderStore();
8878
+ const { clearSubBoundaryBorder, clearObstacles } = useSubBoundaryBorderStore();
8753
8879
  const currentProcessMowingStatusRef = React.useRef(false);
8754
8880
  const { updateProcessStateIsMowing, processStateIsMowing } = useProcessMowingState();
8755
8881
  const [mowPartitionData, setMowPartitionData] = React.useState(null);
@@ -8803,8 +8929,12 @@ const MowerMapRenderer = React.forwardRef(({ mapConfig, modelType, mapRef, mapJs
8803
8929
  lastPostureTheta: currentPositionData?.lastPostureTheta
8804
8930
  ? Number(currentPositionData.lastPostureTheta)
8805
8931
  : 0,
8806
- lastPostureX: currentPositionData?.lastPostureX ? Number(currentPositionData.lastPostureX) : 0,
8807
- lastPostureY: currentPositionData?.lastPostureY ? Number(currentPositionData.lastPostureY) : 0,
8932
+ lastPostureX: currentPositionData?.lastPostureX
8933
+ ? Number(currentPositionData.lastPostureX)
8934
+ : 0,
8935
+ lastPostureY: currentPositionData?.lastPostureY
8936
+ ? Number(currentPositionData.lastPostureY)
8937
+ : 0,
8808
8938
  vehicleState: currentPositionData?.vehicleState || RobotStatus.CHARGING,
8809
8939
  };
8810
8940
  }, [realTimeData, modelType]);
@@ -8897,12 +9027,26 @@ const MowerMapRenderer = React.forwardRef(({ mapConfig, modelType, mapRef, mapJs
8897
9027
  handleError(`初始化Google Maps叠加层失败: ${error instanceof Error ? error.message : String(error)}`);
8898
9028
  }
8899
9029
  };
9030
+ const resetInCharginPie = React.useCallback(() => {
9031
+ const elements = MapDataProcessor.processMapData(mapJson, mergedMapConfig);
9032
+ const chargingPiles = elements.find((element) => element.type === 'charging_pile');
9033
+ if (!overlayRef.current)
9034
+ return;
9035
+ // 如果在充电桩上,则直接更新位置到充电桩的位置
9036
+ overlayRef.current.updatePosition({
9037
+ ...mowerPositionData,
9038
+ postureX: chargingPiles?.originalData.position[0],
9039
+ postureY: chargingPiles?.originalData.position[1],
9040
+ postureTheta: chargingPiles?.originalData.direction - Math.PI || 0,
9041
+ }, 0);
9042
+ }, [mapJson]);
8900
9043
  // 初始化效果
8901
9044
  React.useEffect(() => {
8902
9045
  initializeGoogleMapsOverlay();
8903
9046
  // 清理函数
8904
9047
  return () => {
8905
9048
  clearSubBoundaryBorder();
9049
+ clearObstacles();
8906
9050
  updateProcessStateIsMowing(false);
8907
9051
  currentProcessMowingStatusRef.current = false;
8908
9052
  if (overlayRef.current) {
@@ -8999,12 +9143,12 @@ const MowerMapRenderer = React.forwardRef(({ mapConfig, modelType, mapRef, mapJs
8999
9143
  // 计算左下角和右上角坐标
9000
9144
  sw: {
9001
9145
  x: viewBoxInfo.x / SCALE_FACTOR,
9002
- y: viewBoxInfo.y / SCALE_FACTOR
9146
+ y: viewBoxInfo.y / SCALE_FACTOR,
9003
9147
  },
9004
9148
  ne: {
9005
9149
  x: (viewBoxInfo.x + viewBoxInfo.width) / SCALE_FACTOR,
9006
- y: (viewBoxInfo.y + viewBoxInfo.height) / SCALE_FACTOR
9007
- }
9150
+ y: (viewBoxInfo.y + viewBoxInfo.height) / SCALE_FACTOR,
9151
+ },
9008
9152
  };
9009
9153
  }
9010
9154
  }
@@ -9018,7 +9162,7 @@ const MowerMapRenderer = React.forwardRef(({ mapConfig, modelType, mapRef, mapJs
9018
9162
  lastY: mowerPositionData.lastPostureY || 0,
9019
9163
  lastTheta: mowerPositionData.lastPostureTheta || 0,
9020
9164
  vehicleState: mowerPositionData.vehicleState || RobotStatus.UNKNOWN,
9021
- vehicleStateText: getVehicleStateText(mowerPositionData.vehicleState || RobotStatus.UNKNOWN)
9165
+ vehicleStateText: getVehicleStateText(mowerPositionData.vehicleState || RobotStatus.UNKNOWN),
9022
9166
  };
9023
9167
  }
9024
9168
  // 获取当前割草地块数据
@@ -9026,9 +9170,6 @@ const MowerMapRenderer = React.forwardRef(({ mapConfig, modelType, mapRef, mapJs
9026
9170
  setDebugInfo(newDebugInfo);
9027
9171
  };
9028
9172
  updateDebugInfo();
9029
- // 设置定时更新(仅在没有数据变化时使用)
9030
- const interval = setInterval(updateDebugInfo, 1000);
9031
- return () => clearInterval(interval);
9032
9173
  }, [debug, mapJson, mowerPositionData, mowPartitionData, defaultTransform]);
9033
9174
  // 当关键数据变化时立即更新debug信息
9034
9175
  React.useEffect(() => {
@@ -9057,12 +9198,12 @@ const MowerMapRenderer = React.forwardRef(({ mapConfig, modelType, mapRef, mapJs
9057
9198
  // 计算左下角和右上角坐标
9058
9199
  sw: {
9059
9200
  x: viewBoxInfo.x / SCALE_FACTOR,
9060
- y: viewBoxInfo.y / SCALE_FACTOR
9201
+ y: viewBoxInfo.y / SCALE_FACTOR,
9061
9202
  },
9062
9203
  ne: {
9063
9204
  x: (viewBoxInfo.x + viewBoxInfo.width) / SCALE_FACTOR,
9064
- y: (viewBoxInfo.y + viewBoxInfo.height) / SCALE_FACTOR
9065
- }
9205
+ y: (viewBoxInfo.y + viewBoxInfo.height) / SCALE_FACTOR,
9206
+ },
9066
9207
  };
9067
9208
  }
9068
9209
  }
@@ -9076,7 +9217,7 @@ const MowerMapRenderer = React.forwardRef(({ mapConfig, modelType, mapRef, mapJs
9076
9217
  lastY: mowerPositionData.lastPostureY || 0,
9077
9218
  lastTheta: mowerPositionData.lastPostureTheta || 0,
9078
9219
  vehicleState: mowerPositionData.vehicleState || RobotStatus.UNKNOWN,
9079
- vehicleStateText: getVehicleStateText(mowerPositionData.vehicleState || RobotStatus.UNKNOWN)
9220
+ vehicleStateText: getVehicleStateText(mowerPositionData.vehicleState || RobotStatus.UNKNOWN),
9080
9221
  };
9081
9222
  }
9082
9223
  // 获取当前割草地块数据
@@ -9090,12 +9231,26 @@ const MowerMapRenderer = React.forwardRef(({ mapConfig, modelType, mapRef, mapJs
9090
9231
  return;
9091
9232
  }
9092
9233
  console.log('usefeect realTimeData----->', realTimeData, mapJson, pathJson, overlayRef.current);
9234
+ let curMowPartitionData = mowPartitionData;
9093
9235
  // realtime中包含当前割草任务的数据,根据数据进行path路径和边界的高亮操作,
9094
9236
  const mowingPartition = realTimeData.find((item) => item.type === RealTimeDataType.PARTITION);
9095
9237
  if (mowingPartition) {
9096
9238
  setMowPartitionData(mowingPartition);
9239
+ curMowPartitionData = mowingPartition;
9240
+ }
9241
+ const statusData = realTimeData?.find(item => item?.type === RealTimeDataType.STATUS);
9242
+ if (statusData) {
9243
+ // 车辆回桩不会回传最后的park的位置,所以根据实时数据的状态数据判断车辆回到桩上
9244
+ if ([RobotStatus.CHARGING, RobotStatus.PARKED].includes(statusData?.vehicleState || RobotStatus.UNKNOWN)) {
9245
+ resetInCharginPie();
9246
+ }
9247
+ else if (statusData?.vehicleState === RobotStatus.WORKING) {
9248
+ // 兜底收不到割草地块的实时数据,使用状态来兜底
9249
+ overlayRef.current.resetBorderLayerHighlight();
9250
+ setMowPartitionData({});
9251
+ curMowPartitionData = {};
9252
+ }
9097
9253
  }
9098
- const curMowPartitionData = mowingPartition || mowPartitionData;
9099
9254
  if (!mapJson ||
9100
9255
  !pathJson ||
9101
9256
  !overlayRef.current)
@@ -9211,8 +9366,9 @@ const MowerMapRenderer = React.forwardRef(({ mapConfig, modelType, mapRef, mapJs
9211
9366
  fontFamily: 'monospace',
9212
9367
  zIndex: 10000,
9213
9368
  maxWidth: '300px',
9214
- lineHeight: '1.4'
9215
- }, children: [jsxRuntime.jsx("div", { style: { fontWeight: 'bold', marginBottom: '8px' }, children: "\uD83D\uDC1B Debug Info" }), debugInfo.mapBounds && (jsxRuntime.jsxs("div", { style: { marginBottom: '6px' }, children: [jsxRuntime.jsx("div", { style: { fontWeight: 'bold' }, children: "\uD83D\uDCCD Map GPS Bounds:" }), jsxRuntime.jsxs("div", { children: ["SW: [", debugInfo.mapBounds.sw[0].toFixed(6), ", ", debugInfo.mapBounds.sw[1].toFixed(6), "]"] }), jsxRuntime.jsxs("div", { children: ["NE: [", debugInfo.mapBounds.ne[0].toFixed(6), ", ", debugInfo.mapBounds.ne[1].toFixed(6), "]"] })] })), debugInfo.viewBox && (jsxRuntime.jsxs("div", { style: { marginBottom: '6px' }, children: [jsxRuntime.jsx("div", { style: { fontWeight: 'bold' }, children: "\uD83D\uDCD0 SVG ViewBox (meters):" }), jsxRuntime.jsxs("div", { children: ["SW: [", debugInfo.viewBox.sw.x.toFixed(2), ", ", debugInfo.viewBox.sw.y.toFixed(2), "]"] }), jsxRuntime.jsxs("div", { children: ["NE: [", debugInfo.viewBox.ne.x.toFixed(2), ", ", debugInfo.viewBox.ne.y.toFixed(2), "]"] }), jsxRuntime.jsxs("div", { children: ["Size: ", debugInfo.viewBox.width.toFixed(2), "m \u00D7 ", debugInfo.viewBox.height.toFixed(2), "m"] }), jsxRuntime.jsxs("div", { children: ["Scale: 1:", debugInfo.viewBox.scale] })] })), debugInfo.mowerPosition && (jsxRuntime.jsxs("div", { style: { marginBottom: '6px' }, children: [jsxRuntime.jsx("div", { style: { fontWeight: 'bold' }, children: "\uD83D\uDE9C Mower Position:" }), jsxRuntime.jsxs("div", { children: ["Current: X=", debugInfo.mowerPosition.x.toFixed(2), ", Y=", debugInfo.mowerPosition.y.toFixed(2)] }), jsxRuntime.jsxs("div", { children: ["Theta: ", (debugInfo.mowerPosition.theta * 180 / Math.PI).toFixed(1), "\u00B0"] }), jsxRuntime.jsxs("div", { children: ["Last: X=", debugInfo.mowerPosition.lastX.toFixed(2), ", Y=", debugInfo.mowerPosition.lastY.toFixed(2)] }), jsxRuntime.jsxs("div", { children: ["Last Theta: ", (debugInfo.mowerPosition.lastTheta * 180 / Math.PI).toFixed(1), "\u00B0"] }), jsxRuntime.jsxs("div", { children: ["Status: ", debugInfo.mowerPosition.vehicleStateText, " (", debugInfo.mowerPosition.vehicleState, ")"] })] })), debugInfo.partitionData && (jsxRuntime.jsxs("div", { style: { marginBottom: '6px' }, children: [jsxRuntime.jsx("div", { style: { fontWeight: 'bold' }, children: "\uD83D\uDD32 Mow Partition Data:" }), jsxRuntime.jsxs("div", { children: ["Type: ", debugInfo.partitionData.type || 'N/A'] }), debugInfo.partitionData.partitionIds && debugInfo.partitionData.partitionIds.length > 0 ? (jsxRuntime.jsxs("div", { children: ["Active IDs: [", debugInfo.partitionData.partitionIds.join(', '), "]"] })) : (jsxRuntime.jsx("div", { children: "No active partitions" })), debugInfo.partitionData.time && (jsxRuntime.jsxs("div", { children: ["Updated: ", new Date(debugInfo.partitionData.time).toLocaleTimeString()] }))] })), !debugInfo.partitionData && (jsxRuntime.jsxs("div", { style: { marginBottom: '6px' }, children: [jsxRuntime.jsx("div", { style: { fontWeight: 'bold' }, children: "\uD83D\uDD32 Mow Partition Data:" }), jsxRuntime.jsx("div", { style: { color: '#888' }, children: "No partition data available" })] }))] }));
9369
+ lineHeight: '1.4',
9370
+ }, children: [jsxRuntime.jsx("div", { style: { fontWeight: 'bold', marginBottom: '8px' }, children: "\uD83D\uDC1B Debug Info" }), debugInfo.mapBounds && (jsxRuntime.jsxs("div", { style: { marginBottom: '6px' }, children: [jsxRuntime.jsx("div", { style: { fontWeight: 'bold' }, children: "\uD83D\uDCCD Map GPS Bounds:" }), jsxRuntime.jsxs("div", { children: ["SW: [", debugInfo.mapBounds.sw[0].toFixed(6), ", ", debugInfo.mapBounds.sw[1].toFixed(6), "]"] }), jsxRuntime.jsxs("div", { children: ["NE: [", debugInfo.mapBounds.ne[0].toFixed(6), ", ", debugInfo.mapBounds.ne[1].toFixed(6), "]"] })] })), debugInfo.viewBox && (jsxRuntime.jsxs("div", { style: { marginBottom: '6px' }, children: [jsxRuntime.jsx("div", { style: { fontWeight: 'bold' }, children: "\uD83D\uDCD0 SVG ViewBox (meters):" }), jsxRuntime.jsxs("div", { children: ["SW: [", debugInfo.viewBox.sw.x.toFixed(2), ", ", debugInfo.viewBox.sw.y.toFixed(2), "]"] }), jsxRuntime.jsxs("div", { children: ["NE: [", debugInfo.viewBox.ne.x.toFixed(2), ", ", debugInfo.viewBox.ne.y.toFixed(2), "]"] }), jsxRuntime.jsxs("div", { children: ["Size: ", debugInfo.viewBox.width.toFixed(2), "m \u00D7 ", debugInfo.viewBox.height.toFixed(2), "m"] }), jsxRuntime.jsxs("div", { children: ["Scale: 1:", debugInfo.viewBox.scale] })] })), debugInfo.mowerPosition && (jsxRuntime.jsxs("div", { style: { marginBottom: '6px' }, children: [jsxRuntime.jsx("div", { style: { fontWeight: 'bold' }, children: "\uD83D\uDE9C Mower Position:" }), jsxRuntime.jsxs("div", { children: ["Current: X=", debugInfo.mowerPosition.x.toFixed(2), ", Y=", debugInfo.mowerPosition.y.toFixed(2)] }), jsxRuntime.jsxs("div", { children: ["Theta: ", ((debugInfo.mowerPosition.theta * 180) / Math.PI).toFixed(1), "\u00B0"] }), jsxRuntime.jsxs("div", { children: ["Last: X=", debugInfo.mowerPosition.lastX.toFixed(2), ", Y=", debugInfo.mowerPosition.lastY.toFixed(2)] }), jsxRuntime.jsxs("div", { children: ["Last Theta: ", ((debugInfo.mowerPosition.lastTheta * 180) / Math.PI).toFixed(1), "\u00B0"] }), jsxRuntime.jsxs("div", { children: ["Status: ", debugInfo.mowerPosition.vehicleStateText, " (", debugInfo.mowerPosition.vehicleState, ")"] })] })), debugInfo.partitionData && (jsxRuntime.jsxs("div", { style: { marginBottom: '6px' }, children: [jsxRuntime.jsx("div", { style: { fontWeight: 'bold' }, children: "\uD83D\uDD32 Mow Partition Data:" }), jsxRuntime.jsxs("div", { children: ["Type: ", debugInfo.partitionData.type || 'N/A'] }), debugInfo.partitionData.partitionIds &&
9371
+ debugInfo.partitionData.partitionIds.length > 0 ? (jsxRuntime.jsxs("div", { children: ["Active IDs: [", debugInfo.partitionData.partitionIds.join(', '), "]"] })) : (jsxRuntime.jsx("div", { children: "No active partitions" })), debugInfo.partitionData.time && (jsxRuntime.jsxs("div", { children: ["Updated: ", new Date(debugInfo.partitionData.time).toLocaleTimeString()] }))] })), !debugInfo.partitionData && (jsxRuntime.jsxs("div", { style: { marginBottom: '6px' }, children: [jsxRuntime.jsx("div", { style: { fontWeight: 'bold' }, children: "\uD83D\uDD32 Mow Partition Data:" }), jsxRuntime.jsx("div", { style: { color: '#888' }, children: "No partition data available" })] }))] }));
9216
9372
  };
9217
9373
  // 错误显示
9218
9374
  if (currentError) {