调整线程结构,新增接收外部实时数据的线程总线,采用总分结构,内部子线程从数据总线程中获取数据;新增基于地形的碰撞检测功能;新引入侧边消息通知功能。调整三维地球初始化地点为中国。

master
cbwu 2 years ago
parent fa6b6d00a4
commit 50bd3efe6a

@ -13,6 +13,7 @@ SOURCES += \
angle.cpp \
bindroutedialog.cpp \
bindroutetablemodel.cpp \
collisiondetectionthread.cpp \
computeoffsetpositiondialog.cpp \
displayroutedialog.cpp \
geocomputation.cpp \
@ -35,6 +36,7 @@ SOURCES += \
mycheckbox.cpp \
plane.cpp \
plane3d.cpp \
realtimepositioninfothread.cpp \
routeglobalvariant.cpp \
saveroutedialog.cpp \
scenecontrol.cpp \
@ -52,6 +54,7 @@ HEADERS += \
angle.h \
bindroutedialog.h \
bindroutetablemodel.h \
collisiondetectionthread.h \
computeoffsetpositiondialog.h \
displayroutedialog.h \
exportsDefine.h \
@ -74,6 +77,7 @@ HEADERS += \
mycheckbox.h \
plane.h \
plane3d.h \
realtimepositioninfothread.h \
routeglobalvariant.h \
saveroutedialog.h \
scenecontrol.h \
@ -176,11 +180,13 @@ win32{
DESTDIR = "../../sample/release/x64"
LIBS += -L"../../sample/release/x64" -lExtensions4Qt
LIBS += -L"$$PWD/lib/lib_x64" -lerkir
LIBS += -L"$$PWD/lib/lib_x64" -lQNotify
LIBPATH = "../../lib/lib_x64"
}else{
DESTDIR = "../release/x86"
LIBS += -L"../release/x86" -lExtensions4Qt
LIBS += -L"$$PWD/lib/lib_x64" -lerkir
LIBS += -L"$$PWD/lib/lib_x64" -lQNotify
LIBPATH = "../../lib/lib"
}
LIBS += -lSuToolkit \

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 10.0.2, 2023-07-12T13:14:28. -->
<!-- Written by QtCreator 11.0.0, 2023-07-29T11:34:19. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
@ -76,6 +76,7 @@
<value type="bool" key="ClangTools.BuildBeforeAnalysis">true</value>
<value type="QString" key="ClangTools.DiagnosticConfig">Builtin.DefaultTidyAndClazy</value>
<value type="int" key="ClangTools.ParallelJobs">4</value>
<value type="bool" key="ClangTools.PreferConfigFile">false</value>
<valuelist type="QVariantList" key="ClangTools.SelectedDirs"/>
<valuelist type="QVariantList" key="ClangTools.SelectedFiles"/>
<valuelist type="QVariantList" key="ClangTools.SuppressedDiagnostics"/>
@ -245,12 +246,11 @@
<valuelist type="QVariantList" key="CustomOutputParsers"/>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:D:/supermap-iobjectscpp/MyProject/MapDisplay/MapDisplay.pro</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">D:/supermap-iobjectscpp/MyProject/MapDisplay/MapDisplay.pro</value>
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
<value type="QString" key="RunConfiguration.WorkingDirectory.default">D:/supermap-iobjectscpp/MyProject/build-MapDisplay-Desktop_Qt_5_15_2_MSVC2019_64bit-Release/../../sample/release/x64</value>
</valuemap>

Binary file not shown.

After

Width:  |  Height:  |  Size: 616 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 923 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 934 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 964 B

Binary file not shown.

@ -0,0 +1,275 @@
#include "collisiondetectionthread.h"
#include "qdebug.h"
#include <QPointF>
//#pragma execution_character_set("utf-8")
CollisionDetectionThread::CollisionDetectionThread(QMapControl* pMapControl,QObject *parent)
: QObject{parent}
{
// trayIcon = new QSystemTrayIcon(this);
this->detectFlag = false;
this->endFlag = false;
this->pMapControl = pMapControl;
this->ms = 1000;
this->collisionX = -1;
this->collisionY = -1;
resetWarning();
}
CollisionDetectionThread::~CollisionDetectionThread()
{
// delete trayIcon;
}
//执行地形碰撞检测子线程逻辑
void CollisionDetectionThread::working(double lon,double lat,double relativeAlititude,double heading,double speed)
{
double detectDist = speed * 60;//计算探测距离
int offsetDist = 10; //偏移距离,考虑到左右机翼长度
//计算当前坐标点垂直左右偏点
QPointF curLPointOffset = geoComputation.getDestinationPoint(lon,lat,heading-90,offsetDist);
QPointF curRPointOffset = geoComputation.getDestinationPoint(lon,lat,heading+90,offsetDist);
QList<QPointF> ptList;
ptList.append(curLPointOffset);
ptList.append(QPointF(lon,lat));
ptList.append(curRPointOffset);
double collisionDistance = -1;
QPointF collisionPt;
double collisionAlititude;
foreach(QPointF pt,ptList)
{
QPointF destPt = geoComputation.getDestinationPoint(pt.x(),pt.y(),heading,detectDist);
UGPoint2D pntView(pt.x(),pt.y());//观察点
UGPoint2D pntObject(destPt.x(),destPt.y()); //目标点
UG3DAnalyst::SingleResult* result = spatialAnalysis.DoublePointVisibility(pMapControl,pntView,pntObject,relativeAlititude);
if(!result->bVisible)
{
//计算碰撞距离
double tmpDist = geoComputation.getSphericalDistance(pt.x(),pt.y(),result->pnt3D.x,result->pnt3D.y);
if(collisionDistance<0)
{
collisionDistance = tmpDist;
collisionPt.setX(result->pnt3D.x);
collisionPt.setY(result->pnt3D.y);
collisionAlititude = result->pnt3D.z;
}
else if(tmpDist<collisionDistance)
{//获取距离最近的一个碰撞点
collisionDistance = tmpDist;
collisionPt.setX(result->pnt3D.x);
collisionPt.setY(result->pnt3D.y);
collisionAlititude = result->pnt3D.z;
}
}
};
if(collisionDistance<0) return;
else
{
double collisionLon = collisionPt.x();
double collisionLat = collisionPt.y();
// qDebug()<<"*******curLon:"<<QString::number(lon,'f',6)<<" curLat:"<<QString::number(lat,'f',6)<<" collisionLon:"<<QString::number(collisionLon,'f',6)<<" collisionLat:"<<QString::number(collisionLat,'f',6);
//判断是否同一碰撞点,不是的话进行预警重置
if(!isIdenticalCollisionPoint(collisionLon,collisionLat)) resetWarning();
//预警逻辑实现
int collisionTime = collisionDistance/speed;
/***********************预警提示**************************/
showWarningNotify(collisionTime,collisionDistance,collisionAlititude);
}
/*
//计算目标点
QPointF destPoint = geoComputation.getDestinationPoint(lon,lat,heading,detectDist);
// QPointF destLPointOffset = geoComputation.getDestinationPoint(curLPointOffset.x(),curLPointOffset.y(),heading,detectDist);
// QPointF destRPointOffset = geoComputation.getDestinationPoint(curRPointOffset.x(),curRPointOffset.x(),heading,detectDist);
// qDebug()<<"*******lon:"<<QString::number(destPoint.x(),'f',6)<<" lat:"<<QString::number(destPoint.y(),'f',6);
//进行通视分析
UGPoint2D pntView(lon,lat);//观察点
UGPoint2D pntObject(destPoint.x(),destPoint.y()); //目标点
UG3DAnalyst::SingleResult* result = spatialAnalysis.DoublePointVisibility(pMapControl,pntView,pntObject,relativeAlititude);
if(result->bVisible)
{//两点通视,无障碍,不做任何处理
return;
}
else
{//发现碰撞点,进行预警提示
//第一碰撞点
double collisionLon = result->pnt3D.x;
double collisionLat = result->pnt3D.y;
qDebug()<<"*******curLon:"<<QString::number(lon,'f',6)<<" curLat:"<<QString::number(lat,'f',6)<<" collisionLon:"<<QString::number(collisionLon,'f',6)<<" collisionLat:"<<QString::number(collisionLat,'f',6);
//判断是否同一碰撞点,不是的话进行预警重置
if(!isIdenticalCollisionPoint(collisionLon,collisionLat)) resetWarning();
//计算碰撞距离(m)
double collisionDistance = geoComputation.getSphericalDistance(lon,lat,collisionLon,collisionLat);
//预警逻辑实现
int collisionTime = collisionDistance/speed;
//预警提示
showWarningNotify(collisionTime,collisionDistance,result->pnt3D.z);
}
*/
// this->detectFlag = false;
}
void CollisionDetectionThread::start(int ms)
{
emit requestPositionInfo(ms);
}
//接收飞机位置信息
void CollisionDetectionThread::receiveLocationData(QList<double> lon,QList<double> lat,QList<double> relativeAlititude,
QList<double> heading,QList<double> speed)
{
// this->currentLat1 = currentLat1;
// this->currentLon1 = currentLon1;
// this->heading = heading;
// this->relativeAltitude = relativeAltitude;
// this->speed = speed;
// qDebug()<<"*********************Lon:"<<lon.takeLast();
if(lon.isEmpty()) return;
for(int i=0;i<lon.size();i++)
{
working(lon.at(i),lat.at(i),relativeAlititude.at(i),heading.at(i),speed.at(i));
}
// this->detectFlag = true;
}
//关闭线程
void CollisionDetectionThread::closedCollisionDetection()
{
emit stopSendData();//通知RealTimePositionInfoThread停止发送数据
}
//判断是否同一碰撞点
bool CollisionDetectionThread::isIdenticalCollisionPoint(double collisionLon,double collisionLat)
{
UGPoint2D pt(collisionLon,collisionLat);
UGDatasetRasterPtr datasetRaster = pMapControl->getDemDataSet(pt);
UGPoint pntImg;
datasetRaster->XYToImg(pt,pntImg);
datasetRaster = NULL;
// qDebug()<<"**************x:"<<pntImg.x<<" y:"<<pntImg.y;
// qDebug()<<"*****collisionX:"<<this->collisionX<<" y:"<<this->collisionY;
// if(this->collisionX == pntImg.x && this->collisionY==pntImg.y)
// {//同一碰撞点
// qDebug()<<"**************true:";
// return true;
// }
if(abs(this->collisionX - pntImg.x)<=1 && abs(this->collisionY-pntImg.y)<=1)//设置1像素的容差
{//同一碰撞点
qDebug()<<"**************true:";
return true;
}
else
{//不是同一碰撞点,更新碰撞点记录
// qDebug()<<"******imgX:"<<pntImg.x<<" collisionX:"<<this->collisionX<<" imgY:"<<pntImg.y<<" collisionY:"<<this->collisionY;
this->collisionX = pntImg.x;
this->collisionY = pntImg.y;
return false;
}
}
//重置预警
void CollisionDetectionThread::resetWarning()
{
this->highWarning = false;
this->middleWarning = false;
this->lowWarning = false;
}
//显示预警通知
void CollisionDetectionThread::showWarningNotify(int collisionTime,int collisionDist,int collisionHeight)
{
// qDebug()<<"*************************showWarningNotify:";
QString title;
QString message = "";
// QString message = QString(u8"前方大约") + QString::number(collisionTime) + QString("s ") + QString(u8"后有") + QString::number(collisionHeight) + QString("m ") + QString("地形障碍物 ");
message += "前方" + QString::number(collisionDist) + "m存在高度为" + QString::number(collisionHeight) + "m的地形障碍物;"
+ "大约" + QString::number(collisionTime) + "s到达;" + "请尽快提高飞行高度!";
// qDebug()<<"*************************message:"<<message;
QVariantMap data;
if(collisionTime>40)
{
if(lowWarning) return;
title = "三级碰撞黄色警告!";
data["icon"] = ":/Resources/WarningLevel3.png";
qDebug()<<"*********message3:"<<message;
emit showNotify(title,message,data);
this->lowWarning = true;
}else if(collisionTime>20)
{
if(middleWarning) return;
title = "二级碰撞橙色警告!";
data["icon"] = ":/Resources/WarningLevel2.png";
qDebug()<<"**********message2:"<<message;
emit showNotify(title,message,data);
this->middleWarning = true;
}else if(collisionTime<=20)
{
if(highWarning) return;
title = "一级碰撞红色警告!";
data["icon"] = ":/Resources/WarningLevel1.png";
qDebug()<<"***********message1:"<<message;
emit showNotify(title,message,data);
this->highWarning = true;
}
// notifyManager->notify(title,message,data);
}
/********************************测试线程:发送飞机实时位置************************************/
SendDataTestThread::SendDataTestThread(QObject *parent): QObject{parent}
{
}
void SendDataTestThread::working()
{
// qDebug()<<"***************************SendDataTestThread";
pt.setX(119.668);
pt.setY(32.23);
// int i = 0;
m_timer = new QTimer;
connect(m_timer,&QTimer::timeout,this,[=](){
generateData();
emit sendPositionData(lon,lat,relativeAlititude,heading,speed);
});
m_timer->start(200);
}
void SendDataTestThread::stopGenerateData()
{
m_timer->stop();
delete m_timer;
// this->deleteLater();
qDebug()<<"*******************************stopGenerateData";
}
void SendDataTestThread::generateData()
{
// qDebug() << "SendDataTestThread address: " << QThread::currentThread();
lon.clear();
lat.clear();
heading.clear();
speed.clear();
relativeAlititude.clear();
pt = geoComputation.getDestinationPoint(pt.x(),pt.y(),90,4);
// qDebug()<<"***********lon:"<<QString::number(pt.x(),'f',6)<<" lat:"<<QString::number(pt.y(),'f',6);
lon.append(pt.x());
lat.append(pt.y());
heading.append(90);
speed.append(20);
relativeAlititude.append(90);
}

@ -0,0 +1,122 @@

#ifndef COLLISIONDETECTIONTHREAD_H
#define COLLISIONDETECTIONTHREAD_H
/*
* @cbwu
* @brief 线
*/
//#if _MSC_VER >= 1600
//#pragma execution_character_set("utf-8")
//#endif
#include <QApplication>
#include <QObject>
#include <QIcon>
#include <QSystemTrayIcon>
#include <QList>
#include <QTimer>
#include <QThread>
#include "qmapcontrol.h"
#include "geocomputation.h"
#include "geospatialanalysis.h"
#include "routeglobalvariant.h"
class CollisionDetectionThread : public QObject
{
Q_OBJECT
public:
explicit CollisionDetectionThread(QMapControl* pMapControl,QObject *parent = nullptr);
~CollisionDetectionThread();
//执行子线程业务逻辑
void working(double lon,double lat,double relativeAlititude,double heading,double speed);
void start(int ms);
public slots:
//接收飞机状态信息
void receiveLocationData(QList<double> lon,QList<double> lat,QList<double> relativeAlititude,
QList<double> heading,QList<double> speed);
//停止检测
void closedCollisionDetection();
signals:
void requestPositionInfo(int ms);//请求接收数据
void stopSendData();//停止接收数据
void showNotify(QString title,QString body,QVariantMap data);
private:
//判断是否同一碰撞点
bool isIdenticalCollisionPoint(double collisionLon,double collisionLat);
//重置预警
void resetWarning();
//显示预警通知
void showWarningNotify(int collisionTime,int collisionDist,int collisionHeight);
private:
int ms; //探测时间间隔
// double currentLon1; //飞机当前经度
// double currentLat1; //飞机当前纬度
// double heading; //航向角
// double relativeAltitude; //相对高度
// double speed;//飞行速度(m/s)
// const double detectDist = 500; //探测距离
QMapControl* pMapControl;
GeoComputation geoComputation;
GeoSpatialAnalysis spatialAnalysis;
//历史碰撞点
int collisionX;
int collisionY;
//预警等级
bool highWarning;
bool middleWarning;
bool lowWarning;
// QSystemTrayIcon *trayIcon;
// QIcon icon;
//探测标志
bool detectFlag;
bool endFlag;
};
/********************发数据测试线程**************************/
class SendDataTestThread : public QObject
{
Q_OBJECT
public:
explicit SendDataTestThread(QObject *parent = nullptr);
// ~SendDataTestThread();
//执行子线程业务逻辑
void working();
public slots:
void stopGenerateData();
private:
void generateData();
signals:
void sendPositionData(QList<double> lon,QList<double> lat,QList<double> relativeAlititude,
QList<double> heading,QList<double> speed);
void sendPositionData1(QList<double> lon,QList<double> lat,QList<double> heading);
void sendTest(int i);
private:
QPointF pt;
QList<double> lon, lat, heading,speed,relativeAlititude;
QTimer* m_timer;
bool stopFlag = false;
GeoComputation geoComputation;
};
#endif // COLLISIONDETECTIONTHREAD_H

@ -1,4 +1,4 @@

#include "geospatialanalysis.h"
#include <QMessageBox>
@ -10,8 +10,10 @@ GeoSpatialAnalysis::GeoSpatialAnalysis()
/*@brief 两点间的可视性
* @param pntView
* @param pntObject
* @param relativeAltitude 0
* @tolerance
*/
UG3DAnalyst::SingleResult *GeoSpatialAnalysis::DoublePointVisibility(QMapControl* pMapControl,UGPoint2D pntView, UGPoint2D pntObject)
UG3DAnalyst::SingleResult *GeoSpatialAnalysis::DoublePointVisibility(QMapControl* pMapControl,UGPoint2D pntView, UGPoint2D pntObject,double relativeAltitude,int tolerance)
{
//通过下面的方法首先判断点所在的位置是否存在高程数据;
UGDatasetRasterPtr viewPtDataset = pMapControl->getDemDataSet(pntView);
@ -38,21 +40,23 @@ UG3DAnalyst::SingleResult *GeoSpatialAnalysis::DoublePointVisibility(QMapControl
//高程值需根据x,y查询数据集得到
//得到当前测量点的高程值
// 1.首先将坐标点转换为栅格数据集对应的行和列
UGPoint pntviewImg;
double altitude;
UGPoint pntviewImg;//观察点
double altitude;//地形高度
datasetRaster->XYToImg(pntView,pntviewImg);
altitude = datasetRaster->GetValue(pntviewImg.x,pntviewImg.y);
pntView3D.x = pntView.x;
pntView3D.y = pntView.y;
pntView3D.z = altitude;
// pntView3D.z = altitude + relativeAltitude - tolerance;
pntView3D.z = relativeAltitude - tolerance; //用于测试,把相对高度当成海拔高度
UGPoint pntObjectImg;
//坐标点转换为栅格数据集对应的行和列
datasetRaster->XYToImg(pntObject,pntObjectImg);
altitude = datasetRaster->GetValue(pntObjectImg.x,pntObjectImg.y);
//目标点
// UGPoint pntObjectImg;
// //坐标点转换为栅格数据集对应的行和列
// datasetRaster->XYToImg(pntObject,pntObjectImg);
// altitude = datasetRaster->GetValue(pntObjectImg.x,pntObjectImg.y);
pntObject3D.x = pntObject.x;
pntObject3D.y = pntObject.y;
pntObject3D.z = altitude;
pntObject3D.z = pntView3D.z;
//进行通视分析查询;
UG3DAnalyst::SingleResult* result = visAnalsyt.IsVisible(datasetRaster,pntView3D,pntObject3D);

@ -22,7 +22,7 @@ public:
GeoSpatialAnalysis();
//两点间的可视性
UG3DAnalyst::SingleResult* DoublePointVisibility(QMapControl* pMapControl,UGPoint2D pntView, UGPoint2D pntObject);
UG3DAnalyst::SingleResult* DoublePointVisibility(QMapControl* pMapControl,UGPoint2D pntView, UGPoint2D pntObject,double relativeAltitude=0,int tolerance=0);
private:

@ -0,0 +1,29 @@
#ifndef ARRANGEWND_H
#define ARRANGEWND_H
#include <QWidget>
#include <QMouseEvent>
#include <QPropertyAnimation>
#include "NotifyManager.h"
#include "QNotify_global.h"
class NotifyManager;
// 排列父界面为什么要定义这个类就是要同时作为NotifyWidget和NotifyCountWidget的父类好让NotifyCountWidget始终在NotifyWidget的上方
class QNOTIFY_EXPORT ArrangedWidget : public QWidget
{
Q_OBJECT
public:
explicit ArrangedWidget(NotifyManager *manager, QWidget *parent = 0);
void showArranged(int posIndex); // 根据通知在队列中的索引,来设置其的位置,相当于更新排序
signals:
void visibleChanged(bool visible); // 界面可见状态改变的信号
protected:
NotifyManager *m_manager;
int m_posIndex;
};
#endif // ARRANGEWND_H

@ -0,0 +1,58 @@
#ifndef NOTIFYMANAGER_H
#define NOTIFYMANAGER_H
#include <QtCore>
#include <QApplication>
#include <QScreen>
#include "QNotify_global.h"
class NotifyWidget;
class NotifyCountWidget;
class QNOTIFY_EXPORT NotifyManager : public QObject
{
Q_OBJECT
public:
explicit NotifyManager( QObject *parent = 0);
void notify(const QString &title, const QString &body, const QVariantMap &data = QVariantMap()); // 弹出通知框
void setMaxCount(int count); // 设置通知框的最大数目
int displayTime() const; // 获取通知框显示时间
void setDisplayTime(int displayTime); // 设置通知框显示时间
int animateTime() const; // 获取动画时间
void setAnimateTime(int animateTime); // 设置动画时间
int spacing() const; // 获取通知框之间的间距
void setSpacing(int spacing); // 设置通知框之间的间距
QPoint cornerPos() const; // 获取最下面的通知框的右下角坐标
void setCornerMargins(int right, int bottom); // 传入边距以设置最下面的通知的右下角坐标
QSize notifyWndSize() const; // 获取通知框的尺寸
void setNotifyWndSize(int width, int height); // 设置通知框的尺寸
QString defaultIcon() const; // 获取默认图标的路径
void setDefaultIcon(const QString &defaultIcon); // 设置默认图标
QString styleSheet(const QString &theme = "default") const; // 获取指定theme的样式
void setStyleSheet(const QString &styleSheet, const QString &theme = "default"); // 设置指定theme的样式
void setShowQueueCount(bool isShowQueueCount); // 设置是否显示队列的通知数目
signals:
void notifyDetail(const QVariantMap &data);
private:
void showNext(); // 显示下一条通知
void showQueueCount(); // 显示队列的通知数目
QQueue<QVariantMap> m_dataQueue; // 存放标题栏和内容数据的队列
QList<NotifyWidget *> m_notifyList; // 通知框列表
NotifyCountWidget *m_notifyCount; // 队列的剩余通知数目界面
int m_maxCount; // 通知框的最大数目
bool m_isShowQueueCount; // 是否显示队列的剩余通知数目
int m_displayTime; // 通知框显示时间
int m_animateTime; // 动画时间
int m_spacing; // 通知框之间的间距
QPoint m_cornerPos; // 最下面的通知框的右下角坐标
QSize m_notifyWndSize; // 通知框的尺寸
QString m_defaultIcon; // 默认图标
QMap<QString, QString> m_styleSheets; // 存放多个theme的样式的map
};
#endif // NOTIFYMANAGER_H

@ -0,0 +1,47 @@
#ifndef NOTIFYWND_H
#define NOTIFYWND_H
#include <QLabel>
#include <QPushButton>
#include <QBoxLayout>
#include <QGraphicsDropShadowEffect>
#include "ArrangedWidget.h"
#include "QNotify_global.h"
// 通知框
class QNOTIFY_EXPORT NotifyWidget : public ArrangedWidget
{
Q_OBJECT
public:
explicit NotifyWidget(NotifyManager *manager, QWidget *parent = 0);
QVariantMap data() const; // 获取数据
void setData(const QVariantMap &data); // 设置数据
private:
QVariantMap m_data; // 存放数据的map
QFrame *m_pFrameBack; // 背景界面
QLabel *m_pLabIcon; // 图标标签
QLabel *m_pLabTitle; // 标题标签
QLabel *m_pLabBody; // 内容标签
QPushButton *m_pBtnClose; // 关闭按钮
};
// 队列中的剩余通知数目
class QNOTIFY_EXPORT NotifyCountWidget : public ArrangedWidget
{
Q_OBJECT
public:
explicit NotifyCountWidget(NotifyManager *manager, QWidget *parent = 0);
void setCount(int count); // 设置剩余通知数目
private:
QLabel *m_pLabIcon;
QLabel *m_pLabCount;
QPropertyAnimation *flickerAnim;
};
#endif // NOTIFYWND_H

@ -0,0 +1,12 @@
#ifndef QNOTIFY_GLOBAL_H
#define QNOTIFY_GLOBAL_H
#include <QtCore/qglobal.h>
#if defined(QNOTIFY_LIBRARY)
# define QNOTIFY_EXPORT Q_DECL_EXPORT
#else
# define QNOTIFY_EXPORT Q_DECL_IMPORT
#endif
#endif // QNOTIFY_GLOBAL_H

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -31,7 +31,6 @@ private:
QStringList terrianPathList;
QMutex m_mutex;
};
#endif // LOADSCENEDATATHREAD_H

@ -1,10 +1,22 @@
#include "mainwindow.h"
#include "mainwindow.h"
#include <QApplication>
#include<QMetaType>
#include <QTextCodec>
Q_DECLARE_METATYPE(QVector<double>);
int main(int argc, char *argv[])
{
// QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
QApplication a(argc, argv);
qRegisterMetaType<QList<double>>("QList<double>");
qRegisterMetaType<QMap<int,QList<double>>>("QMap<int,QList<double>>&");
// QTextCodec *codec = QTextCodec::codecForName("UTF-8");
// QTextCodec::setCodecForTr(codec);
// QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());
// QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());
MainWindow w;
w.show();
return a.exec();

@ -1,12 +1,14 @@

#include "mainwindow.h"
#include "FileParser/UGModelConfigParams.h"
#include "collisiondetectionthread.h"
#include "computeoffsetpositiondialog.h"
#include "displayroutedialog.h"
#include "geospatialanalysis.h"
#include "importscenedatadialog.h"
#include "maplocationdialog.h"
#include "qregularexpression.h"
#include "realtimepositioninfothread.h"
#include "routeglobalvariant.h"
#include "ui_mainwindow.h"
@ -33,11 +35,14 @@
#include <QProgressDialog>
#include <QRegularExpressionValidator>
#include <QThreadPool>
#include <QSystemTrayIcon>
#include "math.h"
#include "cmath"
#include "mapdatamaneger.h"
#include "loadscenedatathread.h"
#include "symbolresources.h"
#include "QNotify/NotifyManager.h"
//三维
#include "sceneview.h"
#include "workspace.h"
@ -102,10 +107,8 @@
//#include "FileParser/UGFileParserTile.h"
//#include "FileParser/UGSimpleConfigParams.h"
//#include "FileParser/UGFileParseVector.h"
#include "Symbol/UGMarkerSymbolLib.h"
#include "erkir/sphericalpoint.h"
//工作空间及数据源默认存储路径及别名
const QString wsName = "MapWorkspace"; //工作空间别名
@ -386,26 +389,20 @@ MainWindow::MainWindow(QWidget *parent)
QString demName = "ASTGTMV003_N32E119_dem";
qMapControl->addDEMDataset(demName);
UGPoint2D ptView(119.703784,32.228956);
UGPoint2D ptObject(119.707676,32.227302);
GeoSpatialAnalysis geoSAnalysis;
UG3DAnalyst::SingleResult* result = geoSAnalysis.DoublePointVisibility(qMapControl,ptView,ptObject);
if(!result==NULL)
{
qDebug()<<"*******************bVisible:"<<result->bVisible;
qDebug()<<"*******************x:"<<result->pnt3D.x;
qDebug()<<"*******************y:"<<result->pnt3D.y;
qDebug()<<"*******************z:"<<result->pnt3D.z;
}
erkir::spherical::Point p1{ 52.205, 0.119 };
erkir::spherical::Point p2{ 48.857, 2.351 };
auto d = p1.distanceTo(p2); // 404.3 km
// UGPoint2D ptView(119.708645,32.234523);
// UGPoint2D ptObject(119.711544,32.223927);
// GeoSpatialAnalysis geoSAnalysis;
// UG3DAnalyst::SingleResult* result = geoSAnalysis.DoublePointVisibility(qMapControl,ptView,ptObject,14);
// if(!result==NULL)
// {
// qDebug()<<"*******************bVisible:"<<result->bVisible;
// qDebug()<<"*******************x:"<<QString::number(result->pnt3D.x,'f',6);
// qDebug()<<"*******************y:"<<QString::number(result->pnt3D.y,'f',6);
// qDebug()<<"*******************z:"<<QString::number(result->pnt3D.z,'f',6);
// }
erkir::spherical::Point p3{ 51.4778, -0.0015 };
auto dest = p3.destinationPoint(7794.0, 300.7); // 51.5135°N, 000.0983°W
qDebug()<<"*******************z:"<<abs(-1);
qDebug()<<"*******************z:";
/*
qDebug()<<"****************:" <<QDir("./").absolutePath();
UGDatasetVector* dv = (UGDatasetVector*) m_pWorkspace->GetDataSource(0)->GetDataset(line3DSetAlias).get();
@ -462,6 +459,39 @@ void MainWindow::setupUI(QMainWindow *mainWindow)
//初始化工具条
initMainToolBar(mainWindow);
//初始化消息通知对象
initNotifyManager();
}
//全局消息通知对象初始化设置
void MainWindow::initNotifyManager()
{
notifyManager = new NotifyManager(this);
notifyManager->setMaxCount(5);
notifyManager->setDisplayTime(3000);
notifyManager->setNotifyWndSize(500, 140);
notifyManager->setStyleSheet("#notify-background {"
"background: black;"
"}"
"#notify-title{"
"font: bold 24px 微软雅黑;"
"color: #eeeeee;"
"}"
"#notify-body{"
"font: 22px 微软雅黑;"
"color: #dddddd;"
"}"
"#notify-close-btn{ "
"border: 0;"
"color: #999999;"
"}"
"#notify-close-btn:hover{ "
"background: #444444;"
"}", "black");
// QVariantMap data;
// data["icon"] = ":/Resources/WarningLevel1.png"; // 自定义消息图标也可传入QPixmap
// notifyManager->notify("新消息","前方910m存在高度为126m的地形障碍物;大约45s到达;请尽快提高飞行高度!",data);
}
//工作空间初始化
@ -700,6 +730,10 @@ void MainWindow::addMapAction(QMainWindow *mainWindow)
actionImportData = new QAction(QIcon(":/Resources/import_data.png"),"导入数据",this);
mainToolBar->addAction(actionImportData);
/*******************************Test*******************************/
actionTest = new QAction(QIcon("D:/supermap-iobjectscpp/MyProject/MapDisplay/Resources/Test.png"),"测试",this);
mainToolBar->addAction(actionTest);
}
//添加地图右键菜单QAction
@ -739,6 +773,9 @@ void MainWindow::addEditToolAction()
//Map连接信号和槽的函数
void MainWindow::addMapConnect()
{
connect(actionTest,&QAction::triggered,this,&MainWindow::test);
/*********************************以上连接仅用于测试**************************************/
connect(qMapControl,&QMapControl::sendPreviousPoint,inputPosDlg,&ComputeOffsetPositionDialog::acceptPresiousPoint);
connect(inputPosDlg,&ComputeOffsetPositionDialog::sendComputedPoint,qMapControl,&QMapControl::clickedComputedPoint);
@ -2257,7 +2294,151 @@ void MainWindow::contextMenuEvent(QContextMenuEvent *event)
sceneRBtnMenu->exec(QCursor::pos()); // 右键菜单被模态显示出来了
}
// qDebug()<<"*****************contextMenuEvent:";
// qDebug()<<"*****************contextMenuEvent:";
}
//启动接收实时位置数据总线程
void MainWindow::startReceiveRealTimePositionInfoThread()
{
receiveRealTimePositionInfoThread = new QThread;
receiveRealTimePositionInfoTask = new RealTimePositionInfoThread;
receiveRealTimePositionInfoTask->moveToThread(receiveRealTimePositionInfoThread);
receiveRealTimePositionInfoThread->start();
}
//关闭接收实时位置数据总线程
void MainWindow::closeReceiveRealTimePositionInfoThread()
{
receiveRealTimePositionInfoTask->deleteLater();
receiveRealTimePositionInfoThread->quit();
receiveRealTimePositionInfoThread->wait();
receiveRealTimePositionInfoThread->deleteLater();
}
//启动碰撞检测子线程
void MainWindow::startCollisionDetectThread(int ms)
{
collisionThread = new QThread;
collisionDetectionTask = new CollisionDetectionThread(qMapControl);
collisionDetectionTask->moveToThread(collisionThread);
collisionThread->start();
connect(receiveRealTimePositionInfoTask,&RealTimePositionInfoThread::sendCollisionDetectPosInfo,collisionDetectionTask,&CollisionDetectionThread::receiveLocationData);
connect(collisionDetectionTask,&CollisionDetectionThread::requestPositionInfo,receiveRealTimePositionInfoTask,&RealTimePositionInfoThread::startSendCollisionDetectionPosInfo);
connect(this,&MainWindow::startCollisionDetect,collisionDetectionTask,&CollisionDetectionThread::start);
connect(receiveRealTimePositionInfoTask,&RealTimePositionInfoThread::sendCollisionDetectPosInfo,collisionDetectionTask,&CollisionDetectionThread::receiveLocationData);
connect(collisionDetectionTask,&CollisionDetectionThread::showNotify,this,&MainWindow::showNotify);
connect(collisionDetectionTask,&CollisionDetectionThread::closedCollisionDetection,receiveRealTimePositionInfoTask,&RealTimePositionInfoThread::stopSendCollisionDetectionPosInfo);
emit startCollisionDetect(ms);
}
//关闭碰撞检测子线程
void MainWindow::closeCollisionDetectThread()
{
connect(this,&MainWindow::closeCollisionDetect,collisionDetectionTask,&CollisionDetectionThread::closedCollisionDetection);
connect(collisionThread,&QThread::finished,[=](){
collisionThread->deleteLater();
});
emit closeCollisionDetect();
collisionDetectionTask->deleteLater();//任务对象销毁
collisionThread->quit();//结束线程消息循环
collisionThread->wait();
}
//********用于测试*************
void MainWindow::test()
{
/*
QTimer* sendData = new QTimer;
sendData->setInterval(200);
// QPointF pt;
pt.setX(119.668);
pt.setY(32.23);
// QList<double> lon, lat, heading,speed,relativeAlititude;
// GeoComputation geoComputation;
connect(sendData,&QTimer::timeout,this,[=](){
// qDebug()<<"***************TimeOut:";
// int i = 0;
lon.clear();
lat.clear();
heading.clear();
speed.clear();
relativeAlititude.clear();
pt = geoComputation.getDestinationPoint(pt.x(),pt.y(),90,4);
lon.append(pt.x());
lat.append(pt.y());
heading.append(90);
speed.append(20);
relativeAlititude.append(50);
// qDebug()<<"***************lon:"<<lon.takeLast();
// qDebug()<<"***************lat:"<<lat.takeLast();
// qDebug()<<"***************heading:"<<heading.takeLast();
// qDebug()<<"*********************************";
emit sendPositionData1(lon,lat,heading);
});
*/
testFlag = !testFlag;
qDebug()<<"*******************:"<<testFlag;
qDebug() << "MainThread address: " << QThread::currentThread();
/*
receiveRealTimePositionInfoThread = new QThread;
receiveRealTimePositionInfoTask = new RealTimePositionInfoThread;
receiveRealTimePositionInfoTask->moveToThread(receiveRealTimePositionInfoThread);
receiveRealTimePositionInfoThread->start();
collisionThread = new QThread;
collisionDetectionTask = new CollisionDetectionThread(qMapControl);
collisionDetectionTask->moveToThread(collisionThread);
collisionThread->start();
connect(collisionDetectionTask,&CollisionDetectionThread::showNotify,this,&MainWindow::showNotify);
connect(collisionDetectionTask,&CollisionDetectionThread::requestPositionInfo,receiveRealTimePositionInfoTask,&RealTimePositionInfoThread::startSendCollisionDetectionPosInfo);
connect(this,&MainWindow::startCollisionDetect,collisionDetectionTask,&CollisionDetectionThread::start);
connect(receiveRealTimePositionInfoTask,&RealTimePositionInfoThread::sendCollisionDetectPosInfo,collisionDetectionTask,&CollisionDetectionThread::receiveLocationData);
*/
startReceiveRealTimePositionInfoThread();
QThread* sendDataThread = new QThread;
SendDataTestThread* sendDataTask = new SendDataTestThread;
sendDataTask->moveToThread(sendDataThread);
sendDataThread->start();
connect(sendDataTask,&SendDataTestThread::sendPositionData,receiveRealTimePositionInfoTask,&RealTimePositionInfoThread::receiveRealTimePositionInfo);
connect(this,&MainWindow::startGenerate,sendDataTask,&SendDataTestThread::working);
connect(this,&MainWindow::stopGenerate,sendDataTask,&SendDataTestThread::stopGenerateData);
connect(sendDataThread,&QThread::finished,this,[=](){
qDebug()<<"*******************finished:";
});
//二维飞机实时位置显示测试
ShowPlane* m_pShowPlane = new ShowPlane(qMapControl);
Plane* plane = new Plane("plane1",2,119.668,32.23);
m_pShowPlane->addPlane(plane);
connect(m_pShowPlane,&ShowPlane::requestPositionInfo,receiveRealTimePositionInfoTask,&RealTimePositionInfoThread::startSendDisplayInfo);
connect(receiveRealTimePositionInfoTask,&RealTimePositionInfoThread::sendDisplayInfo,m_pShowPlane,&ShowPlane::receivePositionInfo);
if(testFlag)
{
emit startGenerate();
// emit startCollisionDetect(1000);
startCollisionDetectThread(1000);
}
m_pShowPlane->startFly();
// receiveRealTimePositionInfoThread->start();
// receiveRealTimePositionInfoTask->start();
// receiveRealTimePositionInfoTask->working();
// QThread::msleep(1000);
// emit stopGenerate();
// sendDataThread->quit();
if(!testFlag) emit testEnd();
}
void MainWindow::showNotify(QString title, QString body, QVariantMap data)
{
notifyManager->notify(title,body,data);
}
//Slot:打开栅格地图
@ -2303,12 +2484,6 @@ void MainWindow::openRasterMap()
dataSource = NULL;
/************************************test*******************************/
//二维飞机实时位置显示测试
// ShowPlane* m_pShowPlane = new ShowPlane(qMapControl);
// Plane* plane = new Plane("plane1",2,119.668,32.23);
// m_pShowPlane->addPlane(plane);
// m_pShowPlane->startFly();
// UGGeoPoint* p = new UGGeoPoint();
// p->SetX(119.718414);
@ -2357,6 +2532,16 @@ void MainWindow::viewEntire()
//平移浏览地图操作
void MainWindow::pan()
{
// QVariantMap data;
// data["icon"] = ":/Resources/WarningLevel1.png"; // 自定义消息图标也可传入QPixmap
// notifyManager->notify("新消息","消息主体",data);
// QSystemTrayIcon* trayIcon = new QSystemTrayIcon(this);
// QIcon icon1(":/Resources/WarningLevel1.png");
// trayIcon->setIcon(icon1);
// trayIcon->show();
// trayIcon->showMessage("title", "this is a message",icon1,2000);
if(mapType==MapType::Map2D)
qMapControl->Pan();
else if(mapType==MapType::Map3D)

@ -17,6 +17,7 @@
#include "saveroutedialog.h"
#include "bindroutedialog.h"
#include "computeoffsetpositiondialog.h"
#include "QNotify/NotifyManager.h"
//supermap
#include <Workspace/UGWorkspace.h>
@ -25,6 +26,9 @@
#include "scenecontrol.h"
#include "sceneview.h"
#include "realtimepositioninfothread.h"
#include "collisiondetectionthread.h"
namespace UGC
{
class UGWorkspace;
@ -71,6 +75,8 @@ public:
private:
void setupUI(QMainWindow* mainWindow);//声明搭建界面的函数
void initNotifyManager();//全局消息通知对象初始化设置
void initWorkSpace();//工作空间初始化
void initMapControl(); //二维地图容器初始化
@ -114,12 +120,26 @@ protected:
// 如果窗口设置了 Qt::DefaultContextMenu 策略,
// 点击鼠标右键该函数被Qt框架调用
void contextMenuEvent(QContextMenuEvent *event);
public:
//启动|关闭接收实时位置数据总线程
void startReceiveRealTimePositionInfoThread();
void closeReceiveRealTimePositionInfoThread();
//启动|关闭碰撞检测子线程
void startCollisionDetectThread(int ms=1000);
void closeCollisionDetectThread();
private:
Ui::MainWindow *ui;
QStackedWidget* stackedWidget;
QProgressDialog* progressDlg;
NotifyManager* notifyManager;//全局消息通知管理对象
//线程对象
QThread* receiveRealTimePositionInfoThread;//接收外部实时数据线程对象
RealTimePositionInfoThread* receiveRealTimePositionInfoTask;//接收外部实时数据线程任务对象
QThread* collisionThread; //碰撞检测线程对象
CollisionDetectionThread* collisionDetectionTask;//碰撞检测线程任务对象
RBtnMenuType rMenuType;
MapType mapType;
@ -220,14 +240,35 @@ private:
// QThread* loadSceneDataThread;
/**************************Test**************************/
QAction *actionTest;
signals:
void sendAddRouteState(int addState);// 航线是否添加成功信号
void sendSceneDataList(SceneControl* pSceneControl,UGDataSource* pDataSource,QStringList imagePathList,QStringList terrianPathList);
// void closedProgressDialog();
/******************************Test signal************************************/
void testEnd();
void startReceiveData();
void startGenerate();
void stopGenerate();
void sendPositionData1(QList<double> lon,QList<double> lat,QList<double> heading);
void startCollisionDetect(int ms);
void closeCollisionDetect();
private:
bool testFlag = false;
QPointF pt;
QList<double> lon, lat, heading,speed,relativeAlititude;
GeoComputation geoComputation;
// QThread* receiveRealTimePositionInfoThread;
public slots:
void test();//仅用于测试
void showNotify(QString title,QString body,QVariantMap data);
void openRasterMap(); //声明槽函数openRasterMap打开地图操作
void zoomIn();//声明槽函数zoomIn放大地图操作
@ -274,5 +315,8 @@ public slots:
void highLightKMLGeometry(int currentGeometryID,int lastGeometryID); //高亮当前导入的KML 3D几何对象
/********************以下用于测试***********************/
public:
};
#endif // MAINWINDOW_H

@ -6,13 +6,15 @@ Plane::Plane()
}
Plane::Plane(QString planeName,int planeType, double lon, double lat)
Plane::Plane(QString planeName,int planeType, double lon, double lat,double heading)
{
this->planeName = planeName;
m_pGeoPoint = new UGGeoPoint();
m_pGeoPoint->SetX(lon);
m_pGeoPoint->SetY(lat);
this->heading = heading;
m_pGeoPoint->SetStyle(getPlaneStyle(planeType));
}
//设置飞机位置
@ -32,6 +34,11 @@ double Plane::getPointY()
return m_pGeoPoint->GetY();
}
double Plane::getHeading()
{
return this->heading;
}
UGGeoPoint *Plane::getGeometry()
{
return m_pGeoPoint;

@ -16,12 +16,13 @@ class Plane
{
public:
Plane();
Plane(QString planeName,int planeType,double lon=0,double lat=0);
Plane(QString planeName,int planeType,double lon=0,double lat=0,double heading=0);
void setPosition(double lon,double lat); //设置飞机位置
double getPointX();
double getPointY();
double getHeading();
UGGeoPoint* getGeometry();
QString getPlaneName();
@ -35,6 +36,7 @@ private:
double lat;
double lon;
double heading;
QString planeName;
};

@ -0,0 +1,117 @@
#include "realtimepositioninfothread.h"
#include "qdebug.h"
/*
* @brief 线,线
*/
RealTimePositionInfoThread::RealTimePositionInfoThread(QObject *parent)
: QObject{parent}
{
// showPos_timer.setInterval(200);
// showPos_timer.start();
// connect(&showPos_timer,&QTimer::timeout,this,[=](){
// emit sendPos(this->qmapLon[0],this->qmapLat[0],this->qmapHeading[0]);
// });
}
void RealTimePositionInfoThread::working()
{
// qDebug()<<"*************************RealTimePositionInfoThread:"<<QThread::currentThread();
// while(true)
// {
// if(this->qmapLon[0].size()>=MAX_CONTAINER)
// {
// mutex.lock();
// removePositionContainer(50);
// mutex.unlock();
// }
// QThread::msleep(100);
// }
}
//定时任务:发送地形碰撞检测所需位置信息
void RealTimePositionInfoThread::startSendCollisionDetectionPosInfo(int ms)
{
collisionDetect_timer = new QTimer;
connect(collisionDetect_timer,&QTimer::timeout,this,&RealTimePositionInfoThread::collisionDetectTimeout);
collisionDetect_timer->start(ms);
}
//接收实时飞行位置信息
void RealTimePositionInfoThread::receiveRealTimePositionInfo(QList<double> lon, QList<double> lat, QList<double> relativeAlititude, QList<double> heading, QList<double> speed)
{
// qDebug() << "RealTimePositionThread address: " << QThread::currentThread();
// qDebug()<<"*************************receiveRealTimePositionInfo:";
mutex.lock();
// qDebug()<<"*************************size:"<<this->qmapLon[0].size();
if(this->qmapLon[0].size()>=MAX_CONTAINER)
{
removePositionContainer(50);
}
for(int index=0;index<lon.size();index++)//飞机数量
{
this->qmapLon[index].append(lon.at(index));
this->qmapLat[index].append(lat.at(index));
this->qmapRelativeAlititude[index].append(relativeAlititude.at(index));
this->qmapHeading[index].append(heading.at(index));
this->qmapSpeed[index].append(speed.at(index));
}
mutex.unlock();
}
//发送位置信息用于实时显示飞机位置
void RealTimePositionInfoThread::startSendDisplayInfo(int ms)
{
showPos_timer = new QTimer;
connect(showPos_timer,&QTimer::timeout,this,[=](){
// qDebug()<<"*************************RealTimePositionInfoThread:";
emit sendDisplayInfo(this->qmapLon,this->qmapLat,this->qmapHeading);
});
showPos_timer->start(ms);
}
//停止发送数据给碰撞探测子线程
void RealTimePositionInfoThread::stopSendCollisionDetectionPosInfo()
{
collisionDetect_timer->stop();
delete collisionDetect_timer;
}
void RealTimePositionInfoThread::receiveTest(int i)
{
qDebug() << "************************receive i:"<<i;
}
void RealTimePositionInfoThread::removePositionContainer(int count)
{
for(int i=0;i<this->qmapLon.size();i++)
{
for(int j=0;j<count;j++)
{
this->qmapLon[i].pop_front();
this->qmapLat[i].pop_front();
this->qmapRelativeAlititude[i].pop_front();
this->qmapHeading[i].pop_front();
this->qmapSpeed[i].pop_front();
}
}
}
void RealTimePositionInfoThread::collisionDetectTimeout()
{
// qDebug()<<"*****************************collisionDetectTimeout:";
QList<double> lon,lat,relativeAlititude,heading,speed;
mutex.lock();
for(int i=0;i<this->qmapLon.keys().size();i++)
{
lon.append(this->qmapLon[i].takeLast());
lat.append(this->qmapLat[i].takeLast());
relativeAlititude.append(this->qmapRelativeAlititude[i].takeLast());
heading.append(this->qmapHeading[i].takeLast());
speed.append(this->qmapSpeed[i].takeLast());
}
mutex.unlock();
emit sendCollisionDetectPosInfo(lon,lat,relativeAlititude,heading,speed);
}

@ -0,0 +1,70 @@
#ifndef REALTIMEPOSITIONINFOTHREAD_H
#define REALTIMEPOSITIONINFOTHREAD_H
/*
* @brief 线
*/
#include <QObject>
#include <QVector>
#include <QList>
#include <QMap>
#include <QTimer>
#include <QMutex>
#include <QThread>
class RealTimePositionInfoThread : public QObject
{
Q_OBJECT
public:
explicit RealTimePositionInfoThread(QObject *parent = nullptr);
//执行子线程业务逻辑
void working();
void startSendCollisionDetectionPosInfo(int ms);
public slots:
void receiveRealTimePositionInfo(QList<double> lon,QList<double> lat,QList<double> relativeAlititude,
QList<double> heading,QList<double> speed);
//发送位置信息用于实时显示飞机位置
void startSendDisplayInfo(int ms);
//停止发送数据给碰撞探测子线程
void stopSendCollisionDetectionPosInfo();
/***********************Test***********************/
void receiveTest(int i);
signals:
void sendDisplayInfo(QMap<int,QList<double>>& qmapLon,QMap<int,QList<double>>& qmapLat,QMap<int,QList<double>>& qmapHeading);
void sendCollisionDetectPosInfo(QList<double> lon,QList<double> lat,QList<double> relativeAlititude,
QList<double> heading,QList<double> speed);
void sendPos(QList<double> lon,QList<double> lat,QList<double> heading);
private:
QMutex mutex;
//存储飞机的位置信息的列表
QMap<int,QList<double>> qmapLon; //经度
QMap<int,QList<double>> qmapLat; //纬度
QMap<int,QList<double>> qmapRelativeAlititude; //相对高度
QMap<int,QList<double>> qmapHeading; //航向
QMap<int,QList<double>> qmapSpeed; //速度
//容量最大值
const int MAX_CONTAINER = 100;
//数据转发定时器
QTimer* showPos_timer; //用于实时位置显示
QTimer* collisionDetect_timer;//用于地形碰撞检测
private:
//清除部分容器值
void removePositionContainer(int count);
void collisionDetectTimeout();
};
#endif // REALTIMEPOSITIONINFOTHREAD_H

@ -84,5 +84,8 @@
<file>Resources/DeleteNode.png</file>
<file>Resources/Edit1.png</file>
<file>Resources/EditNode1.png</file>
<file>Resources/WarningLevel1.png</file>
<file>Resources/WarningLevel2.png</file>
<file>Resources/WarningLevel3.png</file>
</qresource>
</RCC>

@ -1,5 +1,8 @@
#include "routeglobalvariant.h"
//NotifyManager* notifyManager = NULL; //全局消息通知管理对象初始化
RouteGlobalVariant::RouteGlobalVariant()
{

@ -1,4 +1,4 @@
#ifndef ROUTEGLOBALVARIANT_H
#ifndef ROUTEGLOBALVARIANT_H
#define ROUTEGLOBALVARIANT_H
#include "Base3D/UGStyle3D.h"
@ -7,6 +7,8 @@
#include <QMap>
#include <Toolkit/UGStyle.h>
#include "Base3D/UGTextStyle3D.h"
#include "QNotify/NotifyManager.h"
#include "QNotify/QNotify_global.h"
using namespace UGC;
@ -31,6 +33,9 @@ struct WorkspaceDataName
const UGString Line3DDatasetName = _U("FlightLines3D");
};
//全局消息通知管理对象
//extern NotifyManager* notifyManager; //声明
class RouteGlobalVariant
{
public:

@ -1,4 +1,4 @@
/*
/*
* Author: Jun0x01@github.com
* Date: 2019.06.06
*/
@ -86,6 +86,13 @@ void SceneControl::Initialize(void* pWndHandle, int dpiX, int dpiY)
// pScene->SetDrawMode(UGC::DRAW_SCREEN);
m_pCameraWorld = pScene->CreateCamera(_U("Camera"));
UGCameraState ChinaState;
ChinaState.dLon= UGMathEngine::DegreesToRadians(105);
ChinaState.dLat= UGMathEngine::DegreesToRadians(33);
ChinaState.dHeading = 0;
ChinaState.dTilt=0;
ChinaState.dAltitude=11269380;
m_pCameraWorld->SetCamera(ChinaState);
pScene->GetRenderTarget()->AddViewport(m_pCameraWorld, 0);
m_pRoot3D->SetActiveScene(pScene);

@ -13,8 +13,11 @@ ShowPlane::ShowPlane(QMapControl *pMapControl)
{
m_pMapControl = pMapControl;
addPlaneDyLayer(pMapControl);
this->refreshTime = 500;
pMapControl->GetMap()->SetRefreshFlag(false);
// num_data = 0;
}
ShowPlane::~ShowPlane()
@ -26,17 +29,21 @@ void ShowPlane::startFly()
{
addPlaneToDyLayer();
//每500ms刷新一次
m_timer.setInterval(500);
connect(&m_timer,&QTimer::timeout,this,&ShowPlane::movePlane);
m_timer.start();
// m_timer.setInterval(500);
// connect(&m_timer,&QTimer::timeout,this,&ShowPlane::movePlane);
// m_timer.start();
m_pDynamicLayer->SetVisible(true);
emit requestPositionInfo(this->refreshTime);
}
void ShowPlane::stopFly()
{
m_timer.stop();
// m_timer.stop();
// m_pDynamicLayer->SetVisible(false);
emit rejectPositionInfo();
m_pMapControl->refreshDynamicLayer();
// num_data = 0;
// m_pDynamicLayer->RemoveAll();
// m_planes.clear();
}
@ -50,19 +57,66 @@ void ShowPlane::addPlane(Plane* plane)
//设置刷新时间
void ShowPlane::setRefreshTime(int ms)
{
this->refreshTime = ms;
m_timer.setInterval(ms);
}
void ShowPlane::movePlane()
//接收飞机的位置信息
void ShowPlane::receivePosition(QList<double> lon,QList<double> lat,QList<double> heading)
{
// qDebug()<<"*************************movePlane";
// qDebug()<<"***************lon:"<<lon.takeLast();
/*
mutex.lock();
// qDebug()<<"***************lon:"<<lon.takeLast();
// qDebug()<<"***************lat:"<<lat.takeLast();
// qDebug()<<"***************heading:"<<heading.takeLast();
// qDebug()<<"*********************************receivePosition";
for(int index=0;index<lon.size();index++)
{
this->qmapLon[index].append(lon.at(index));
this->qmapLat[index].append(lat.at(index));
this->qmapHeading[index].append(heading.at(index));
}
// qDebug()<<"************************Lon:"<<this->qmapLon[0].takeLast();
// num_data++;
// movePlane();
if(this->qmapLon[0].size()==MAX) removePositionContainer(20);
mutex.unlock();
*/
m_planes[0]->setPosition(lon.takeLast(),lat.takeLast());
m_pMapControl->refreshDynamicLayer();
}
void ShowPlane::receivePositionInfo(QMap<int, QList<double> > &qmapLon, QMap<int, QList<double> > &qmapLat, QMap<int, QList<double> > &qmapHeading)
{
// this->qmapLon = qmapLon;
// this->qmapLat = qmapLat;
// this->qmapHeading = qmapHeading;
// qDebug()<<"************************show lon:"<<qmapLon[0].takeLast();
mutex.lock();
movePlane(qmapLon,qmapLat,qmapHeading);
mutex.unlock();
// m_planes[0]->setPosition(qmapLon[0].takeLast(),qmapLat[0].takeLast());
// m_pMapControl->refreshDynamicLayer();
}
void ShowPlane::movePlane(QMap<int,QList<double>> qmapLon,QMap<int,QList<double>> qmapLat,QMap<int,QList<double>> qmapHeading)
{
int i = 0;
// if(this->qmapLon[i].isEmpty()) return;
// qDebug()<<"*************************movePlaneLon:";//<<this->qmapLon[0].takeLast();
foreach (Plane* plane, m_planes)
{
qDebug()<<"***************PlaneX:"<<plane->getPointX();
plane->setPosition(plane->getPointX()+0.001,plane->getPointY());
// qDebug()<<"***************PlaneX:"<<plane->getPointX();
plane->setPosition(qmapLon[i].takeLast(),qmapLat[i].takeLast());
i++;
// plane->setPosition(plane->getPointX()+0.001,plane->getPointY());
}
m_pMapControl->refreshDynamicLayer();
// m_pMapControl->Refresh();
}
//添加飞机到动态层
@ -90,7 +144,16 @@ void ShowPlane::addPlaneDyLayer(QMapControl* pMapControl)
m_pDynamicLayer = pDyLayers->GetDynamicLayer(dylayername);
}
pMapControl->GetMap()->SetRefreshFlag(false);
}
//清除部分容器值
void ShowPlane::removePositionContainer(int count)
{
for(int i=0;i<m_planes.count();i++)
{
// this->qmapLon[i].remove(0,count);
// this->qmapLat[i].remove(0,count);
// this->qmapHeading[i].remove(0,count);
}
}

@ -4,6 +4,9 @@
#include <QObject>
#include <QList>
#include <QTimer>
#include <QVector>
#include <QMap>
#include <QMutex>
#include "qmapcontrol.h"
#include "plane.h"
#include "Map/UGDynamicLayer.h"
@ -25,22 +28,51 @@ public:
void addPlane(Plane* plane);
void setRefreshTime(int ms);
public slots:
//接收飞机的位置信息
void receivePosition(QList<double> lon,QList<double> lat,QList<double> heading);
void receivePositionInfo(QMap<int,QList<double>>& qmapLon,QMap<int,QList<double>>& qmapLat,QMap<int,QList<double>>& qmapHeading);
signals:
void requestPositionInfo(int ms);//请求飞机位置信息
void rejectPositionInfo();//停止接收飞机位置信息
//test
void sendPostion(QMapControl* pMapControl,double currentLon1,double currentLat1,double heading,double relativeAltitude,double speed);
private slots:
void movePlane();
private:
void movePlane(QMap<int,QList<double>> qmapLon,QMap<int,QList<double>> qmapLat,QMap<int,QList<double>> qmapHeading);
private:
QMapControl* m_pMapControl;
UGDynamicLayer* m_pDynamicLayer;
QList<Plane*> m_planes;
int refreshTime;
QTimer m_timer;
QMutex mutex;
//存储飞机的位置信息的列表
// QMap<int,QVector<double>> qmapLon; //经度
// QMap<int,QVector<double>> qmapLat; //纬度
// QMap<int,QVector<double>> qmapHeading; //航向
QMap<int,QList<double>>* qmapLon; //经度
QMap<int,QList<double>>* qmapLat; //纬度
QMap<int,QList<double>>* qmapHeading; //航向
//容量最大值
const int MAX = 60;
// int num_data = 0;
private:
void addPlaneToDyLayer(); //添加飞机到动态层
void addPlaneDyLayer(QMapControl* pMapControl); //添加飞机图层
//清除部分容器值
void removePositionContainer(int count);
};
#endif // SHOWPLANE_H

Loading…
Cancel
Save