十字准星模式 保存 初步实现
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user