From 4cf742a6eae3d6a9eff6d189f998aaec4c3ba386 Mon Sep 17 00:00:00 2001 From: 123 <123@example.com> Date: Tue, 8 Jul 2025 15:19:57 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=95=8C=E6=83=85=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E5=8A=9F=E8=83=BD=EF=BC=8C=E5=AE=9E=E7=8E=B0=E5=9C=B0?= =?UTF-8?q?=E5=9B=BE=E6=A0=87=E8=AE=B0=E5=88=87=E6=8D=A2=E5=92=8C=E4=BD=8D?= =?UTF-8?q?=E7=BD=AE=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 实现敌情显示切换功能:点击可显示/隐藏敌人标记,无弹窗干扰 - 优化敌人标记样式:移除文字,使用纯色圆形标记,根据威胁等级显示不同颜色和大小 - 调整地图中心点:向北移动200米到最佳观察位置 (113.045134, 28.264012) - 优化敌人分布:减少到15个敌人,均匀分布在120米范围内 - 修复JavaScript编码问题:解决中文字符导致的标记显示失败 - 添加数据库更新脚本:支持敌人位置批量调整和范围控制 --- .../database/update_center_north_150m.sql | 183 ++++++++++++++++++ .../database/update_enemy_120m_reduce.sql | 146 ++++++++++++++ .../database/update_enemy_locations.sql | 42 ++++ .../update_enemy_locations_center.sql | 99 ++++++++++ src/Client/include/ui/main/MainWindow.h | 3 + src/Client/res/html/map.html | 145 +++++++++++++- src/Client/src/ui/main/MainWindow.cpp | 142 ++++++++++---- 7 files changed, 720 insertions(+), 40 deletions(-) create mode 100644 src/Client/database/update_center_north_150m.sql create mode 100644 src/Client/database/update_enemy_120m_reduce.sql create mode 100644 src/Client/database/update_enemy_locations.sql create mode 100644 src/Client/database/update_enemy_locations_center.sql diff --git a/src/Client/database/update_center_north_150m.sql b/src/Client/database/update_center_north_150m.sql new file mode 100644 index 00000000..ace9bbe3 --- /dev/null +++ b/src/Client/database/update_center_north_150m.sql @@ -0,0 +1,183 @@ +-- 将地图中心向北移动150米,并重新分布敌人位置 +-- Move map center 150m north and redistribute enemy positions +-- 新地图中心:(113.045134, 28.263562) +-- New Map Center: (113.045134, 28.263562) + +USE Client; + +-- 更新所有敌人位置围绕新的中心点,保持120米范围内 +UPDATE enemy_records SET + longitude = 113.045134 + (RAND() - 0.5) * 0.0024, -- ±120米经度范围 + latitude = 28.263562 + (RAND() - 0.5) * 0.0022, -- ±120米纬度范围 + update_time = NOW() +WHERE id LIKE 'ENEMY%'; + +-- 手动设置一些关键敌人位置,确保围绕新中心点均匀分布 +UPDATE enemy_records SET + longitude = 113.045134, latitude = 28.263562, -- 新中心点 + update_time = NOW() +WHERE id = 'ENEMY001'; + +UPDATE enemy_records SET + longitude = 113.045134 + 0.0008, latitude = 28.263562 + 0.0008, -- 东北约80米 + update_time = NOW() +WHERE id = 'ENEMY002'; + +UPDATE enemy_records SET + longitude = 113.045134 - 0.0008, latitude = 28.263562 - 0.0008, -- 西南约80米 + update_time = NOW() +WHERE id = 'ENEMY003'; + +UPDATE enemy_records SET + longitude = 113.045134 + 0.0008, latitude = 28.263562 - 0.0008, -- 东南约80米 + update_time = NOW() +WHERE id = 'ENEMY004'; + +UPDATE enemy_records SET + longitude = 113.045134 - 0.0008, latitude = 28.263562 + 0.0008, -- 西北约80米 + update_time = NOW() +WHERE id = 'ENEMY005'; + +UPDATE enemy_records SET + longitude = 113.045134 + 0.0012, latitude = 28.263562, -- 正东120米 + update_time = NOW() +WHERE id = 'ENEMY006'; + +UPDATE enemy_records SET + longitude = 113.045134 - 0.0012, latitude = 28.263562, -- 正西120米 + update_time = NOW() +WHERE id = 'ENEMY007'; + +UPDATE enemy_records SET + longitude = 113.045134, latitude = 28.263562 + 0.0011, -- 正北120米 + update_time = NOW() +WHERE id = 'ENEMY008'; + +UPDATE enemy_records SET + longitude = 113.045134, latitude = 28.263562 - 0.0011, -- 正南120米 + update_time = NOW() +WHERE id = 'ENEMY009'; + +UPDATE enemy_records SET + longitude = 113.045134 + 0.0006, latitude = 28.263562 + 0.0006, -- 东北约60米 + update_time = NOW() +WHERE id = 'ENEMY017'; + +UPDATE enemy_records SET + longitude = 113.045134 - 0.0006, latitude = 28.263562 - 0.0006, -- 西南约60米 + update_time = NOW() +WHERE id = 'ENEMY021'; + +UPDATE enemy_records SET + longitude = 113.045134 + 0.0006, latitude = 28.263562 - 0.0006, -- 东南约60米 + update_time = NOW() +WHERE id = 'ENEMY022'; + +UPDATE enemy_records SET + longitude = 113.045134 - 0.0006, latitude = 28.263562 + 0.0006, -- 西北约60米 + update_time = NOW() +WHERE id = 'ENEMY023'; + +UPDATE enemy_records SET + longitude = 113.045134 + 0.0004, latitude = 28.263562, -- 正东约40米 + update_time = NOW() +WHERE id = 'ENEMY024'; + +UPDATE enemy_records SET + longitude = 113.045134 - 0.0004, latitude = 28.263562, -- 正西约40米 + update_time = NOW() +WHERE id = 'ENEMY025'; + +-- 验证更新结果 +SELECT + id, + ROUND(longitude, 7) as longitude, + ROUND(latitude, 7) as latitude, + threat_level, + status, + -- 计算距离新中心点的距离(米) + ROUND( + 6371000 * 2 * ASIN( + SQRT( + POW(SIN(RADIANS(28.263562 - latitude) / 2), 2) + + COS(RADIANS(latitude)) * COS(RADIANS(28.263562)) * + POW(SIN(RADIANS(113.045134 - longitude) / 2), 2) + ) + ), 1 + ) as distance_meters, + update_time +FROM enemy_records +ORDER BY distance_meters, threat_level DESC, id; + +-- 显示新旧中心点对比 +SELECT + '原中心点' as point_type, + 113.045134 as longitude, + 28.262212 as latitude, + '距离新中心' as note, + ROUND( + 6371000 * 2 * ASIN( + SQRT( + POW(SIN(RADIANS(28.263562 - 28.262212) / 2), 2) + + COS(RADIANS(28.262212)) * COS(RADIANS(28.263562)) * + POW(SIN(RADIANS(113.045134 - 113.045134) / 2), 2) + ) + ), 1 + ) as distance_meters +UNION ALL +SELECT + '新中心点(北移150米)', + 113.045134, + 28.263562, + '当前中心', + 0; + +-- 威胁等级分布统计 +SELECT + threat_level, + COUNT(*) as count, + ROUND(AVG( + 6371000 * 2 * ASIN( + SQRT( + POW(SIN(RADIANS(28.263562 - latitude) / 2), 2) + + COS(RADIANS(latitude)) * COS(RADIANS(28.263562)) * + POW(SIN(RADIANS(113.045134 - longitude) / 2), 2) + ) + ) + ), 1) as avg_distance_meters +FROM enemy_records +GROUP BY threat_level +ORDER BY FIELD(threat_level, '高', '中', '低'); + +-- 最终统计 +SELECT + '最终结果' as result, + COUNT(*) as total_enemies, + COUNT(CASE WHEN + 6371000 * 2 * ASIN( + SQRT( + POW(SIN(RADIANS(28.263562 - latitude) / 2), 2) + + COS(RADIANS(latitude)) * COS(RADIANS(28.263562)) * + POW(SIN(RADIANS(113.045134 - longitude) / 2), 2) + ) + ) <= 120 + THEN 1 END) as within_120m, + ROUND(MAX( + 6371000 * 2 * ASIN( + SQRT( + POW(SIN(RADIANS(28.263562 - latitude) / 2), 2) + + COS(RADIANS(latitude)) * COS(RADIANS(28.263562)) * + POW(SIN(RADIANS(113.045134 - longitude) / 2), 2) + ) + ) + ), 1) as max_distance_meters, + ROUND(AVG( + 6371000 * 2 * ASIN( + SQRT( + POW(SIN(RADIANS(28.263562 - latitude) / 2), 2) + + COS(RADIANS(latitude)) * COS(RADIANS(28.263562)) * + POW(SIN(RADIANS(113.045134 - longitude) / 2), 2) + ) + ) + ), 1) as avg_distance_meters +FROM enemy_records; \ No newline at end of file diff --git a/src/Client/database/update_enemy_120m_reduce.sql b/src/Client/database/update_enemy_120m_reduce.sql new file mode 100644 index 00000000..4a4c461a --- /dev/null +++ b/src/Client/database/update_enemy_120m_reduce.sql @@ -0,0 +1,146 @@ +-- 调整敌人位置到120米范围内,并减少数量到15个 +-- Update Enemy Locations within 120 meters range and reduce to 15 enemies +-- 地图中心:(113.045134, 28.262212) +-- Map Center: (113.045134, 28.262212) + +USE Client; + +-- 首先删除一些敌人,保留15个(保持威胁等级均衡分布) +-- 保留:高威胁5个,中威胁5个,低威胁5个 +DELETE FROM enemy_records +WHERE id IN ( + 'ENEMY010', 'ENEMY011', 'ENEMY012', -- 删除3个高威胁 + 'ENEMY013', 'ENEMY014', 'ENEMY015', 'ENEMY016', -- 删除4个中威胁 + 'ENEMY018', 'ENEMY019', 'ENEMY020' -- 删除3个低威胁 +); + +-- 计算120米对应的经纬度偏移量 +-- 在纬度28.26度附近: +-- 1度经度 ≈ 98,500米 +-- 1度纬度 ≈ 111,000米 +-- 120米经度偏移 ≈ 120/98500 ≈ 0.00122度 +-- 120米纬度偏移 ≈ 120/111000 ≈ 0.00108度 + +-- 更新剩余敌人位置到120米范围内 +UPDATE enemy_records SET + longitude = 113.045134 + (RAND() - 0.5) * 0.0024, -- ±0.0012度 ≈ ±120米 + latitude = 28.262212 + (RAND() - 0.5) * 0.0022, -- ±0.0011度 ≈ ±120米 + update_time = NOW() +WHERE id LIKE 'ENEMY%'; + +-- 手动设置一些关键敌人位置,确保分布均匀 +UPDATE enemy_records SET + longitude = 113.045134, latitude = 28.262212, -- 正中心 + update_time = NOW() +WHERE id = 'ENEMY001'; + +UPDATE enemy_records SET + longitude = 113.045134 + 0.0008, latitude = 28.262212 + 0.0008, -- 东北约80米 + update_time = NOW() +WHERE id = 'ENEMY002'; + +UPDATE enemy_records SET + longitude = 113.045134 - 0.0008, latitude = 28.262212 - 0.0008, -- 西南约80米 + update_time = NOW() +WHERE id = 'ENEMY003'; + +UPDATE enemy_records SET + longitude = 113.045134 + 0.0008, latitude = 28.262212 - 0.0008, -- 东南约80米 + update_time = NOW() +WHERE id = 'ENEMY004'; + +UPDATE enemy_records SET + longitude = 113.045134 - 0.0008, latitude = 28.262212 + 0.0008, -- 西北约80米 + update_time = NOW() +WHERE id = 'ENEMY005'; + +UPDATE enemy_records SET + longitude = 113.045134 + 0.0012, latitude = 28.262212, -- 正东120米 + update_time = NOW() +WHERE id = 'ENEMY006'; + +UPDATE enemy_records SET + longitude = 113.045134 - 0.0012, latitude = 28.262212, -- 正西120米 + update_time = NOW() +WHERE id = 'ENEMY007'; + +UPDATE enemy_records SET + longitude = 113.045134, latitude = 28.262212 + 0.0011, -- 正北120米 + update_time = NOW() +WHERE id = 'ENEMY008'; + +UPDATE enemy_records SET + longitude = 113.045134, latitude = 28.262212 - 0.0011, -- 正南120米 + update_time = NOW() +WHERE id = 'ENEMY009'; + +-- 验证更新结果 +SELECT + id, + ROUND(longitude, 7) as longitude, + ROUND(latitude, 7) as latitude, + threat_level, + status, + -- 计算距离中心点的距离(米) + ROUND( + 6371000 * 2 * ASIN( + SQRT( + POW(SIN(RADIANS(28.262212 - latitude) / 2), 2) + + COS(RADIANS(latitude)) * COS(RADIANS(28.262212)) * + POW(SIN(RADIANS(113.045134 - longitude) / 2), 2) + ) + ), 1 + ) as distance_meters, + update_time +FROM enemy_records +ORDER BY distance_meters, threat_level DESC, id; + +-- 显示威胁等级分布统计 +SELECT + threat_level, + COUNT(*) as count, + ROUND(AVG( + 6371000 * 2 * ASIN( + SQRT( + POW(SIN(RADIANS(28.262212 - latitude) / 2), 2) + + COS(RADIANS(latitude)) * COS(RADIANS(28.262212)) * + POW(SIN(RADIANS(113.045134 - longitude) / 2), 2) + ) + ) + ), 1) as avg_distance_meters +FROM enemy_records +GROUP BY threat_level +ORDER BY FIELD(threat_level, '高', '中', '低'); + +-- 最终统计 +SELECT + '最终结果' as result, + COUNT(*) as total_enemies, + COUNT(CASE WHEN + 6371000 * 2 * ASIN( + SQRT( + POW(SIN(RADIANS(28.262212 - latitude) / 2), 2) + + COS(RADIANS(latitude)) * COS(RADIANS(28.262212)) * + POW(SIN(RADIANS(113.045134 - longitude) / 2), 2) + ) + ) <= 120 + THEN 1 END) as within_120m, + ROUND(MAX( + 6371000 * 2 * ASIN( + SQRT( + POW(SIN(RADIANS(28.262212 - latitude) / 2), 2) + + COS(RADIANS(latitude)) * COS(RADIANS(28.262212)) * + POW(SIN(RADIANS(113.045134 - longitude) / 2), 2) + ) + ) + ), 1) as max_distance_meters, + ROUND(AVG( + 6371000 * 2 * ASIN( + SQRT( + POW(SIN(RADIANS(28.262212 - latitude) / 2), 2) + + COS(RADIANS(latitude)) * COS(RADIANS(28.262212)) * + POW(SIN(RADIANS(113.045134 - longitude) / 2), 2) + ) + ) + ), 1) as avg_distance_meters +FROM enemy_records; \ No newline at end of file diff --git a/src/Client/database/update_enemy_locations.sql b/src/Client/database/update_enemy_locations.sql new file mode 100644 index 00000000..33404761 --- /dev/null +++ b/src/Client/database/update_enemy_locations.sql @@ -0,0 +1,42 @@ +-- 更新敌人位置到地图中心附近 +-- Update Enemy Locations to Map Center Area +-- 地图中心:长沙地区 (113.04436, 28.2561619) +-- Map Center: Changsha Area (113.04436, 28.2561619) + +USE Client; + +-- 更新所有敌人位置到长沙地区附近 +UPDATE enemy_records SET + longitude = 113.04436 + (RAND() - 0.5) * 0.02, -- 地图中心经度 ± 0.01度范围内随机 + latitude = 28.2561619 + (RAND() - 0.5) * 0.02, -- 地图中心纬度 ± 0.01度范围内随机 + update_time = NOW() +WHERE id IN ( + 'ENEMY001', 'ENEMY002', 'ENEMY003', 'ENEMY004', 'ENEMY005', + 'ENEMY006', 'ENEMY007', 'ENEMY008', 'ENEMY009', 'ENEMY010', + 'ENEMY011', 'ENEMY012', 'ENEMY013', 'ENEMY014', 'ENEMY015', + 'ENEMY016', 'ENEMY017', 'ENEMY018', 'ENEMY019', 'ENEMY020', + 'ENEMY021', 'ENEMY022', 'ENEMY023', 'ENEMY024', 'ENEMY025' +); + +-- 验证更新结果 +SELECT + id, + ROUND(longitude, 6) as longitude, + ROUND(latitude, 6) as latitude, + threat_level, + status, + update_time +FROM enemy_records +ORDER BY threat_level DESC, id; + +-- 显示统计信息 +SELECT + '地图中心坐标' as location_type, + 113.04436 as longitude, + 28.2561619 as latitude +UNION ALL +SELECT + '敌人位置范围', + CONCAT(ROUND(MIN(longitude), 6), ' ~ ', ROUND(MAX(longitude), 6)), + CONCAT(ROUND(MIN(latitude), 6), ' ~ ', ROUND(MAX(latitude), 6)) +FROM enemy_records; \ No newline at end of file diff --git a/src/Client/database/update_enemy_locations_center.sql b/src/Client/database/update_enemy_locations_center.sql new file mode 100644 index 00000000..ea974a31 --- /dev/null +++ b/src/Client/database/update_enemy_locations_center.sql @@ -0,0 +1,99 @@ +-- 更新敌人位置到新的地图中心附近 +-- Update Enemy Locations to New Map Center Area +-- 新地图中心:(113.045134, 28.262212) +-- New Map Center: (113.045134, 28.262212) + +USE Client; + +-- 更新所有敌人位置到新地图中心附近,范围更小更紧密 +UPDATE enemy_records SET + longitude = 113.045134 + (RAND() - 0.5) * 0.005, -- 新中心经度 ± 0.0025度范围内随机(约270米范围) + latitude = 28.262212 + (RAND() - 0.5) * 0.005, -- 新中心纬度 ± 0.0025度范围内随机(约270米范围) + update_time = NOW() +WHERE id LIKE 'ENEMY%'; + +-- 手动设置几个关键位置的敌人,确保分布更均匀 +UPDATE enemy_records SET + longitude = 113.045134, latitude = 28.262212, -- 正中心 + update_time = NOW() +WHERE id = 'ENEMY001'; + +UPDATE enemy_records SET + longitude = 113.045634, latitude = 28.262712, -- 东北方向 + update_time = NOW() +WHERE id = 'ENEMY002'; + +UPDATE enemy_records SET + longitude = 113.044634, latitude = 28.261712, -- 西南方向 + update_time = NOW() +WHERE id = 'ENEMY003'; + +UPDATE enemy_records SET + longitude = 113.045634, latitude = 28.261712, -- 东南方向 + update_time = NOW() +WHERE id = 'ENEMY004'; + +UPDATE enemy_records SET + longitude = 113.044634, latitude = 28.262712, -- 西北方向 + update_time = NOW() +WHERE id = 'ENEMY005'; + +-- 验证更新结果 +SELECT + id, + ROUND(longitude, 6) as longitude, + ROUND(latitude, 6) as latitude, + threat_level, + status, + -- 计算距离中心点的距离(米) + ROUND( + 6371000 * 2 * ASIN( + SQRT( + POW(SIN(RADIANS(28.262212 - latitude) / 2), 2) + + COS(RADIANS(latitude)) * COS(RADIANS(28.262212)) * + POW(SIN(RADIANS(113.045134 - longitude) / 2), 2) + ) + ), 0 + ) as distance_meters, + update_time +FROM enemy_records +ORDER BY distance_meters, threat_level DESC, id; + +-- 显示统计信息 +SELECT + '新地图中心坐标' as location_type, + 113.045134 as longitude, + 28.262212 as latitude, + 0 as distance_meters +UNION ALL +SELECT + '敌人位置范围', + CONCAT(ROUND(MIN(longitude), 6), ' ~ ', ROUND(MAX(longitude), 6)), + CONCAT(ROUND(MIN(latitude), 6), ' ~ ', ROUND(MAX(latitude), 6)), + ROUND(MAX( + 6371000 * 2 * ASIN( + SQRT( + POW(SIN(RADIANS(28.262212 - latitude) / 2), 2) + + COS(RADIANS(latitude)) * COS(RADIANS(28.262212)) * + POW(SIN(RADIANS(113.045134 - longitude) / 2), 2) + ) + ) + ), 0) +FROM enemy_records; + +-- 按威胁等级显示分布 +SELECT + threat_level, + COUNT(*) as count, + ROUND(AVG( + 6371000 * 2 * ASIN( + SQRT( + POW(SIN(RADIANS(28.262212 - latitude) / 2), 2) + + COS(RADIANS(latitude)) * COS(RADIANS(28.262212)) * + POW(SIN(RADIANS(113.045134 - longitude) / 2), 2) + ) + ) + ), 0) as avg_distance_meters +FROM enemy_records +GROUP BY threat_level +ORDER BY FIELD(threat_level, '高', '中', '低'); \ No newline at end of file diff --git a/src/Client/include/ui/main/MainWindow.h b/src/Client/include/ui/main/MainWindow.h index 87682975..909fa196 100644 --- a/src/Client/include/ui/main/MainWindow.h +++ b/src/Client/include/ui/main/MainWindow.h @@ -340,6 +340,9 @@ private: Ui::MainWindow *m_ui; ///< UI界面指针 IntelligenceUI *m_intelligenceUI; ///< 情报传达界面指针 FaceLightControl *m_faceLightControl; ///< 面部灯光控制界面指针 + + // 敌情显示状态 + bool m_enemyDisplayVisible; ///< 敌情显示状态标志 DeviceListPanel *m_deviceListPanel; ///< 设备列表面板组件 SystemLogPanel *m_systemLogPanel; ///< 系统日志面板组件 RightFunctionPanel *m_rightFunctionPanel; ///< 右侧功能面板组件 diff --git a/src/Client/res/html/map.html b/src/Client/res/html/map.html index bce3763f..ff3a6388 100644 --- a/src/Client/res/html/map.html +++ b/src/Client/res/html/map.html @@ -110,7 +110,7 @@ map = new AMap.Map('container', { resizeEnable: true, zoom: 19, - center: [113.04436, 28.2551619], // 恢复为原来的实验地点坐标 + center: [113.045134, 28.264012], // 地图中心向北移动200米(150+50) pitch: 0, showLabel: true, mapStyle: 'amap://styles/normal', @@ -369,6 +369,149 @@ return Object.keys(markersMap).length; } + // 添加敌人标记 - 专门用于显示敌人位置 + function addEnemyMarker(enemyId, latitude, longitude, color, enemyType, threatLevel) { + console.log('添加敌人标记:', enemyId, latitude, longitude, color, enemyType, threatLevel); + + // 删除已存在的同ID敌人标记 + removeEnemyMarker(enemyId); + + var iconSize = [24, 24]; + var markerColor = color || 'red'; // 默认红色 + + // 根据威胁等级设置颜色 + switch (threatLevel) { + case '高': + markerColor = '#ff3838'; // 红色 + iconSize = [28, 28]; + break; + case '中': + markerColor = '#ffa502'; // 橙色 + iconSize = [24, 24]; + break; + case '低': + markerColor = '#00a8ff'; // 蓝色 + iconSize = [20, 20]; + break; + default: + markerColor = '#ff3838'; // 默认红色 + break; + } + + // 创建敌人标记的HTML内容 - 纯色圆形标记,无文字 + var markerContent = '
'; + + // 创建敌人标记 + var marker = new AMap.Marker({ + position: [longitude, latitude], + content: markerContent, + offset: new AMap.Pixel(-iconSize[0]/2, -iconSize[1]/2), + title: '敌人: ' + enemyId + ' (' + threatLevel + '威胁)', + clickable: true + }); + + // 添加信息窗口 + var infoWindow = new AMap.InfoWindow({ + content: '
' + + '

🎯 敌人信息

' + + '
' + + '

敌人ID: ' + enemyId + '

' + + '

威胁等级: ' + threatLevel + '

' + + '

位置: ' + latitude.toFixed(6) + ', ' + longitude.toFixed(6) + '

' + + '

发现时间: ' + new Date().toLocaleString() + '

' + + '
', + offset: new AMap.Pixel(0, -30) + }); + + // 点击标记显示信息窗口 + marker.on('click', function() { + infoWindow.open(map, marker.getPosition()); + }); + + // 添加闪烁动画效果 - 检查动画方法是否存在 + if (typeof marker.setAnimation === 'function') { + marker.setAnimation('AMAP_ANIMATION_DROP'); + } + + // 确保地图已初始化 + if (!map) { + console.error('地图未初始化,无法添加敌人标记'); + return null; + } + + marker.setMap(map); + + // 保存标记 + var markerKey = 'enemy_' + enemyId; + markersMap[markerKey] = marker; + + console.log('敌人标记添加成功:', markerKey, '位置:', latitude, longitude); + console.log('当前地图标记总数:', Object.keys(markersMap).length); + + // 验证标记是否真的添加到地图上 + setTimeout(function() { + var mapMarkers = map.getAllOverlays('marker'); + console.log('地图上的所有标记数量:', mapMarkers ? mapMarkers.length : 0); + }, 100); + + return markerKey; + } + + // 删除敌人标记 + function removeEnemyMarker(enemyId) { + var markerKey = 'enemy_' + enemyId; + if (markersMap[markerKey]) { + markersMap[markerKey].setMap(null); + delete markersMap[markerKey]; + console.log('删除敌人标记:', markerKey); + return true; + } + return false; + } + + // 清除所有敌人标记 + function clearEnemyMarkers() { + console.log('开始清除所有敌人标记...'); + var count = 0; + for (var key in markersMap) { + if (markersMap.hasOwnProperty(key) && key.startsWith('enemy_')) { + markersMap[key].setMap(null); + delete markersMap[key]; + count++; + } + } + console.log('清除了 ' + count + ' 个敌人标记'); + return count; + } + + // 聚焦到敌人位置 + function focusOnEnemy(enemyId, latitude, longitude) { + console.log('聚焦到敌人:', enemyId, latitude, longitude); + map.setCenter([longitude, latitude]); + map.setZoom(18); // 设置较高的缩放级别以便观察 + + // 如果敌人标记存在,添加动画效果 + var markerKey = 'enemy_' + enemyId; + if (markersMap[markerKey]) { + var marker = markersMap[markerKey]; + if (typeof marker.setAnimation === 'function') { + marker.setAnimation('AMAP_ANIMATION_BOUNCE'); + setTimeout(function() { + marker.setAnimation('AMAP_ANIMATION_NONE'); + }, 3000); + } + } + } + // 显示伤员信息窗口 function showInjuryInfo(injuryId, level, position) { console.log('显示伤员信息: ID=' + injuryId + ', 等级=' + level + ', 位置=' + position); diff --git a/src/Client/src/ui/main/MainWindow.cpp b/src/Client/src/ui/main/MainWindow.cpp index bdbd1b4b..8604af53 100644 --- a/src/Client/src/ui/main/MainWindow.cpp +++ b/src/Client/src/ui/main/MainWindow.cpp @@ -11,6 +11,7 @@ #include "ui/dialogs/DeviceDialog.h" #include "utils/SystemLogger.h" #include "core/database/DatabaseHelper.h" +#include "core/database/EnemyDatabase.h" #include "styles/ModernStyleManager.h" // Qt GUI头文件 @@ -56,6 +57,7 @@ MainWindow::MainWindow(QWidget *parent) , m_leftPanelSplitter(nullptr) , m_intelligenceUI(nullptr) , m_faceLightControl(nullptr) + , m_enemyDisplayVisible(false) , m_enemyStatsDialog(nullptr) , m_visionProcess(nullptr) // , m_droneControlDialog(nullptr) @@ -1219,51 +1221,113 @@ void MainWindow::onEnemyStatsRequested() void MainWindow::onEnemyDisplayRequested() { - qDebug() << "Displaying enemies on map..."; - SystemLogger::getInstance()->logInfo("在地图上显示敌情"); - - // 获取所有敌情数据并在地图上显示 - // 这里可以从EnemyDatabase获取数据 + qDebug() << "Enemy display toggle requested, current state:" << m_enemyDisplayVisible; + + if (m_enemyDisplayVisible) { + // 当前显示敌情,需要隐藏 + qDebug() << "Hiding enemies on map..."; + SystemLogger::getInstance()->logInfo("隐藏地图上的敌情"); + + QString jsCode = R"( + // 清除所有敌人标记 + if (typeof clearEnemyMarkers === 'function') { + clearEnemyMarkers(); + console.log('All enemy markers cleared from map'); + } + )"; + + // 查找地图WebEngineView并执行JavaScript + QList webViews = this->findChildren(); + for (auto webView : webViews) { + if (webView->isVisible()) { + webView->page()->runJavaScript(jsCode, [this](const QVariant &result) { + SystemLogger::getInstance()->logInfo("敌情标记已从地图上清除"); + }); + break; + } + } + + m_enemyDisplayVisible = false; + } else { + // 当前隐藏敌情,需要显示 + qDebug() << "Displaying enemies on map..."; + SystemLogger::getInstance()->logInfo("在地图上显示敌情"); + + // 从数据库获取所有敌情数据 + EnemyDatabase* enemyDB = EnemyDatabase::getInstance(); + if (!enemyDB->initializeDatabase()) { + SystemLogger::getInstance()->logError("敌情数据库连接失败"); + return; + } - // 模拟在地图上显示敌人位置的JavaScript代码 - QString jsCode = R"( - // 清除现有的敌人标记 - if (typeof clearEnemyMarkers === 'function') { - clearEnemyMarkers(); + QList enemyRecords = enemyDB->getAllEnemyRecords(); + + if (enemyRecords.isEmpty()) { + SystemLogger::getInstance()->logInfo("数据库中没有敌情数据"); + return; } - // 添加敌人标记 - var enemies = [ - {id: 'ENEMY001', lat: 39.9042, lng: 116.4074, threat: '高', type: '装甲车'}, - {id: 'ENEMY002', lat: 39.9139, lng: 116.3912, threat: '中', type: '步兵'}, - {id: 'ENEMY003', lat: 39.8876, lng: 116.4231, threat: '低', type: '侦察兵'}, - {id: 'ENEMY004', lat: 39.9254, lng: 116.3845, threat: '高', type: '坦克'} - ]; - - enemies.forEach(function(enemy) { - var color = enemy.threat === '高' ? 'red' : - enemy.threat === '中' ? 'orange' : 'yellow'; - if (typeof addEnemyMarker === 'function') { - addEnemyMarker(enemy.id, enemy.lat, enemy.lng, color, enemy.type, enemy.threat); + // 构建JavaScript代码来显示敌人位置 + QString jsCode = R"( + // 清除现有的敌人标记 + if (typeof clearEnemyMarkers === 'function') { + clearEnemyMarkers(); } - }); - - console.log('Enemy markers displayed on map'); - )"; - // 查找地图WebEngineView并执行JavaScript - QList webViews = this->findChildren(); - for (auto webView : webViews) { - if (webView->isVisible()) { - webView->page()->runJavaScript(jsCode, [this](const QVariant &result) { - SystemLogger::getInstance()->logInfo("敌情标记已在地图上显示"); - QMessageBox::information(this, "敌情显示", - "敌情位置已在地图上标记显示!\n\n" - "🔴 红色:高威胁目标\n" - "🟠 橙色:中威胁目标\n" - "🟡 黄色:低威胁目标"); + // 添加敌人标记 + var enemies = [)"; + + // 将数据库中的敌情数据转换为JavaScript数组 + QStringList enemyJsObjects; + qDebug() << "Converting enemy records to JavaScript (Final center: 113.045134, 28.264012):"; + for (const EnemyRecord& record : enemyRecords) { + qDebug() << "Enemy:" << record.id << "Lat:" << record.latitude << "Lng:" << record.longitude << "Threat:" << record.threatLevel; + + QString enemyJs = QString( + "{id: '%1', lat: %2, lng: %3, threat: '%4', status: '%5'}") + .arg(record.id) + .arg(record.latitude, 0, 'f', 6) + .arg(record.longitude, 0, 'f', 6) + .arg(record.threatLevel) + .arg(record.status); + enemyJsObjects.append(enemyJs); + } + + jsCode += enemyJsObjects.join(",\n "); + jsCode += R"( + ]; + + enemies.forEach(function(enemy) { + var color = enemy.threat === '高' ? '#ff3838' : + enemy.threat === '中' ? '#ffa502' : '#00a8ff'; + if (typeof addEnemyMarker === 'function') { + addEnemyMarker(enemy.id, enemy.lat, enemy.lng, color, enemy.status, enemy.threat); + } }); - break; + + console.log('从数据库加载了 ' + enemies.length + ' 个敌人标记'); + )"; + + qDebug() << "Generated JavaScript code for" << enemyRecords.size() << "enemies"; + + // 查找地图WebEngineView并执行JavaScript + QList webViews = this->findChildren(); + bool mapFound = false; + + for (auto webView : webViews) { + if (webView->isVisible()) { + mapFound = true; + webView->page()->runJavaScript(jsCode, [this, enemyRecords](const QVariant &result) { + SystemLogger::getInstance()->logInfo(QString("敌情标记已在地图上显示:%1个目标").arg(enemyRecords.size())); + }); + break; + } + } + + if (!mapFound) { + SystemLogger::getInstance()->logError("未找到地图显示组件"); + } else { + m_enemyDisplayVisible = true; } } }