修复bug
parent
3292dc63e9
commit
32be3d8f48
|
|
@ -3606,12 +3606,14 @@ void ConvertCoordinateSystem(QString inRasterPath, QString outRasterPath, long o
|
||||||
|
|
||||||
if (!warpedVRT) {
|
if (!warpedVRT) {
|
||||||
GDALClose(srcDataset);
|
GDALClose(srcDataset);
|
||||||
// qDebug() << "创建投影转换VRT失败";
|
qDebug() << u8"创建投影转换VRT失败";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取输出驱动(GeoTIFF格式)
|
// 获取输出驱动(GeoTIFF格式)
|
||||||
GDALDriver* driver = GetGDALDriverManager()->GetDriverByName("GTiff");
|
QString filesuffer = getFileExtension(outRasterPath).toLower();
|
||||||
|
bool isTiff = filesuffer.contains("tif");
|
||||||
|
GDALDriver* driver = isTiff ? GetGDALDriverManager()->GetDriverByName("GTiff") : GetGDALDriverManager()->GetDriverByName("ENVI");
|
||||||
if (!driver) {
|
if (!driver) {
|
||||||
GDALClose(warpedVRT);
|
GDALClose(warpedVRT);
|
||||||
GDALClose(srcDataset);
|
GDALClose(srcDataset);
|
||||||
|
|
@ -3643,103 +3645,154 @@ void ConvertCoordinateSystem(QString inRasterPath, QString outRasterPath, long o
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ResampleByReferenceRasterB(QString rasterAPath, QString rasterBPath, QString rasterCPath) {
|
void ResampleByReferenceRasterB(QString pszSrcFile, QString RefrasterBPath, QString pszOutFile, GDALResampleAlg eResample) {
|
||||||
GDALAllRegister(); // 初始化GDAL驱动
|
GDALAllRegister();
|
||||||
|
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
|
||||||
// 阶段1:读取参考栅格B的元数据
|
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");
|
||||||
GDALDatasetH hRefDS = GDALOpen(rasterBPath.toUtf8().constData(), GA_ReadOnly);
|
GDALDataset* pDSrc = (GDALDataset*)GDALOpen(pszSrcFile.toLocal8Bit().constData(), GA_ReadOnly);
|
||||||
if (!hRefDS) {
|
if (pDSrc == NULL) {
|
||||||
qDebug() << u8"参考栅格打开失败:" << rasterBPath;
|
qDebug() << u8"do not open In Raster file: " << pszSrcFile;
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取地理变换参数和尺寸
|
GDALDataset* pDRef = (GDALDataset*)GDALOpen(RefrasterBPath.toLocal8Bit().constData(), GA_ReadOnly);
|
||||||
double geotransform[6];
|
if (pDRef == NULL) {
|
||||||
int refWidth = GDALGetRasterXSize(hRefDS);
|
qDebug() << u8"do not open Ref Raster file: " << RefrasterBPath;
|
||||||
int refHeight = GDALGetRasterYSize(hRefDS);
|
|
||||||
if (GDALGetGeoTransform(hRefDS, geotransform) != CE_None) {
|
|
||||||
GDALClose(hRefDS);
|
|
||||||
qDebug() << u8"参考栅格缺少地理变换参数:" << rasterBPath;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 计算目标地理范围
|
QString filesuffer = getFileExtension(pszOutFile).toLower();
|
||||||
const double xmin = geotransform[0];
|
bool isTiff = filesuffer.contains("tif");
|
||||||
const double ymax = geotransform[3];
|
GDALDriver* pDriver = isTiff ? GetGDALDriverManager()->GetDriverByName("GTiff") : GetGDALDriverManager()->GetDriverByName("ENVI");
|
||||||
const double xmax = xmin + geotransform[1] * refWidth;
|
|
||||||
const double ymin = ymax + geotransform[5] * refHeight;
|
|
||||||
|
|
||||||
// 获取目标坐标系
|
if (pDriver == NULL) {
|
||||||
const char* projRef = GDALGetProjectionRef(hRefDS);
|
qDebug() << "not open driver";
|
||||||
OGRSpatialReference targetSRS;
|
GDALClose((GDALDatasetH)(GDALDatasetH)pDSrc);
|
||||||
if (projRef[0] == '\0' || targetSRS.importFromWkt(projRef) != OGRERR_NONE) {
|
|
||||||
GDALClose(hRefDS);
|
|
||||||
qDebug() << u8"参考栅格坐标系无效:" << rasterBPath;
|
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
GDALClose(hRefDS); // 尽早释放参考数据集
|
int width = pDSrc->GetRasterXSize();
|
||||||
|
int height = pDSrc->GetRasterYSize();
|
||||||
|
int nBandCount = pDSrc->GetRasterCount();
|
||||||
|
GDALDataType dataType = pDSrc->GetRasterBand(1)->GetRasterDataType();
|
||||||
|
|
||||||
// 阶段2:配置Warp参数
|
char* pszSrcWKT = NULL;
|
||||||
char** warpOptions = nullptr;
|
pszSrcWKT = const_cast<char*>(pDSrc->GetProjectionRef());
|
||||||
warpOptions = CSLAddString(warpOptions, "-t_srs"); // 目标坐标系
|
|
||||||
char* targetSRSWkt = nullptr;
|
|
||||||
targetSRS.exportToWkt(&targetSRSWkt);
|
|
||||||
warpOptions = CSLAddString(warpOptions, targetSRSWkt);
|
|
||||||
|
|
||||||
warpOptions = CSLAddString(warpOptions, "-te"); // 目标范围
|
// 锟斤拷锟矫伙拷锟酵队帮拷锟斤拷锟轿?拷锟斤拷锟揭伙拷锟?1锟?7
|
||||||
warpOptions = CSLAddString(warpOptions, QString::number(xmin, 'f', 10).toUtf8().constData());
|
if (strlen(pszSrcWKT) <= 0) {
|
||||||
warpOptions = CSLAddString(warpOptions, QString::number(ymin, 'f', 10).toUtf8().constData());
|
OGRSpatialReference oSRS;
|
||||||
warpOptions = CSLAddString(warpOptions, QString::number(xmax, 'f', 10).toUtf8().constData());
|
oSRS.importFromEPSG(4326);
|
||||||
warpOptions = CSLAddString(warpOptions, QString::number(ymax, 'f', 10).toUtf8().constData());
|
// oSRS.SetUTM(50, true); //锟斤拷锟斤拷锟斤拷 锟斤拷锟斤拷120锟斤拷
|
||||||
|
// oSRS.SetWellKnownGeogCS("WGS84");
|
||||||
|
oSRS.exportToWkt(&pszSrcWKT);
|
||||||
|
}
|
||||||
|
|
||||||
warpOptions = CSLAddString(warpOptions, "-ts"); // 目标尺寸
|
char* pdstSrcWKT = NULL;
|
||||||
warpOptions = CSLAddString(warpOptions, QString::number(refWidth).toUtf8().constData());
|
pdstSrcWKT = const_cast<char*>(pDRef->GetProjectionRef());
|
||||||
warpOptions = CSLAddString(warpOptions, QString::number(refHeight).toUtf8().constData());
|
|
||||||
|
|
||||||
warpOptions = CSLAddString(warpOptions, "-r"); // 双线性重采样
|
// 锟斤拷锟矫伙拷锟酵队帮拷锟斤拷锟轿?拷锟斤拷锟揭伙拷锟?1锟?7
|
||||||
warpOptions = CSLAddString(warpOptions, "bilinear");
|
if (strlen(pdstSrcWKT) <= 0)
|
||||||
|
{
|
||||||
|
OGRSpatialReference oSRS;
|
||||||
|
oSRS.importFromEPSG(4326);
|
||||||
|
// oSRS.SetUTM(50, true); //锟斤拷锟斤拷锟斤拷 锟斤拷锟斤拷120锟斤拷
|
||||||
|
// oSRS.SetWellKnownGeogCS("WGS84");
|
||||||
|
oSRS.exportToWkt(&pdstSrcWKT);
|
||||||
|
}
|
||||||
|
|
||||||
warpOptions = CSLAddString(warpOptions, "-of"); // 输出为GTiff
|
|
||||||
warpOptions = CSLAddString(warpOptions, "GTiff");
|
|
||||||
|
|
||||||
warpOptions = CSLAddString(warpOptions, "-wo"); // 启用多线程
|
int new_width = pDRef->GetRasterXSize();
|
||||||
warpOptions = CSLAddString(warpOptions, "NUM_THREADS=ALL_CPUS");
|
int new_height = pDRef->GetRasterYSize();
|
||||||
|
double gt[6] ;
|
||||||
|
pDRef->GetGeoTransform(gt);
|
||||||
|
|
||||||
warpOptions = CSLAddString(warpOptions, "-co"); // 压缩优化
|
// GDALDestroyGenImgProjTransformer(hTransformArg);
|
||||||
warpOptions = CSLAddString(warpOptions, "COMPRESS=LZW");
|
qDebug() << "create init GDALDataset ";
|
||||||
|
GDALDataset* pDDst =
|
||||||
// 阶段3:执行重采样操作
|
pDriver->Create(pszOutFile.toLocal8Bit().constData(), new_width, new_height, nBandCount, dataType, NULL);
|
||||||
GDALWarpAppOptions* warpAppOptions = GDALWarpAppOptionsNew(warpOptions, nullptr);
|
if (pDDst == NULL) {
|
||||||
GDALDatasetH hSrcDS = GDALOpen(rasterAPath.toUtf8().constData(), GA_ReadOnly);
|
qDebug() << "not create init GDALDataset ";
|
||||||
if (!hSrcDS) {
|
GDALClose((GDALDatasetH)(GDALDatasetH)pDSrc);
|
||||||
GDALWarpAppOptionsFree(warpAppOptions);
|
GDALClose((GDALDatasetH)(GDALDatasetH)pDDst);
|
||||||
CSLDestroy(warpOptions);
|
GDALClose((GDALDatasetH)(GDALDatasetH)pDRef);
|
||||||
CPLFree(targetSRSWkt);
|
|
||||||
qDebug() << u8"源栅格打开失败:" << rasterAPath;
|
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
int bUsageError = FALSE;
|
pDDst->SetProjection(pdstSrcWKT);
|
||||||
GDALDatasetH hDstDS = GDALWarp(
|
pDDst->SetGeoTransform(gt);
|
||||||
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() << "GDALCreateGenImgProjTransformer " << Qt::endl;
|
||||||
qDebug() << u8"重采样过程发生错误";
|
void* hTransformArg;
|
||||||
|
hTransformArg = GDALCreateGenImgProjTransformer((GDALDatasetH)pDSrc, pszSrcWKT, NULL, pszSrcWKT,
|
||||||
|
FALSE, 0.0, 1);
|
||||||
|
qDebug() << "no proj ";
|
||||||
|
//(没锟斤拷投影锟斤拷影锟斤拷锟斤拷锟斤拷锟斤拷卟锟酵?拷锟?1锟?7)
|
||||||
|
if (hTransformArg == NULL) {
|
||||||
|
qDebug() << "hTransformArg create failure";
|
||||||
|
GDALClose((GDALDatasetH)(GDALDatasetH)pDSrc);
|
||||||
|
GDALClose((GDALDatasetH)(GDALDatasetH)pDDst);
|
||||||
|
GDALClose((GDALDatasetH)(GDALDatasetH)pDRef);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
qDebug() << u8"重采样成功完成:" << rasterCPath;
|
qDebug() << "has proj ";
|
||||||
|
double dGeoTrans[6] = { 0 };
|
||||||
|
int nNewWidth = 0, nNewHeight = 0;
|
||||||
|
if (GDALSuggestedWarpOutput((GDALDatasetH)pDSrc, GDALGenImgProjTransform, hTransformArg,
|
||||||
|
dGeoTrans, &nNewWidth, &nNewHeight)
|
||||||
|
!= CE_None) {
|
||||||
|
GDALClose((GDALDatasetH)(GDALDatasetH)pDSrc);
|
||||||
|
GDALClose((GDALDatasetH)(GDALDatasetH)pDDst);
|
||||||
|
GDALClose((GDALDatasetH)(GDALDatasetH)pDRef);
|
||||||
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
GDALWarpOptions* psWo = GDALCreateWarpOptions();
|
||||||
|
CPLSetConfigOption("GDAL_NUM_THREADS", "ALL_CPUS"); // 使用所有可用的CPU核心
|
||||||
|
CPLSetConfigOption("GDAL_CACHEMAX", "16000"); // 设置缓存大小为500MB
|
||||||
|
// psWo->papszWarpOptions = CSLDuplicate(NULL);
|
||||||
|
psWo->eWorkingDataType = dataType;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
psWo->eResampleAlg = eResample;
|
||||||
|
|
||||||
|
psWo->hSrcDS = (GDALDatasetH)pDSrc;
|
||||||
|
psWo->hDstDS = (GDALDatasetH)pDDst;
|
||||||
|
qDebug() << "GDALCreateGenImgProjTransformer" ;
|
||||||
|
psWo->pfnTransformer = GDALGenImgProjTransform;
|
||||||
|
psWo->pTransformerArg = GDALCreateGenImgProjTransformer(
|
||||||
|
(GDALDatasetH)pDSrc, pszSrcWKT, (GDALDatasetH)pDDst, pszSrcWKT, FALSE, 0.0, 1);
|
||||||
|
;
|
||||||
|
|
||||||
|
qDebug() << "GDALCreateGenImgProjTransformer has created" << Qt::endl;
|
||||||
|
psWo->nBandCount = nBandCount;
|
||||||
|
psWo->panSrcBands = (int*)CPLMalloc(nBandCount * sizeof(int));
|
||||||
|
psWo->panDstBands = (int*)CPLMalloc(nBandCount * sizeof(int));
|
||||||
|
for (int i = 0; i < nBandCount; i++) {
|
||||||
|
psWo->panSrcBands[i] = i + 1;
|
||||||
|
psWo->panDstBands[i] = i + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
GDALWarpOperation oWo;
|
||||||
|
if (oWo.Initialize(psWo) != CE_None) {
|
||||||
|
GDALClose((GDALDatasetH)(GDALDatasetH)pDSrc);
|
||||||
|
GDALClose((GDALDatasetH)(GDALDatasetH)pDDst);
|
||||||
|
GDALClose((GDALDatasetH)(GDALDatasetH)pDRef);
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
qDebug() << "ChunkAndWarpImage:" << new_width << "," << new_height << Qt::endl;
|
||||||
|
oWo.ChunkAndWarpMulti(0, 0, new_width, new_height);
|
||||||
|
GDALFlushCache(pDDst);
|
||||||
|
qDebug() << "ChunkAndWarpImage over" << Qt::endl;
|
||||||
|
// GDALDestroyGenImgProjTransformer(psWo->pTransformerArg);
|
||||||
|
// GDALDestroyWarpOptions(psWo);
|
||||||
|
GDALClose((GDALDatasetH)(GDALDatasetH)pDSrc);
|
||||||
|
GDALClose((GDALDatasetH)(GDALDatasetH)pDDst);
|
||||||
|
GDALClose((GDALDatasetH)(GDALDatasetH)pDRef);
|
||||||
|
////GDALDestroy(); // or, DllMain at DLL_PROCESS_DETACH
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -261,6 +261,9 @@ ErrorCode BASECONSTVARIABLEAPI transformCoordinate(double x, double y, int sou
|
||||||
|
|
||||||
int BASECONSTVARIABLEAPI alignRaster(QString inputPath, QString referencePath, QString outputPath, GDALResampleAlg eResample);
|
int BASECONSTVARIABLEAPI alignRaster(QString inputPath, QString referencePath, QString outputPath, GDALResampleAlg eResample);
|
||||||
|
|
||||||
|
|
||||||
|
void BASECONSTVARIABLEAPI ResampleByReferenceRasterB(QString pszSrcFile, QString RefrasterBPath, QString pszOutFile, GDALResampleAlg eResample);
|
||||||
|
|
||||||
//--------------------- 保存文博 -------------------------------
|
//--------------------- 保存文博 -------------------------------
|
||||||
|
|
||||||
int BASECONSTVARIABLEAPI saveMatrixXcd2TiFF(Eigen::MatrixXcd data, QString out_tiff_path);
|
int BASECONSTVARIABLEAPI saveMatrixXcd2TiFF(Eigen::MatrixXcd data, QString out_tiff_path);
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
#include "ui_QResampleRefrenceRaster.h"
|
#include "ui_QResampleRefrenceRaster.h"
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
#include <QFileDialog>
|
#include <QFileDialog>
|
||||||
|
#include "ImageOperatorBase.h"
|
||||||
|
|
||||||
QResampleRefrenceRaster::QResampleRefrenceRaster(QWidget *parent)
|
QResampleRefrenceRaster::QResampleRefrenceRaster(QWidget *parent)
|
||||||
: QDialog(parent),ui(new Ui::QResampleRefrenceRasterClass)
|
: QDialog(parent),ui(new Ui::QResampleRefrenceRasterClass)
|
||||||
|
|
@ -83,12 +84,26 @@ void QResampleRefrenceRaster::ondialogBtnaccepted()
|
||||||
QString RefRasterPath = this->ui->lineEditRefRaster->text();
|
QString RefRasterPath = this->ui->lineEditRefRaster->text();
|
||||||
QString OutRasterPath = this->ui->lineEditOutRaster->text();
|
QString OutRasterPath = this->ui->lineEditOutRaster->text();
|
||||||
|
|
||||||
|
std::shared_ptr<double> gt(new double[6], delArrPtr);
|
||||||
|
gdalImage refimage(RefRasterPath);
|
||||||
|
|
||||||
|
gt.get()[0] = refimage.gt(0, 0);
|
||||||
|
gt.get()[1] = refimage.gt(0, 1);
|
||||||
|
gt.get()[2] = refimage.gt(0, 2);
|
||||||
|
gt.get()[3] = refimage.gt(1, 0);
|
||||||
|
gt.get()[4] = refimage.gt(1, 1);
|
||||||
|
gt.get()[5] = refimage.gt(1, 2);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ResampleGDAL(inRasterPath.toLocal8Bit().constData(), OutRasterPath.toLocal8Bit().constData(),
|
||||||
|
gt.get(), refimage.width, refimage.height,
|
||||||
|
GDALResampleAlg::GRA_Bilinear);
|
||||||
|
//alignRaster(inRasterPath, RefRasterPath, OutRasterPath,GDALResampleAlg::GRA_Bilinear);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
QMessageBox::information(this, tr(u8"Ìáʾ"), tr(u8"completed!!!"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void QResampleRefrenceRaster::ondialogBtnrejected()
|
void QResampleRefrenceRaster::ondialogBtnrejected()
|
||||||
|
|
|
||||||
|
|
@ -120,7 +120,7 @@
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>输入影像:</string>
|
<string>输出影像:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue