孔洞逻辑完成
This commit is contained in:
@@ -4,10 +4,7 @@ class ReferencePoint {
|
||||
|
||||
ReferencePoint({required this.lat, required this.lon});
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
'lat': lat,
|
||||
'lon': lon,
|
||||
};
|
||||
Map<String, dynamic> toJson() => {'lat': lat, 'lon': lon};
|
||||
}
|
||||
|
||||
class OuterBoundary {
|
||||
@@ -16,22 +13,55 @@ class OuterBoundary {
|
||||
|
||||
OuterBoundary({required this.position, required this.sideWidth});
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
'position': position.map((p) => p.toJson()).toList(),
|
||||
'sideWidth': sideWidth,
|
||||
};
|
||||
Map<String, dynamic> toJson() => {'position': position.map((p) => p.toJson()).toList(), 'sideWidth': sideWidth};
|
||||
}
|
||||
|
||||
class HoleBoundary {
|
||||
final List<Position> position;
|
||||
// 核心修改:position 改为二维列表(List<List<Position>>)
|
||||
final List<List<Position>> position;
|
||||
final double sideWidth;
|
||||
|
||||
HoleBoundary({required this.position, required this.sideWidth});
|
||||
// 构造函数:支持传入一维/二维Position列表,自动适配格式
|
||||
HoleBoundary({
|
||||
required dynamic position, // 兼容一维/二维输入
|
||||
required this.sideWidth,
|
||||
}) : position = _normalizePosition(position);
|
||||
|
||||
// 辅助方法:将任意格式的position转为标准二维数组
|
||||
static List<List<Position>> _normalizePosition(dynamic input) {
|
||||
if (input is List<List<Position>>) {
|
||||
// 已经是二维数组,直接返回
|
||||
return input;
|
||||
} else if (input is List<Position>) {
|
||||
// 一维数组,包装成二维数组 [[p1,p2,p3]]
|
||||
return [input];
|
||||
} else {
|
||||
throw ArgumentError('position 必须是 List<Position> 或 List<List<Position>> 类型');
|
||||
}
|
||||
}
|
||||
|
||||
// 核心修改:toJson 输出二维数组格式
|
||||
Map<String, dynamic> toJson() => {
|
||||
'position': position.map((p) => p.toJson()).toList(),
|
||||
'position': position.map((innerList) => innerList.map((p) => p.toJson()).toList()).toList(), // 二维数组:[[{lat,lon}], ...]
|
||||
'sideWidth': sideWidth,
|
||||
};
|
||||
|
||||
// 可选:从JSON反序列化(方便解析返回值)
|
||||
factory HoleBoundary.fromJson(Map<String, dynamic> json) {
|
||||
// 1. 提取position数组(分步处理,更易读)
|
||||
final List<dynamic> outerList = json['position'] as List;
|
||||
// 2. 遍历外层数组,将每个内层数组转为 List<Position>
|
||||
final List<List<Position>> position = outerList.map((innerList) {
|
||||
// 3. 处理内层数组,转为 Position 对象列表
|
||||
return (innerList as List).map((p) => Position.fromJson(p as Map<String, dynamic>)).toList();
|
||||
}).toList();
|
||||
|
||||
// 4. 提取sideWidth(确保数字类型)
|
||||
final double sideWidth = (json['sideWidth'] as num).toDouble();
|
||||
|
||||
// 5. 返回实例
|
||||
return HoleBoundary(position: position, sideWidth: sideWidth);
|
||||
}
|
||||
}
|
||||
|
||||
class Position {
|
||||
@@ -39,9 +69,12 @@ class Position {
|
||||
final double lon;
|
||||
|
||||
Position({required this.lat, required this.lon});
|
||||
factory Position.fromJson(Map<String, dynamic> json) {
|
||||
// 安全解析经纬度,避免空值/非数字
|
||||
final double lat = (json['lat'] as num?)?.toDouble() ?? 0.0;
|
||||
final double lon = (json['lon'] as num?)?.toDouble() ?? 0.0;
|
||||
return Position(lat: lat, lon: lon);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
'lat': lat,
|
||||
'lon': lon,
|
||||
};
|
||||
Map<String, dynamic> toJson() => {'lat': lat, 'lon': lon};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user