/* Copyright(c)--Navinfo--Author:fangzurui--date:2023-05-27 */ #include #include "mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) , _pTimer(new QTimer()) { // 引用翻译文件 auto trans = new QTranslator(qApp); trans->load(":/test_zh_CN.qm"); qApp->installTranslator(trans); this->setWindowIcon(QIcon(QCoreApplication::applicationDirPath() + "\\Resource\\dmatch.ico")); ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; } void MainWindow::initMainWindow() { // 初始化任务栏 initTaskBar(); // 初始化侧边栏 initImageSideBar(); initMarkPointSideBar(); // 初始化渲染窗口 initOsgRender(); // 初始化底部栏 initButtomBar(); // 初始化数据库 initDatabase(); QMessageBox* welcomeMessage = new QMessageBox(QMessageBox::Information, QObject::tr("Welcome"), QObject::tr("Everything is Ready"), QMessageBox::Button::NoButton, this); // 定时关闭窗口 QTimer::singleShot(500, welcomeMessage, SLOT(accept())); welcomeMessage->exec(); // 自动关闭欢迎窗口时触发事件 if(welcomeMessage->close() == true) { // 根据时间刷新一次图像管理表格 emit ui->SearchButton->clicked(); // 根据数据库记录点跳转位置 if(_lastMapPoint._dLon != 0.0) { OSGRender::getInstance()->setViewPoint("cache", _lastMapPoint, 0, -90.0, 500); // 根据ImageLayer中最后一个图像的信息,设置当前图像记录 if(RenderNode::getInstance()->_pImageLayer->getImageVec().size() == 0) { return; } else { _pCurrentImage = RenderNode::getInstance()->_pImageLayer->getImageVec().back(); } } else { return; } delete welcomeMessage; welcomeMessage = nullptr; } } /* -------------------------------------- 任务栏初始化 -------------------------------------- */ /** * @brief MainWindow::initTaskBar * 初始化任务栏 */ void MainWindow::initTaskBar() { // 初始化ui界面 ui->ImportImage->setText(QObject::tr("Import Image")); ui->SaveImage->setText(QObject::tr("Save Image")); ui->ExportMarkPoint->setText(QObject::tr("Export Task")); ui->ImportMarkPoint->setText(QObject::tr("Import Task")); ui->CoordLocate->setText(QObject::tr("Map Locate")); connect(ui->ImportImage, SIGNAL(clicked(bool)), this, SLOT(importImage())); connect(ui->SaveImage, SIGNAL(clicked(bool)), this, SLOT(saveImage())); connect(ui->ExportMarkPoint, SIGNAL(clicked(bool)), this, SLOT(exportMarkPoint())); connect(ui->ImportMarkPoint, SIGNAL(clicked(bool)), this, SLOT(importMarkPoint())); connect(ui->CoordLocate, SIGNAL(clicked(bool)), this, SLOT(coordLocate())); connect(OSGRender::getInstance(), SIGNAL(updateImage(Image*)), this, SLOT(updateImage(Image*))); } void MainWindow::loadDefaultImage() { // 获取默认高程数据存放的文件路径 QDir defaultDEMDir(QCoreApplication::applicationDirPath() + "\\defaultDEM"); QStringList fileType; fileType << "*.tif"; // 读取所有tif文件的文件名 QStringList demFileNameList = defaultDEMDir.entryList(fileType, QDir::Files | QDir::Readable, QDir::Name); // 加载数据 for(int i = 0; i < demFileNameList.size(); i++) { osg::ref_ptr demLayer = RenderNode::getInstance()->getOrCreateTifDemData(defaultDEMDir.path().toStdString() + "\\" + demFileNameList.at(i).toStdString(), "defaultDEM"); } // // 获取默认影像数据存放的文件路径 // QDir defaultImageDir(QCoreApplication::applicationDirPath() + "\\defaultImage"); // QStringList ImageFileNameList = defaultImageDir.entryList(fileType, QDir::Files | QDir::Readable, QDir::Name); // for(int i = 0; i < ImageFileNameList.size(); i++) { // osg::ref_ptr imageLayer = RenderNode::getInstance()->getOrCreateTifImageData(defaultImageDir.path().toStdString() + "\\" + ImageFileNameList.at(i).toStdString(), "defaultImage"); // } } /** * @brief MainWindow::readTifManageFile * 读取TifManageFile文件 */ void MainWindow::readImageManageFile() { // 创建tif图层 RenderNode::getInstance()->createImageLayer(new ImageLayer()); // 读取数据库 ImageInfoDb* imageInfoDb = new ImageInfoDb(); if(imageInfoDb->open(QCoreApplication::applicationDirPath() + "\\dmatch.db") == true) { // 获取刚刚创建的图层 ImageLayer* imageLayer = RenderNode::getInstance()->getImageLayer(); // 从数据库中读取图像信息 std::vector vecImage = imageInfoDb->getAllImage(); for(int i = 0; i < vecImage.size(); i++) { // 将读取的图像信息放到内存中 Image* image = imageLayer->createImage(vecImage.at(i)->getImageName(), vecImage.at(i)->getImageDate(), vecImage.at(i)->getImageType(), vecImage.at(i)->getImageCenterCoord()); // 加载数据 osg::ref_ptr pImage = RenderNode::getInstance()->getOrCreateTifImageData( QCoreApplication::applicationDirPath().toStdString() + "\\tifMaxRect\\" + vecImage.at(i)->getImageName() + ".tif", "SavedImage"); image->setImagePtr(pImage); imageLayer->addImage(image); updateImageFileTable(); } } else { QMessageBox::warning(this, QObject::tr("Waring"), QObject::tr("Cannot Connect Database"), QMessageBox::Ok, QMessageBox::Ok); return; } delete imageInfoDb; imageInfoDb = nullptr; } void MainWindow::readMarkPoint() { // 读取数据库 MarkPointDb* markPointDb = new MarkPointDb(); // 数据库如果不为空,则置空数据库 if(markPointDb->getAllMarkPoint().size() != 0) { markPointDb->clearMarkPoint(); } delete markPointDb; markPointDb = nullptr; } void MainWindow::readCache() { // 读取数据库 PositionDb* positionDb = new PositionDb(); if(positionDb->open(QCoreApplication::applicationDirPath() + "\\dmatch.db") == true) { // 从数据库中读取坐标点信息 _lastMapPoint = positionDb->getPosition(); } else { QMessageBox::warning(this, QObject::tr("Waring"), QObject::tr("Cannot Connect Database"), QMessageBox::Ok, QMessageBox::Ok); return; } delete positionDb; positionDb = nullptr; } /** * @brief MainWindow::switchToTask * 切换到标记模式 */ void MainWindow::setMarkPoint() { int state = OSGRender::getDrawState(); if(state != 3) { ui->SetMarkPointButton->setDown(true); OSGRender::getInstance()->setDrawState(3); } else { ui->SetMarkPointButton->setDown(false); OSGRender::getInstance()->setDrawState(0); } } /** * @brief MainWindow::importImage * 导入图像 */ void MainWindow::importImage() { // 创建数据库对象 ImageInfoDb* imageInfoDb = new ImageInfoDb(); std::vector vecImage = imageInfoDb->getAllImage(); // 检查是否已经存入数组 if(_pCurrentImage == nullptr) { // next } else if(vecImage.size() == 0 && _pCurrentImage != nullptr) { int result = QMessageBox::warning(this, QObject::tr("Waring"), QObject::tr("Import New Image, This Image Will Delete"), QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Cancel); if(result == QMessageBox::Cancel) { return; } } else { if(imageInfoDb->isExists(_pCurrentImage) == false) { int result = QMessageBox::warning(this, QObject::tr("Waring"), QObject::tr("Import New Image, This Image Will Delete"), QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Cancel); if(result == QMessageBox::Cancel) { return; } } } // 创建基本参数窗口 if(_widgetImportImageFile == nullptr) { _widgetImportImageFile = new ImageFileImport(this); } // _widgetImportImageFile->exec(); _widgetImportImageFile->show(); } /** * @brief MainWindow::saveImage * 记录tif文件名称到list中 */ void MainWindow::saveImage() { // 获取tif图层 ImageLayer* imageLayer = RenderNode::getInstance()->getImageLayer(); if(_pCurrentImage == nullptr) { QMessageBox::warning(this, QObject::tr("Warning"), QObject::tr("No Image Need To Save"), QMessageBox::Ok, QMessageBox::Ok); return; } else { // 读取数据库 ImageInfoDb* imageInfoDb = new ImageInfoDb(); if(imageInfoDb->open(QCoreApplication::applicationDirPath() + "\\dmatch.db") == false) { QMessageBox::warning(this, QObject::tr("Warning"), QObject::tr("Cannot Open Database"), QMessageBox::Ok, QMessageBox::Ok); return; } // 判断是否已经保存 if(imageInfoDb->isExists(_pCurrentImage) == true) { QMessageBox::warning(this, QObject::tr("Warning"), QObject::tr("This Image Is Already Saved"), QMessageBox::Ok, QMessageBox::Ok); return; } else { // 确认是否保存 int result = QMessageBox::information(this, QObject::tr("Warning"), QObject::tr("This Image Will Be Saved"), QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Cancel); if(result == QMessageBox::Cancel) { return; } else { // 写入到数据库中 imageInfoDb->saveImage(_pCurrentImage); imageLayer->addImage(_pCurrentImage); QMessageBox::information(this, QObject::tr("Finished"), QObject::tr("Save Image Finished"), QMessageBox::Ok, QMessageBox::Ok); updateImageFileTable(); } } // 释放 delete imageInfoDb; imageInfoDb = nullptr; } } /** * @brief MainWindow::exportTask * 标注导出 */ void MainWindow::exportMarkPoint() { if(_widgetExportMarkPointFile == nullptr) { _widgetExportMarkPointFile = new MarkPointFileExport(); } MarkPointLayer* layer = RenderNode::getInstance()->getMarkPointLayer(); // 如果数组为空 if(layer->getMarkPointVec().empty() == true) { QMessageBox::warning(this, QObject::tr("Waring"), QObject::tr("No Mark Point Need To Export"), QMessageBox::Ok, QMessageBox::Ok); return; } else { _widgetExportMarkPointFile->exec(); } } /** * @brief MainWindow::importTask * 标注导入 */ void MainWindow::importMarkPoint() { if(_widgetImportMarkPointFile == nullptr) { _widgetImportMarkPointFile = new MarkPointFileImport(this); } _widgetImportMarkPointFile->exec(); // _widgetImportMarkPointFile->show(); updateMarkPointTable(); } /** * @brief MainWindow::coordLocate * 地图定位 */ void MainWindow::coordLocate() { if(_widgetCoordLocate == nullptr) { _widgetCoordLocate = new CoordLocate(this); } // _widgetCoordLocate->exec(); _widgetCoordLocate->show(); } void MainWindow::updateImage(Image* image) { // 移除掉之前的影像 if(_pCurrentImage != nullptr) { RenderNode::getInstance()->deleteTifImageData(_pCurrentImage->getImagePtr()); } if(image != nullptr) { // 将新创建的Image设为当前Image _pCurrentImage = image; osg::ref_ptr imageLayer = RenderNode::getInstance()->getOrCreateTifImageData( QCoreApplication::applicationDirPath().toStdString() + "\\tifMaxRect\\" + _pCurrentImage->getImageName() + ".tif", "Image"); _pCurrentImage->setImagePtr(imageLayer); // 将新创建的Image的中心点设为当前中心点 _lastMapPoint = _pCurrentImage->getImageCenterCoord(); } } /* -------------------------------------- 影像层侧边栏 -------------------------------------- */ /** * @brief MainWindow::initImageSideBar * 初始化影像层侧边栏 */ void MainWindow::initImageSideBar() { // Image侧边栏 ui->SideTabBar->setTabText(0, QObject::tr("History Image")); // 更新影像文件表格 ui->ImageFileTable->setColumnCount(6); // 序号 名称 ui->ImageFileTable->horizontalHeader()->setStretchLastSection(true); ui->ImageFileTable->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); // 设置影像表单组件 QTableWidgetItem* selectAll = new QTableWidgetItem(); QTableWidgetItem* name = new QTableWidgetItem(); QTableWidgetItem* createDate = new QTableWidgetItem(); QTableWidgetItem* imgType = new QTableWidgetItem(); QTableWidgetItem* centerLon = new QTableWidgetItem(); QTableWidgetItem* centerLat = new QTableWidgetItem(); selectAll->setCheckState(Qt::Unchecked); name->setText(QObject::tr("Name")); createDate->setText(QObject::tr("Date")); imgType->setText(QObject::tr("Type")); centerLon->setText(QObject::tr("Longitude")); centerLat->setText(QObject::tr("Latitude")); ui->ImageFileTable->setHorizontalHeaderItem(0, selectAll); ui->ImageFileTable->setHorizontalHeaderItem(1, name); ui->ImageFileTable->setHorizontalHeaderItem(2, createDate); ui->ImageFileTable->setHorizontalHeaderItem(3, imgType); ui->ImageFileTable->setHorizontalHeaderItem(4, centerLon); ui->ImageFileTable->setHorizontalHeaderItem(5, centerLat); // 设置搜索组件 ui->StartDate->setMaximumDate(QDate::currentDate().addMonths(1)); ui->EndDate->setMaximumDate(QDate::currentDate().addMonths(1)); ui->StartDate->setDate(QDate::currentDate().addMonths(-1)); ui->EndDate->setDate(QDate::currentDate()); ui->SearchTypeBox->addItem(QObject::tr("All")); ui->SearchTypeBox->addItem(QObject::tr("Infrared Image")); ui->SearchTypeBox->addItem(QObject::tr("Visible Image")); ui->SearchButton->setText(QObject::tr("Search")); ui->SearchReset->setText(QObject::tr("Reset")); // 设置图像表单组件 ui->ImageFileTable->setEditTriggers(QAbstractItemView::NoEditTriggers); ui->ImageSelectAll->setText(QObject::tr("Select All")); ui->ImageFileDelete->setText(QObject::tr("Delete")); // 双击加载选择的tif到地球 connect(ui->ImageFileTable, SIGNAL(cellDoubleClicked(int,int)), this, SLOT(loadGenerateTif(int,int))); // 点击全选 connect(ui->ImageSelectAll, SIGNAL(clicked(bool)), this, SLOT(selectAllImage())); // 点击复选框选中影像 connect(ui->ImageFileTable, SIGNAL(itemClicked(QTableWidgetItem*)), this, SLOT(selectImage(QTableWidgetItem*))); // 点击删除按钮删除指定序号的tif文件 connect(ui->ImageFileDelete, SIGNAL(clicked(bool)), this, SLOT(deleteImageFile())); // 点击搜索按钮进行搜索 connect(ui->SearchButton, SIGNAL(clicked(bool)), this, SLOT(searchImage())); // 点击重置按钮进行搜索 connect(ui->SearchReset, SIGNAL(clicked(bool)), this, SLOT(resetSearch())); } void MainWindow::searchImage() { // 创建影像数据库对象 ImageInfoDb* imageInfoDb = new ImageInfoDb(); std::vector vecSearchResult; if(ui->StartDate->date() < ui->EndDate->date()) { vecSearchResult = imageInfoDb->searchImage(ui->StartDate->date(), ui->EndDate->date().addDays(1), ui->SearchTypeBox->currentText().toStdString()); } else { vecSearchResult = imageInfoDb->searchImage(ui->EndDate->date(), ui->StartDate->date().addDays(1), ui->SearchTypeBox->currentText().toStdString()); } // 先清空表格原始的内容 ui->ImageFileTable->clearContents(); // 按照长度更新表格 ui->ImageFileTable->setRowCount(vecSearchResult.size()); if(vecSearchResult.size() == 0) { return; } for(int i = 0; i < vecSearchResult.size(); i++) { QTableWidgetItem* checkbox = new QTableWidgetItem(); checkbox->setCheckState(Qt::Unchecked); QTableWidgetItem* name = new QTableWidgetItem(vecSearchResult.at(i)->getImageName().c_str()); QTableWidgetItem* createDate = new QTableWidgetItem(vecSearchResult.at(i)->getImageDate().c_str()); QTableWidgetItem* imgType = new QTableWidgetItem(vecSearchResult.at(i)->getImageType().c_str()); QTableWidgetItem* lon = new QTableWidgetItem(QString::number(vecSearchResult.at(i)->getImageCenterCoord()._dLon, 'f', 7)); QTableWidgetItem* lat = new QTableWidgetItem(QString::number(vecSearchResult.at(i)->getImageCenterCoord()._dLat, 'f', 7)); ui->ImageFileTable->setItem(vecSearchResult.size() - 1 - i, 0, checkbox); ui->ImageFileTable->setItem(vecSearchResult.size() - 1 - i, 1, name); ui->ImageFileTable->setItem(vecSearchResult.size() - 1 - i, 2, createDate); ui->ImageFileTable->setItem(vecSearchResult.size() - 1 - i, 3, imgType); ui->ImageFileTable->setItem(vecSearchResult.size() - 1 - i, 4, lon); ui->ImageFileTable->setItem(vecSearchResult.size() - 1 - i, 5, lat); } _vecSelectImage.clear(); delete imageInfoDb; imageInfoDb = nullptr; } void MainWindow::resetSearch() { // 重置输入参数 ui->StartDate->setDate(QDate::currentDate()); ui->EndDate->setDate(QDate::currentDate().addMonths(1)); ui->SearchTypeBox->setCurrentIndex(0); searchImage(); } /** * @brief MainWindow::updateTifFileTable * 更新侧边栏Tif文件表格的内容 */ void MainWindow::updateImageFileTable() { // 创建影像数据库对象 ImageInfoDb* imageInfoDb = new ImageInfoDb(); std::vector vecImage = imageInfoDb->getAllImage(); // 先清空表格原始的内容 ui->ImageFileTable->clearContents(); // 按照长度更新表格 ui->ImageFileTable->setRowCount(vecImage.size()); if(vecImage.size() == 0) { return; } for(int i = 0; i < vecImage.size(); i++) { QTableWidgetItem* checkbox = new QTableWidgetItem(); checkbox->setCheckState(Qt::Unchecked); QTableWidgetItem* name = new QTableWidgetItem(vecImage.at(i)->getImageName().c_str()); QTableWidgetItem* createDate = new QTableWidgetItem(vecImage.at(i)->getImageDate().c_str()); QTableWidgetItem* imgType = new QTableWidgetItem(vecImage.at(i)->getImageType().c_str()); QTableWidgetItem* lon = new QTableWidgetItem(QString::number(vecImage.at(i)->getImageCenterCoord()._dLon, 'f', 7)); QTableWidgetItem* lat = new QTableWidgetItem(QString::number(vecImage.at(i)->getImageCenterCoord()._dLat, 'f', 7)); ui->ImageFileTable->setItem(vecImage.size() - 1 - i, 0, checkbox); ui->ImageFileTable->setItem(vecImage.size() - 1 - i, 1, name); ui->ImageFileTable->setItem(vecImage.size() - 1 - i, 2, createDate); ui->ImageFileTable->setItem(vecImage.size() - 1 - i, 3, imgType); ui->ImageFileTable->setItem(vecImage.size() - 1 - i, 4, lon); ui->ImageFileTable->setItem(vecImage.size() - 1 - i, 5, lat); } _vecSelectImage.clear(); delete imageInfoDb; imageInfoDb = nullptr; } /** * @brief MainWindow::loadGenerateTif * 在地球上展示选中的tif */ void MainWindow::loadGenerateTif(int i, int j) { // 获取需要加载的文件名称 if(ui->ImageFileTable->item(i, 1) == nullptr) { return; } // 与数据库建立链接 ImageInfoDb* imageInfoDb = new ImageInfoDb(); // 获取影像图层 ImageLayer* imageLayer = new ImageLayer(); // 找到目标路径 QString tifFilePath = QCoreApplication::applicationDirPath() + "\\tifMaxRect\\" + ui->ImageFileTable->item(i, 1)->text() + ".tif"; // 获取创建时间 QString strDate = ui->ImageFileTable->item(i, 2)->text(); // 判断是否已经加载 for(int i = 0; i < imageLayer->getImageVec().size(); i++) { if(strDate == imageLayer->getImageDate(i).c_str()) { // 先移除影像 RenderNode::getInstance()->deleteTifImageData(imageLayer->getImage(i)->getImagePtr()); // 重新获取该对象 osg::ref_ptr pImage = RenderNode::getInstance()->getOrCreateTifImageData(tifFilePath.toStdString(), "CurrentImage"); // 重新设置 imageLayer->getImage(i)->setImagePtr(pImage); // 设置视点 OSGRender::getInstance()->setViewPoint("ImageView", imageLayer->getImageCenterCoord(i), 0, -90.0, imageLayer->getImageCenterCoord(i)._dAlt + 500); delete imageInfoDb; imageInfoDb = nullptr; return; } } // 如果未加载 Image* image = imageInfoDb->getImageByDate(strDate); if(image == nullptr) { QMessageBox::warning(this, QObject::tr("Warning"), QObject::tr("Cannot Get Image From Database"), QMessageBox::Ok, QMessageBox::Ok); delete imageInfoDb; imageInfoDb = nullptr; return; } MapPoint tifCenterCoord = image->getImageCenterCoord(); if(tifCenterCoord._dLon != 0.0) { // 加载到三维地球中 osg::ref_ptr tifImageLayer = RenderNode::getInstance()->getOrCreateTifImageData(tifFilePath.toStdString(), "calibratedImage"); // 设为当前图层 if(_pCurrentImage == nullptr) { _pCurrentImage = new Image(); } _pCurrentImage->setImageName(image->getImageName()); _pCurrentImage->setImageDate(image->getImageDate()); _pCurrentImage->setImageType(image->getImageType()); _pCurrentImage->setImageCenterCoord(image->getImageCenterCoord()); _pCurrentImage->setImagePtr(tifImageLayer); OSGRender::getInstance()->setViewPoint("ImageView", tifCenterCoord, 0, -90.0, tifCenterCoord._dAlt + 500); // 添加到图层 imageLayer->addImage(_pCurrentImage); } delete imageInfoDb; imageInfoDb = nullptr; } void MainWindow::selectAllImage() { // 判断是否已经选择 if(_vecSelectImage.size() == ui->ImageFileTable->rowCount()) { for(int i = 0; i < ui->ImageFileTable->rowCount(); i++) { ui->ImageFileTable->item(i, 0)->setCheckState(Qt::Unchecked); } _vecSelectImage.clear(); } else { for(int i = 0; i < ui->ImageFileTable->rowCount(); i++) { if(ui->ImageFileTable->item(i, 0)->checkState() == Qt::Checked) { continue; } else { ui->ImageFileTable->item(i, 0)->setCheckState(Qt::Checked); _vecSelectImage.push_back(ui->ImageFileTable->item(i, 2)->text().toStdString()); } } } } void MainWindow::selectImage(QTableWidgetItem* checkbox) { // 获取表格中的创建时间字段 if(checkbox->checkState() == Qt::Checked) { _vecSelectImage.push_back(ui->ImageFileTable->item(checkbox->row(), 2)->text().toStdString()); } if(checkbox->checkState() == Qt::Unchecked) { // 已选择则取消选择并从选择数组中移除 for(int num = 0; num < _vecSelectImage.size(); num++) { if(ui->ImageFileTable->item(checkbox->row(), 2)->text().toStdString() == _vecSelectImage.at(num)) { _vecSelectImage.erase(_vecSelectImage.begin() + num); break; } } } } void MainWindow::deleteImageFile() { // 判断是否有选点 if(_vecSelectImage.size() == 0) { QMessageBox::warning(this, QObject::tr("Waring"), QObject::tr("No Image Selected"), QMessageBox::Ok, QMessageBox::Ok); return; } else { for(int i = 0; i < _vecSelectImage.size(); i++) { deleteImageFile(_vecSelectImage.at(i)); } _vecSelectImage.clear(); } // 更新影像表格 updateImageFileTable(); } /** * @brief MainWindow::deleteTifFile * 删除tif文件 */ void MainWindow::deleteImageFile(std::string imageDate) { // 从数据库中移除 ImageInfoDb* imageInfoDb = new ImageInfoDb(); // 获取tif图层 ImageLayer* imageLayer = RenderNode::getInstance()->getImageLayer(); if(imageLayer->isExists(imageDate) == false) { QMessageBox::warning(this, QObject::tr("Waring"), QObject::tr("Cannot Get Choose Item"), QMessageBox::Ok, QMessageBox::Ok); } else { // 从三维地球上移除 osg::ref_ptr tif = imageLayer->getTifImage(imageDate); if(tif != nullptr) { RenderNode::getInstance()->deleteTifImageData(imageLayer->getTifImage(imageDate)); imageInfoDb->removeImage(imageDate); imageLayer->deleteImage(imageDate); _pCurrentImage = nullptr; } } delete imageInfoDb; imageInfoDb = nullptr; } /* -------------------------------------- 标记点侧边栏 ------------------------------------- */ /** * @brief MainWindow::initSideBar * 初始化标记点侧边栏 */ void MainWindow::initMarkPointSideBar() { // MarkPoint侧边栏 ui->SideTabBar->setTabText(1, QObject::tr("Task Infomation")); // 更新任务点表格 ui->SetMarkPointButton->setText(QObject::tr("Set Mark")); ui->MarkPointTable->setColumnCount(5); // 序号 经度 纬度 高程 ui->MarkPointTable->horizontalHeader()->setStretchLastSection(true); ui->MarkPointTable->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); // ui->MarkPointTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive); // ui->MarkPointTable->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents); // ui->MarkPointTable->horizontalHeader()->setSectionResizeMode(1, QHeaderView::ResizeToContents); // ui->MarkPointTable->horizontalHeader()->setSectionResizeMode(2, QHeaderView::ResizeToContents); // ui->MarkPointTable->horizontalHeader()->setSectionResizeMode(3, QHeaderView::ResizeToContents); // ui->MarkPointTable->horizontalHeader()->setSectionResizeMode(4, QHeaderView::ResizeToContents); // 设置任务点表单组件 QTableWidgetItem* selectAll = new QTableWidgetItem(); QTableWidgetItem* coordId = new QTableWidgetItem(); QTableWidgetItem* coordLon = new QTableWidgetItem(); QTableWidgetItem* coordLat = new QTableWidgetItem(); QTableWidgetItem* coordAlt = new QTableWidgetItem(); selectAll->setCheckState(Qt::Unchecked); coordId->setText(QObject::tr("Name")); coordLon->setText(QObject::tr("Longitude")); coordLat->setText(QObject::tr("Latitude")); coordAlt->setText(QObject::tr("Altitude")); ui->MarkPointTable->setHorizontalHeaderItem(0, selectAll); ui->MarkPointTable->setHorizontalHeaderItem(1, coordId); ui->MarkPointTable->setHorizontalHeaderItem(2, coordLon); ui->MarkPointTable->setHorizontalHeaderItem(3, coordLat); ui->MarkPointTable->setHorizontalHeaderItem(4, coordAlt); ui->MarkPointTable->setEditTriggers(QAbstractItemView::NoEditTriggers); ui->MarkPointSelectAll->setText(QObject::tr("Select All")); ui->MarkPointDelete->setText(QObject::tr("Delete")); ui->MarkPointClear->setText(QObject::tr("Clear")); // 点击放置任务点 connect(ui->SetMarkPointButton,SIGNAL(clicked(bool)), this, SLOT(setMarkPoint())); // 双击跳转到选择的任务点坐标位置 connect(ui->MarkPointTable, SIGNAL(cellDoubleClicked(int,int)), this, SLOT(jumpCoordPos(int,int))); // 点击全选 connect(ui->MarkPointSelectAll, SIGNAL(clicked(bool)), this, SLOT(selectAllMarkPoint())); // 点击复选框选中任务点 connect(ui->MarkPointTable, SIGNAL(itemClicked(QTableWidgetItem*)), this, SLOT(selectMarkPoint(QTableWidgetItem*))); // 点击删除按钮删除勾线的任务点 connect(ui->MarkPointDelete, SIGNAL(clicked(bool)), this, SLOT(deleteMarkPoint())); // 点击删除按钮删除指定序号的任务点 connect(ui->MarkPointClear, SIGNAL(clicked(bool)), this, SLOT(clearMarkPoint())); // 任务点侧边栏更新事件 connect(OSGRender::getInstance(), SIGNAL(updateMarkPointTable()), this, SLOT(updateMarkPointTable())); // 删除指定任务点 connect(OSGRender::getInstance(), SIGNAL(deleteMarkPoint(int)), this, SLOT(deleteMarkPoint(int))); } /** * @brief MainWindow::updateMarkPointTable * 更新侧边栏任务点表格的内容 */ void MainWindow::updateMarkPointTable() { // 获取数据库对象 MarkPointDb* markPointDb = new MarkPointDb(); std::vector vecMarkPoint = markPointDb->getAllMarkPoint(); // 先清空表格原始的内容 ui->MarkPointTable->clearContents(); // 根据数据库信息设置表格内容 ui->MarkPointTable->setRowCount(vecMarkPoint.size()); if(vecMarkPoint.size() == 0) { return; } for(int i = 0; i < vecMarkPoint.size(); i++) { QTableWidgetItem* checkbox = new QTableWidgetItem(); checkbox->setCheckState(Qt::Unchecked); QTableWidgetItem* id = new QTableWidgetItem(QString(vecMarkPoint.at(i)->getId().c_str())); QTableWidgetItem* lon = new QTableWidgetItem(QString::number(vecMarkPoint.at(i)->getMapPoint()._dLon, 'f', 7)); QTableWidgetItem* lat = new QTableWidgetItem(QString::number(vecMarkPoint.at(i)->getMapPoint()._dLat, 'f', 7)); QTableWidgetItem* alt = new QTableWidgetItem(QString::number(vecMarkPoint.at(i)->getMapPoint()._dAlt, 'f', 2)); ui->MarkPointTable->setItem(i, 0, checkbox); ui->MarkPointTable->setItem(i, 1, id); ui->MarkPointTable->setItem(i, 2, lon); ui->MarkPointTable->setItem(i, 3, lat); ui->MarkPointTable->setItem(i, 4, alt); } ui->SetMarkPointButton->setDown(false); _vecSelectMarkPoint.clear(); delete markPointDb; markPointDb = nullptr; } void MainWindow::selectAllMarkPoint() { // 判断是否已经选择 if(_vecSelectMarkPoint.size() == ui->MarkPointTable->rowCount()) { // 全选则全部取消 for(int i = 0; i < ui->MarkPointTable->rowCount(); i++) { ui->MarkPointTable->item(i, 0)->setCheckState(Qt::Unchecked); } _vecSelectMarkPoint.clear(); } else { for(int i = 0; i < ui->MarkPointTable->rowCount(); i++) { if(ui->MarkPointTable->item(i, 0)->checkState() == Qt::Checked) { continue; } else { ui->MarkPointTable->item(i, 0)->setCheckState(Qt::Checked); _vecSelectMarkPoint.push_back(ui->MarkPointTable->item(i, 1)->text().toStdString()); } } } } void MainWindow::selectMarkPoint(QTableWidgetItem* checkbox) { // 如果状态未选 if(checkbox->checkState() == Qt::Checked) { _vecSelectMarkPoint.push_back(ui->MarkPointTable->item(checkbox->row(), 1)->text().toStdString()); } if(checkbox->checkState() == Qt::Unchecked) { // 已选择则取消选择并从选择数组中移除 for(int num = 0; num < _vecSelectMarkPoint.size(); num++) { if(ui->MarkPointTable->item(checkbox->row(), 1)->text().toStdString() == _vecSelectMarkPoint.at(num)) { _vecSelectMarkPoint.erase(_vecSelectMarkPoint.begin() + num); break; } } } } /** * @brief MainWindow::deleteTaskPoint * 删除侧边任务栏表格中对应任务点 */ void MainWindow::deleteMarkPoint() { // 判断是否有选点 if(_vecSelectMarkPoint.size() == 0) { QMessageBox::warning(this, QObject::tr("Waring"), QObject::tr("No Mark Point Selected"), QMessageBox::Ok, QMessageBox::Ok); return; } else { for(int i = 0; i < _vecSelectMarkPoint.size(); i++) { deleteMarkPoint(_vecSelectMarkPoint.at(i)); } _vecSelectMarkPoint.clear(); } updateMarkPointTable(); } void MainWindow::deleteMarkPoint(int num) { // 记录到数据库 MarkPointDb* markPointDb = new MarkPointDb(); // 获取任务点图层对象 MarkPointLayer* markPointLayer = RenderNode::getInstance()->getMarkPointLayer(); if(markPointLayer->isExists(num) == false) { QMessageBox::warning(this, QObject::tr("Waring"), QObject::tr("Enter Number Out of Arrage"), QMessageBox::Ok, QMessageBox::Ok); } else { // 先从图层上移除mark osg::ref_ptr mark = markPointLayer->getMarkPtr(num); if(mark != nullptr) { RenderNode::getInstance()->deleteMark(mark); markPointDb->deleteMarkPoint(markPointLayer->getId(num)); markPointLayer->deleteMarkPoint(num); } updateMarkPointTable(); } delete markPointDb; markPointDb = nullptr; } void MainWindow::deleteMarkPoint(std::string strId) { // 记录到数据库 MarkPointDb* markPointDb = new MarkPointDb(); // 获取任务点图层对象 MarkPointLayer* markPointLayer = RenderNode::getInstance()->getMarkPointLayer(); if(markPointLayer->isExists(strId) == false) { QMessageBox::warning(this, QObject::tr("Waring"), QObject::tr("Enter Number Out of Arrage"), QMessageBox::Ok, QMessageBox::Ok); } else { for(int num = 0; num < markPointLayer->getMarkPointVec().size(); num++) { if(markPointLayer->getId(num) == strId) { // 先从图层上移除pText osg::ref_ptr mark = markPointLayer->getMarkPtr(num); if(mark != nullptr) { RenderNode::getInstance()->deleteMark(mark); markPointDb->deleteMarkPoint(markPointLayer->getId(num)); markPointLayer->deleteMarkPoint(num); } break; } } } delete markPointDb; markPointDb = nullptr; } void MainWindow::clearMarkPoint() { // 确认是否清空 int result = QMessageBox::warning(this, QObject::tr("Warning"), QObject::tr("It Will Clean All Mark Point"), QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Cancel); if(result == QMessageBox::Cancel) { return; } // 获取任务点图层对象 MarkPointLayer* markPointLayer = RenderNode::getInstance()->getMarkPointLayer(); if(markPointLayer->getMarkPointVec().size() == 0) { return; } else { // 记录到数据库 MarkPointDb* markPointDb = new MarkPointDb(); // 先从图层上移除pText int max = markPointLayer->getMarkPointVec().size(); for(int i = 0; i < max; i++) { osg::ref_ptr text = markPointLayer->getMarkPtr(i); if(text != nullptr) { RenderNode::getInstance()->deleteMark(text); } } // 清空图层 markPointLayer->clearMarkPoint(); markPointLayer->resetMarkPointCount(); // 清空数据库 markPointDb->clearMarkPoint(); updateMarkPointTable(); delete markPointDb; markPointDb = nullptr; } } /** * @brief MainWindow::jumpCoordPos * 双击跳转到选中任务点所在位置 */ void MainWindow::jumpCoordPos(int i, int j) { // 获取markPoint图层 MarkPointLayer* markPointLayer = RenderNode::getInstance()->getMarkPointLayer(); OSGRender::getInstance()->setViewPoint("taskPoint", MapPoint(markPointLayer->getMarkPoint(i)->getMapPoint()._dLon, markPointLayer->getMarkPoint(i)->getMapPoint()._dLat, markPointLayer->getMarkPoint(i)->getMapPoint()._dAlt), 0, -90.0, markPointLayer->getMarkPoint(i)->getMapPoint()._dAlt + 200); } /* ------------------------------------ OSG渲染窗口初始化 ------------------------------------ */ /** * @brief MainWindow::initOsgRender * 初始化渲染窗口 */ void MainWindow::initOsgRender() { // 创建渲染窗口 OSGRender::getInstance()->initOSGRender(); _osgRender = OSGRender::getInstance()->getQWidget(); ui->RenderLayout->addWidget(_osgRender); qDebug() << "*** tiles files path: " << QCoreApplication::applicationDirPath().append("/tiles/{z}/{x}/{y}.jpg"); // 加载瓦片数据 // _pGlobalLayer = RenderNode::getInstance()->getOrCreateXYZServerData("E:/Data/tdt2/{z}/{x}/{y}.jpg"); _pGlobalLayer = RenderNode::getInstance()->getOrCreateXYZServerData(QCoreApplication::applicationDirPath().toStdString() + "/tiles/{z}/{x}/{y}.jpg"); // _pXYZLayer = RenderNode::getInstance()->getOrCreateXYZServerData("http://172.19.50.236:8086/{z}/{x}/{y}.jpg"); OSGRender::getInstance()->setDrawState(0); } /* -------------------------------------- 底部栏初始化 -------------------------------------- */ /** * @brief MainWindow::initButtomBar * 初始化底部栏 */ void MainWindow::initButtomBar() { ui->CoordinateLine->setText(QObject::tr("Longitude:0.0 Latitude:0.0 Altitude:0.0")); connect(OSGRender::getInstance(), SIGNAL(updatePickMapPoint()), this, SLOT(updatePickCoord())); connect(OSGRender::getInstance(), SIGNAL(updatePickMapPoint(double, double, double)), this, SLOT(updatePickCoord(double, double, double))); } /** * @brief MainWindow::updatePickCoord * 更新底部坐标框信息 */ void MainWindow::updatePickCoord() { osg::Vec3d vecCoord = RenderNode::getInstance()->getCoord(); std::stringstream streamX, streamY, streamZ; streamX << std::fixed << std::setprecision(7) << vecCoord.x(); streamY << std::fixed << std::setprecision(7) << vecCoord.y(); streamZ << std::fixed << std::setprecision(2) << vecCoord.z(); std::string stdCoord = (QObject::tr("Longitude:").toStdString() + streamX.str() + " " + QObject::tr("Latitude:").toStdString() + streamY.str() + " " + QObject::tr("Altitude:").toStdString() + streamZ.str()); ui->CoordinateLine->setText(QObject::tr(stdCoord.c_str())); } void MainWindow::updatePickCoord(double lon, double lat, double alt) { std::stringstream streamX, streamY, streamZ; streamX << std::fixed << std::setprecision(7) << lon; streamY << std::fixed << std::setprecision(7) << lat; streamZ << std::fixed << std::setprecision(2) << alt; std::string stdCoord = (QObject::tr("Longitude:").toStdString() + streamX.str() + " " + QObject::tr("Latitude:").toStdString() + streamY.str() + " " + QObject::tr("Altitude:").toStdString() + streamZ.str()); ui->CoordinateLine->setText(QObject::tr(stdCoord.c_str())); } /* -------------------------------------- 数据库初始化 -------------------------------------- */ void MainWindow::initDatabase() { // 判断数据库是否存在 DbManager* dbManager = new DbManager(); if(dbManager->isDbExists(QCoreApplication::applicationDirPath() + "\\dmatch.db") == false) { // 创建数据库 QSqlDatabase* database = dbManager->createDatabase(QCoreApplication::applicationDirPath() + "\\dmatch.db"); database->open(); // 在数据库中创建table if(dbManager->createTables(database) == false) { QMessageBox::warning(this, QObject::tr("Warning"), QObject::tr("Create Table Failed"), QMessageBox::Ok, QMessageBox::Ok); } } // 加载默认Tif数据 loadDefaultImage(); // 读取tifMangeFile readImageManageFile(); // 读取任务点 readMarkPoint(); // 读取cache readCache(); } /* -------------------------------------- 窗口关闭事件 -------------------------------------- */ /** * @brief MainWindow::closeEvent * 初始化相关事件 * @param QCloseEvent* event 关闭事件指针 */ void MainWindow::closeEvent(QCloseEvent* event) { int result = QMessageBox::warning(this, QObject::tr("Waring"), QObject::tr("Really Want To Exit?\nAnything not Saved Will be Cleaned."), QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Cancel); if(result == QMessageBox::Ok) { writeCache(); cleanTemImage(); cleanTemMarkPoint(); event->accept(); } else { event->ignore(); } } /** * @brief MainWindow::cleanTemTif * 清理不需要保存的tif文件 */ void MainWindow::cleanTemImage() { // 读取影像数据库 ImageInfoDb* imageDb = new ImageInfoDb(); // 获取该文件夹下的所有文件名称 QDir dir(QCoreApplication::applicationDirPath() + "\\tifMaxRect"); QStringList fileList; // 遍历目录中的所有文件 foreach(QString fileName, dir.entryList(QDir::Files)) { // 获取文件的基本名称(不包含路径和扩展名) QString baseName = QFileInfo(dir.filePath(fileName)).baseName(); fileList.append(baseName); } // 获取数据库保存的所有影像名称 QStringList saveList; for(int i = 0; i < imageDb->getAllImage().size(); i++) { saveList.append(imageDb->getImageByIndex(i)->getImageName().c_str()); } // 如果没有保存图片,直接清空文件夹 if(saveList.empty() == true) { for(int i = 0; i < fileList.size(); i++) { QFile file(QCoreApplication::applicationDirPath() + "\\tifMaxRect\\" + fileList.at(i) + ".tif"); file.remove(); } } else { // 循环判断名称是否在保存影像的列表中 for(int i = 0; i < fileList.size(); i++) { // 如果不存在则删除文件 if(saveList.contains(fileList.at(i)) == false) { QFile file(QCoreApplication::applicationDirPath() + "\\tifMaxRect\\" + fileList.at(i) + ".tif"); file.remove(); } } } } void MainWindow::cleanTemMarkPoint() { // 获取任务点图层 MarkPointLayer* markPointLayer = RenderNode::getInstance()->getMarkPointLayer(); // 读取数据库 MarkPointDb* markPointDb = new MarkPointDb(); markPointLayer->clearMarkPoint(); markPointDb->clearMarkPoint(); } /** * @brief MainWindow::writeCache * 写入cache */ void MainWindow::writeCache() { // 读取数据库 PositionDb* positionDb = new PositionDb(); if(positionDb->open(QCoreApplication::applicationDirPath() + "\\dmatch.db") == true) { // 从数据库中写入坐标信息 positionDb->clearPosition(); positionDb->savePosition(_lastMapPoint); } else { QMessageBox::warning(this, QObject::tr("Waring"), QObject::tr("Cannot Connect Database"), QMessageBox::Ok, QMessageBox::Ok); return; } delete positionDb; positionDb = nullptr; }