完善敌情显示功能,实现地图标记切换和位置优化

- 实现敌情显示切换功能:点击可显示/隐藏敌人标记,无弹窗干扰
- 优化敌人标记样式:移除文字,使用纯色圆形标记,根据威胁等级显示不同颜色和大小
- 调整地图中心点:向北移动200米到最佳观察位置 (113.045134, 28.264012)
- 优化敌人分布:减少到15个敌人,均匀分布在120米范围内
- 修复JavaScript编码问题:解决中文字符导致的标记显示失败
- 添加数据库更新脚本:支持敌人位置批量调整和范围控制
pull/8/head
123 6 days ago
parent d0a98be624
commit 4cf742a6ea

@ -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;

@ -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;

@ -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;

@ -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, '', '', '');

@ -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; ///< 右侧功能面板组件

@ -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 = '<div style="' +
'width: ' + iconSize[0] + 'px; ' +
'height: ' + iconSize[1] + 'px; ' +
'background-color: ' + markerColor + '; ' +
'border: 2px solid #fff; ' +
'border-radius: 50%; ' +
'cursor: pointer; ' +
'box-shadow: 0 3px 8px rgba(0,0,0,0.4); ' +
'transition: transform 0.2s ease; ' +
'" onmouseover="this.style.transform=\'scale(1.2)\'" onmouseout="this.style.transform=\'scale(1)\'"></div>';
// 创建敌人标记
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: '<div style="padding:10px;min-width:200px;background:#fff;border-radius:5px;">' +
'<h3 style="margin:0;color:#333;font-size:16px;">🎯 敌人信息</h3>' +
'<hr style="margin:8px 0;border:none;border-top:1px solid #eee;">' +
'<p style="margin:5px 0;color:#666;"><strong>敌人ID:</strong> ' + enemyId + '</p>' +
'<p style="margin:5px 0;color:#666;"><strong>威胁等级:</strong> <span style="color:' + markerColor + ';font-weight:bold;">' + threatLevel + '</span></p>' +
'<p style="margin:5px 0;color:#666;"><strong>位置:</strong> ' + latitude.toFixed(6) + ', ' + longitude.toFixed(6) + '</p>' +
'<p style="margin:5px 0;color:#666;"><strong>发现时间:</strong> ' + new Date().toLocaleString() + '</p>' +
'</div>',
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);

@ -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<QWebEngineView*> webViews = this->findChildren<QWebEngineView*>();
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<EnemyRecord> 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<QWebEngineView*> webViews = this->findChildren<QWebEngineView*>();
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<QWebEngineView*> webViews = this->findChildren<QWebEngineView*>();
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;
}
}
}

Loading…
Cancel
Save