地图显示缓存逻辑

This commit is contained in:
mmc
2026-03-10 17:04:43 +08:00
parent 80a7e0b36f
commit 9fb3da7590

View File

@@ -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<MapPageEnterprise> {
List<PlotPoint>? gctracePoint = [];
// ========== 核心新增状态 ==========
final List<LatLng> _markedPoints = []; // 存储所有s十字准星打点坐标
List<LatLng> _markedPoints = []; // 存储所有s十字准星打点坐标
List<LatLng> _robotModeWgsPoints = []; // Robot模式下从设备获取的wgs打点
List<LatLng> _robotModeObsWgsPoints = []; // Robot模式下从设备获取的wgs打点 障碍物
@@ -153,6 +161,8 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
_currentStation = _stationList.first;
_traceManager = TracePoint<PlotPoint>();
_initLocationEnterprise();
// 新增:加载本地存储的绘制数据
_loadSavedData();
// 示例:切换到导航模式
_traceManager.setMode(TPMode.LOCATION);
@@ -175,6 +185,105 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
});
}
// 新增:手动清除本地存储数据
Future<void> _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<void> _loadSavedData() async {
try {
final prefs = await SharedPreferences.getInstance();
// 加载路径点
final pathJson = prefs.getString(kSavedGcjPathPoints);
if (pathJson != null) {
final List<dynamic> 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<dynamic> 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<dynamic> 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<dynamic> obstacleList = jsonDecode(obstacleJson);
_obstacleHoles = obstacleList.map((hole) {
return (hole as List<dynamic>).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<LatLng> allPoints = [];
allPoints.addAll(gcjPathPoints);
allPoints.addAll(gcjOuterPoints);
if (allPoints.isNotEmpty) {
moveMapToPointsCenter(allPoints);
}
}
} catch (e) {
debugPrint('加载本地数据失败:$e');
}
}
// 新增:保存绘制数据到本地
Future<void> _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<LatLng> points) {
if (points.isEmpty) return null;
@@ -513,6 +622,7 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
ToastUtils.showInfo(context, '暂无障碍物可撤回');
}
});
_saveDataToLocal();
}
// ========== 统一删除方法(适配完成后状态) ==========
@@ -559,6 +669,7 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
ToastUtils.showSuccess(context, '已清空所有障碍物');
}
});
_saveDataToLocal();
}
void _handleGotoLocation() {
@@ -625,6 +736,7 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
isDjMapShow = false;
});
_clearLocalData();
// 3. 重新初始化定位
await _initLocationEnterprise();
@@ -700,6 +812,7 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
_robotModeObsWgsPoints.clear(); // 清空Robot模式下的障碍物WGS84坐标
_isObstacleEditing = false; // 退出编辑状态
});
_saveDataToLocal();
debugPrint('完成障碍物绘制,当前障碍物组数:${_obstacleHoles.length}');
ToastUtils.showSuccess(context, '已添加第${_obstacleHoles.length}个障碍物区域');
@@ -742,6 +855,7 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
}
}
});
_saveDataToLocal();
debugPrint('$_markedPoints,新增打点:第${_markedPoints.length}个点,经纬度:${_mapCenter.latitude.toStringAsFixed(20)}, ${_mapCenter.longitude.toStringAsFixed(20)}');
}
@@ -1768,6 +1882,7 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
// 外边界保持原有逻辑
gcjOuterPoints = List.from(_markedPoints);
});
_saveDataToLocal();
moveMapToPointsCenter(gcjPathPoints);
}
}