Manual-Labeling-Tool/Manual-Label-Tool-Widget/ManualLabelToolWidget.cpp

277 lines
8.7 KiB
C++
Raw Normal View History

2025-10-13 05:49:55 +00:00
#include "ManualLabelToolWidget.h"
#include <qdockwidget.h>
#include <qgslayertreeview.h>
#include <qgslayertreemodel.h>
#include <qgslayertreemapcanvasbridge.h>
#include <qgslayertreeview.h>
#include <qgslayertreemapcanvasbridge.h>
#include <qlabel.h>
#include <qstatusbar.h>
#include <QMenuBar>
#include <QToolBar>
#include <qgsmapcanvas.h>
#include <qgsrasterlayer.h>
#include <qgsmaptoolpan.h>
#include <qgsunittypes.h>
#include <QString>
#include <qgis.h>
#include <QgsMapSettings.h>
#include <QFile>
#include <QFileDialog>
#include <QDialog>
#include <QString>
#include <qfileinfo.h>
#include <qdir.h>
#include <qgsmaplayer.h>
#include <qgsproject.h>
//QgsUnitTypes
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʲ<EFBFBD><CAB2><EFBFBD>
#define RASTERFILEFILTER u8"<22><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD> (*.*);;TIF (*.tif);;TIFF (*.tiff);;bin (*.bin);;dat (*.dat);;"
ManualLabelToolWidget::ManualLabelToolWidget(QWidget *parent)
: QMainWindow(parent)
{
this->init_UI();
}
ManualLabelToolWidget::~ManualLabelToolWidget()
{
}
void ManualLabelToolWidget::init_UI()
{
this->setWindowTitle(tr(u8"AI<EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD>"));
// <20><>ʼ<EFBFBD><CABC>С
{
this->resize(1920,1080);
}
//<2F><>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>
{
// 1. inti map canvas
this->map_canvas = new QgsMapCanvas();
this->setCentralWidget((this->map_canvas));
// 2. map tool pan
this->map_tool_pan = new QgsMapToolPan(this->map_canvas);
this->map_canvas->setMapTool(this->map_tool_pan);
// 3. map layer manager
this->map_layerTreeView = new QgsLayerTreeView(this);
// 4. create map model
this->map_layerModel = new QgsLayerTreeModel(QgsProject::instance()->layerTreeRoot(), this);
this->map_layerModel->setFlag(QgsLayerTreeModel::AllowNodeRename); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
this->map_layerModel->setFlag(QgsLayerTreeModel::AllowNodeReorder); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3>
this->map_layerModel->setFlag(QgsLayerTreeModel::AllowNodeChangeVisibility); // <20><><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1>ɼ<EFBFBD><C9BC><EFBFBD>
this->map_layerModel->setFlag(QgsLayerTreeModel::ShowLegendAsTree); // <20><><EFBFBD><EFBFBD>״ͼ<D7B4><CDBC>ʾͼ<CABE><CDBC>
this->map_layerModel->setAutoCollapseLegendNodes(10); // <20>Զ<EFBFBD><D4B6>۵<EFBFBD><DBB5><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>
this->map_layerTreeView->setModel(this->map_layerModel);
// create bridge between mapcontrol and layer
this->map_layer_Bridge = new QgsLayerTreeMapCanvasBridge(QgsProject::instance()->layerTreeRoot(), this->map_canvas, this);
// layer <20><><EFBFBD><EFBFBD>
// 1. <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>QDockWidget<65><74>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ
this->layerTreeDock = new QDockWidget(tr(u8"ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"), this);
this->layerTreeDock->setWidget(this->map_layerTreeView);
// 2. <20><><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ(m_layerTreeView)<29><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>
layerTreeDock->setWidget(this->map_layerTreeView);
// 3. (<28><>ѡ<EFBFBD><D1A1><EFBFBD>Ƽ<EFBFBD>)<29><><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
layerTreeDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
// 5. <20><>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
this->addDockWidget(Qt::LeftDockWidgetArea, this->layerTreeDock);
}
// ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
appStatusBar = this->statusBar(); // <20><>ȡ<EFBFBD>򴴽<EFBFBD>״̬<D7B4><CCAC>
scaleLabel = new QLabel(tr(u8"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߣ<EFBFBD>"));
CoordinaryTextLabel = new QLabel(tr(u8"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD>"));
PointXYLabel = new QLabel(tr(u8"<EFBFBD><EFBFBD><EFBFBD>"));
UnitLabel = new QLabel(tr(u8"<EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>"));
appStatusBar->addPermanentWidget(PointXYLabel); //
appStatusBar->addPermanentWidget(scaleLabel); //
appStatusBar->addPermanentWidget(UnitLabel); //
appStatusBar->addPermanentWidget(CoordinaryTextLabel); //
// <20><><EFBFBD>ӱ<EFBFBD><D3B1><EFBFBD><EFBFBD>߱仯<DFB1>ź<EFBFBD>
connect(map_canvas, SIGNAL(scaleChanged(double)) , this, SLOT(updateScaleLabel(double)));
connect(map_canvas, SIGNAL(xyCoordinates(const QgsPointXY&)), this, SLOT(updateCoordinateLabel(const QgsPointXY&)));
connect(map_canvas, SIGNAL(extentsChanged()), this, SLOT(onMapExtentsChanged()));
}
// <20>˵<EFBFBD><CBB5><EFBFBD>
{
menubar = this->menuBar();
// <20>ڲ˵<DAB2><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"<22>ļ<EFBFBD>"<22><>"<22>༭"<22>˵<EFBFBD>
fileMenu = menubar->addMenu(tr(u8"<EFBFBD>ļ<EFBFBD>"));
// <20><>"<22>ļ<EFBFBD>"<22>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ˵<D3B2><CBB5>QAction<6F><6E>
newAction = fileMenu->addAction(tr(u8"<EFBFBD>½<EFBFBD>"));
fileMenu->addSeparator(); // <20><><EFBFBD>ӷָ<D3B7><D6B8><EFBFBD>[1,5](@ref)
openMenu = fileMenu->addMenu(tr(u8"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>"));
openRasterFolderAction = openMenu->addAction(tr(u8"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>"));
openRasterAction = openMenu->addAction(tr(u8"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><EFBFBD>"));
openSLCRasterAction = openMenu->addAction(tr(u8"SLCӰ<EFBFBD><EFBFBD>"));
editMenu = menubar->addMenu(tr(u8"<EFBFBD>"));
// <20>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>
QObject::connect(this->openRasterAction, SIGNAL(triggered()), this, SLOT(openRasterLayerTriggered()));
}
// AI<41><49>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
AiLabelToolBar = new QToolBar(tr(u8"AI<EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"), this);
this->addToolBar(Qt::LeftToolBarArea, AiLabelToolBar);
}
}
void ManualLabelToolWidget::open()
{
}
void ManualLabelToolWidget::openRasterLayerTriggered()
{
if (lastFileDialogPath.isEmpty()) {
lastFileDialogPath = ".";
}
// <20><><EFBFBD><EFBFBD>Ӱ<EFBFBD><D3B0>
// 2. ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
QString rasterPath = QFileDialog::getOpenFileName(
this,
tr(u8"<EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>Ӱ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>"),
lastFileDialogPath,
tr(RASTERFILEFILTER)
);
lastFileDialogPath = rasterPath;
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
this->openRaster(rasterPath);
}
void ManualLabelToolWidget::openRaster(QString& filePath)
{
QString filename = QFileInfo(filePath).fileName();
QgsRasterLayer* rasterLayer = new QgsRasterLayer(filePath, filename);
if (!rasterLayer->isValid()) {
qDebug() << "Failed to load raster layer!";
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return;
}
QgsProject::instance()->addMapLayer(rasterLayer);
}
void ManualLabelToolWidget::updateCoordinateLabel(const QgsPointXY& point)
{
QString coordText = QString(tr(u8"<EFBFBD><EFBFBD><EFBFBD>꣺X:%1 Y:%2")).arg(QString::number(point.x(), 'f', 2)).arg(QString::number(point.y(), 'f', 2));
PointXYLabel->setText(coordText);
}
void ManualLabelToolWidget::onMapExtentsChanged()
{
QgsRectangle currentExtent = map_canvas->extent();
//// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7>Ϣ<EFBFBD>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD>
//// 1. <20><>ӡ<EFBFBD><D3A1>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD>
//qDebug() << "<22>·<EFBFBD>Χ - Xmin:" << currentExtent.xMinimum()
// << "Ymin:" << currentExtent.yMinimum()
// << "Xmax:" << currentExtent.xMaximum()
// << "Ymax:" << currentExtent.yMaximum();
}
void ManualLabelToolWidget::onLayersChanged(QgsMapLayer* layer)
{
// WGS<47><53><EFBFBD><EFBFBD>ϵ
QgsCoordinateReferenceSystem currentCrs = map_canvas->mapSettings().destinationCrs();
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>֤<EFBFBD><D6A4>ʶ<EFBFBD><CAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "WGS 84 / EPSG:4326"
QString description = currentCrs.description();
QString authid = currentCrs.authid();
// <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>
QList<QgsMapLayer*> layers = QgsProject::instance()->mapLayers().values();
int layerCount = layers.size();
// <20>жϵ<D0B6>ǰ<EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
if (layerCount == 0&&description == "") {
QgsMapLayer* theOnlyLayer = layers.first();
// <20><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ч<EFBFBD><D0A7>ӵ<EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ
if (theOnlyLayer && theOnlyLayer->isValid() && theOnlyLayer->crs().isValid()) {
// <20><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>ͼ<EFBFBD><CDBC>һ<EFBFBD><D2BB>
map_canvas->mapSettings().setDestinationCrs(theOnlyLayer->crs());
// <20><>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><E1B9A9><EFBFBD>õij<C3B5>ʼ<EFBFBD><CABC>ͼ
map_canvas->setExtent(theOnlyLayer->extent());
// ˢ<>»<EFBFBD><C2BB><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч
map_canvas->refresh();
qDebug() << "ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ1<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>" << theOnlyLayer->crs().description();
}
}
}
void ManualLabelToolWidget::updateScaleLabel(double scale)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>ʽ<EFBFBD><CABD>Ϊ<EFBFBD>׶<EFBFBD><D7B6><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1:10000
QString scaleText = QString(tr(u8"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߣ<EFBFBD>1:%1")).arg(QString::number(scale, 'f', 0));
scaleLabel->setText(scaleText);
// ͬʱ<CDAC><CAB1><EFBFBD>µ<EFBFBD>λ<EFBFBD><CEBB>ǩ
Qgis::DistanceUnit unit = map_canvas->mapUnits();
QString unitString;
if (unit == Qgis::DistanceUnit::Meters) {
unitString = tr(u8"<EFBFBD><EFBFBD>");
}
else if (unit == Qgis::DistanceUnit::Degrees) {
unitString = tr(u8"<EFBFBD><EFBFBD>");
}
else if (unit == Qgis::DistanceUnit::Feet) {
unitString = tr(u8"Ӣ<EFBFBD><EFBFBD>");
}
else {
unitString = tr(u8"δ֪");
}
UnitLabel->setText(QString(tr(u8"<EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>%1")).arg(unitString));
// WGS<47><53><EFBFBD><EFBFBD>ϵ
QgsCoordinateReferenceSystem currentCrs = map_canvas->mapSettings().destinationCrs();
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>֤<EFBFBD><D6A4>ʶ<EFBFBD><CAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "WGS 84 / EPSG:4326"
QString description = currentCrs.description();
QString authid = currentCrs.authid();
if (description == "") {
// <20><><EFBFBD><EFBFBD> ui->label_crs <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>Ϣ<EFBFBD><CFA2>QLabel
CoordinaryTextLabel->setText(QString(tr(u8"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD>δ֪")));
}
else {
// <20><><EFBFBD><EFBFBD> ui->label_crs <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>Ϣ<EFBFBD><CFA2>QLabel
CoordinaryTextLabel->setText(QString(tr(u8"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD>%1 (%2)")).arg(description).arg(authid));
}
}