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() + '
' + + '