From 2a424bd634f51a58043494bc074fe5687e65c921 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=A2=9E=E8=BE=89?= <3045316072@qq.com> Date: Mon, 25 Nov 2024 15:14:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=BE=E5=9B=9E=E4=B8=A2=E5=A4=B1=E7=9A=84?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BaseConstVariable.h | 35 ++- BaseTool.cpp | 47 +++- BaseTool.h | 8 + FileOperator.cpp | 37 ++- FileOperator.h | 6 + ImageOperatorBase.cpp | 414 +++++++++++++++++++++++++++++++-- ImageOperatorBase.h | 31 ++- LogInfoCls.cpp | 1 + LogInfoCls.h | 3 +- SARSimulationImageL1.cpp | 480 ++++++++++++++++++++++++++++++++++++++- SARSimulationImageL1.h | 97 +++++++- 11 files changed, 1113 insertions(+), 46 deletions(-) diff --git a/BaseConstVariable.h b/BaseConstVariable.h index 3d21db4..bb099df 100644 --- a/BaseConstVariable.h +++ b/BaseConstVariable.h @@ -2,7 +2,7 @@ #ifndef BASECONSTVARIABLE_H #define BASECONSTVARIABLE_H -//#define EIGEN_USE_MKL_ALL +#define EIGEN_USE_MKL_ALL //#define EIGEN_NO_DEBUG @@ -17,14 +17,17 @@ #include #include +#define MATPLOTDRAWIMAGE + + #define PI_180 180/3.141592653589793238462643383279 #define T180_PI 3.141592653589793238462643383279/180 #define LIGHTSPEED 299792458 #define PRECISIONTOLERANCE 1e-9 #define Radians2Degrees(Radians) Radians*PI_180 #define Degrees2Radians(Degrees) Degrees*T180_PI +#define EARTHWE 0.000072292115 -#define MATPLOTDRAWIMAGE #define earthRoute 0.000072292115 @@ -52,7 +55,7 @@ const double earth_Rp = (1 - 1 / f_inverse) * earth_Re; const double earth_We = 0.000072292115; /*********************************************** openMap参数 ********************************************************************/ -static long Paral_num_thread = 6; +static long Paral_num_thread = 14; /*********************************************** 基础枚举 ********************************************************************/ @@ -61,7 +64,8 @@ enum POLARTYPEENUM { // 极化类型 POLARHH, POLARHV, POLARVH, - POLARVV + POLARVV, + POLARUNKOWN }; @@ -89,11 +93,28 @@ struct Point3 { double z = 0; }; +struct DemBox { + double min_lon; + double max_lon; + double min_lat; + double max_lat; +}; + + /*********************************************** FEKO仿真参数 ********************************************************************/ +struct SatellitePos { + double time; + double Px; + double Py; + double Pz; + double Vx; + double Vy; + double Vz; +}; struct SatelliteAntPos { - double time; + double time; // 0 double Px; double Py; double Pz; @@ -108,10 +129,12 @@ struct SatelliteAntPos { double AVz; double lon; double lat; - double ati; + double ati; // 15 }; + + /*********************************************** 指针回收区域 ********************************************************************/ inline void delArrPtr(void* p) diff --git a/BaseTool.cpp b/BaseTool.cpp index c122680..9e9fca4 100644 --- a/BaseTool.cpp +++ b/BaseTool.cpp @@ -8,7 +8,7 @@ #include #include ////#include -#include + #include #include #include < io.h > @@ -539,3 +539,48 @@ long FindValueInStdVectorLast(std::vector& list, double& insertValue) return -1; } + +ErrorCode polynomial_fit(const std::vector& x, const std::vector& y, int degree, std::vector& out_factor, double& out_chisq) { + int xyLength = x.size(); + double* xdata = new double[xyLength]; + double* ydata = new double[xyLength]; + for (long i = 0; i < xyLength; i++) { + xdata[i] = x[i]; + ydata[i] = y[i]; + } + ErrorCode state = polyfit(xdata, ydata, xyLength, degree, out_factor, out_chisq); + + delete[] xdata; + delete[] ydata; // 释放内存 + return state; +} + +QVector SatellitePos2SatelliteAntPos(QVector poses) +{ + QVector antposes(poses.count()); + for (long i = 0; i < poses.count(); i++) { + antposes[i].time = poses[i].time; + antposes[i].Px = poses[i].Px; + antposes[i].Py = poses[i].Py; + antposes[i].Pz = poses[i].Pz; + antposes[i].Vx = poses[i].Vx; + antposes[i].Vy = poses[i].Vy; + antposes[i].Vz = poses[i].Vz; + } + return antposes; +} + +QVector SatelliteAntPos2SatellitePos(QVector poses) +{ + QVector antposes(poses.count()); + for (long i = 0; i < poses.count(); i++) { + antposes[i].time = poses[i].time; + antposes[i].Px = poses[i].Px; + antposes[i].Py = poses[i].Py; + antposes[i].Pz = poses[i].Pz; + antposes[i].Vx = poses[i].Vx; + antposes[i].Vy = poses[i].Vy; + antposes[i].Vz = poses[i].Vz; + } + return antposes; +} diff --git a/BaseTool.h b/BaseTool.h index b2b0220..ccb0c1b 100644 --- a/BaseTool.h +++ b/BaseTool.h @@ -105,5 +105,13 @@ long InsertValueInStdVector(std::vector& list, double insertValue, bool long FindValueInStdVectorLast(std::vector& list, double& findv); +ErrorCode polynomial_fit(const std::vector& x, const std::vector& y, int degree, std::vector& out_factor, double& out_chisq); + +QVector SatellitePos2SatelliteAntPos(QVector poses); + +QVector SatelliteAntPos2SatellitePos(QVector poses); + + + #endif \ No newline at end of file diff --git a/FileOperator.cpp b/FileOperator.cpp index 3319db2..7127be3 100644 --- a/FileOperator.cpp +++ b/FileOperator.cpp @@ -90,6 +90,13 @@ QString getFileNameFromPath(const QString& path) return fileInfo.fileName(); } +QString getFileNameWidthoutExtend(QString path) +{ + QFileInfo fileInfo(path); + QString fileNameWithoutExtension = fileInfo.baseName(); // 获取无后缀文件名 + return fileNameWithoutExtension; +} + bool isDirectory(const QString& path) { QFileInfo fileinfo(path); @@ -215,4 +222,32 @@ void copyFile(const QString& sourcePath, const QString& destinationPath) { // 源文件不存在 QMessageBox::warning(nullptr, QObject::tr("warning"), QObject::tr("Source file not found")); } -} \ No newline at end of file +} + + + + +bool copyAndReplaceFile(const QString& sourceFilePath, const QString& destinationFilePath) { + // 检查源文件是否存在 + if (!QFile::exists(sourceFilePath)) { + qDebug() << "Source file does not exist:" << sourceFilePath; + return false; + } + + // 如果目标文件存在,则删除它 + if (QFile::exists(destinationFilePath)) { + if (!QFile::remove(destinationFilePath)) { + qDebug() << "Failed to remove existing destination file:" << destinationFilePath; + return false; + } + } + + // 复制文件 + if (!QFile::copy(sourceFilePath, destinationFilePath)) { + qDebug() << "Failed to copy file from" << sourceFilePath << "to" << destinationFilePath; + return false; + } + + qDebug() << "File copied successfully from" << sourceFilePath << "to" << destinationFilePath; + return true; +} diff --git a/FileOperator.h b/FileOperator.h index 01f5131..c0fd563 100644 --- a/FileOperator.h +++ b/FileOperator.h @@ -35,6 +35,8 @@ QString getParantFolderNameFromPath(const QString& path); QString getFileNameFromPath(const QString& path); +QString getFileNameWidthoutExtend(QString path); + int write_binfile(char* filepath, char* data, size_t data_len); char* read_textfile(char* text_path, int* length); @@ -47,4 +49,8 @@ QString getParantFromPath(const QString& path); void copyFile(const QString& sourcePath, const QString& destinationPath); QString addMaskToFileName(const QString& filePath, QString _zzname); // QT FileOperator + +bool copyAndReplaceFile(const QString& sourceFilePath, const QString& destinationFilePath); + + #endif \ No newline at end of file diff --git a/ImageOperatorBase.cpp b/ImageOperatorBase.cpp index a3381ef..45156ee 100644 --- a/ImageOperatorBase.cpp +++ b/ImageOperatorBase.cpp @@ -25,6 +25,12 @@ #include #include #include +#include +#include // OGRSpatialReference 用于空间参考转换 +#include // 用于 GDALWarp 操作 + +#include "../Imageshow/ImageShowDialogClass.h" + /** * 输入数据是ENVI格式数据 @@ -1645,7 +1651,7 @@ ErrorCode MergeRasterProcess(QVector filepaths, QString outfileptah, QS Eigen::MatrixXd rgt = Eigen::MatrixXd::Zero(2,3); RasterExtend mainExtend = mainimg.getExtend(); rgt(0, 1) = (mainExtend.max_x - mainExtend.min_x) / (mainimg.width - 1); //dx - rgt(1, 2) =-1*( (mainExtend.max_y - mainExtend.min_y) / (mainimg.height - 1));//dy + rgt(1, 2) = -1*std::abs(( (mainExtend.max_y - mainExtend.min_y) / (mainimg.height - 1)));//dy QVector extendlist(imgdslist.count()); for (long i = 0; i < imgdslist.count(); i++) { extendlist[i] = imgdslist[i].getExtend(); @@ -1736,15 +1742,14 @@ ErrorCode MergeRasterInGeoCoding(QVector imgdslist, gdalImage resulti } // 分块计算 - long resultline = Memory1MB * 300 / 8 / resultimg.width; - resultline = resultline < 1000 ? resultline : 1000; // 最多100行 + long resultline = Memory1MB * 1000 / 8 / resultimg.width; + resultline = resultline < 300 ? resultline : 300; // 最多100行 long bandnum = resultimg.band_num+1; long starti = 0; long rasterCount = imgdslist.count(); long processNumber = 0; - QProgressDialog progressDialog(u8"合并影像", u8"终止", 0, resultimg.height); progressDialog.setWindowTitle(u8"合并影像"); progressDialog.setWindowModality(Qt::WindowModal); @@ -1753,10 +1758,6 @@ ErrorCode MergeRasterInGeoCoding(QVector imgdslist, gdalImage resulti progressDialog.setMaximum(resultimg.height); progressDialog.setMinimum(0); progressDialog.show(); - - - - omp_lock_t lock; omp_init_lock(&lock); @@ -1783,12 +1784,19 @@ ErrorCode MergeRasterInGeoCoding(QVector imgdslist, gdalImage resulti rid = starti + i; for (long j = 0; j < resultimg.width; j++) {// 列号 cid = j; - resultimg.getLandPoint(i,j,0,pp); - lp = resultimg.getRow_Col(pp.lon, pp.lat); // 获取点坐标 + resultimg.getLandPoint(rid, cid,0,pp); + lp = imgdslist[ir].getRow_Col(pp.lon, pp.lat); // 获取点坐标 ridlist(i, j) = lp.lat; cidlist(i, j) = lp.lon; } } + + //ImageShowDialogClass* dialog = new ImageShowDialogClass; + //dialog->show(); + //dialog->load_double_MatrixX_data(cidlist, u8""); + + //dialog->exec(); + if (ridlist.maxCoeff() < 0 || ridlist.minCoeff() >= imgdslist[ir].height) { continue; @@ -1833,29 +1841,30 @@ ErrorCode MergeRasterInGeoCoding(QVector imgdslist, gdalImage resulti } } } - - - - rowcount = data.rows(); - colcount = data.cols(); + rowcount = ridlist.rows(); + colcount = ridlist.cols(); + double Bileanervalue = 0; for (long i = 0; i < rowcount; i++) { for (long j = 0; j < colcount; j++) { ridtemp = ridlist(i, j); cidtemp = cidlist(i, j); - if (ridtemp < 0 || ridtemp >= imgdslist[ir].height||cidtemp<0||cidtemp>=imgdslist[ir].width) { + lastr = std::floor(ridtemp); + nextr = std::ceil(ridtemp); + lastc = std::floor(cidtemp); + nextc = std::ceil(cidtemp); + + if (lastr < 0 || lastr >= imgdslist[ir].height + || nextr < 0 || nextr >= imgdslist[ir].height + || lastc < 0 || lastc >= imgdslist[ir].width + || nextc <0|| nextc >=imgdslist[ir].width) { continue; } else {} r0 = ridtemp - std::floor(ridtemp); c0 = cidtemp - std::floor(cidtemp); - - lastr = std::floor(ridtemp); - nextr = std::ceil(ridtemp); - lastc = std::floor(cidtemp); - lastc = std::ceil(cidtemp); - + lastr = lastr - minRid; nextr = nextr - minRid; @@ -1864,8 +1873,11 @@ ErrorCode MergeRasterInGeoCoding(QVector imgdslist, gdalImage resulti p21 = Landpoint{ 0,1,data(nextr,lastc) }; p12 = Landpoint{ 1,0,data(lastr,nextc) }; p22 = Landpoint{ 1,1,data(nextr,nextc) }; - - resultdata(i,j) = resultdata(i, j)+ Bilinear_interpolation(p0, p11, p21, p12, p22); + Bileanervalue = Bilinear_interpolation(p0, p11, p21, p12, p22); + if (std::abs(Bileanervalue) < 1e-6||resultmask(i, j)>0) { + continue; + } + resultdata(i,j) = resultdata(i, j)+ Bileanervalue; resultmask(i, j) = resultmask(i, j) + 1; } } @@ -2153,7 +2165,8 @@ void gdalImageComplex::savePreViewImage() -long getProjectEPSGCodeByLon_Lat(double lon, double lat, ProjectStripDelta stripState) + +long getProjectEPSGCodeByLon_Lat(double long, double lat, ProjectStripDelta stripState) { long EPSGCode = 0; switch (stripState) { @@ -2424,3 +2437,354 @@ void ShowProessAbstract::showProcess(double precent, QString tip) void ShowProessAbstract::showToolInfo(QString tip) { } + + +void resampleRaster(const char* inputRaster, const char* outputRaster, double targetPixelSizeX, double targetPixelSizeY) { + // 初始化GDAL + GDALAllRegister(); + // 打开输入栅格文件 + GDALDataset* poDataset = (GDALDataset*)GDALOpen(inputRaster, GA_ReadOnly); + if (poDataset == nullptr) { + std::cerr << "Failed to open raster file." << std::endl; + return; + } + + // 获取原始栅格的空间参考 + double adfGeoTransform[6]; + if (poDataset->GetGeoTransform(adfGeoTransform) != CE_None) { + std::cerr << "Failed to get geotransform." << std::endl; + GDALClose(poDataset); + return; + } + + // 获取原始栅格的尺寸 + int nXSize = poDataset->GetRasterXSize(); + int nYSize = poDataset->GetRasterYSize(); + + // 计算目标栅格的尺寸 + double targetXSize = (adfGeoTransform[1] * nXSize) / targetPixelSizeX; + double targetYSize = (adfGeoTransform[5] * nYSize) / targetPixelSizeY; + + // 创建目标数据集(输出栅格) + GDALDriver* poDriver = GetGDALDriverManager()->GetDriverByName("GTiff"); + if (poDriver == nullptr) { + std::cerr << "Failed to get GTiff driver." << std::endl; + GDALClose(poDataset); + return; + } + + // 创建输出数据集 + GDALDataset* poOutDataset = poDriver->Create(outputRaster, (int)targetXSize, (int)targetYSize, poDataset->GetRasterCount(), GDT_Float32, nullptr); + if (poOutDataset == nullptr) { + std::cerr << "Failed to create output raster." << std::endl; + GDALClose(poDataset); + return; + } + + // 设置输出数据集的地理变换(坐标系) + double targetGeoTransform[6] = { + adfGeoTransform[0], targetPixelSizeX, 0, adfGeoTransform[3], 0, -targetPixelSizeY + }; + poOutDataset->SetGeoTransform(targetGeoTransform); + + // 设置输出数据集的投影信息 + poOutDataset->SetProjection(poDataset->GetProjectionRef()); + + // 进行重采样 + for (int i = 0; i < poDataset->GetRasterCount(); i++) { + GDALRasterBand* poBand = poDataset->GetRasterBand(i + 1); + GDALRasterBand* poOutBand = poOutDataset->GetRasterBand(i + 1); + + // 使用GDAL的重采样方法,选择一个适当的重采样方式 + poOutBand->RasterIO(GF_Write, 0, 0, (int)targetXSize, (int)targetYSize, + nullptr, (int)targetXSize, (int)targetYSize, + poBand->GetRasterDataType(), 0, 0, nullptr); + } + + // 关闭数据集 + GDALClose(poDataset); + GDALClose(poOutDataset); + + std::cout << "Resampling completed." << std::endl; +} + +void transformRaster(const char* inputFile, const char* outputFile, int sourceEPSG, int targetEPSG) { + // 初始化 GDAL 库 + GDALAllRegister(); + + // 打开源栅格文件 + GDALDataset* poSrcDS = (GDALDataset*)GDALOpen(inputFile, GA_ReadOnly); + if (poSrcDS == nullptr) { + qDebug() << "Failed to open input file:" << inputFile; + return; + } + + // 获取源栅格的基本信息 + int nXSize = poSrcDS->GetRasterXSize(); + int nYSize = poSrcDS->GetRasterYSize(); + int nBands = poSrcDS->GetRasterCount(); + GDALDataType eDT = poSrcDS->GetRasterBand(1)->GetRasterDataType(); + + // 创建目标栅格文件 + GDALDriver* poDriver = GetGDALDriverManager()->GetDriverByName("GTiff"); + if (poDriver == nullptr) { + qDebug() << "GTiff driver not available."; + GDALClose(poSrcDS); + return; + } + + GDALDataset* poDstDS = poDriver->Create(outputFile, nXSize, nYSize, nBands, eDT, nullptr); + if (poDstDS == nullptr) { + qDebug() << "Failed to create output file:" << outputFile; + GDALClose(poSrcDS); + return; + } + + // 设置目标栅格的空间参考系统 + OGRSpatialReference oSRS; + oSRS.importFromEPSG(targetEPSG); + + char* pszWKT = nullptr; + oSRS.exportToWkt(&pszWKT); + poDstDS->SetProjection(pszWKT); + CPLFree(pszWKT); + + // 复制元数据 + poDstDS->SetMetadata(poSrcDS->GetMetadata()); + + // 复制每个波段的数据 + for (int i = 1; i <= nBands; ++i) { + GDALRasterBand* poSrcBand = poSrcDS->GetRasterBand(i); + GDALRasterBand* poDstBand = poDstDS->GetRasterBand(i); + + float* pafScanline = (float*)CPLMalloc(sizeof(float) * nXSize); + + for (int j = 0; j < nYSize; ++j) { + poSrcBand->RasterIO(GF_Read, 0, j, nXSize, 1, pafScanline, nXSize, 1, GDT_Float32, 0, 0); + poDstBand->RasterIO(GF_Write, 0, j, nXSize, 1, pafScanline, nXSize, 1, GDT_Float32, 0, 0); + } + + CPLFree(pafScanline); + } + + // 关闭数据集 + GDALClose(poSrcDS); + GDALClose(poDstDS); + + qDebug() << "Raster transformation completed successfully."; +} + + + +ErrorCode transformCoordinate(double x, double y, int sourceEPSG, int targetEPSG, Point2 &p) { + // 创建源坐标系(原始坐标系) + OGRSpatialReference sourceSRS; + sourceSRS.importFromEPSG(sourceEPSG); // 使用 EPSG 编码来指定坐标系 + + // 创建目标坐标系(目标坐标系) + OGRSpatialReference targetSRS; + targetSRS.importFromEPSG(targetEPSG); // WGS84 坐标系 EPSG:4326 + + // 创建坐标变换对象 + OGRCoordinateTransformation* transform = OGRCreateCoordinateTransformation(&sourceSRS, &targetSRS); + if (transform == nullptr) { + std::cerr << "Failed to create coordinate transformation." << std::endl; + return ErrorCode::FAIL; + } + + // 转换坐标 + double transformedX = x; + double transformedY = y; + if (transform->Transform(1, &transformedX, &transformedY)) { + std::cout << "Original Coordinates: (" << x << ", " << y << ")" << std::endl; + std::cout << "Transformed Coordinates (EPSG:" << targetEPSG << "): (" << transformedX << ", " << transformedY << ")" << std::endl; + } + else { + std::cerr << "Coordinate transformation failed." << std::endl; + } + + // 清理 + delete transform; + p.x = transformedX; + p.y = transformedY; + return ErrorCode::SUCCESS; + +} + +void cropRasterByLatLon(const char* inputFile, const char* outputFile,double minLon, double maxLon, double minLat, double maxLat) { + // 初始化 GDAL 库 + GDALAllRegister(); + + // 打开栅格数据集 + GDALDataset* poDataset = (GDALDataset*)GDALOpen(inputFile, GA_ReadOnly); + if (poDataset == nullptr) { + std::cerr << "Failed to open input raster." << std::endl; + return; + } + + // 获取栅格数据的地理参考信息 + double adfGeoTransform[6]; + if (poDataset->GetGeoTransform(adfGeoTransform) != CE_None) { + std::cerr << "Failed to get geotransform." << std::endl; + GDALClose(poDataset); + return; + } + + // 获取输入影像的投影信息 + const char* projection = poDataset->GetProjectionRef(); + + // 根据经纬度计算出裁剪区域对应的栅格像素坐标 + int xMin = (int)((minLon - adfGeoTransform[0]) / adfGeoTransform[1]); + int xMax = (int)((maxLon - adfGeoTransform[0]) / adfGeoTransform[1]); + int yMin = (int)((maxLat - adfGeoTransform[3]) / adfGeoTransform[5]); + int yMax = (int)((minLat - adfGeoTransform[3]) / adfGeoTransform[5]); + + // 创建裁剪区域的目标栅格数据集 + GDALDriver* poDriver = GetGDALDriverManager()->GetDriverByName("GTiff"); + if (poDriver == nullptr) { + std::cerr << "Failed to get GTiff driver." << std::endl; + GDALClose(poDataset); + return; + } + + // 创建输出栅格数据集,指定尺寸 + int width = xMax - xMin; + int height = yMax - yMin; + GDALDataset* poOutDataset = poDriver->Create(outputFile, width, height, poDataset->GetRasterCount(), GDT_Float32, nullptr); + if (poOutDataset == nullptr) { + std::cerr << "Failed to create output raster." << std::endl; + GDALClose(poDataset); + return; + } + + // 设置输出栅格的投影信息和地理变换 + poOutDataset->SetProjection(projection); + double newGeoTransform[6] = { adfGeoTransform[0] + xMin * adfGeoTransform[1], adfGeoTransform[1], 0.0, adfGeoTransform[3] + yMin * adfGeoTransform[5], 0.0, adfGeoTransform[5] }; + poOutDataset->SetGeoTransform(newGeoTransform); + + // 循环读取源数据并写入目标数据集 + for (int i = 0; i < poDataset->GetRasterCount(); ++i) { + GDALRasterBand* poBand = poDataset->GetRasterBand(i + 1); + GDALRasterBand* poOutBand = poOutDataset->GetRasterBand(i + 1); + + // 读取源数据 + int* pData = new int[width * height]; + poBand->RasterIO(GF_Read, xMin, yMin, width, height, pData, width, height, GDT_Int32, 0, 0); + + // 写入目标数据 + poOutBand->RasterIO(GF_Write, 0, 0, width, height, pData, width, height, GDT_Int32, 0, 0); + + delete[] pData; + } + + std::cout << "Raster cropped and saved to: " << outputFile << std::endl; + + // 清理 + GDALClose(poDataset); + GDALClose(poOutDataset); +} + + +ErrorCode DEM2XYZRasterAndSlopRaster(QString dempath, QString demxyzpath, QString demsloperPath) +{ + gdalImage demds(dempath); + gdalImage demxyz = CreategdalImage(demxyzpath, demds.height, demds.width, 3, demds.gt, demds.projection, true, true);// X,Y,Z + + // 分块计算并转换为XYZ + + Eigen::MatrixXd demArr = demds.getData(0, 0, demds.height, demds.width, 1); + Eigen::MatrixXd demR = demArr; + Landpoint LandP{ 0,0,0 }; + Point3 GERpoint{ 0,0,0 }; + double R = 0; + double dem_row = 0, dem_col = 0, dem_alt = 0; + + long line_invert = 1000; + + double rowidx = 0; + double colidx = 0; + for (int max_rows_ids = 0; max_rows_ids < demds.height; max_rows_ids = max_rows_ids + line_invert) { + Eigen::MatrixXd demdata = demds.getData(max_rows_ids, 0, line_invert, demds.width, 1); + Eigen::MatrixXd xyzdata_x = demdata.array() * 0; + Eigen::MatrixXd xyzdata_y = demdata.array() * 0; + Eigen::MatrixXd xyzdata_z = demdata.array() * 0; + + int datarows = demdata.rows(); + int datacols = demdata.cols(); + + for (int i = 0; i < datarows; i++) { + for (int j = 0; j < datacols; j++) { + rowidx = i + max_rows_ids; + colidx = j; + demds.getLandPoint(rowidx, colidx, demdata(i, j), LandP); // 获取地理坐标 + LLA2XYZ(LandP, GERpoint); // 经纬度转换为地心坐标系 + xyzdata_x(i, j) = GERpoint.x; + xyzdata_y(i, j) = GERpoint.y; + xyzdata_z(i, j) = GERpoint.z; + } + } + demxyz.saveImage(xyzdata_x, max_rows_ids, 0, 1); + demxyz.saveImage(xyzdata_y, max_rows_ids, 0, 2); + demxyz.saveImage(xyzdata_z, max_rows_ids, 0, 3); + } + + + // 计算坡向角 + gdalImage demsloperxyz = CreategdalImage(demsloperPath, demds.height, demds.width, 4, demds.gt, demds.projection, true, true);// X,Y,Z,cosangle + + line_invert = 1000; + long start_ids = 0; + long dem_rows = 0, dem_cols = 0; + + for (start_ids = 1; start_ids < demds.height; start_ids = start_ids + line_invert) { + Eigen::MatrixXd demdata = demds.getData(start_ids - 1, 0, line_invert + 2, demxyz.width, 1); + long startlineid = start_ids; + Eigen::MatrixXd demsloper_x = demsloperxyz.getData(start_ids - 1, 0, line_invert + 2, demxyz.width, 1); + Eigen::MatrixXd demsloper_y = demsloperxyz.getData(start_ids - 1, 0, line_invert + 2, demxyz.width, 2); + Eigen::MatrixXd demsloper_z = demsloperxyz.getData(start_ids - 1, 0, line_invert + 2, demxyz.width, 3); + Eigen::MatrixXd demsloper_angle = demsloperxyz.getData(start_ids - 1, 0, line_invert + 2, demxyz.width, 4); + + Landpoint p0, p1, p2, p3, p4, pslopeVector, pp; + Vector3D slopeVector; + + dem_rows = demsloper_y.rows(); + dem_cols = demsloper_y.cols(); + double sloperAngle = 0; + Vector3D Zaxis = { 0,0,1 }; + + double rowidx = 0, colidx = 0; + + for (long i = 1; i < dem_rows - 1; i++) { + for (long j = 1; j < dem_cols - 1; j++) { + rowidx = i + startlineid; + colidx = j; + demds.getLandPoint(rowidx, colidx, demdata(i, j), p0); + demds.getLandPoint(rowidx - 1, colidx, demdata(i - 1, j), p1); + demds.getLandPoint(rowidx, colidx - 1, demdata(i, j - 1), p2); + demds.getLandPoint(rowidx + 1, colidx, demdata(i + 1, j), p3); + demds.getLandPoint(rowidx, colidx + 1, demdata(i, j + 1), p4); + + pslopeVector = getSlopeVector(p0, p1, p2, p3, p4); // 地面坡向矢量 + slopeVector = { pslopeVector.lon,pslopeVector.lat,pslopeVector.ati }; + pp = LLA2XYZ(p0); + Zaxis.x = pp.lon; + Zaxis.y = pp.lat; + Zaxis.z = pp.ati; + sloperAngle = getCosAngle(slopeVector, Zaxis); // 地面坡向角 + + demsloper_x(i, j) = slopeVector.x; + demsloper_y(i, j) = slopeVector.y; + demsloper_z(i, j) = slopeVector.z; + demsloper_angle(i, j) = sloperAngle; + } + } + demsloperxyz.saveImage(demsloper_x, start_ids - 1, 0, 1); + demsloperxyz.saveImage(demsloper_y, start_ids - 1, 0, 2); + demsloperxyz.saveImage(demsloper_z, start_ids - 1, 0, 3); + demsloperxyz.saveImage(demsloper_angle, start_ids - 1, 0, 4); + } + + + return ErrorCode::SUCCESS; +} + diff --git a/ImageOperatorBase.h b/ImageOperatorBase.h index fefbf3e..8eca03e 100644 --- a/ImageOperatorBase.h +++ b/ImageOperatorBase.h @@ -25,7 +25,7 @@ #include #include // for CPLMalloc() #include "LogInfoCls.h" - +#include enum ProjectStripDelta { Strip_6, // 6度带 @@ -74,16 +74,17 @@ enum GDALREADARRCOPYMETHOD { -class ShowProessAbstract { +class ShowProessAbstract :public QObject{ +public: + Q_OBJECT public: virtual void showProcess(double precent,QString tip); virtual void showToolInfo( QString tip) ; - - }; + /// 根据经纬度获取 /// EPSG代码,根据经纬度返回对应投影坐标系统,其中如果在中华人民共和国境内,默认使用 /// CGCS2000坐标系统(EPSG 4502 ~ 4512 6度带,EPSG 4534 ~ 4554 3度带),其余地方使用WGS坐标系统, @@ -91,7 +92,7 @@ public: /// \param long 经度 /// \param lat 纬度 /// \return 对应投影坐标系统的 EPSG编码,-1 表示计算错误 -long getProjectEPSGCodeByLon_Lat(double long, double lat,ProjectStripDelta stripState = ProjectStripDelta::Strip_3); +long getProjectEPSGCodeByLon_Lat(double long, double lat,ProjectStripDelta stripState ); long getProjectEPSGCodeByLon_Lat_inStrip3(double lon, double lat); @@ -233,11 +234,20 @@ gdalImageComplex CreategdalImageComplex(const QString& img_path, int height, i gdalImageComplex CreateEchoComplex(const QString& img_path, int height, int width, int band_num); +ErrorCode DEM2XYZRasterAndSlopRaster(QString dempath, QString demxyzpath, QString demsloperPath); int ResampleGDAL(const char* pszSrcFile, const char* pszOutFile, double* gt, int new_width, int new_height, GDALResampleAlg eResample); +void resampleRaster(const char* inputRaster, const char* outputRaster, double targetPixelSizeX, double targetPixelSizeY); + +void cropRasterByLatLon(const char* inputFile, const char* outputFile, double minLon, double maxLon, double minLat, double maxLat); + int ResampleGDALs(const char* pszSrcFile, int band_ids, GDALRIOResampleAlg eResample = GRIORA_Bilinear); +void transformRaster(const char* inputFile, const char* outputFile, int sourceEPSG, int targetEPSG); + +ErrorCode transformCoordinate(double x, double y, int sourceEPSG, int targetEPSG, Point2& p); + int alignRaster(QString inputPath, QString referencePath, QString outputPath, GDALResampleAlg eResample); //--------------------- 保存文博 ------------------------------- @@ -258,6 +268,7 @@ ErrorCode MergeRasterProcess(QVector filepath, QString outfileptah, QSt ErrorCode MergeRasterInGeoCoding(QVector inimgs, gdalImage resultimg,gdalImage maskimg, ShowProessAbstract* dia = nullptr); + template std::shared_ptr readDataArr(gdalImage& imgds, int start_row, int start_col, int rows_count, int cols_count, int band_ids, GDALREADARRCOPYMETHOD method) { @@ -417,5 +428,13 @@ std::shared_ptr readDataArr(gdalImage& imgds, int start_row, int start_col, i +//--------------------- 图像分块 ------------------------------ + + + + + + + #endif - \ No newline at end of file + diff --git a/LogInfoCls.cpp b/LogInfoCls.cpp index fcdb257..4139ef9 100644 --- a/LogInfoCls.cpp +++ b/LogInfoCls.cpp @@ -7,6 +7,7 @@ std::string errorCode2errInfo(ErrorCode e) { _CASE_STR(SUCCESS); _CASE_STR(VIRTUALABSTRACT); + _CASE_STR(FAIL); _CASE_STR(FILENOFOUND); _CASE_STR(OrbitNodeNotEnough); _CASE_STR(XYDataPointNotEqual); diff --git a/LogInfoCls.h b/LogInfoCls.h index b35520d..652ee8e 100644 --- a/LogInfoCls.h +++ b/LogInfoCls.h @@ -16,6 +16,7 @@ enum ErrorCode { SUCCESS = -1,// ִгɹ VIRTUALABSTRACT = -2,// virtual abstract function not implement + FAIL=0, FILENOFOUND = 1, OrbitNodeNotEnough = 2, XYDataPointNotEqual = 3, @@ -87,7 +88,7 @@ enum ErrorCode { IMAGE_L1DATA_XMLNAMEERROR = 401, IMAGE_L1DATA_XMLNAMEOPENERROR = 402, IMAGE_L1DATA_XMLNAMEPARASEERROR = 403, - + }; diff --git a/SARSimulationImageL1.cpp b/SARSimulationImageL1.cpp index 13ffcc3..1e78618 100644 --- a/SARSimulationImageL1.cpp +++ b/SARSimulationImageL1.cpp @@ -6,14 +6,20 @@ #include #include -SARSimulationImageL1Dataset::SARSimulationImageL1Dataset() +SARSimulationImageL1Dataset::SARSimulationImageL1Dataset(RasterLevel level) { + this->Rasterlevel = level; } SARSimulationImageL1Dataset::~SARSimulationImageL1Dataset() { } +RasterLevel SARSimulationImageL1Dataset::getRasterLevel() +{ + return this->Rasterlevel; +} + QString SARSimulationImageL1Dataset::getoutFolderPath() { return outFolderPath; @@ -46,11 +52,17 @@ QString SARSimulationImageL1Dataset::getImageRasterPath() QString SARSimulationImageL1Dataset::getGPSPointFilename() { + if (this->Rasterlevel == RasterLevel::RasterL2) { + return ""; + } return GPSPointFilename; } QString SARSimulationImageL1Dataset::getGPSPointFilePath() { + if (this->Rasterlevel == RasterLevel::RasterL2) { + return ""; + } return GPSPointFilePath; } @@ -94,7 +106,7 @@ ErrorCode SARSimulationImageL1Dataset::OpenOrNew(QString folder, QString filenam this->saveToXml(); } - if (QFile(this->GPSPointFilePath).exists() == false) { + if (this->Rasterlevel!=RasterL2||QFile(this->GPSPointFilePath).exists() == false) { // ļ omp_lock_t lock; omp_init_lock(&lock); @@ -110,7 +122,7 @@ ErrorCode SARSimulationImageL1Dataset::OpenOrNew(QString folder, QString filenam omp_destroy_lock(&lock); } - if (QFile(this->ImageRasterPath).exists() == false) { + if (this->Rasterlevel == RasterLevel::RasterSLC || QFile(this->ImageRasterPath).exists() == false) { // ļ omp_lock_t lock; @@ -127,6 +139,25 @@ ErrorCode SARSimulationImageL1Dataset::OpenOrNew(QString folder, QString filenam omp_destroy_lock(&lock); // } + + if (this->Rasterlevel != RasterLevel::RasterSLC || QFile(this->ImageRasterPath).exists() == false) { + + // ļ + omp_lock_t lock; + omp_init_lock(&lock); + omp_set_lock(&lock); + GDALAllRegister(); + CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "YES"); + + GDALDriver* poDriver = GetGDALDriverManager()->GetDriverByName("ENVI"); + std::shared_ptr poDstDS(poDriver->Create(this->ImageRasterPath.toUtf8().constData(), colCount, rowCount, 1, GDT_CFloat32, NULL)); + GDALFlushCache((GDALDatasetH)poDstDS.get()); + poDstDS.reset(); + omp_unset_lock(&lock); // + omp_destroy_lock(&lock); // + } + + return ErrorCode::SUCCESS; } @@ -198,6 +229,21 @@ void SARSimulationImageL1Dataset::saveToXml() xmlWriter.writeStartDocument(); xmlWriter.writeStartElement("Parameters"); + switch (this->Rasterlevel) + { + case(RasterLevel::RasterSLC): + xmlWriter.writeTextElement("rasterlevel", "SLC"); + break; + case(RasterLevel::RasterL1B): + xmlWriter.writeTextElement("rasterlevel", "L1B"); + break; + case(RasterLevel::RasterL2): + xmlWriter.writeTextElement("rasterlevel", "L2"); + break; + default: + break; + } + xmlWriter.writeTextElement("RowCount", QString::number(this->rowCount)); xmlWriter.writeTextElement("ColCount", QString::number(this->colCount)); xmlWriter.writeTextElement("Rnear", QString::number(this->Rnear)); @@ -208,6 +254,66 @@ void SARSimulationImageL1Dataset::saveToXml() xmlWriter.writeTextElement("CenterAngle", QString::number(this->CenterAngle)); xmlWriter.writeTextElement("LookSide", this->LookSide); + // sateantpos + xmlWriter.writeStartElement("AntPos"); + + for (long i = 0; i < this->sateposes.count(); i++) { + xmlWriter.writeStartElement("AntPosParam"); + xmlWriter.writeTextElement("time", QString::number(this->sateposes[i].time)); // time + xmlWriter.writeTextElement("Px", QString::number(this->sateposes[i].Px)); // Px + xmlWriter.writeTextElement("Py", QString::number(this->sateposes[i].Py)); // Py + xmlWriter.writeTextElement("Pz", QString::number(this->sateposes[i].Pz)); // Pz + xmlWriter.writeTextElement("Vx", QString::number(this->sateposes[i].Vx)); // Vx + xmlWriter.writeTextElement("Vy", QString::number(this->sateposes[i].Vy)); // Vy + xmlWriter.writeTextElement("Vz", QString::number(this->sateposes[i].Vz)); // Vz + xmlWriter.writeTextElement("AntDirectX", QString::number(this->sateposes[i].AntDirectX)); // AntDirectX + xmlWriter.writeTextElement("AntDirectY", QString::number(this->sateposes[i].AntDirectY)); // AntDirectY + xmlWriter.writeTextElement("AntDirectZ", QString::number(this->sateposes[i].AntDirectZ)); // AntDirectZ + xmlWriter.writeTextElement("AVx", QString::number(this->sateposes[i].AVx)); // AVx + xmlWriter.writeTextElement("AVy", QString::number(this->sateposes[i].AVy)); // AVy + xmlWriter.writeTextElement("AVz", QString::number(this->sateposes[i].AVz)); // AVz + xmlWriter.writeTextElement("lon", QString::number(this->sateposes[i].lon)); // lon + xmlWriter.writeTextElement("lat", QString::number(this->sateposes[i].lat)); // lat + xmlWriter.writeTextElement("ati", QString::number(this->sateposes[i].ati)); // ati + xmlWriter.writeEndElement(); // + } + + xmlWriter.writeTextElement("ImageStartTime", QString::number(this->startImageTime)); + xmlWriter.writeTextElement("ImageEndTime", QString::number(this->EndImageTime)); + + xmlWriter.writeTextElement("incidenceAngleNearRange", QString::number(this->incidenceAngleNearRange)); + xmlWriter.writeTextElement("incidenceAngleFarRange", QString::number(this->incidenceAngleFarRange)); + xmlWriter.writeTextElement("TotalProcessedAzimuthBandWidth", QString::number(this->TotalProcessedAzimuthBandWidth)); + xmlWriter.writeTextElement("DopplerParametersReferenceTime", QString::number(this->DopplerParametersReferenceTime)); + + xmlWriter.writeStartElement("DopplerCentroidCoefficients"); + xmlWriter.writeTextElement("d0", QString::number(this->d0)); + xmlWriter.writeTextElement("d1", QString::number(this->d1)); + xmlWriter.writeTextElement("d2", QString::number(this->d2)); + xmlWriter.writeTextElement("d3", QString::number(this->d3)); + xmlWriter.writeTextElement("d4", QString::number(this->d4)); + xmlWriter.writeEndElement(); // DopplerCentroidCoefficients + + xmlWriter.writeStartElement("DopplerRateValuesCoefficients"); + xmlWriter.writeTextElement("r0", QString::number(this->r0)); + xmlWriter.writeTextElement("r1", QString::number(this->r1)); + xmlWriter.writeTextElement("r2", QString::number(this->r2)); + xmlWriter.writeTextElement("r3", QString::number(this->r3)); + xmlWriter.writeTextElement("r4", QString::number(this->r4)); + xmlWriter.writeEndElement(); // DopplerRateValuesCoefficients + + + xmlWriter.writeTextElement("latitude_center", QString::number(this->latitude_center)); + xmlWriter.writeTextElement("longitude_center", QString::number(this->longitude_center)); + xmlWriter.writeTextElement("latitude_topLeft", QString::number(this->latitude_topLeft)); + xmlWriter.writeTextElement("longitude_topLeft", QString::number(this->longitude_topLeft)); + xmlWriter.writeTextElement("latitude_topRight", QString::number(this->latitude_topRight)); + xmlWriter.writeTextElement("longitude_topRight", QString::number(this->longitude_topRight)); + xmlWriter.writeTextElement("latitude_bottomLeft", QString::number(this->latitude_bottomLeft)); + xmlWriter.writeTextElement("longitude_bottomLeft", QString::number(this->longitude_bottomLeft)); + xmlWriter.writeTextElement("latitude_bottomRight", QString::number(this->latitude_bottomRight)); + xmlWriter.writeTextElement("longitude_bottomRight", QString::number(this->longitude_bottomRight)); + xmlWriter.writeEndElement(); // Parameters xmlWriter.writeEndDocument(); @@ -232,6 +338,18 @@ ErrorCode SARSimulationImageL1Dataset::loadFromXml() if (xmlReader.name() == "Parameters") { continue; } + else if (xmlReader.name() == "rasterlevel") { + QString rasterlevelstr = xmlReader.readElementText(); + if (rasterlevelstr == "SLC") { + this->Rasterlevel = RasterLevel::RasterSLC; + } + else if (rasterlevelstr == "L1B") { + this->Rasterlevel = RasterLevel::RasterL1B; + } + else if (rasterlevelstr == "L2") { + this->Rasterlevel = RasterLevel::RasterL2; + } + } else if (xmlReader.name() == "RowCount") { this->rowCount = xmlReader.readElementText().toLong(); } @@ -253,15 +371,166 @@ ErrorCode SARSimulationImageL1Dataset::loadFromXml() else if (xmlReader.name() == "Fs") { this->Fs = xmlReader.readElementText().toDouble(); } + else if(xmlReader.name() == "ImageStartTime"){ + this->startImageTime = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "ImageEndTime") { + this->EndImageTime = xmlReader.readElementText().toDouble(); + } else if (xmlReader.name() == "CenterAngle") { this->CenterAngle = xmlReader.readElementText().toDouble(); } else if (xmlReader.name() == "LookSide") { this->LookSide = xmlReader.readElementText(); } + else if (xmlReader.name() == "AntPosParam") { + SatelliteAntPos antPosParam; + while (!(xmlReader.isEndElement() && xmlReader.name() == "AntPosParam")) { + if (xmlReader.isStartElement()) { + if (xmlReader.name() == "time") { + antPosParam.time = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "Px") { + antPosParam.Px = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "Py") { + antPosParam.Py = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "Pz") { + antPosParam.Pz = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "Vx") { + antPosParam.Vx = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "Vy") { + antPosParam.Vy = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "Vz") { + antPosParam.Vz = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "AntDirectX") { + antPosParam.AntDirectX = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "AntDirectY") { + antPosParam.AntDirectY = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "AntDirectZ") { + antPosParam.AntDirectZ = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "AVx") { + antPosParam.AVx = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "AVy") { + antPosParam.AVy = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "AVz") { + antPosParam.AVz = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "lon") { + antPosParam.lon = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "lat") { + antPosParam.lat = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "ati") { + antPosParam.ati = xmlReader.readElementText().toDouble(); + } + } + xmlReader.readNext(); + } + + sateposes.append(antPosParam); // ӵб + } + else if (xmlReader.name() == "incidenceAngleNearRange") { + incidenceAngleNearRange = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "incidenceAngleFarRange") { + incidenceAngleFarRange = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "TotalProcessedAzimuthBandWidth") { + this->TotalProcessedAzimuthBandWidth = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "DopplerParametersReferenceTime") { + this->DopplerParametersReferenceTime = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "DopplerCentroidCoefficients") { + + while (!(xmlReader.tokenType() == QXmlStreamReader::EndElement && xmlReader.name() == "DopplerCentroidCoefficients")) { + if (xmlReader.tokenType() == QXmlStreamReader::StartElement) { + if (xmlReader.name() == "d0") { + this->d0 = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "d1") { + this->d1 = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "d2") { + this->d2 = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "d3") { + this->d3 = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "d4") { + this->d4 = xmlReader.readElementText().toDouble(); + } + } + xmlReader.readNext(); + } + } + else if (xmlReader.name() == "DopplerRateValuesCoefficients") { + while (!(xmlReader.tokenType() == QXmlStreamReader::EndElement && xmlReader.name() == "DopplerRateValuesCoefficients")) { + if (xmlReader.tokenType() == QXmlStreamReader::StartElement) { + if (xmlReader.name() == "r0") { + this->r0 = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "r1") { + this->r1 = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "r2") { + this->r2 = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "r3") { + this->r3 = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "r4") { + this->r4 = xmlReader.readElementText().toDouble(); + } + } + xmlReader.readNext(); + } + } + else if (xmlReader.name() == "latitude_center") { + this->latitude_center = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "longitude_center") { + this->longitude_center = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "latitude_topLeft") { + this->latitude_topLeft = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "longitude_topLeft") { + this->longitude_topLeft = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "latitude_topRight") { + this->latitude_topRight = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "longitude_topRight") { + this->longitude_topRight = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "latitude_bottomLeft") { + this->latitude_bottomLeft = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "longitude_bottomLeft") { + this->longitude_bottomLeft = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "latitude_bottomRight") { + this->latitude_bottomRight = xmlReader.readElementText().toDouble(); + } + else if (xmlReader.name() == "longitude_bottomRight") { + this->longitude_bottomRight = xmlReader.readElementText().toDouble(); + } } } - + if (xmlReader.hasError()) { qDebug() << "XML error:" << xmlReader.errorString(); return ErrorCode::IMAGE_L1DATA_XMLNAMEPARASEERROR; @@ -273,6 +542,11 @@ ErrorCode SARSimulationImageL1Dataset::loadFromXml() std::shared_ptr SARSimulationImageL1Dataset::getAntPos() { + if (this->Rasterlevel == RasterLevel::RasterL2) { + return nullptr; + } + + omp_lock_t lock; omp_init_lock(&lock); omp_set_lock(&lock); @@ -333,6 +607,10 @@ ErrorCode SARSimulationImageL1Dataset::saveAntPos(std::shared_ptr ptr) std::shared_ptr> SARSimulationImageL1Dataset::getImageRaster() { + if (this->Rasterlevel != RasterLevel::RasterSLC) { + return nullptr; + } + return this->getImageRaster(0, this->rowCount); } @@ -387,6 +665,11 @@ ErrorCode SARSimulationImageL1Dataset::saveImageRaster(std::shared_ptr> SARSimulationImageL1Dataset::getImageRaster(long startPRF, long PRFLen) { + if (this->Rasterlevel != RasterLevel::RasterSLC) { + return nullptr; + } + + if (!(startPRF < this->rowCount)) { qDebug() << QString::fromStdString(errorCode2errInfo(ErrorCode::ECHO_L0DATA_PRFIDXOUTRANGE)) << startPRF << " " << this->rowCount; return nullptr; @@ -435,6 +718,11 @@ std::shared_ptr> SARSimulationImageL1Dataset::getImageRaste Eigen::MatrixXcd SARSimulationImageL1Dataset::getImageRasterMatrix() { + if (this->Rasterlevel != RasterLevel::RasterSLC) { + return Eigen::MatrixXcd::Zero(0,0); + } + + std::shared_ptr> data = this->getImageRaster(); Eigen::MatrixXcd dataimg = Eigen::MatrixXcd::Zero(this->rowCount, this->colCount); for (long i = 0; i < this->rowCount; i++) { @@ -459,8 +747,43 @@ ErrorCode SARSimulationImageL1Dataset::saveImageRaster(Eigen::MatrixXcd& dataimg return ErrorCode(); } +gdalImage SARSimulationImageL1Dataset::getImageRasterGdalImage() +{ + return gdalImage(this->ImageRasterPath); +} +void SARSimulationImageL1Dataset::setStartImageTime(double imageTime) +{ + this->startImageTime = imageTime; +} +double SARSimulationImageL1Dataset::getStartImageTime() +{ + return this->startImageTime; +} + +void SARSimulationImageL1Dataset::setEndImageTime(double imageTime) +{ + this->EndImageTime = imageTime; +} + +double SARSimulationImageL1Dataset::getEndImageTime() +{ + return this->EndImageTime; +} + +QVector SARSimulationImageL1Dataset::getXmlSateAntPos() +{ + if (this->Rasterlevel == RasterLevel::RasterL2) { + return QVector(0); + } + return this->sateposes; +} + +void SARSimulationImageL1Dataset::setSateAntPos(QVector pos) +{ + this->sateposes = pos; +} // Getter Setter ʵ long SARSimulationImageL1Dataset::getrowCount() { return this->rowCount; } @@ -492,7 +815,15 @@ void SARSimulationImageL1Dataset::setCenterFreq(double freq) { this->centerFreq double SARSimulationImageL1Dataset::getFs() { return this->Fs; } void SARSimulationImageL1Dataset::setFs(double samplingFreq) { this->Fs = samplingFreq; } - +double SARSimulationImageL1Dataset::getPRF() +{ + return this->prf; +} + +void SARSimulationImageL1Dataset::setPRF(double PRF) +{ + this->prf = PRF; +} double SARSimulationImageL1Dataset::getCenterAngle() { @@ -513,3 +844,142 @@ void SARSimulationImageL1Dataset::setLookSide(QString looksides) { this->LookSide = looksides; } + +double SARSimulationImageL1Dataset::getTotalProcessedAzimuthBandWidth() +{ + return TotalProcessedAzimuthBandWidth; +} + +void SARSimulationImageL1Dataset::setTotalProcessedAzimuthBandWidth(double v) +{ + TotalProcessedAzimuthBandWidth = v; +} + +double SARSimulationImageL1Dataset::getDopplerParametersReferenceTime() +{ + return DopplerParametersReferenceTime; +} + +void SARSimulationImageL1Dataset::setDopplerParametersReferenceTime(double v) +{ + DopplerParametersReferenceTime = v; +} + +QVector SARSimulationImageL1Dataset::getDopplerParams() +{ + QVector result(5); + result[0] = d0; + result[1] = d1; + result[2] = d2; + result[3] = d3; + result[4] = d4; + return result; +} + +void SARSimulationImageL1Dataset::setDopplerParams(double id0, double id1, double id2, double id3, double id4) +{ + this->d0 = id0; + this->d1 = id1; + this->d2 = id2; + this->d3 = id3; + this->d4 = id4; +} + +QVector SARSimulationImageL1Dataset::getDopplerCenterCoff() +{ + QVector result(5); + result[0]=r0; + result[1]=r1; + result[2]=r2; + result[3]=r3; + result[4]=r4; + return result; +} + +void SARSimulationImageL1Dataset::setDopplerCenterCoff(double ir0, double ir1, double ir2, double ir3, double ir4) +{ + this->r0 = ir0; + this->r1 = ir1; + this->r2 = ir2; + this->r3 = ir3; + this->r4 = ir4; +} + +double SARSimulationImageL1Dataset::getIncidenceAngleNearRange() +{ + return incidenceAngleNearRange; +} + +void SARSimulationImageL1Dataset::setIncidenceAngleNearRangeet(double angle) +{ + this->incidenceAngleNearRange = angle; +} + +double SARSimulationImageL1Dataset::getIncidenceAngleFarRange() +{ + return incidenceAngleFarRange; +} + +void SARSimulationImageL1Dataset::setIncidenceAngleFarRange(double angle) +{ + this->incidenceAngleFarRange = angle; +} + +double SARSimulationImageL1Dataset::getLatitudeCenter() { return latitude_center; } +void SARSimulationImageL1Dataset::setLatitudeCenter(double value) { latitude_center = value; } + +double SARSimulationImageL1Dataset::getLongitudeCenter() { return longitude_center; } +void SARSimulationImageL1Dataset::setLongitudeCenter(double value) { longitude_center = value; } + +double SARSimulationImageL1Dataset::getLatitudeTopLeft() { return latitude_topLeft; } +void SARSimulationImageL1Dataset::setLatitudeTopLeft(double value) { latitude_topLeft = value; } + +double SARSimulationImageL1Dataset::getLongitudeTopLeft() { return longitude_topLeft; } +void SARSimulationImageL1Dataset::setLongitudeTopLeft(double value) { longitude_topLeft = value; } + +double SARSimulationImageL1Dataset::getLatitudeTopRight() { return latitude_topRight; } +void SARSimulationImageL1Dataset::setLatitudeTopRight(double value) { latitude_topRight = value; } + +double SARSimulationImageL1Dataset::getLongitudeTopRight() { return longitude_topRight; } +void SARSimulationImageL1Dataset::setLongitudeTopRight(double value) { longitude_topRight = value; } + +double SARSimulationImageL1Dataset::getLatitudeBottomLeft() { return latitude_bottomLeft; } +void SARSimulationImageL1Dataset::setLatitudeBottomLeft(double value) { latitude_bottomLeft = value; } + +double SARSimulationImageL1Dataset::getLongitudeBottomLeft() { return longitude_bottomLeft; } +void SARSimulationImageL1Dataset::setLongitudeBottomLeft(double value) { longitude_bottomLeft = value; } + +double SARSimulationImageL1Dataset::getLatitudeBottomRight() { return latitude_bottomRight; } +void SARSimulationImageL1Dataset::setLatitudeBottomRight(double value) { latitude_bottomRight = value; } + +double SARSimulationImageL1Dataset::getLongitudeBottomRight() { return longitude_bottomRight; } +void SARSimulationImageL1Dataset::setLongitudeBottomRight(double value) { longitude_bottomRight = value; } + +DemBox SARSimulationImageL1Dataset::getExtend() +{ + double minlon = 0, maxlon = 0; + double minlat = 0, maxlat = 0; + minlon = this->longitude_bottomLeft < this->longitude_bottomRight ? this->longitude_bottomLeft : this->longitude_bottomRight; + minlon = minlon < this->longitude_topLeft ? minlon : this->longitude_topLeft; + minlon = minlon < this->longitude_topRight ? minlon : this->longitude_topRight; + + minlat = this->latitude_bottomLeft < this->latitude_bottomRight ? this->latitude_bottomLeft : this->latitude_bottomRight; + minlat = minlat < this->latitude_topLeft ? minlat : this->latitude_topLeft; + minlat = minlat < this->latitude_bottomRight ? minlat : this->latitude_bottomRight; + + maxlon = this->longitude_bottomLeft > this->longitude_bottomRight ? this->longitude_bottomLeft : this->longitude_bottomRight; + maxlon = maxlon > this->longitude_topLeft ? maxlon : this->longitude_topLeft; + maxlon = maxlon > this->longitude_topRight ? maxlon : this->longitude_topRight; + + maxlat = this->latitude_bottomLeft > this->latitude_bottomRight ? this->latitude_bottomLeft : this->latitude_bottomRight; + maxlat = maxlat > this->latitude_topLeft ? maxlat : this->latitude_topLeft; + maxlat = maxlat > this->latitude_bottomRight ? maxlat : this->latitude_bottomRight; + + DemBox box; + box.min_lat = minlat; + box.min_lon = minlon; + box.max_lat = maxlat; + box.max_lon = maxlon; + + return box; +} diff --git a/SARSimulationImageL1.h b/SARSimulationImageL1.h index e95d0b9..c0ed6db 100644 --- a/SARSimulationImageL1.h +++ b/SARSimulationImageL1.h @@ -8,14 +8,25 @@ #include "FileOperator.h" #include "LogInfoCls.h" +enum RasterLevel { + RasterSLC, + RasterL1B, + RasterL2 +}; class SARSimulationImageL1Dataset { public: - SARSimulationImageL1Dataset(); + SARSimulationImageL1Dataset(RasterLevel Rasterlevel= RasterLevel::RasterSLC); ~SARSimulationImageL1Dataset(); +private: + RasterLevel Rasterlevel; +public: + RasterLevel getRasterLevel(); + + private : QString outFolderPath; QString L1DatasetName; @@ -54,6 +65,8 @@ public: Eigen::MatrixXcd getImageRasterMatrix(); ErrorCode saveImageRaster(Eigen::MatrixXcd& data, long startPRF); + gdalImage getImageRasterGdalImage(); + private: // xmlв long rowCount; @@ -65,11 +78,27 @@ private: // xml double centerFreq; double Fs; + double prf; double CenterAngle; QString LookSide; + QVector sateposes; + + double startImageTime; + double EndImageTime; public: + + void setStartImageTime(double imageTime); + double getStartImageTime(); + + void setEndImageTime(double imageTime); + double getEndImageTime(); + + + QVector getXmlSateAntPos(); + void setSateAntPos(QVector pos); + long getrowCount(); void setrowCount(long rowCount); @@ -91,15 +120,81 @@ public: double getFs(); void setFs(double samplingFreq); + double getPRF(); + void setPRF(double PRF); + double getCenterAngle(); void setCenterAngle(double angle); QString getLookSide(); void setLookSide(QString lookside); +public:// ղ + double TotalProcessedAzimuthBandWidth, DopplerParametersReferenceTime; + double d0, d1, d2, d3, d4; + double r0, r1, r2, r3, r4; + double DEM; + double incidenceAngleNearRange, incidenceAngleFarRange; + +public: + + double getTotalProcessedAzimuthBandWidth(); + void setTotalProcessedAzimuthBandWidth(double v); + + double getDopplerParametersReferenceTime(); + void setDopplerParametersReferenceTime(double v); + + QVector getDopplerParams(); + void setDopplerParams(double d0, double d1, double d2, double d3, double d4); + + QVector getDopplerCenterCoff(); + void setDopplerCenterCoff(double r0, double r1, double r2, double r3, double r4); + double getIncidenceAngleNearRange(); + void setIncidenceAngleNearRangeet(double angle); + double getIncidenceAngleFarRange(); + void setIncidenceAngleFarRange(double angle); +private: + double latitude_center, longitude_center, + latitude_topLeft, longitude_topLeft, + latitude_topRight, longitude_topRight, + latitude_bottomLeft, longitude_bottomLeft, + latitude_bottomRight, longitude_bottomRight; +public: + // Getter and Setter functions + double getLatitudeCenter(); + void setLatitudeCenter(double value); + + double getLongitudeCenter(); + void setLongitudeCenter(double value); + + double getLatitudeTopLeft(); + void setLatitudeTopLeft(double value); + + double getLongitudeTopLeft(); + void setLongitudeTopLeft(double value); + + double getLatitudeTopRight(); + void setLatitudeTopRight(double value); + + double getLongitudeTopRight(); + void setLongitudeTopRight(double value); + + double getLatitudeBottomLeft(); + void setLatitudeBottomLeft(double value); + + double getLongitudeBottomLeft(); + void setLongitudeBottomLeft(double value); + + double getLatitudeBottomRight(); + void setLatitudeBottomRight(double value); + + double getLongitudeBottomRight(); + void setLongitudeBottomRight(double value); +public: + DemBox getExtend(); };