diff --git a/ALLRelease/ALLRelease.vcxproj b/ALLRelease/ALLRelease.vcxproj index 3453369..ecf4b96 100644 --- a/ALLRelease/ALLRelease.vcxproj +++ b/ALLRelease/ALLRelease.vcxproj @@ -141,6 +141,9 @@ {8c8ca066-a93a-4098-9a46-b855efeaadf2} + + {4e6e79a3-048c-4fb4-bbb0-43c518a3e6d4} + {7ef67daa-dbc0-4b7f-80e8-11b4d2cb7ec2} diff --git a/BaseCommonLibrary/BaseTool/ImageOperatorBase.cpp b/BaseCommonLibrary/BaseTool/ImageOperatorBase.cpp index b125bd9..37887d8 100644 --- a/BaseCommonLibrary/BaseTool/ImageOperatorBase.cpp +++ b/BaseCommonLibrary/BaseTool/ImageOperatorBase.cpp @@ -3627,3 +3627,108 @@ bool ConvertCoordinateSystem(QString inRasterPath, QString outRasterPath, long o return true; } + + + + + +void ResampleByReferenceRasterB(QString rasterAPath, QString rasterBPath, QString rasterCPath) { + GDALAllRegister(); // 初始化GDAL驱动 + + // 阶段1:读取参考栅格B的元数据 + GDALDatasetH hRefDS = GDALOpen(rasterBPath.toUtf8().constData(), GA_ReadOnly); + if (!hRefDS) { + qDebug() << u8"参考栅格打开失败:" << rasterBPath; + return; + } + + // 获取地理变换参数和尺寸 + double geotransform[6]; + int refWidth = GDALGetRasterXSize(hRefDS); + int refHeight = GDALGetRasterYSize(hRefDS); + if (GDALGetGeoTransform(hRefDS, geotransform) != CE_None) { + GDALClose(hRefDS); + qDebug() << u8"参考栅格缺少地理变换参数:" << rasterBPath; + return; + } + + // 计算目标地理范围 + const double xmin = geotransform[0]; + const double ymax = geotransform[3]; + const double xmax = xmin + geotransform[1] * refWidth; + const double ymin = ymax + geotransform[5] * refHeight; + + // 获取目标坐标系 + const char* projRef = GDALGetProjectionRef(hRefDS); + OGRSpatialReference targetSRS; + if (projRef[0] == '\0' || targetSRS.importFromWkt(projRef) != OGRERR_NONE) { + GDALClose(hRefDS); + qDebug() << u8"参考栅格坐标系无效:" << rasterBPath; + return; + } + GDALClose(hRefDS); // 尽早释放参考数据集 + + // 阶段2:配置Warp参数 + char** warpOptions = nullptr; + warpOptions = CSLAddString(warpOptions, "-t_srs"); // 目标坐标系 + char* targetSRSWkt = nullptr; + targetSRS.exportToWkt(&targetSRSWkt); + warpOptions = CSLAddString(warpOptions, targetSRSWkt); + + warpOptions = CSLAddString(warpOptions, "-te"); // 目标范围 + warpOptions = CSLAddString(warpOptions, QString::number(xmin, 'f', 10).toUtf8().constData()); + warpOptions = CSLAddString(warpOptions, QString::number(ymin, 'f', 10).toUtf8().constData()); + warpOptions = CSLAddString(warpOptions, QString::number(xmax, 'f', 10).toUtf8().constData()); + warpOptions = CSLAddString(warpOptions, QString::number(ymax, 'f', 10).toUtf8().constData()); + + warpOptions = CSLAddString(warpOptions, "-ts"); // 目标尺寸 + warpOptions = CSLAddString(warpOptions, QString::number(refWidth).toUtf8().constData()); + warpOptions = CSLAddString(warpOptions, QString::number(refHeight).toUtf8().constData()); + + warpOptions = CSLAddString(warpOptions, "-r"); // 双线性重采样 + warpOptions = CSLAddString(warpOptions, "bilinear"); + + warpOptions = CSLAddString(warpOptions, "-of"); // 输出为GTiff + warpOptions = CSLAddString(warpOptions, "GTiff"); + + warpOptions = CSLAddString(warpOptions, "-wo"); // 启用多线程 + warpOptions = CSLAddString(warpOptions, "NUM_THREADS=ALL_CPUS"); + + warpOptions = CSLAddString(warpOptions, "-co"); // 压缩优化 + warpOptions = CSLAddString(warpOptions, "COMPRESS=LZW"); + + // 阶段3:执行重采样操作 + GDALWarpAppOptions* warpAppOptions = GDALWarpAppOptionsNew(warpOptions, nullptr); + GDALDatasetH hSrcDS = GDALOpen(rasterAPath.toUtf8().constData(), GA_ReadOnly); + if (!hSrcDS) { + GDALWarpAppOptionsFree(warpAppOptions); + CSLDestroy(warpOptions); + CPLFree(targetSRSWkt); + qDebug() << u8"源栅格打开失败:" << rasterAPath; + return; + } + + int bUsageError = FALSE; + GDALDatasetH hDstDS = GDALWarp( + rasterCPath.toUtf8().constData(), // 输出路径 + nullptr, // 自动选择驱动 + 1, &hSrcDS, // 输入数据集 + warpAppOptions, // 转换参数 + &bUsageError // 错误状态 + ); + + // 阶段4:资源清理与状态检查 + GDALClose(hSrcDS); + if (hDstDS) GDALClose(hDstDS); + GDALWarpAppOptionsFree(warpAppOptions); + CSLDestroy(warpOptions); + CPLFree(targetSRSWkt); + + if (bUsageError || !hDstDS) { + qDebug() << u8"重采样过程发生错误"; + return; + } + qDebug() << u8"重采样成功完成:" << rasterCPath; +} + + diff --git a/LAMPDataProcessEXE/LAMPDataProcessEXE.vcxproj b/LAMPDataProcessEXE/LAMPDataProcessEXE.vcxproj index fe9184b..cbab17c 100644 --- a/LAMPDataProcessEXE/LAMPDataProcessEXE.vcxproj +++ b/LAMPDataProcessEXE/LAMPDataProcessEXE.vcxproj @@ -109,9 +109,6 @@ - - {8a71d19d-9ac6-42e9-81ec-9e82af8075b8} - {872ecd6f-30e3-4a1b-b17c-15e87d373ff6} diff --git a/Toolbox/BaseToolbox/BaseToolbox.cpp b/Toolbox/BaseToolbox/BaseToolbox.cpp index 8c9f242..4d33185 100644 --- a/Toolbox/BaseToolbox/BaseToolbox.cpp +++ b/Toolbox/BaseToolbox/BaseToolbox.cpp @@ -10,7 +10,7 @@ #include "QDEMResampleDialog.h" #include "DEMLLA2XYZTool.h" #include "QConvertCoordinateSystemDialog.h" - +#include "QResampleRefrenceRaster.h" GF3ImportDataToolButton::GF3ImportDataToolButton(QWidget* parent) :QToolAbstract(parent) { @@ -161,3 +161,20 @@ void QConvertCoordinateSystemToolButton::excute() QConvertCoordinateSystemDialog* dialog = new QConvertCoordinateSystemDialog(); dialog->show(); } + +QResampleRefrenceRasterToolButton::QResampleRefrenceRasterToolButton(QWidget* parent) +{ + this->toolPath = QVector(0); + this->toolPath.push_back(u8""); + this->toolname = QString(u8"դزοӰ"); +} + +QResampleRefrenceRasterToolButton::~QResampleRefrenceRasterToolButton() +{ +} + +void QResampleRefrenceRasterToolButton::excute() +{ + QResampleRefrenceRaster* dialog = new QResampleRefrenceRaster; + dialog->show(); +} diff --git a/Toolbox/BaseToolbox/BaseToolbox.h b/Toolbox/BaseToolbox/BaseToolbox.h index 750af8a..d1bf550 100644 --- a/Toolbox/BaseToolbox/BaseToolbox.h +++ b/Toolbox/BaseToolbox/BaseToolbox.h @@ -96,4 +96,17 @@ public slots: }; + + +class BASETOOLBOX_EXPORT QResampleRefrenceRasterToolButton : public QToolAbstract { + Q_OBJECT +public: + QResampleRefrenceRasterToolButton(QWidget* parent = nullptr); + ~QResampleRefrenceRasterToolButton(); +public slots: + virtual void excute() override; + +}; + + extern "C" BASETOOLBOX_EXPORT void RegisterPreToolBox(LAMPMainWidget::RasterMainWidget* mainwindows, ToolBoxWidget* toolbox); diff --git a/Toolbox/BaseToolbox/BaseToolbox.vcxproj b/Toolbox/BaseToolbox/BaseToolbox.vcxproj index 39ba4a7..3609a96 100644 --- a/Toolbox/BaseToolbox/BaseToolbox.vcxproj +++ b/Toolbox/BaseToolbox/BaseToolbox.vcxproj @@ -118,6 +118,7 @@ + @@ -133,6 +134,7 @@ + @@ -151,6 +153,7 @@ + diff --git a/Toolbox/BaseToolbox/BaseToolbox.vcxproj.filters b/Toolbox/BaseToolbox/BaseToolbox.vcxproj.filters index ef54615..40f93db 100644 --- a/Toolbox/BaseToolbox/BaseToolbox.vcxproj.filters +++ b/Toolbox/BaseToolbox/BaseToolbox.vcxproj.filters @@ -97,6 +97,9 @@ BaseToolbox + + BaseToolbox + @@ -129,6 +132,9 @@ BaseToolbox + + BaseToolbox + @@ -158,5 +164,8 @@ BaseToolbox + + BaseToolbox + \ No newline at end of file diff --git a/Toolbox/BaseToolbox/BaseToolbox/QResampleRefrenceRaster.cpp b/Toolbox/BaseToolbox/BaseToolbox/QResampleRefrenceRaster.cpp new file mode 100644 index 0000000..be8bfe5 --- /dev/null +++ b/Toolbox/BaseToolbox/BaseToolbox/QResampleRefrenceRaster.cpp @@ -0,0 +1,97 @@ +#include "QResampleRefrenceRaster.h" +#include "ui_QResampleRefrenceRaster.h" +#include +#include + +QResampleRefrenceRaster::QResampleRefrenceRaster(QWidget *parent) + : QDialog(parent),ui(new Ui::QResampleRefrenceRasterClass) +{ + ui->setupUi(this); + + connect(ui->dialogBtn, SIGNAL(accepted()), this, SLOT(ondialogBtnaccepted())); + connect(ui->dialogBtn, SIGNAL(rejected()), this, SLOT(ondialogBtnrejected())); + connect(ui->BtnInRaster, SIGNAL(clicked(bool)), this, SLOT(onBtnInRasterClicked(bool))); + connect(ui->BtnOutRaster, SIGNAL(clicked(bool)), this, SLOT(onBtnOutRasterClicked(bool))); + connect(ui->BtnRefRaster, SIGNAL(clicked(bool)), this, SLOT(onBtnRefRasterClicked(bool))); + +} + +QResampleRefrenceRaster::~QResampleRefrenceRaster() +{} + + +void QResampleRefrenceRaster::onBtnInRasterClicked(bool) +{ + QString fileName = QFileDialog::getOpenFileName( + this, // + tr(u8"ѡӰ"), // + QString(), // Ĭ· + tr(u8"tif Files (*.tif);;data Files (*.data);;bin Files (*.bin);;All Files (*)") // ļ + ); + + // ûѡļ + if (!fileName.isEmpty()) { + this->ui->lineEditInRaster->setText(fileName); + + } + else { + QMessageBox::information(this, tr(u8"ûѡļ"), tr(u8"ûѡκļ")); + } +} + +void QResampleRefrenceRaster::onBtnOutRasterClicked(bool) +{ + QString fileName = QFileDialog::getSaveFileName( + this, // + tr(u8"Ӱ"), // + QString(), // Ĭ· + tr(u8"tif Files (*.tif);;data Files (*.data);;bin Files (*.bin);;All Files (*)") // ļ + ); + + // ûѡļ + if (!fileName.isEmpty()) { + this->ui->lineEditOutRaster->setText(fileName); + + } + else { + QMessageBox::information(this, tr(u8"ûѡļ"), tr(u8"ûѡκļ")); + } +} + +void QResampleRefrenceRaster::onBtnRefRasterClicked(bool) +{ + QString fileName = QFileDialog::getOpenFileName( + this, // + tr(u8"ѡοӰ"), // + QString(), // Ĭ· + tr(u8"tif Files (*.tif);;data Files (*.data);;bin Files (*.bin);;All Files (*)") // ļ + ); + + // ûѡļ + if (!fileName.isEmpty()) { + this->ui->lineEditRefRaster->setText(fileName); + + } + else { + QMessageBox::information(this, tr(u8"ûѡļ"), tr(u8"ûѡκļ")); + } +} + +void QResampleRefrenceRaster::ondialogBtnaccepted() +{ + QString inRasterPath = this->ui->lineEditInRaster->text(); + QString RefRasterPath = this->ui->lineEditRefRaster->text(); + QString OutRasterPath = this->ui->lineEditOutRaster->text(); + + + + + + + +} + +void QResampleRefrenceRaster::ondialogBtnrejected() +{ + this->close(); +} diff --git a/Toolbox/BaseToolbox/BaseToolbox/QResampleRefrenceRaster.h b/Toolbox/BaseToolbox/BaseToolbox/QResampleRefrenceRaster.h new file mode 100644 index 0000000..1990653 --- /dev/null +++ b/Toolbox/BaseToolbox/BaseToolbox/QResampleRefrenceRaster.h @@ -0,0 +1,30 @@ +#pragma once + +#include + + +namespace Ui { + class QResampleRefrenceRasterClass; +} + + +class QResampleRefrenceRaster : public QDialog +{ + Q_OBJECT + +public: + QResampleRefrenceRaster(QWidget *parent = nullptr); + ~QResampleRefrenceRaster(); + +private: + Ui::QResampleRefrenceRasterClass* ui; + + +public slots : + + void onBtnInRasterClicked(bool); + void onBtnOutRasterClicked(bool); + void onBtnRefRasterClicked(bool); + void ondialogBtnaccepted(); + void ondialogBtnrejected(); +}; diff --git a/Toolbox/BaseToolbox/BaseToolbox/QResampleRefrenceRaster.ui b/Toolbox/BaseToolbox/BaseToolbox/QResampleRefrenceRaster.ui new file mode 100644 index 0000000..e200b3b --- /dev/null +++ b/Toolbox/BaseToolbox/BaseToolbox/QResampleRefrenceRaster.ui @@ -0,0 +1,161 @@ + + + QResampleRefrenceRasterClass + + + + 0 + 0 + 600 + 400 + + + + QResampleRefrenceRaster + + + + + + + + + 0 + 30 + + + + 选择 + + + + + + + + 0 + 30 + + + + 选择 + + + + + + + + 0 + 30 + + + + + + + + + 0 + 30 + + + + + + + + + 0 + 30 + + + + 选择 + + + + + + + + 0 + 30 + + + + + + + + + 0 + 30 + + + + 输入影像: + + + + + + + + 0 + 30 + + + + 参考影像: + + + + + + + + 0 + 30 + + + + 输入影像: + + + + + + + + + Qt::Vertical + + + + 20 + 220 + + + + + + + + + + + + + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + +