十字准星模式 保存 初步实现

This commit is contained in:
mmc
2026-03-01 16:13:37 +08:00
parent 8f9dd775d7
commit fe8a0ffbc4
2 changed files with 162 additions and 14 deletions

View File

@@ -1,9 +1,9 @@
enum WorkMode {
bow("0"), // 作业模式:bow,值为0
custom("2"); // 作业模式:custom,值为2
bow(0), // 作业模式:bow,值为0
custom(2); // 作业模式:custom,值为2
// 定义枚举的数值属性
final String value;
final int value;
// 枚举构造函数(必须是const)
const WorkMode(this.value);
}

View File

@@ -1,6 +1,7 @@
import 'dart:async';
import 'dart:convert';
import 'dart:math';
import 'dart:math' as math;
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
@@ -324,7 +325,7 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
// 2. 构造 SavePath 数据 (严格对应你的 JS 结构)
final Map<String, dynamic> savePath = {
'img': imgBase64 ?? '', // 截图的 Base64 字符串
//'img': imgBase64 ?? '', // 截图的 Base64 字符串
'name': plotName, // 地块名称
'path': jsonEncode(
typedPathList
@@ -342,7 +343,7 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
.map(
(point) => {
// 外边界点数组
'lon': point.longitude,
'lng': point.longitude,
'lat': point.latitude,
},
)
@@ -350,6 +351,34 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
),
'planModel': _currentWorkMode == WorkMode.bow ? 0 : 2, // 作业模式值
};
// 2. 解析并打印 Path
try {
final List<dynamic> pathData = jsonDecode(savePath['path'] as String);
print('\n🗺️ 路径数据 (共 ${pathData.length} 个点):');
// 格式化打印前 3 个点,避免数据过多刷屏
for (int i = 0; i < math.min(3, pathData.length); i++) {
final point = pathData[i] as Map<String, dynamic>;
print(' 点 $i: lat=${point['lat']}, lon=${point['lon']}');
}
if (pathData.length > 3) {
print(' ... 还有 ${pathData.length - 3} 个点');
}
} catch (e) {
print('❌ 解析 path 失败: $e');
}
// 3. 解析并打印 Outer
try {
final List<dynamic> outerData = jsonDecode(savePath['outer'] as String);
print('\n📏 外边界数据 (共 ${outerData.length} 个点):');
// 格式化打印所有外边界点(通常数量少)
for (int i = 0; i < outerData.length; i++) {
final point = outerData[i] as Map<String, dynamic>;
print(' 点 $i: lat=${point['lat']}, lon=${point['lon']}');
}
} catch (e) {
print('❌ 解析 outer 失败: $e');
}
// 3. 构造 workRecord (包裹一层)
final Map<String, dynamic> workRecord = {
@@ -383,7 +412,7 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
),
);
_debugPrintMultipartRequest(request);
//_debugPrintMultipartRequest(request);
// 7. 发送请求
try {
@@ -630,29 +659,150 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
print('加载地块「${plot.plotName}」的路径数据: $_loadedPlot');
// 2. 立即解析并更新状态(在事件回调中,不在 build 中)
//if (_loadedPlot is List) {
// final List<dynamic> rawList = _loadedPlot as List<dynamic>;
// final pathRecords = rawList.where((item) => item is Map<String, dynamic>).cast<Map<String, dynamic>>().toList();
// // 打印:过滤后的 pathRecords 长度和第一条数据的顶层字段
// print('🔍 过滤后 pathRecords 长度: ${pathRecords.length}');
// if (pathRecords.isNotEmpty) {
// final Map<String, dynamic> firstRecord = pathRecords.first;
// print('📋 第一条记录的顶层字段:');
// print(' - id: ${firstRecord['id']}');
// print(' - workName: ${firstRecord['workName']}');
// print(' - userId: ${firstRecord['userId']}');
// print(' - jsonData (原始字符串长度): ${firstRecord['jsonData']?.toString().length ?? 0} 字符');
// print('------------------------------------');
// final selectedPlotPath = PlotDataPath(jsonData: firstRecord);
// try {
// final dynamic nestedJsonRaw = selectedPlotPath.jsonData['jsonData'];
// print('📦 嵌套 jsonData 原始类型: ${nestedJsonRaw.runtimeType}');
// print('📦 嵌套 jsonData 前200字符: ${nestedJsonRaw?.toString().substring(0, min(200, nestedJsonRaw?.toString().length ?? 0))}...');
// if (nestedJsonRaw != null && nestedJsonRaw is String) {
// final String nestedJsonStr = nestedJsonRaw;
// final dynamic parsedJson = jsonDecode(nestedJsonStr);
// print('✅ 嵌套 JSON 解析成功,类型: ${parsedJson.runtimeType}');
// // 格式化打印完整的嵌套 JSON(排除 img 字段,避免刷屏)
// if (parsedJson is Map<String, dynamic>) {
// final Map<String, dynamic> nestedJson = Map.from(parsedJson);
// // 截断 img 字段的 Base64 数据
// if (nestedJson.containsKey('img')) {
// final String imgBase64 = nestedJson['img'] as String;
// nestedJson['img'] = imgBase64.substring(0, min(50, imgBase64.length)) + '...(Base64 已截断)';
// }
// print('📝 格式化嵌套 JSON 数据:');
// print(const JsonEncoder.withIndent(' ').convert(nestedJson));
// print('------------------------------------');
// // 解析作业模式并打印
// final dynamic planModel = nestedJson['planModel'];
// workMode = planModel == WorkMode.bow.value ? "弓字模式" : "自定义模式";
// print('⚙️ 解析出作业模式: $workMode (原始 planModel 值: $planModel)');
// // 解析 Path 并打印明细
// final dynamic rawPath = nestedJson['path'];
// List<dynamic> pathList = rawPath is List ? rawPath : [];
// print('🗺️ 解析出 Path 数据:');
// print(' - Path 类型: ${rawPath.runtimeType}');
// print(' - Path 长度: ${pathList.length} 个点');
// // 逐点打印前 5 个 Path 坐标(避免点太多刷屏)
// for (int i = 0; i < min(5, pathList.length); i++) {
// final dynamic point = pathList[i];
// print(' - Path 点 $i: lat=${point['lat']}, lon=${point['lon']} (或 lng=${point['lng']})');
// }
// if (pathList.length > 5) {
// print(' - ... 还有 ${pathList.length - 5} 个点未显示');
// }
// // 解析 Outer 并打印明细
// final dynamic rawOuter = nestedJson['outer'];
// List<dynamic> outerList = rawOuter is List ? rawOuter : [];
// print('📏 解析出 Outer 外边界数据:');
// print(' - Outer 类型: ${rawOuter.runtimeType}');
// print(' - Outer 长度: ${outerList.length} 个点');
// // 逐点打印前 5 个 Outer 坐标
// for (int i = 0; i < min(5, outerList.length); i++) {
// final dynamic point = outerList[i];
// print(' - Outer 点 $i: lat=${point['lat']}, lon=${point['lon']} (或 lng=${point['lng']})');
// }
// if (outerList.length > 5) {
// print(' - ... 还有 ${outerList.length - 5} 个点未显示');
// }
// // 后续坐标转换逻辑(保持你的原有代码)
// // ...(这里放你原来的坐标转换、setState 逻辑)
// } else {
// print('❌ 解析失败:嵌套 JSON 不是 Map 类型,实际类型: ${parsedJson.runtimeType}');
// }
// } else {
// print('❌ 解析失败:nestedJsonRaw 为空或不是字符串,实际值: $nestedJsonRaw,类型: ${nestedJsonRaw?.runtimeType}');
// }
// } catch (e, stackTrace) {
// print('❌ 解析嵌套 JSON 时发生异常: $e');
// print('📜 异常堆栈: $stackTrace');
// }
// } else {
// print('❌ 过滤后 pathRecords 为空,无有效数据');
// }
//}
if (_loadedPlot is List) {
final List<dynamic> rawList = _loadedPlot as List<dynamic>;
final pathRecords = rawList.where((item) => item is Map<String, dynamic>).cast<Map<String, dynamic>>().toList();
if (pathRecords.isNotEmpty) {
final selectedPlotPath = PlotDataPath(jsonData: pathRecords.first);
try {
final dynamic nestedJsonRaw = selectedPlotPath.jsonData['jsonData'];
if (nestedJsonRaw != null && nestedJsonRaw is String) {
final String nestedJsonStr = nestedJsonRaw;
final dynamic parsedJson = jsonDecode(nestedJsonStr);
workMode = parsedJson['planModel'] == WorkMode.bow.value ? "弓字模式" : "自定义模式";
debugPrint('解析出的作业模式: ${parsedJson['planModel']},WorkMode.bow.value=${WorkMode.bow.value}, 解析结果: $workMode');
if (parsedJson is Map<String, dynamic>) {
final Map<String, dynamic> nestedJson = parsedJson;
// 替换你原来的 rawPath/rawOuter 解析部分
final dynamic rawPath = nestedJson['path'];
final dynamic rawOuter = nestedJson['outer'];
List<dynamic> pathList = rawPath is List ? rawPath : [];
List<dynamic> outerList = rawOuter is List ? rawOuter : [];
debugPrint('解析后的路径数据11: pathList=$rawPath,');
debugPrint('解析后的外边界数据22: outerList=$rawOuter,');
// ========== 修复核心:先解码字符串,再处理类型 ==========
List<dynamic> pathList = [];
if (rawPath is String) {
try {
pathList = jsonDecode(rawPath) as List<dynamic>;
} catch (e) {
debugPrint('path 字符串解码失败: $e, rawPath=$rawPath');
pathList = [];
}
} else if (rawPath is List) {
pathList = rawPath;
} else {
pathList = [];
}
List<dynamic> outerList = [];
if (rawOuter is String) {
try {
outerList = jsonDecode(rawOuter) as List<dynamic>;
} catch (e) {
debugPrint('outer 字符串解码失败: $e, rawOuter=$rawOuter');
outerList = [];
}
} else if (rawOuter is List) {
outerList = rawOuter;
} else {
outerList = [];
}
// ========== 修复结束 ==========
debugPrint('解析后的路径数据: pathList=$pathList, 长度=${pathList.length}');
debugPrint('解析后的外边界数据: outerList=$outerList, 长度=${outerList.length}');
List<LatLng> newPathPoints = [];
List<LatLng> newOuterPoints = [];
for (var item in pathList) {
double? lat = safeToDouble(item['lat']);
double? lon = safeToDouble(item['lon']);
@@ -667,7 +817,6 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
newOuterPoints.add(convertWGS84ToGCJ02(lat, lng));
}
}
// 在这里更新状态(安全,因为在事件回调中)
setState(() {
gcjPathPoints = newPathPoints;
@@ -676,7 +825,6 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
_isListBoxOpen = false;
_isWorkPanelOpen = true;
});
// 移动地图到中心
List<LatLng> allPoints = [];
allPoints.addAll(gcjPathPoints);
@@ -1326,7 +1474,7 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
}).toList();
gcjOuterPoints = List.from(_markedPoints); // 生成新列表,复制所有元素 // ========== 核心修改:清空临时打点列表 ==========
_markedPoints.clear(); // 清空后,临时划线会自动消失
//_markedPoints.clear(); // 清空后,临时划线会自动消失
});
moveMapToPointsCenter(gcjPathPoints);
}