diff --git a/MapDisplay.pro b/MapDisplay.pro index ad85b646..7afbe757 100644 --- a/MapDisplay.pro +++ b/MapDisplay.pro @@ -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 \ diff --git a/MapDisplay.pro.user b/MapDisplay.pro.user index b4847440..e6dc5738 100644 --- a/MapDisplay.pro.user +++ b/MapDisplay.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId @@ -76,6 +76,7 @@ true Builtin.DefaultTidyAndClazy 4 + false @@ -245,12 +246,11 @@ 2 + false Qt4ProjectManager.Qt4RunConfiguration:D:/supermap-iobjectscpp/MyProject/MapDisplay/MapDisplay.pro D:/supermap-iobjectscpp/MyProject/MapDisplay/MapDisplay.pro - false true true - false true D:/supermap-iobjectscpp/MyProject/build-MapDisplay-Desktop_Qt_5_15_2_MSVC2019_64bit-Release/../../sample/release/x64 diff --git a/Resources/Test.png b/Resources/Test.png new file mode 100644 index 00000000..ed2a0d37 Binary files /dev/null and b/Resources/Test.png differ diff --git a/Resources/WarningLevel1.png b/Resources/WarningLevel1.png new file mode 100644 index 00000000..ad92a38b Binary files /dev/null and b/Resources/WarningLevel1.png differ diff --git a/Resources/WarningLevel2.png b/Resources/WarningLevel2.png new file mode 100644 index 00000000..d17c167e Binary files /dev/null and b/Resources/WarningLevel2.png differ diff --git a/Resources/WarningLevel3.png b/Resources/WarningLevel3.png new file mode 100644 index 00000000..41b63d03 Binary files /dev/null and b/Resources/WarningLevel3.png differ diff --git a/bin/bin_x64/QNotify.dll b/bin/bin_x64/QNotify.dll new file mode 100644 index 00000000..505e5f69 Binary files /dev/null and b/bin/bin_x64/QNotify.dll differ diff --git a/collisiondetectionthread.cpp b/collisiondetectionthread.cpp new file mode 100644 index 00000000..ac1caa1a --- /dev/null +++ b/collisiondetectionthread.cpp @@ -0,0 +1,275 @@ +#include "collisiondetectionthread.h" +#include "qdebug.h" +#include + +//#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 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(tmpDistpnt3D.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:"<bVisible) + {//两点通视,无障碍,不做任何处理 + return; + } + else + {//发现碰撞点,进行预警提示 + //第一碰撞点 + double collisionLon = result->pnt3D.x; + double collisionLat = result->pnt3D.y; + qDebug()<<"*******curLon:"<pnt3D.z); + } + */ +// this->detectFlag = false; +} + +void CollisionDetectionThread::start(int ms) +{ + emit requestPositionInfo(ms); +} + +//接收飞机位置信息 +void CollisionDetectionThread::receiveLocationData(QList lon,QList lat,QList relativeAlititude, + QList heading,QList speed) +{ +// this->currentLat1 = currentLat1; +// this->currentLon1 = currentLon1; +// this->heading = heading; +// this->relativeAltitude = relativeAltitude; +// this->speed = speed; +// qDebug()<<"*********************Lon:"<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:"<collisionX<<" y:"<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:"<collisionX<<" imgY:"<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:"<40) + { + if(lowWarning) return; + title = "三级碰撞黄色警告!"; + data["icon"] = ":/Resources/WarningLevel3.png"; + qDebug()<<"*********message3:"<lowWarning = true; + }else if(collisionTime>20) + { + if(middleWarning) return; + title = "二级碰撞橙色警告!"; + data["icon"] = ":/Resources/WarningLevel2.png"; + qDebug()<<"**********message2:"<middleWarning = true; + }else if(collisionTime<=20) + { + if(highWarning) return; + title = "一级碰撞红色警告!"; + data["icon"] = ":/Resources/WarningLevel1.png"; + qDebug()<<"***********message1:"<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:"<= 1600 +//#pragma execution_character_set("utf-8") +//#endif + +#include +#include +#include +#include +#include +#include +#include +#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 lon,QList lat,QList relativeAlititude, + QList heading,QList 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 lon,QList lat,QList relativeAlititude, + QList heading,QList speed); + + void sendPositionData1(QList lon,QList lat,QList heading); + + void sendTest(int i); + +private: + QPointF pt; + QList lon, lat, heading,speed,relativeAlititude; + QTimer* m_timer; + bool stopFlag = false; + GeoComputation geoComputation; +}; + +#endif // COLLISIONDETECTIONTHREAD_H + + diff --git a/geospatialanalysis.cpp b/geospatialanalysis.cpp index 205223ec..ac33bc55 100644 --- a/geospatialanalysis.cpp +++ b/geospatialanalysis.cpp @@ -1,4 +1,4 @@ - + #include "geospatialanalysis.h" #include @@ -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); diff --git a/geospatialanalysis.h b/geospatialanalysis.h index 65a83bc1..25b1db9a 100644 --- a/geospatialanalysis.h +++ b/geospatialanalysis.h @@ -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: diff --git a/include/QNotify/ArrangedWidget.h b/include/QNotify/ArrangedWidget.h new file mode 100644 index 00000000..f34dbced --- /dev/null +++ b/include/QNotify/ArrangedWidget.h @@ -0,0 +1,29 @@ +#ifndef ARRANGEWND_H +#define ARRANGEWND_H + +#include +#include +#include +#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 diff --git a/include/QNotify/NotifyManager.h b/include/QNotify/NotifyManager.h new file mode 100644 index 00000000..0bab2283 --- /dev/null +++ b/include/QNotify/NotifyManager.h @@ -0,0 +1,58 @@ +#ifndef NOTIFYMANAGER_H +#define NOTIFYMANAGER_H + +#include +#include +#include +#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 m_dataQueue; // 存放标题栏和内容数据的队列 + QList 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 m_styleSheets; // 存放多个theme的样式的map +}; + +#endif // NOTIFYMANAGER_H diff --git a/include/QNotify/NotifyWidget.h b/include/QNotify/NotifyWidget.h new file mode 100644 index 00000000..888a50ea --- /dev/null +++ b/include/QNotify/NotifyWidget.h @@ -0,0 +1,47 @@ +#ifndef NOTIFYWND_H +#define NOTIFYWND_H + + +#include +#include +#include +#include +#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 diff --git a/include/QNotify/QNotify_global.h b/include/QNotify/QNotify_global.h new file mode 100644 index 00000000..c673eaa2 --- /dev/null +++ b/include/QNotify/QNotify_global.h @@ -0,0 +1,12 @@ +#ifndef QNOTIFY_GLOBAL_H +#define QNOTIFY_GLOBAL_H + +#include + +#if defined(QNOTIFY_LIBRARY) +# define QNOTIFY_EXPORT Q_DECL_EXPORT +#else +# define QNOTIFY_EXPORT Q_DECL_IMPORT +#endif + +#endif // QNOTIFY_GLOBAL_H diff --git a/lib/lib_x64/QNotify.dll b/lib/lib_x64/QNotify.dll new file mode 100644 index 00000000..505e5f69 Binary files /dev/null and b/lib/lib_x64/QNotify.dll differ diff --git a/lib/lib_x64/QNotify.exp b/lib/lib_x64/QNotify.exp new file mode 100644 index 00000000..c7b69957 Binary files /dev/null and b/lib/lib_x64/QNotify.exp differ diff --git a/lib/lib_x64/QNotify.ilk b/lib/lib_x64/QNotify.ilk new file mode 100644 index 00000000..9a936cc4 Binary files /dev/null and b/lib/lib_x64/QNotify.ilk differ diff --git a/lib/lib_x64/QNotify.lib b/lib/lib_x64/QNotify.lib new file mode 100644 index 00000000..3ed6ec1e Binary files /dev/null and b/lib/lib_x64/QNotify.lib differ diff --git a/lib/lib_x64/QNotify.pdb b/lib/lib_x64/QNotify.pdb new file mode 100644 index 00000000..24e76ed5 Binary files /dev/null and b/lib/lib_x64/QNotify.pdb differ diff --git a/loadscenedatathread.h b/loadscenedatathread.h index e8904600..5d4badd2 100644 --- a/loadscenedatathread.h +++ b/loadscenedatathread.h @@ -31,7 +31,6 @@ private: QStringList terrianPathList; QMutex m_mutex; - }; #endif // LOADSCENEDATATHREAD_H diff --git a/main.cpp b/main.cpp index fd3e5334..4b9da804 100644 --- a/main.cpp +++ b/main.cpp @@ -1,10 +1,22 @@ -#include "mainwindow.h" +#include "mainwindow.h" #include - +#include +#include +Q_DECLARE_METATYPE(QVector); int main(int argc, char *argv[]) { +// QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); QApplication a(argc, argv); + + qRegisterMetaType>("QList"); + qRegisterMetaType>>("QMap>&"); + +// QTextCodec *codec = QTextCodec::codecForName("UTF-8"); +// QTextCodec::setCodecForTr(codec); +// QTextCodec::setCodecForLocale(QTextCodec::codecForLocale()); +// QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale()); + MainWindow w; w.show(); return a.exec(); diff --git a/mainwindow.cpp b/mainwindow.cpp index 581104b1..5a61f1ce 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -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 #include #include +#include + #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:"<bVisible; - qDebug()<<"*******************x:"<pnt3D.x; - qDebug()<<"*******************y:"<pnt3D.y; - qDebug()<<"*******************z:"<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:"<bVisible; +// qDebug()<<"*******************x:"<pnt3D.x,'f',6); +// qDebug()<<"*******************y:"<pnt3D.y,'f',6); +// qDebug()<<"*******************z:"<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:"<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 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:"<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) diff --git a/mainwindow.h b/mainwindow.h index e9140028..9ebb73b7 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -17,6 +17,7 @@ #include "saveroutedialog.h" #include "bindroutedialog.h" #include "computeoffsetpositiondialog.h" +#include "QNotify/NotifyManager.h" //supermap #include @@ -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 lon,QList lat,QList heading); + void startCollisionDetect(int ms); + void closeCollisionDetect(); + +private: + bool testFlag = false; + QPointF pt; + QList 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 diff --git a/plane.cpp b/plane.cpp index 5a1ed816..5636e42f 100644 --- a/plane.cpp +++ b/plane.cpp @@ -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; diff --git a/plane.h b/plane.h index 75a2742a..9069e4b3 100644 --- a/plane.h +++ b/plane.h @@ -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; }; diff --git a/realtimepositioninfothread.cpp b/realtimepositioninfothread.cpp new file mode 100644 index 00000000..3809a123 --- /dev/null +++ b/realtimepositioninfothread.cpp @@ -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:"<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 lon, QList lat, QList relativeAlititude, QList heading, QList speed) +{ +// qDebug() << "RealTimePositionThread address: " << QThread::currentThread(); +// qDebug()<<"*************************receiveRealTimePositionInfo:"; + mutex.lock(); +// qDebug()<<"*************************size:"<qmapLon[0].size(); + if(this->qmapLon[0].size()>=MAX_CONTAINER) + { + removePositionContainer(50); + } + for(int index=0;indexqmapLon[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:"<qmapLon.size();i++) + { + for(int j=0;jqmapLon[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 lon,lat,relativeAlititude,heading,speed; + mutex.lock(); + for(int i=0;iqmapLon.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); +} diff --git a/realtimepositioninfothread.h b/realtimepositioninfothread.h new file mode 100644 index 00000000..1eab16a6 --- /dev/null +++ b/realtimepositioninfothread.h @@ -0,0 +1,70 @@ +#ifndef REALTIMEPOSITIONINFOTHREAD_H +#define REALTIMEPOSITIONINFOTHREAD_H +/* + * @brief 实时接收飞机位置信息子线程 + */ + +#include +#include +#include +#include +#include +#include +#include + +class RealTimePositionInfoThread : public QObject +{ + Q_OBJECT +public: + explicit RealTimePositionInfoThread(QObject *parent = nullptr); + //执行子线程业务逻辑 + void working(); + + void startSendCollisionDetectionPosInfo(int ms); + +public slots: + void receiveRealTimePositionInfo(QList lon,QList lat,QList relativeAlititude, + QList heading,QList speed); + + //发送位置信息用于实时显示飞机位置 + void startSendDisplayInfo(int ms); + //停止发送数据给碰撞探测子线程 + void stopSendCollisionDetectionPosInfo(); + + /***********************Test***********************/ + void receiveTest(int i); + +signals: + void sendDisplayInfo(QMap>& qmapLon,QMap>& qmapLat,QMap>& qmapHeading); + void sendCollisionDetectPosInfo(QList lon,QList lat,QList relativeAlititude, + QList heading,QList speed); + + void sendPos(QList lon,QList lat,QList heading); + +private: + QMutex mutex; + + //存储飞机的位置信息的列表 + QMap> qmapLon; //经度 + QMap> qmapLat; //纬度 + QMap> qmapRelativeAlititude; //相对高度 + QMap> qmapHeading; //航向 + QMap> qmapSpeed; //速度 + + //容量最大值 + const int MAX_CONTAINER = 100; + + //数据转发定时器 + QTimer* showPos_timer; //用于实时位置显示 + QTimer* collisionDetect_timer;//用于地形碰撞检测 + + +private: + //清除部分容器值 + void removePositionContainer(int count); + + void collisionDetectTimeout(); + +}; + +#endif // REALTIMEPOSITIONINFOTHREAD_H diff --git a/res.qrc b/res.qrc index f0900d3b..85acaace 100644 --- a/res.qrc +++ b/res.qrc @@ -84,5 +84,8 @@ Resources/DeleteNode.png Resources/Edit1.png Resources/EditNode1.png + Resources/WarningLevel1.png + Resources/WarningLevel2.png + Resources/WarningLevel3.png diff --git a/routeglobalvariant.cpp b/routeglobalvariant.cpp index 66b4686e..c6882b77 100644 --- a/routeglobalvariant.cpp +++ b/routeglobalvariant.cpp @@ -1,5 +1,8 @@ #include "routeglobalvariant.h" +//NotifyManager* notifyManager = NULL; //全局消息通知管理对象初始化 + + RouteGlobalVariant::RouteGlobalVariant() { diff --git a/routeglobalvariant.h b/routeglobalvariant.h index 11295eb5..ee671f50 100644 --- a/routeglobalvariant.h +++ b/routeglobalvariant.h @@ -1,4 +1,4 @@ -#ifndef ROUTEGLOBALVARIANT_H +#ifndef ROUTEGLOBALVARIANT_H #define ROUTEGLOBALVARIANT_H #include "Base3D/UGStyle3D.h" @@ -7,6 +7,8 @@ #include #include #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: diff --git a/scenecontrol.cpp b/scenecontrol.cpp index f1742d84..27acca34 100644 --- a/scenecontrol.cpp +++ b/scenecontrol.cpp @@ -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); diff --git a/showplane.cpp b/showplane.cpp index 53f3b3d1..4dee4c7d 100644 --- a/showplane.cpp +++ b/showplane.cpp @@ -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 lon,QList lat,QList heading) { -// qDebug()<<"*************************movePlane"; +// qDebug()<<"***************lon:"<qmapLon[index].append(lon.at(index)); + this->qmapLat[index].append(lat.at(index)); + this->qmapHeading[index].append(heading.at(index)); + } +// qDebug()<<"************************Lon:"<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 > &qmapLon, QMap > &qmapLat, QMap > &qmapHeading) +{ +// this->qmapLon = qmapLon; +// this->qmapLat = qmapLat; +// this->qmapHeading = qmapHeading; + +// qDebug()<<"************************show lon:"<setPosition(qmapLon[0].takeLast(),qmapLat[0].takeLast()); +// m_pMapControl->refreshDynamicLayer(); +} + +void ShowPlane::movePlane(QMap> qmapLon,QMap> qmapLat,QMap> qmapHeading) +{ + int i = 0; +// if(this->qmapLon[i].isEmpty()) return; +// qDebug()<<"*************************movePlaneLon:";//<qmapLon[0].takeLast(); foreach (Plane* plane, m_planes) { - qDebug()<<"***************PlaneX:"<getPointX(); - plane->setPosition(plane->getPointX()+0.001,plane->getPointY()); +// qDebug()<<"***************PlaneX:"<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;iqmapLon[i].remove(0,count); +// this->qmapLat[i].remove(0,count); +// this->qmapHeading[i].remove(0,count); + } +} diff --git a/showplane.h b/showplane.h index d3bb2c3b..51322097 100644 --- a/showplane.h +++ b/showplane.h @@ -4,6 +4,9 @@ #include #include #include +#include +#include +#include #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 lon,QList lat,QList heading); + void receivePositionInfo(QMap>& qmapLon,QMap>& qmapLat,QMap>& 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> qmapLon,QMap> qmapLat,QMap> qmapHeading); private: QMapControl* m_pMapControl; UGDynamicLayer* m_pDynamicLayer; QList m_planes; + int refreshTime; + QTimer m_timer; + QMutex mutex; + + //存储飞机的位置信息的列表 +// QMap> qmapLon; //经度 +// QMap> qmapLat; //纬度 +// QMap> qmapHeading; //航向 + + QMap>* qmapLon; //经度 + QMap>* qmapLat; //纬度 + QMap>* qmapHeading; //航向 + + //容量最大值 + const int MAX = 60; + +// int num_data = 0; private: void addPlaneToDyLayer(); //添加飞机到动态层 void addPlaneDyLayer(QMapControl* pMapControl); //添加飞机图层 + + //清除部分容器值 + void removePositionContainer(int count); }; #endif // SHOWPLANE_H