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
+
+
+
+
+
+
+
+
+