2025-02-07 09:16:22 +00:00
|
|
|
|
#include <QLabel>
|
|
|
|
|
#include <QDesktopServices>
|
|
|
|
|
#include <QMessageBox>
|
|
|
|
|
#include <QTableWidgetItem>
|
2025-02-09 18:16:07 +00:00
|
|
|
|
#include "RasterMainWidget.h"
|
|
|
|
|
#include "ui_RasterMainWidget.h"
|
|
|
|
|
|
|
|
|
|
#include <sponsorwindow.h>
|
|
|
|
|
#include <taskwindow.h>
|
|
|
|
|
#include <tmslayer.h>
|
|
|
|
|
#include <QDockWidget>
|
|
|
|
|
#include "ToolBoxWidget.h"
|
|
|
|
|
#include "BaseTool.h"
|
|
|
|
|
#include "FileOperator.h"
|
|
|
|
|
|
2025-02-17 07:03:09 +00:00
|
|
|
|
#include "RasterWidgetMessageShow.h"
|
2025-04-11 03:29:12 +00:00
|
|
|
|
#include "ImageOperatorBase.h"
|
2025-02-07 09:16:22 +00:00
|
|
|
|
|
|
|
|
|
#pragma execution_character_set("utf-8")
|
|
|
|
|
|
|
|
|
|
namespace LAMPMainWidget {
|
|
|
|
|
|
2025-04-01 10:23:24 +00:00
|
|
|
|
QHash<QString, MapLayer*>RasterMainWidget::mMaps{};
|
|
|
|
|
|
|
|
|
|
RasterMainWidget::RasterMainWidget(QWidget* parent)
|
|
|
|
|
: mUi(new Ui::RasterMainWidget),
|
|
|
|
|
mMapConvas(new MapCanvas),
|
|
|
|
|
mScaleText(new QLineEdit),
|
|
|
|
|
mScaleLabel(new QLabel),
|
|
|
|
|
mCenterText(new QLineEdit),
|
|
|
|
|
mCenterLabel(new QLabel),
|
|
|
|
|
mZoomText(new QLineEdit),
|
|
|
|
|
mZoomLabel(new QLabel),
|
|
|
|
|
mMapActionGroup(new QActionGroup(dynamic_cast<QObject*>(this))),
|
|
|
|
|
mSetLeftTop(true),
|
|
|
|
|
mLayerList(),
|
|
|
|
|
mLeftTop(),
|
|
|
|
|
mRightBottom() {
|
|
|
|
|
this->setWindowTitle(tr(u8"LAMP影像处理软件"));
|
|
|
|
|
mUi->setupUi(dynamic_cast<QMainWindow*>(this));
|
|
|
|
|
setupWindow();
|
|
|
|
|
setupTaskWindow();
|
2025-05-02 05:19:00 +00:00
|
|
|
|
setupShowMessage();
|
|
|
|
|
|
|
|
|
|
this->show();// 强制显示窗口
|
2025-04-01 10:23:24 +00:00
|
|
|
|
setupLayers();
|
|
|
|
|
setupStatusBar();
|
|
|
|
|
setupActions();
|
|
|
|
|
setRightToolbox();
|
|
|
|
|
mUi->panAction->trigger();
|
|
|
|
|
mUi->layerList->setCurrentItem(mLayerList.first());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
RasterMainWidget::~RasterMainWidget() {
|
|
|
|
|
delete mUi;
|
|
|
|
|
delete mMapConvas;
|
|
|
|
|
delete mScaleText;
|
|
|
|
|
delete mScaleLabel;
|
|
|
|
|
delete mCenterText;
|
|
|
|
|
delete mCenterLabel;
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-02 05:19:00 +00:00
|
|
|
|
void RasterMainWidget::setupTaskWindow() {
|
2025-04-01 10:23:24 +00:00
|
|
|
|
mUi->taskTable->setColumnCount(5);
|
|
|
|
|
mUi->taskTable->setHorizontalHeaderLabels(QStringList{
|
|
|
|
|
"名称", "范围", "zoom值", "数据源", "进度"
|
|
|
|
|
});
|
|
|
|
|
mUi->taskTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-02 05:19:00 +00:00
|
|
|
|
void RasterMainWidget::setupActions() {
|
2025-04-01 10:23:24 +00:00
|
|
|
|
mMapActionGroup->addAction(mUi->panAction);
|
|
|
|
|
mMapActionGroup->addAction(mUi->zoomInAction);
|
|
|
|
|
mMapActionGroup->addAction(mUi->zoomOutAction);
|
|
|
|
|
mMapActionGroup->addAction(mUi->selectAction);
|
|
|
|
|
|
|
|
|
|
mUi->selectAction->setEnabled(false);
|
|
|
|
|
|
|
|
|
|
QObject::connect(mUi->panAction, &QAction::triggered, this, &RasterMainWidget::panHandle);
|
|
|
|
|
QObject::connect(mUi->zoomInAction, &QAction::triggered, this, &RasterMainWidget::zoomInHandle);
|
|
|
|
|
QObject::connect(mUi->zoomOutAction, &QAction::triggered, this, &RasterMainWidget::zoomOutHandle);
|
|
|
|
|
|
|
|
|
|
QObject::connect(mUi->refreshAction, &QAction::triggered, this, &RasterMainWidget::refreshHandle);
|
|
|
|
|
QObject::connect(mUi->sponsorAction, &QAction::triggered, this, &RasterMainWidget::sponsorHandle);
|
|
|
|
|
QObject::connect(mUi->selectAction, &QAction::triggered, this, &RasterMainWidget::selectHandle);
|
|
|
|
|
QObject::connect(mUi->downloadAction, &QAction::triggered, this, &RasterMainWidget::createDownloadTask);
|
|
|
|
|
QObject::connect(mUi->drawlineAction, &QAction::triggered, this, &RasterMainWidget::drawlineHandle);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void RasterMainWidget::setupWindow() {
|
2025-05-09 09:06:07 +00:00
|
|
|
|
//mMapglWidget = new QOpenGLWidget(mMapConvas); // 使用OpenGL渲染
|
|
|
|
|
//mMapConvas->setViewport(mMapglWidget);
|
|
|
|
|
//mMapConvas->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
|
2025-04-01 10:23:24 +00:00
|
|
|
|
mUi->mapCanvasLayout->addWidget(mMapConvas);
|
|
|
|
|
//setFixedSize(size());
|
|
|
|
|
//setWindowFlags(windowFlags() | Qt::WindowMinMaxButtonsHint | Qt::WindowSystemMenuHint);
|
|
|
|
|
|
|
|
|
|
QObject::connect(mMapConvas, &MapCanvas::zoomChanged, this, &RasterMainWidget::zoomChangedHandle);
|
|
|
|
|
QObject::connect(mMapConvas, &MapCanvas::clicked, this, &RasterMainWidget::clickedHandle);
|
|
|
|
|
QObject::connect(mMapConvas, &MapCanvas::mapCenterChanged, this, &RasterMainWidget::centerChangedHandle);
|
|
|
|
|
QObject::connect(mUi->layerList, &QListWidget::currentItemChanged, this, &RasterMainWidget::layerChanged);
|
|
|
|
|
QObject::connect(mUi->leftTopBtn, &QPushButton::clicked, this, &RasterMainWidget::leftTopClickedHandle);
|
|
|
|
|
QObject::connect(mUi->rightBottomBtn, &QPushButton::clicked, this, &RasterMainWidget::rightBottomClickedHandle);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void RasterMainWidget::setupStatusBar() {
|
|
|
|
|
/// 比例尺
|
|
|
|
|
mScaleLabel->setText("比例尺");
|
|
|
|
|
mScaleText->setText(QString("1cm : %1m").arg(mMapConvas->scale()));
|
|
|
|
|
mScaleText->setFixedWidth(150);
|
|
|
|
|
mScaleText->setReadOnly(true);
|
|
|
|
|
mUi->statusbar->addWidget(mScaleLabel);
|
|
|
|
|
mUi->statusbar->addWidget(mScaleText);
|
|
|
|
|
|
|
|
|
|
/// 空白间隔
|
|
|
|
|
mUi->statusbar->addWidget(spacerWiget(30));
|
|
|
|
|
|
|
|
|
|
/// zoom值
|
|
|
|
|
mZoomLabel->setText("Zoom值=>");
|
|
|
|
|
mZoomText->setText(QString("%1").arg(mMapConvas->zoomValue()));
|
|
|
|
|
mZoomText->setFixedWidth(80);
|
|
|
|
|
mZoomText->setReadOnly(true);
|
|
|
|
|
mUi->statusbar->addWidget(mZoomLabel);
|
|
|
|
|
mUi->statusbar->addWidget(mZoomText);
|
|
|
|
|
|
|
|
|
|
/// 空白间隔
|
|
|
|
|
mUi->statusbar->addWidget(spacerWiget(30));
|
|
|
|
|
|
|
|
|
|
/// 视图中心坐标
|
|
|
|
|
mCenterLabel->setText("视图中心坐标=>");
|
|
|
|
|
PointXY center = mMapConvas->mapCenter();
|
|
|
|
|
mCenterText->setText(QString("lon:%1, lat:%2").arg(center.x()).arg(center.y()));
|
|
|
|
|
mCenterText->setFixedWidth(300);
|
|
|
|
|
mCenterText->setReadOnly(true);
|
|
|
|
|
mUi->statusbar->addWidget(mCenterLabel);
|
|
|
|
|
mUi->statusbar->addWidget(mCenterText);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void RasterMainWidget::setupLayers() {
|
|
|
|
|
initMaps();
|
|
|
|
|
auto i = mMaps.constBegin();
|
|
|
|
|
for (; i != mMaps.constEnd(); ++i) {
|
|
|
|
|
mLayerList.append(new QListWidgetItem(i.key(), mUi->layerList));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-02 05:19:00 +00:00
|
|
|
|
void RasterMainWidget::initMaps() {
|
|
|
|
|
if (mMaps.isEmpty()) {
|
2025-04-01 10:23:24 +00:00
|
|
|
|
mMaps = QHash<QString, MapLayer*>{
|
2025-05-02 05:19:00 +00:00
|
|
|
|
//{"Openstreet地图", new TmsLayer(OSTNormalMap, "ostnormalmap", mMapConvas)},
|
|
|
|
|
{"高德地图", new TmsLayer(GaodeNormapMap, "gaodenormalmap", mMapConvas)}
|
2025-04-01 10:23:24 +00:00
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void RasterMainWidget::setRightToolbox()
|
|
|
|
|
{
|
|
|
|
|
this->toolboxDockWidget = new QDockWidget(tr(u8"工具箱"), this);
|
|
|
|
|
toolboxDockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
|
|
|
|
|
toolBoxWidget = new ToolBoxWidget(this);
|
|
|
|
|
toolboxDockWidget->setWidget(toolBoxWidget);
|
|
|
|
|
addDockWidget(Qt::LeftDockWidgetArea, toolboxDockWidget);
|
|
|
|
|
setDockOptions(QMainWindow::AllowNestedDocks | QMainWindow::AllowTabbedDocks);
|
|
|
|
|
this->initToolbox();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void RasterMainWidget::initToolbox()
|
|
|
|
|
{
|
|
|
|
|
QString appPath = QCoreApplication::applicationDirPath();
|
|
|
|
|
QString pluginPath = JoinPath(appPath, "Toolbox");
|
|
|
|
|
|
|
|
|
|
toolBoxWidget->initToolbox(pluginPath);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-02 05:19:00 +00:00
|
|
|
|
void RasterMainWidget::setupShowMessage()
|
|
|
|
|
{
|
|
|
|
|
// 绑定消息显示
|
|
|
|
|
RasterMessageShow::RasterWidgetMessageShow* messageshow = RasterMessageShow::RasterWidgetMessageShow::getInstance(this);
|
|
|
|
|
messageshow->bandingTextBrowserMessage(this->mUi->textBrowserMessage);
|
|
|
|
|
|
|
|
|
|
connect(mUi->actioncloseAllRasterFile, SIGNAL(triggered()), this, SLOT(onactioncloseAllRasterFile_triggered()));
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-01 10:23:24 +00:00
|
|
|
|
QWidget* RasterMainWidget::spacerWiget(int width) const {
|
|
|
|
|
auto spacer = new QWidget{};
|
|
|
|
|
spacer->setHidden(true);
|
|
|
|
|
spacer->setVisible(true);
|
|
|
|
|
spacer->setFixedWidth(width);
|
|
|
|
|
|
|
|
|
|
return spacer;
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-02 05:19:00 +00:00
|
|
|
|
void RasterMainWidget::panHandle(bool checked) {
|
2025-04-01 10:23:24 +00:00
|
|
|
|
mMapConvas->selectTool(QString{ "pan_tool" });
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-02 05:19:00 +00:00
|
|
|
|
void RasterMainWidget::zoomInHandle(bool checked) {
|
2025-04-01 10:23:24 +00:00
|
|
|
|
mMapConvas->selectTool(QString{ "zoomin_tool" });
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-02 05:19:00 +00:00
|
|
|
|
void RasterMainWidget::zoomOutHandle(bool checked) {
|
2025-04-01 10:23:24 +00:00
|
|
|
|
mMapConvas->selectTool(QString{ "zoomout_tool" });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void RasterMainWidget::drawlineHandle(bool checked)
|
|
|
|
|
{
|
|
|
|
|
mMapConvas->selectTool("drawline_tool");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-05-02 05:19:00 +00:00
|
|
|
|
|
|
|
|
|
void RasterMainWidget::sponsorHandle(bool checked) {
|
2025-04-01 10:23:24 +00:00
|
|
|
|
auto* window = new SponsorWindow(dynamic_cast<QWidget*>(this));
|
|
|
|
|
window->exec();
|
|
|
|
|
window->deleteLater();
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-02 05:19:00 +00:00
|
|
|
|
void RasterMainWidget::refreshHandle(bool checked) {
|
2025-04-01 10:23:24 +00:00
|
|
|
|
mMapConvas->refreshMap();
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-02 05:19:00 +00:00
|
|
|
|
void RasterMainWidget::selectHandle(bool checked) {
|
2025-04-01 10:23:24 +00:00
|
|
|
|
mMapConvas->selectTool(QString{ "select_tool" });
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-02 05:19:00 +00:00
|
|
|
|
void RasterMainWidget::centerChangedHandle(LAMPMainWidget::PointXY pos) {
|
2025-04-01 10:23:24 +00:00
|
|
|
|
mCenterText->setText(QString("lon:%1, lat:%2").arg(pos.x()).arg(pos.y()));
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-02 05:19:00 +00:00
|
|
|
|
void RasterMainWidget::zoomChangedHandle(int zoom) {
|
2025-04-01 10:23:24 +00:00
|
|
|
|
mZoomText->setText(QString("%1").arg(zoom));
|
|
|
|
|
mScaleText->setText(QString("1cm:%1m").arg(this->mMapConvas->scale()));
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-02 05:19:00 +00:00
|
|
|
|
void RasterMainWidget::clickedHandle(LAMPMainWidget::PointXY pos) {
|
2025-04-01 10:23:24 +00:00
|
|
|
|
QString posText = QString("%1, %2").arg(pos.x()).arg(pos.y());
|
|
|
|
|
if (mSetLeftTop) {
|
|
|
|
|
mUi->leftTopText->setText(posText);
|
|
|
|
|
mLeftTop = pos;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
mUi->rightBottomText->setText(posText);
|
|
|
|
|
mRightBottom = pos;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-02 05:19:00 +00:00
|
|
|
|
void RasterMainWidget::leftTopClickedHandle() {
|
2025-04-01 10:23:24 +00:00
|
|
|
|
mSetLeftTop = true;
|
|
|
|
|
mUi->selectAction->trigger();
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-02 05:19:00 +00:00
|
|
|
|
void RasterMainWidget::rightBottomClickedHandle() {
|
2025-04-01 10:23:24 +00:00
|
|
|
|
mSetLeftTop = false;
|
|
|
|
|
mUi->selectAction->trigger();
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-02 05:19:00 +00:00
|
|
|
|
void RasterMainWidget::layerChanged(QListWidgetItem* current, QListWidgetItem* previous) {
|
2025-04-01 10:23:24 +00:00
|
|
|
|
auto mapName = current->text();
|
|
|
|
|
if (!mMaps.contains(mapName)) {
|
2025-05-02 05:19:00 +00:00
|
|
|
|
qDebug() << mapName << u8"不支持";
|
2025-04-01 10:23:24 +00:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
auto layer = mMaps.value(mapName);
|
|
|
|
|
auto i = mMaps.begin();
|
|
|
|
|
for (; i != mMaps.end(); ++i) {
|
|
|
|
|
if (i.key() == mapName) {
|
2025-05-02 05:19:00 +00:00
|
|
|
|
i.value()->setVisiblity(true); // 切换图层为显示模式
|
2025-04-01 10:23:24 +00:00
|
|
|
|
qDebug() << i.key() << i.value()->isVisible();
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
i.value()->setVisiblity(false);
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-02 05:19:00 +00:00
|
|
|
|
mMapConvas->addLayer(layer);//图层开始显示
|
2025-04-01 10:23:24 +00:00
|
|
|
|
mMapConvas->setCurrentLayer(layer->id());
|
2025-05-02 05:19:00 +00:00
|
|
|
|
mMapConvas->refreshMap();//刷新地图
|
2025-04-01 10:23:24 +00:00
|
|
|
|
|
2025-05-02 05:19:00 +00:00
|
|
|
|
zoomChangedHandle(mMapConvas->zoomValue());// 更新zoom值
|
|
|
|
|
centerChangedHandle(mMapConvas->mapCenter());// 更新中心坐标
|
2025-04-01 10:23:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2025-05-02 05:19:00 +00:00
|
|
|
|
void RasterMainWidget::createDownloadTask() {
|
2025-04-01 10:23:24 +00:00
|
|
|
|
auto taskWindow = new TaskWindow(dynamic_cast<QWidget*>(this));
|
|
|
|
|
taskWindow->exec();
|
|
|
|
|
taskWindow->deleteLater();
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-02 05:19:00 +00:00
|
|
|
|
void RasterMainWidget::changeTaskTable(int row, int col, QString text) {
|
2025-04-01 10:23:24 +00:00
|
|
|
|
mUi->taskTable->takeItem(row, col);
|
|
|
|
|
mUi->taskTable->setItem(row, col, new QTableWidgetItem(text));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void RasterMainWidget::on_drawArea_triggered()
|
|
|
|
|
{
|
|
|
|
|
mMapConvas->selectTool("drawarea_tool");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void RasterMainWidget::on_addPlaneaction_triggered()
|
|
|
|
|
{
|
|
|
|
|
mMapConvas->selectTool("addplane_tool");
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-02 05:19:00 +00:00
|
|
|
|
void RasterMainWidget::onactioncloseAllRasterFile_triggered()
|
|
|
|
|
{
|
|
|
|
|
CloseAllGDALRaster();
|
|
|
|
|
}
|
2025-04-11 03:29:12 +00:00
|
|
|
|
|
2025-05-02 05:19:00 +00:00
|
|
|
|
QTableWidget* RasterMainWidget::getTaskTable()
|
|
|
|
|
{
|
|
|
|
|
return this->mUi->taskTable;
|
|
|
|
|
}
|
2025-02-07 09:16:22 +00:00
|
|
|
|
|
2025-02-09 18:16:07 +00:00
|
|
|
|
}
|