From 9fb3da7590811ef0a7576b671f5bcd3142a2be38 Mon Sep 17 00:00:00 2001 From: mmc <1556375442@qq.com> Date: Tue, 10 Mar 2026 17:04:43 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9C=B0=E5=9B=BE=E6=98=BE=E7=A4=BA=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../widgets/map/testmap_pages.dart | 117 +++++++++++++++++- 1 file changed, 116 insertions(+), 1 deletion(-) diff --git a/lib/features/home/presentation/widgets/map/testmap_pages.dart b/lib/features/home/presentation/widgets/map/testmap_pages.dart index 65aa2067..b6713378 100644 --- a/lib/features/home/presentation/widgets/map/testmap_pages.dart +++ b/lib/features/home/presentation/widgets/map/testmap_pages.dart @@ -41,12 +41,20 @@ import 'package:maibu_satabot_v2/features/home/presentation/widgets/obsToast.dar import 'package:maibu_satabot_v2/features/home/presentation/widgets/startpoint_area.dart'; import 'package:image/image.dart' as _image; // 注意命名空间冲突,使用 as img import 'package:maibu_satabot_v2/features/home/presentation/widgets/video.dart'; +import 'package:shared_preferences/shared_preferences.dart'; import 'dart:ui' as ui; import '../path_list_pages.dart'; // 定义轨迹点类型(经纬度) typedef PlotPoint = LatLng; +// 本地存储Key常量 +const String kSavedPlotData = 'saved_plot_data'; +const String kSavedGcjPathPoints = 'saved_gcj_path_points'; +const String kSavedGcjOuterPoints = 'saved_gcj_outer_points'; +const String kSavedMarkedPoints = 'saved_marked_points'; +const String kSavedObstacleHoles = 'saved_obstacle_holes'; +const String kSavedIsWorkAreaCompleted = 'saved_is_work_area_completed'; // 保持 PlotData 类不变 class PlotData { @@ -114,7 +122,7 @@ class _MapPageEnterpriseState extends State { List? gctracePoint = []; // ========== 核心新增状态 ========== - final List _markedPoints = []; // 存储所有s十字准星打点坐标 + List _markedPoints = []; // 存储所有s十字准星打点坐标 List _robotModeWgsPoints = []; // Robot模式下从设备获取的wgs打点 List _robotModeObsWgsPoints = []; // Robot模式下从设备获取的wgs打点 障碍物 @@ -153,6 +161,8 @@ class _MapPageEnterpriseState extends State { _currentStation = _stationList.first; _traceManager = TracePoint(); _initLocationEnterprise(); + // 新增:加载本地存储的绘制数据 + _loadSavedData(); // 示例:切换到导航模式 _traceManager.setMode(TPMode.LOCATION); @@ -175,6 +185,105 @@ class _MapPageEnterpriseState extends State { }); } + // 新增:手动清除本地存储数据 + Future _clearLocalData() async { + try { + final prefs = await SharedPreferences.getInstance(); + prefs.remove(kSavedGcjPathPoints); + prefs.remove(kSavedGcjOuterPoints); + prefs.remove(kSavedMarkedPoints); + prefs.remove(kSavedObstacleHoles); + prefs.remove(kSavedIsWorkAreaCompleted); + debugPrint('本地存储的绘制数据已清空'); + } catch (e) { + debugPrint('清空本地数据失败:$e'); + } + } + + // 新增:加载本地存储数据方法 + Future _loadSavedData() async { + try { + final prefs = await SharedPreferences.getInstance(); + + // 加载路径点 + final pathJson = prefs.getString(kSavedGcjPathPoints); + if (pathJson != null) { + final List pathList = jsonDecode(pathJson); + gcjPathPoints = pathList.map((item) => LatLng(double.parse(item['lat'].toString()), double.parse(item['lng'].toString()))).toList(); + } + + // 加载外边界点 + final outerJson = prefs.getString(kSavedGcjOuterPoints); + if (outerJson != null) { + final List outerList = jsonDecode(outerJson); + gcjOuterPoints = outerList.map((item) => LatLng(double.parse(item['lat'].toString()), double.parse(item['lng'].toString()))).toList(); + } + + // 加载打点数据 + final markedJson = prefs.getString(kSavedMarkedPoints); + if (markedJson != null) { + final List markedList = jsonDecode(markedJson); + _markedPoints = markedList.map((item) => LatLng(double.parse(item['lat'].toString()), double.parse(item['lng'].toString()))).toList().toList(); + } + + // 加载障碍物数据 + final obstacleJson = prefs.getString(kSavedObstacleHoles); + if (obstacleJson != null) { + final List obstacleList = jsonDecode(obstacleJson); + _obstacleHoles = obstacleList.map((hole) { + return (hole as List).map((item) => LatLng(double.parse(item['lat'].toString()), double.parse(item['lng'].toString()))).toList(); + }).toList(); + } + + // 加载作业区域完成状态 + _isWorkAreaCompleted = prefs.getBool(kSavedIsWorkAreaCompleted) ?? false; + _saveBoxOpen = _isWorkAreaCompleted; + + if (mounted) { + setState(() {}); + // 移动地图到绘制内容中心 + List allPoints = []; + allPoints.addAll(gcjPathPoints); + allPoints.addAll(gcjOuterPoints); + if (allPoints.isNotEmpty) { + moveMapToPointsCenter(allPoints); + } + } + } catch (e) { + debugPrint('加载本地数据失败:$e'); + } + } + + // 新增:保存绘制数据到本地 + Future _saveDataToLocal() async { + try { + final prefs = await SharedPreferences.getInstance(); + + // 保存路径点 + final pathList = gcjPathPoints.map((point) => {'lat': point.latitude, 'lng': point.longitude}).toList(); + prefs.setString(kSavedGcjPathPoints, jsonEncode(pathList)); + + // 保存外边界点 + final outerList = gcjOuterPoints.map((point) => {'lat': point.latitude, 'lng': point.longitude}).toList(); + prefs.setString(kSavedGcjOuterPoints, jsonEncode(outerList)); + + // 保存打点数据 + final markedList = _markedPoints.map((point) => {'lat': point.latitude, 'lng': point.longitude}).toList(); + prefs.setString(kSavedMarkedPoints, jsonEncode(markedList)); + + // 保存障碍物数据 + final obstacleList = _obstacleHoles.map((hole) { + return hole.map((point) => {'lat': point.latitude, 'lng': point.longitude}).toList(); + }).toList(); + prefs.setString(kSavedObstacleHoles, jsonEncode(obstacleList)); + + // 保存作业区域完成状态 + prefs.setBool(kSavedIsWorkAreaCompleted, _isWorkAreaCompleted); + } catch (e) { + debugPrint('保存本地数据失败:$e'); + } + } + // ========== 新增:计算坐标列表的边界范围 ========== LatLngBounds? calculateBounds(List points) { if (points.isEmpty) return null; @@ -513,6 +622,7 @@ class _MapPageEnterpriseState extends State { ToastUtils.showInfo(context, '暂无障碍物可撤回'); } }); + _saveDataToLocal(); } // ========== 统一删除方法(适配完成后状态) ========== @@ -559,6 +669,7 @@ class _MapPageEnterpriseState extends State { ToastUtils.showSuccess(context, '已清空所有障碍物'); } }); + _saveDataToLocal(); } void _handleGotoLocation() { @@ -625,6 +736,7 @@ class _MapPageEnterpriseState extends State { isDjMapShow = false; }); + _clearLocalData(); // 3. 重新初始化定位 await _initLocationEnterprise(); @@ -700,6 +812,7 @@ class _MapPageEnterpriseState extends State { _robotModeObsWgsPoints.clear(); // 清空Robot模式下的障碍物WGS84坐标 _isObstacleEditing = false; // 退出编辑状态 }); + _saveDataToLocal(); debugPrint('完成障碍物绘制,当前障碍物组数:${_obstacleHoles.length}'); ToastUtils.showSuccess(context, '已添加第${_obstacleHoles.length}个障碍物区域'); @@ -742,6 +855,7 @@ class _MapPageEnterpriseState extends State { } } }); + _saveDataToLocal(); debugPrint('$_markedPoints,新增打点:第${_markedPoints.length}个点,经纬度:${_mapCenter.latitude.toStringAsFixed(20)}, ${_mapCenter.longitude.toStringAsFixed(20)}'); } @@ -1768,6 +1882,7 @@ class _MapPageEnterpriseState extends State { // 外边界保持原有逻辑 gcjOuterPoints = List.from(_markedPoints); }); + _saveDataToLocal(); moveMapToPointsCenter(gcjPathPoints); } }