11 KiB
11 KiB
✅ 作业路线规划 - 地块选择功能集成
🎯 更新内容
根据需求,作业路线规划现在需要先选择地块管理系统中维护的地块,实现与地块管理系统的深度集成。
📦 新增功能
1️⃣ 地块选择对话框
在创建新路线规划时,系统会弹出地块选择对话框,用户可以:
- ✅ 选择已有地块作为规划基础
- ✅ 或选择"不选择",手动绘制边界
功能特点:
- 自动加载地块管理系统中的所有地块
- 只显示状态为"活跃"的地块
- 显示地块的详细信息(面积、位置、土壤类型等)
- 实时预览选中地块的信息
2️⃣ 地块信息关联
选择地块后,路线规划会自动关联地块信息:
- ✅ 地块ID (
fieldId) - ✅ 地块名称 (
fieldName) - ✅ 地块边界坐标(自动转换为路线边界)
- ✅ 路线名称自动命名为"{地块名称}作业路线"
3️⃣ 路线列表显示优化
路线列表中新增地块信息显示:
- ✅ 显示关联的地块名称
- ✅ 地图图标标识
- ✅ 直观了解路线对应的地块
🎨 界面展示
地块选择对话框
┌─────────────────────────────────────────────┐
│ 选择地块 │
│ 从地块管理系统中选择一个地块作为作业路线 │
│ 规划的基础 │
├─────────────────────────────────────────────┤
│ │
│ 选择地块 │
│ [选择地块 ▼] │
│ ○ 不选择(手动绘制边界) │
│ ○ 东一地块 (50亩 · 东区) │
│ ○ 西二地块 (80亩 · 西区) │
│ ○ 南三地块 (35亩 · 南区) │
│ │
│ ┌─────────────────────────────────────┐ │
│ │ 📍 地块信息 │ │
│ ├─────────────────────────────────────┤ │
│ │ 地块名称: 东一地块 │ │
│ │ 地块面积: 50 亩 │ │
│ │ 所在位置: 东区 │ │
│ │ 土壤类型: 壤土 │ │
│ └─────────────────────────────────────┘ │
│ │
│ [取消] [✓ 确认创建] │
└─────────────────────────────────────────────┘
路线列表(带地块信息)
┌──────────────────────┐
│ 路线列表 │
├──────────────────────┤
│ ✓ 东一地块作业路线 │
│ 📍 东一地块 │ ← 新增地块名称显示
│ 18行 · 3.6km │
│ [草稿] │
│ │
│ □ 西二地块作业路线 │
│ 📍 西二地块 │
│ 24行 · 4.8km │
│ [已审核] │
└──────────────────────┘
🔧 技术实现
数据结构更新
RoutePlan 接口
interface RoutePlan {
id: string;
name: string;
fieldId?: string; // 新增:关联地块ID
fieldName?: string; // 新增:关联地块名称
fieldBoundary: RoutePoint[];
obstacles: Obstacle[];
workingLines: RoutePoint[][];
params: RouteParams;
stats: RouteStats;
createdAt: string;
status: 'draft' | 'approved' | 'exported';
}
核心功能实现
1. 加载地块数据
useEffect(() => {
// 加载地块数据
const fieldsData = localStorage.getItem('smart_agriculture_fields');
if (fieldsData) {
setFields(JSON.parse(fieldsData));
}
}, []);
2. 创建路线流程
const createNewRoute = () => {
// 打开地块选择对话框
setShowFieldSelectDialog(true);
};
const confirmCreateRoute = () => {
let fieldBoundary: RoutePoint[] = [];
let fieldName = '';
let fieldId: string | undefined;
if (selectedFieldId && selectedFieldId !== 'none') {
// 使用选中的地块边界
const selectedField = fields.find(f => f.id === selectedFieldId);
if (selectedField) {
// 转换地块坐标到画布坐标系
fieldBoundary = selectedField.coordinates.map(coord => ({
lng: coord.lng * 10 + 100,
lat: coord.lat * 10 + 100,
}));
fieldName = selectedField.name;
fieldId = selectedField.id;
}
}
const newRoute: RoutePlan = {
id: `route-${Date.now()}`,
name: fieldName ? `${fieldName}作业路线` : `路线规划${routes.length + 1}`,
fieldId,
fieldName,
fieldBoundary,
// ... 其他属性
};
setRoutes([...routes, newRoute]);
setSelectedRoute(newRoute);
setShowFieldSelectDialog(false);
};
3. 坐标转换
// 地块坐标(经纬度)→ Canvas坐标
const convertCoordinates = (geoCoords: GeoCoordinate[]) => {
return geoCoords.map(coord => ({
lng: coord.lng * 10 + 100, // 缩放和平移
lat: coord.lat * 10 + 100,
}));
};
📊 完整工作流程
流程1: 基于地块创建路线
1. 点击"新建规划"
↓
2. 弹出"选择地块"对话框
↓
3. 从下拉列表选择地块
→ 显示地块信息预览
↓
4. 点击"确认创建"
↓
5. 系统自动:
- 关联地块信息
- 加载地块边界
- 命名为"{地块名称}作业路线"
↓
6. 在地图上显示地块边界
↓
7. 设置作业参数
↓
8. 生成作业路线
↓
9. 保存路线规划
流程2: 手动绘制边界
1. 点击"新建规划"
↓
2. 弹出"选择地块"对话框
↓
3. 选择"不选择(手动绘制边界)"
↓
4. 点击"确认创建"
↓
5. 创建空白路线规划
↓
6. 点击"绘制边界"按钮
↓
7. 在地图上手动绘制边界
↓
8. 完成后设置参数生成路线
🎯 功能对比
更新前 vs 更新后
| 功能 | 更新前 | 更新后 |
|---|---|---|
| 地块选择 | ❌ 无 | ✅ 支持 |
| 地块关联 | ❌ 无 | ✅ 自动关联 |
| 边界导入 | ❌ 手动绘制 | ✅ 自动导入 |
| 路线命名 | 手动输入 | ✅ 自动命名 |
| 地块信息显示 | ❌ 无 | ✅ 显示地块名称 |
| 与地块系统集成 | ❌ 无 | ✅ 完全集成 |
💡 使用建议
1. 选择地块的优势
✅ 自动导入边界
- 无需手动绘制
- 精确的地块边界
- 节省时间
✅ 数据关联
- 路线与地块关联
- 便于追溯和管理
- 数据一致性
✅ 智能命名
- 自动生成描述性名称
- 便于识别和查找
2. 手动绘制的场景
适用于以下情况:
- 🔹 地块尚未在系统中录入
- 🔹 临时作业区域
- 🔹 需要特殊边界处理
3. 最佳实践
推荐工作流:
1. 在地块管理系统中维护所有地块信息
2. 创建路线规划时选择对应地块
3. 系统自动导入边界和信息
4. 设置作业参数生成路线
5. 保存并导出至农机系统
📋 新增状<E5A29E><E78AB6><EFBFBD>和数据
新增状态
const [fields, setFields] = useState<Field[]>([]); // 地块列表
const [selectedFieldId, setSelectedFieldId] = useState<string>('none'); // 选中的地块ID
const [showFieldSelectDialog, setShowFieldSelectDialog] = useState(false); // 对话框显示
示例数据
// 地块数据(从地块管理系统加载)
const fields = [
{
id: 'field-1',
name: '东一地块',
area: 50,
location: '东区',
soilType: 'loamy',
coordinates: [
{ lng: 10, lat: 10 },
{ lng: 50, lat: 10 },
{ lng: 50, lat: 40 },
{ lng: 10, lat: 40 },
],
status: 'active',
},
];
// 路线规划数据(关联地块)
const route = {
id: 'route-1',
name: '东一地块作业路线',
fieldId: 'field-1', // 关联地块ID
fieldName: '东一地块', // 关联地块名称
fieldBoundary: [...], // 从地块坐标转换
};
✅ 功能验证
测试场景
场景1: 选择地块创建路线
✅ 打开地块选择对话框
✅ 加载所有活跃地块
✅ 选择地块后显示详细信息
✅ 确认创建后自动关联
✅ 地块边界正确显示
✅ 路线名称自动生成
场景2: 不选择地块
✅ 选择"不选择(手动绘制边界)"
✅ 创建空白路线
✅ 可以手动绘制边界
✅ 正常生成路线
场景3: 路线列表显示
✅ 关联地块的路线显示地块名称
✅ 地图图标正确显示
✅ 未关联地块的路线不显示地块信息
🎨 UI优化
1. 地块选择器优化
- ✅ 地图图标标识
- ✅ 显示地块面积和位置
- ✅ 实时信息预览
- ✅ 清晰的提示文字
2. 路线列表优化
- ✅ 新增地块名称显示
- ✅ 地图图标标识
- ✅ 更直观的信息呈现
3. 提示信息
- ✅ 选择地块时的信息预览
- ✅ 不选择地块时的提示
- ✅ 创建成功的反馈
🔗 系统集成
与地块管理系统的关联
地块管理系统
↓
地块数据
↓
路线规划系统
↓
作业路线
↓
下发至农机
数据流向
1. 地块管理系统录入/维护地块
↓
2. 路线规划选择地块
↓
3. 自动导入地块边界
↓
4. 生成作业路线
↓
5. 下发至农机执行
↓
6. 作业数据回传
↓
7. 关联到对应地块
📝 注意事项
1. 坐标系统
- 地块坐标:经纬度坐标(WGS84)
- Canvas坐标:像素坐标
- 需要进行坐标转换
2. 数据一致性
- 地块数据变更时,需考虑已关联的路线
- 建议保留历史地块信息
3. 用户体验
- 提供清晰的选择引导
- 支持两种创建方式
- 提供充分的信息预览
🎉 总结
✅ 完成内容
- ✅ 新增地块选择对话框
- ✅ 实现地块数据加载
- ✅ 自动导入地块边界
- ✅ 自动关联地块信息
- ✅ 智能路线命名
- ✅ 路线列表显示优化
- ✅ 支持手动绘制备选方案
🎯 核心价值
- 提高效率: 无需手动绘制边界
- 数据关联: 路线与地块完整关联
- 便于管理: 清晰的数据追溯
- 用户友好: 直观的操作流程
📊 状态
✅ 功能完成,可正常使用
更新时间: 2025-10-17
版本: v1.2
状态: ✅ 已集成地块选择功能