实现一对多规划 #22

Merged
p5iufsk8w merged 1 commits from dmz_branch into main 6 months ago

@ -0,0 +1,171 @@
# 路径历史功能使用指南
## 功能概述
路径历史功能允许您保存、查看和管理所有通过A*算法规划的飞行路径。系统会自动保存每次路径规划的结果,包括平滑处理后的路径点和原始算法路径点。
## 主要特性
### 1. 自动路径保存
- **智能保存**每次使用A*算法规划路径后,系统自动保存到数据库
- **平滑处理**对超过20个点的路径自动执行平滑处理减少路径点数量同时保持路径质量
- **双重存储**:同时保存平滑后的路径(用于显示)和原始算法路径(用于分析)
- **元数据记录**:保存路径名称、描述、距离、飞行参数、避开的威胁区等完整信息
### 2. 路径历史管理
- **历史列表**:在"路径历史"标签页查看所有已保存的路径
- **状态筛选**:按路径状态筛选(已规划、执行中、已完成、已失败、已取消)
- **算法筛选**按规划算法筛选A*算法、直线规划)
- **路径详情**:查看每条路径的详细信息,包括威胁区规避情况
### 3. 地图可视化
- **批量显示**:支持在地图上同时显示多条历史路径
- **颜色区分**:每条路径使用不同颜色显示,便于区分
- **虚线样式**:历史路径使用虚线显示,与当前规划路径(实线)区分
- **起终点标记**:每条路径显示起点(S)和终点(E)标记
## 使用方法
### 步骤1规划并保存路径
1. 切换到"路径规划"标签页
2. 设置起点和终点
3. 配置飞行参数(高度、速度等)
4. 点击"开始规划"按钮
5. 系统自动使用A*算法规划路径并保存到数据库
### 步骤2查看历史路径
1. 切换到"路径历史"标签页
2. 浏览已保存的路径列表
3. 使用筛选功能查找特定路径
4. 点击路径项目查看基本信息
### 步骤3地图显示管理
#### 显示单条路径
- 点击路径项目右侧的"显示"按钮
- 路径将在地图上以虚线形式显示
#### 显示所有路径
- 点击页面顶部"显示所有路径"按钮
- 当前筛选结果中的所有路径将同时显示
#### 隐藏路径
- 点击已显示路径的"隐藏"按钮
- 或点击"隐藏所有路径"按钮清空地图
### 步骤4路径操作
#### 查看详情
1. 点击路径右侧的菜单按钮(⋯)
2. 选择"查看详情"
3. 在弹出对话框中查看完整的路径信息
#### 居中显示
1. 点击菜单中的"居中显示"
2. 地图将自动调整视野以完整显示该路径
#### 复制路径
1. 点击菜单中的"复制路径"
2. 路径点将复制到当前规划中
3. 可以基于此路径进行修改和重新规划
#### 删除路径
1. 点击菜单中的"删除"
2. 确认删除操作
3. 路径将从数据库中永久删除
## 数据结构说明
### 路径点格式
```json
{
"lng": 112.982279, // 经度
"lat": 28.194090, // 纬度
"altitude": 100 // 飞行高度(米)
}
```
### 完整路径信息
每条保存的路径包含以下信息:
- **基本信息**:名称、描述、创建时间
- **地理信息**:起点、终点、路径点数组
- **飞行参数**:高度、速度、预计时间
- **算法信息**:使用的规划算法、网格大小、迭代次数
- **威胁区域**避开的威胁区ID列表
- **状态信息**:规划状态、可见性、显示颜色
### 平滑处理
- **触发条件**路径点数量超过20个
- **平滑参数**5次迭代平滑因子0.3
- **保留策略**:保留重要路径点,移除冗余点
- **存储策略**:同时保存原始路径和平滑路径
## 性能优化
### 地图渲染
- 使用虚线样式减少渲染负担
- 合理的线条宽度和透明度
- 起终点使用轻量级SVG图标
### 数据加载
- 历史路径列表分页加载默认50条
- 路径点数据按需加载
- 智能缓存减少重复请求
### 内存管理
- 及时清理隐藏路径的地图覆盖物
- 使用非响应式对象存储地图元素
- 避免大量路径同时显示造成性能问题
## 注意事项
1. **存储空间**:每条路径占用一定数据库空间,建议定期清理不需要的历史路径
2. **显示性能**:同时显示过多路径可能影响地图性能,建议分批查看
3. **路径颜色**:系统自动分配颜色,如需特定颜色可在详情中修改
4. **权限控制**:路径可见性分为公开和私有,默认为公开
5. **数据备份**:重要路径建议定期备份,避免意外丢失
## 故障排除
### 路径不显示
- 检查路径状态是否为"公开"
- 确认地图已加载完成
- 刷新页面重新加载数据
### 保存失败
- 检查网络连接
- 确认路径点数据有效
- 查看浏览器控制台错误信息
### 性能问题
- 减少同时显示的路径数量
- 清空地图后重新加载
- 使用筛选功能精确查找
## API接口
### 获取历史路径列表
```
GET /api/path-planning/history/all
```
### 获取路径详情
```
GET /api/path-planning/:id
```
### 更新路径状态
```
PUT /api/path-planning/:id/status
```
### 删除路径
```
DELETE /api/path-planning/:id
```
---
通过路径历史功能,您可以有效管理和重用飞行路径,提高无人机任务规划的效率。如有问题,请参考技术文档或联系开发团队。

@ -108,13 +108,100 @@ router.get('/', async (req, res) => {
// 转换数据格式,兼容前端
const threatZones = rows.map(row => {
let geometryData = null
let convertedGeometry = null
try {
if (row.geometry_data) {
geometryData = typeof row.geometry_data === 'string' ? JSON.parse(row.geometry_data) : row.geometry_data
// 转换几何数据格式以匹配前端期望
if (row.geometry_type === 'circle') {
// 转换圆形:支持多种输入格式到 {center: [lng, lat], radius}
if (geometryData.center) {
let centerArray = null;
if (Array.isArray(geometryData.center) && geometryData.center.length === 2) {
// 已经是数组格式 [lng, lat]
centerArray = geometryData.center;
} else if (typeof geometryData.center === 'object' &&
geometryData.center.lng !== undefined && geometryData.center.lat !== undefined) {
// 对象格式 {lng, lat}
centerArray = [geometryData.center.lng, geometryData.center.lat];
}
if (centerArray && !isNaN(centerArray[0]) && !isNaN(centerArray[1])) {
convertedGeometry = {
type: row.geometry_type,
center: centerArray,
radius: geometryData.radius
};
}
}
} else if (row.geometry_type === 'polygon') {
// 转换多边形:支持多种输入格式到 {path: [[lng, lat]]}
let pathArray = null;
if (geometryData.path && Array.isArray(geometryData.path)) {
// 已经是 path 格式
pathArray = geometryData.path.map(point => {
if (Array.isArray(point) && point.length === 2) {
return point; // 已经是数组格式 [lng, lat]
} else if (typeof point === 'object' && point.lng !== undefined && point.lat !== undefined) {
return [point.lng, point.lat]; // 对象格式 {lng, lat}
}
return null;
}).filter(point => point !== null);
} else if (geometryData.coordinates && Array.isArray(geometryData.coordinates)) {
// coordinates 格式
pathArray = geometryData.coordinates.map(point => {
if (Array.isArray(point) && point.length === 2) {
return point; // 已经是数组格式 [lng, lat]
} else if (typeof point === 'object' && point.lng !== undefined && point.lat !== undefined) {
return [point.lng, point.lat]; // 对象格式 {lng, lat}
}
return null;
}).filter(point => point !== null);
}
if (pathArray && pathArray.length >= 3) {
convertedGeometry = {
type: row.geometry_type,
path: pathArray
};
}
} else if (row.geometry_type === 'rectangle') {
// 转换矩形:支持多种输入格式到 {bounds: [swLng, swLat, neLng, neLat]}
let boundsArray = null;
if (geometryData.bounds && Array.isArray(geometryData.bounds) && geometryData.bounds.length === 4) {
// 已经是 bounds 数组格式 [swLng, swLat, neLng, neLat]
boundsArray = geometryData.bounds;
} else if (geometryData.southwest && geometryData.northeast) {
// 对象格式 {southwest: {lng, lat}, northeast: {lng, lat}}
if (typeof geometryData.southwest === 'object' && typeof geometryData.northeast === 'object' &&
geometryData.southwest.lng !== undefined && geometryData.southwest.lat !== undefined &&
geometryData.northeast.lng !== undefined && geometryData.northeast.lat !== undefined) {
boundsArray = [
geometryData.southwest.lng,
geometryData.southwest.lat,
geometryData.northeast.lng,
geometryData.northeast.lat
];
}
}
if (boundsArray && boundsArray.every(val => !isNaN(val))) {
convertedGeometry = {
type: row.geometry_type,
bounds: boundsArray
};
}
}
}
} catch (error) {
console.error('解析威胁区几何数据失败:', error, row.geometry_data)
geometryData = null
convertedGeometry = null
}
return {
@ -124,10 +211,10 @@ router.get('/', async (req, res) => {
description: row.description,
geometry_type: row.geometry_type,
geometry_data: geometryData,
geometry: geometryData ? {
geometry: convertedGeometry || (geometryData ? {
type: row.geometry_type,
...geometryData
} : null,
} : null),
timeRange: [row.time_start, row.time_end],
status: row.status,
createdAt: row.created_at,
@ -171,15 +258,112 @@ router.get('/:id', async (req, res) => {
}
const row = rows[0]
// 转换几何数据格式以匹配前端期望
let geometryData = row.geometry_data
let convertedGeometry = null
try {
if (geometryData) {
geometryData = typeof geometryData === 'string' ? JSON.parse(geometryData) : geometryData
if (row.geometry_type === 'circle') {
// 转换圆形:支持多种输入格式到 {center: [lng, lat], radius}
if (geometryData.center) {
let centerArray = null;
if (Array.isArray(geometryData.center) && geometryData.center.length === 2) {
// 已经是数组格式 [lng, lat]
centerArray = geometryData.center;
} else if (typeof geometryData.center === 'object' &&
geometryData.center.lng !== undefined && geometryData.center.lat !== undefined) {
// 对象格式 {lng, lat}
centerArray = [geometryData.center.lng, geometryData.center.lat];
}
if (centerArray && !isNaN(centerArray[0]) && !isNaN(centerArray[1])) {
convertedGeometry = {
type: row.geometry_type,
center: centerArray,
radius: geometryData.radius
};
}
}
} else if (row.geometry_type === 'polygon') {
// 转换多边形:支持多种输入格式到 {path: [[lng, lat]]}
let pathArray = null;
if (geometryData.path && Array.isArray(geometryData.path)) {
// 已经是 path 格式
pathArray = geometryData.path.map(point => {
if (Array.isArray(point) && point.length === 2) {
return point; // 已经是数组格式 [lng, lat]
} else if (typeof point === 'object' && point.lng !== undefined && point.lat !== undefined) {
return [point.lng, point.lat]; // 对象格式 {lng, lat}
}
return null;
}).filter(point => point !== null);
} else if (geometryData.coordinates && Array.isArray(geometryData.coordinates)) {
// coordinates 格式
pathArray = geometryData.coordinates.map(point => {
if (Array.isArray(point) && point.length === 2) {
return point; // 已经是数组格式 [lng, lat]
} else if (typeof point === 'object' && point.lng !== undefined && point.lat !== undefined) {
return [point.lng, point.lat]; // 对象格式 {lng, lat}
}
return null;
}).filter(point => point !== null);
}
if (pathArray && pathArray.length >= 3) {
convertedGeometry = {
type: row.geometry_type,
path: pathArray
};
}
} else if (row.geometry_type === 'rectangle') {
// 转换矩形:支持多种输入格式到 {bounds: [swLng, swLat, neLng, neLat]}
let boundsArray = null;
if (geometryData.bounds && Array.isArray(geometryData.bounds) && geometryData.bounds.length === 4) {
// 已经是 bounds 数组格式 [swLng, swLat, neLng, neLat]
boundsArray = geometryData.bounds;
} else if (geometryData.southwest && geometryData.northeast) {
// 对象格式 {southwest: {lng, lat}, northeast: {lng, lat}}
if (typeof geometryData.southwest === 'object' && typeof geometryData.northeast === 'object' &&
geometryData.southwest.lng !== undefined && geometryData.southwest.lat !== undefined &&
geometryData.northeast.lng !== undefined && geometryData.northeast.lat !== undefined) {
boundsArray = [
geometryData.southwest.lng,
geometryData.southwest.lat,
geometryData.northeast.lng,
geometryData.northeast.lat
];
}
}
if (boundsArray && boundsArray.every(val => !isNaN(val))) {
convertedGeometry = {
type: row.geometry_type,
bounds: boundsArray
};
}
}
}
} catch (error) {
console.error('解析威胁区几何数据失败:', error, row.geometry_data)
convertedGeometry = null
}
const zone = {
id: row.id,
type: row.type,
level: row.level,
description: row.description,
geometry: {
geometry: convertedGeometry || (geometryData ? {
type: row.geometry_type,
...row.geometry_data
},
...geometryData
} : null),
timeRange: [row.time_start, row.time_end],
status: row.status,
createdAt: row.created_at,

@ -60,32 +60,44 @@ CREATE TABLE threat_zones (
-- 删除现有路径规划表(如果存在)以确保结构正确
DROP TABLE IF EXISTS path_plans;
-- 创建路径规划表(基于最新API结构
-- 创建路径规划表(增强版本,支持完整的路径保存和历史查看
CREATE TABLE path_plans (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) DEFAULT NULL COMMENT '路径规划名称',
description TEXT DEFAULT NULL COMMENT '路径描述信息',
start_latitude DECIMAL(10, 7) NOT NULL COMMENT '起点纬度',
start_longitude DECIMAL(10, 7) NOT NULL COMMENT '起点经度',
end_latitude DECIMAL(10, 7) NOT NULL COMMENT '终点纬度',
end_longitude DECIMAL(10, 7) NOT NULL COMMENT '终点经度',
path_points JSON NOT NULL COMMENT '路径点数据包含lng, lat, altitude',
smoothed_path_points JSON DEFAULT NULL COMMENT '平滑后的路径点数据',
original_path_points JSON DEFAULT NULL COMMENT '原始A*算法路径点(未平滑)',
algorithm VARCHAR(20) NOT NULL DEFAULT 'astar' COMMENT '使用的规划算法',
distance DECIMAL(10, 2) DEFAULT NULL COMMENT '路径总距离(米)',
estimated_time INT DEFAULT NULL COMMENT '预计时间(分钟)',
flight_altitude INT DEFAULT 100 COMMENT '飞行高度(米)',
flight_speed DECIMAL(5, 2) DEFAULT 10.00 COMMENT '飞行速度(米/秒)',
waypoint_count INT DEFAULT 0 COMMENT '路径点数量',
threat_zones_avoided JSON DEFAULT NULL COMMENT '避开的威胁区ID列表',
threat_zones_passed JSON DEFAULT NULL COMMENT '穿过的威胁区ID列表',
target_order JSON DEFAULT NULL COMMENT '目标点访问顺序',
planning_options JSON DEFAULT NULL COMMENT '规划时的选项参数',
execution_result JSON DEFAULT NULL COMMENT '执行结果信息',
status ENUM('planned', 'executing', 'completed', 'failed', 'cancelled') NOT NULL DEFAULT 'planned',
visibility ENUM('public', 'private') NOT NULL DEFAULT 'public' COMMENT '路径可见性',
color VARCHAR(7) DEFAULT '#FF5722' COMMENT '路径显示颜色',
created_by INT DEFAULT NULL COMMENT '创建者ID',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
executed_at TIMESTAMP NULL COMMENT '开始执行时间',
completed_at TIMESTAMP NULL COMMENT '完成时间',
INDEX idx_status (status),
INDEX idx_algorithm (algorithm),
INDEX idx_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='路径规划表';
INDEX idx_created_at (created_at),
INDEX idx_created_by (created_by),
INDEX idx_visibility (visibility),
FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='路径规划表(增强版)';
-- ============================================
-- 4. 操作日志系统
@ -116,71 +128,130 @@ INSERT INTO users (username, password, role)
VALUES ('admin', '$2a$10$X7UrH5QxX5QxX5QxX5QxX.5QxX5QxX5QxX5QxX5QxX5QxX5QxX5Qx', 'admin')
ON DUPLICATE KEY UPDATE username = username;
-- 插入示例威胁区数据
INSERT INTO threat_zones (type, level, description, geometry_type, geometry_data, time_start, time_end, status, created_by)
VALUES
('radar', 'high', 'Radar Station', 'circle',
JSON_OBJECT('center', JSON_OBJECT('lng', 112.982279, 'lat', 28.19409), 'radius', 2000),
'2024-01-01 00:00:00', '2024-12-31 23:59:59', 'active', 1),
('missile', 'critical', 'Missile Site', 'circle',
JSON_OBJECT('center', JSON_OBJECT('lng', 112.992279, 'lat', 28.18409), 'radius', 3000),
'2024-01-01 00:00:00', '2024-12-31 23:59:59', 'active', 1),
('aircraft', 'medium', 'Air Patrol Zone', 'polygon',
JSON_OBJECT('coordinates', JSON_ARRAY(
JSON_OBJECT('lng', 112.970000, 'lat', 28.200000),
JSON_OBJECT('lng', 112.990000, 'lat', 28.200000),
JSON_OBJECT('lng', 112.990000, 'lat', 28.180000),
JSON_OBJECT('lng', 112.970000, 'lat', 28.180000)
)),
'2024-01-01 06:00:00', '2024-01-01 18:00:00', 'active', 1),
('weather', 'low', 'Weather Zone', 'rectangle',
JSON_OBJECT('southwest', JSON_OBJECT('lng', 112.960000, 'lat', 28.170000), 'northeast', JSON_OBJECT('lng', 112.980000, 'lat', 28.190000)),
'2024-01-01 00:00:00', '2024-12-31 23:59:59', 'active', 1),
('ground', 'medium', 'Military Base', 'polygon',
JSON_OBJECT('coordinates', JSON_ARRAY(
JSON_OBJECT('lng', 112.975000, 'lat', 28.195000),
JSON_OBJECT('lng', 112.980000, 'lat', 28.195000),
JSON_OBJECT('lng', 112.980000, 'lat', 28.190000),
JSON_OBJECT('lng', 112.975000, 'lat', 28.190000)
)),
'2024-01-01 00:00:00', '2024-12-31 23:59:59', 'active', 1);
-- 插入示例路径规划数据
-- 插入示例路径规划数据(增强版本)
INSERT INTO path_plans (
name, start_latitude, start_longitude, end_latitude, end_longitude,
path_points, algorithm, distance, estimated_time, flight_altitude, flight_speed,
threat_zones_avoided, status
name, description, start_latitude, start_longitude, end_latitude, end_longitude,
path_points, smoothed_path_points, original_path_points, algorithm, distance,
estimated_time, flight_altitude, flight_speed, waypoint_count, threat_zones_avoided,
planning_options, status, visibility, color, created_by
) VALUES
(
'长沙市区巡逻路径', 28.194090, 112.982279, 28.200000, 112.990000,
'长沙市区巡逻路径',
'A*算法规划路径距离1.20km避开2个威胁区',
28.194090, 112.982279, 28.200000, 112.990000,
JSON_ARRAY(
JSON_OBJECT('lng', 112.982279, 'lat', 28.194090, 'altitude', 100),
JSON_OBJECT('lng', 112.985000, 'lat', 28.197000, 'altitude', 100),
JSON_OBJECT('lng', 112.990000, 'lat', 28.200000, 'altitude', 100)
),
JSON_ARRAY(
JSON_OBJECT('lng', 112.982279, 'lat', 28.194090, 'altitude', 100),
JSON_OBJECT('lng', 112.985000, 'lat', 28.197000, 'altitude', 100),
JSON_OBJECT('lng', 112.990000, 'lat', 28.200000, 'altitude', 100)
),
JSON_ARRAY(
JSON_OBJECT('lng', 112.982279, 'lat', 28.194090, 'altitude', 100),
JSON_OBJECT('lng', 112.984000, 'lat', 28.195500, 'altitude', 100),
JSON_OBJECT('lng', 112.985000, 'lat', 28.197000, 'altitude', 100),
JSON_OBJECT('lng', 112.987000, 'lat', 28.198500, 'altitude', 100),
JSON_OBJECT('lng', 112.990000, 'lat', 28.200000, 'altitude', 100)
),
'astar', 1200.50, 8, 100, 10.0,
JSON_ARRAY(1, 2), 'completed'
'astar', 1200.50, 8, 100, 10.0, 3,
JSON_ARRAY(1, 2),
JSON_OBJECT('gridSize', 0.001, 'maxIterations', 8000, 'smoothed', true),
'completed', 'public', '#FF5722', 1
),
(
'湘江沿岸监控路径', 28.196000, 112.985000, 28.205000, 112.995000,
'湘江沿岸监控路径',
'A*算法规划路径距离1.80km避开2个威胁区',
28.196000, 112.985000, 28.205000, 112.995000,
JSON_ARRAY(
JSON_OBJECT('lng', 112.985000, 'lat', 28.196000, 'altitude', 120),
JSON_OBJECT('lng', 112.988000, 'lat', 28.199000, 'altitude', 120),
JSON_OBJECT('lng', 112.992000, 'lat', 28.202000, 'altitude', 120),
JSON_OBJECT('lng', 112.995000, 'lat', 28.205000, 'altitude', 120)
),
'astar', 1800.75, 12, 120, 10.0,
JSON_ARRAY(1, 3), 'executing'
JSON_ARRAY(
JSON_OBJECT('lng', 112.985000, 'lat', 28.196000, 'altitude', 120),
JSON_OBJECT('lng', 112.988000, 'lat', 28.199000, 'altitude', 120),
JSON_OBJECT('lng', 112.992000, 'lat', 28.202000, 'altitude', 120),
JSON_OBJECT('lng', 112.995000, 'lat', 28.205000, 'altitude', 120)
),
JSON_ARRAY(
JSON_OBJECT('lng', 112.985000, 'lat', 28.196000, 'altitude', 120),
JSON_OBJECT('lng', 112.986500, 'lat', 28.197500, 'altitude', 120),
JSON_OBJECT('lng', 112.988000, 'lat', 28.199000, 'altitude', 120),
JSON_OBJECT('lng', 112.990000, 'lat', 28.200500, 'altitude', 120),
JSON_OBJECT('lng', 112.992000, 'lat', 28.202000, 'altitude', 120),
JSON_OBJECT('lng', 112.993500, 'lat', 28.203500, 'altitude', 120),
JSON_OBJECT('lng', 112.995000, 'lat', 28.205000, 'altitude', 120)
),
'astar', 1800.75, 12, 120, 10.0, 4,
JSON_ARRAY(1, 3),
JSON_OBJECT('gridSize', 0.001, 'maxIterations', 8000, 'smoothed', true),
'executing', 'public', '#2196F3', 1
),
(
'橘子洲头勘察路径', 28.180000, 112.970000, 28.185000, 112.975000,
'橘子洲头勘察路径',
'直线规划路径距离0.80km,无威胁区域',
28.180000, 112.970000, 28.185000, 112.975000,
JSON_ARRAY(
JSON_OBJECT('lng', 112.970000, 'lat', 28.180000, 'altitude', 50),
JSON_OBJECT('lng', 112.972000, 'lat', 28.182000, 'altitude', 60),
JSON_OBJECT('lng', 112.975000, 'lat', 28.185000, 'altitude', 50)
),
JSON_ARRAY(
JSON_OBJECT('lng', 112.970000, 'lat', 28.180000, 'altitude', 50),
JSON_OBJECT('lng', 112.972000, 'lat', 28.182000, 'altitude', 60),
JSON_OBJECT('lng', 112.975000, 'lat', 28.185000, 'altitude', 50)
),
JSON_ARRAY(
JSON_OBJECT('lng', 112.970000, 'lat', 28.180000, 'altitude', 50),
JSON_OBJECT('lng', 112.972000, 'lat', 28.182000, 'altitude', 60),
JSON_OBJECT('lng', 112.975000, 'lat', 28.185000, 'altitude', 50)
),
'straight', 800.25, 5, 50, 8.0,
JSON_ARRAY(), 'planned'
'straight', 800.25, 5, 50, 8.0, 3,
JSON_ARRAY(),
JSON_OBJECT('gridSize', 0.001, 'maxIterations', 0, 'smoothed', false),
'planned', 'public', '#4CAF50', 1
),
(
'高速避障路径测试',
'A*算法规划路径距离2.15km避开4个威胁区',
28.175000, 112.965000, 28.210000, 113.000000,
JSON_ARRAY(
JSON_OBJECT('lng', 112.965000, 'lat', 28.175000, 'altitude', 150),
JSON_OBJECT('lng', 112.970000, 'lat', 28.178000, 'altitude', 150),
JSON_OBJECT('lng', 112.975000, 'lat', 28.185000, 'altitude', 150),
JSON_OBJECT('lng', 112.985000, 'lat', 28.195000, 'altitude', 150),
JSON_OBJECT('lng', 112.995000, 'lat', 28.205000, 'altitude', 150),
JSON_OBJECT('lng', 113.000000, 'lat', 28.210000, 'altitude', 150)
),
JSON_ARRAY(
JSON_OBJECT('lng', 112.965000, 'lat', 28.175000, 'altitude', 150),
JSON_OBJECT('lng', 112.970000, 'lat', 28.178000, 'altitude', 150),
JSON_OBJECT('lng', 112.975000, 'lat', 28.185000, 'altitude', 150),
JSON_OBJECT('lng', 112.985000, 'lat', 28.195000, 'altitude', 150),
JSON_OBJECT('lng', 112.995000, 'lat', 28.205000, 'altitude', 150),
JSON_OBJECT('lng', 113.000000, 'lat', 28.210000, 'altitude', 150)
),
JSON_ARRAY(
JSON_OBJECT('lng', 112.965000, 'lat', 28.175000, 'altitude', 150),
JSON_OBJECT('lng', 112.967000, 'lat', 28.176000, 'altitude', 150),
JSON_OBJECT('lng', 112.970000, 'lat', 28.178000, 'altitude', 150),
JSON_OBJECT('lng', 112.972000, 'lat', 28.180000, 'altitude', 150),
JSON_OBJECT('lng', 112.975000, 'lat', 28.185000, 'altitude', 150),
JSON_OBJECT('lng', 112.980000, 'lat', 28.190000, 'altitude', 150),
JSON_OBJECT('lng', 112.985000, 'lat', 28.195000, 'altitude', 150),
JSON_OBJECT('lng', 112.990000, 'lat', 28.200000, 'altitude', 150),
JSON_OBJECT('lng', 112.995000, 'lat', 28.205000, 'altitude', 150),
JSON_OBJECT('lng', 112.998000, 'lat', 28.208000, 'altitude', 150),
JSON_OBJECT('lng', 113.000000, 'lat', 28.210000, 'altitude', 150)
),
'astar', 2150.80, 15, 150, 12.0, 6,
JSON_ARRAY(1, 2, 3, 4),
JSON_OBJECT('gridSize', 0.0005, 'maxIterations', 10000, 'smoothed', true),
'completed', 'public', '#FF9800', 1
);
-- ============================================
@ -214,6 +285,10 @@ FROM path_plans
GROUP BY algorithm, status
ORDER BY algorithm, status;
-- ============================================
-- 初始化完成
-- ============================================
-- ============================================
-- 初始化完成
-- ============================================

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save