找回丢失的代码

main
陈增辉 2024-11-25 15:14:53 +08:00
parent 19d16be069
commit 2a424bd634
11 changed files with 1113 additions and 46 deletions

View File

@ -2,7 +2,7 @@
#ifndef BASECONSTVARIABLE_H #ifndef BASECONSTVARIABLE_H
#define BASECONSTVARIABLE_H #define BASECONSTVARIABLE_H
//#define EIGEN_USE_MKL_ALL #define EIGEN_USE_MKL_ALL
//#define EIGEN_NO_DEBUG //#define EIGEN_NO_DEBUG
@ -17,14 +17,17 @@
#include <math.h> #include <math.h>
#include <complex> #include <complex>
#define MATPLOTDRAWIMAGE
#define PI_180 180/3.141592653589793238462643383279 #define PI_180 180/3.141592653589793238462643383279
#define T180_PI 3.141592653589793238462643383279/180 #define T180_PI 3.141592653589793238462643383279/180
#define LIGHTSPEED 299792458 #define LIGHTSPEED 299792458
#define PRECISIONTOLERANCE 1e-9 #define PRECISIONTOLERANCE 1e-9
#define Radians2Degrees(Radians) Radians*PI_180 #define Radians2Degrees(Radians) Radians*PI_180
#define Degrees2Radians(Degrees) Degrees*T180_PI #define Degrees2Radians(Degrees) Degrees*T180_PI
#define EARTHWE 0.000072292115
#define MATPLOTDRAWIMAGE
#define earthRoute 0.000072292115 #define earthRoute 0.000072292115
@ -52,7 +55,7 @@ const double earth_Rp = (1 - 1 / f_inverse) * earth_Re;
const double earth_We = 0.000072292115; const double earth_We = 0.000072292115;
/*********************************************** openMap参数 ********************************************************************/ /*********************************************** openMap参数 ********************************************************************/
static long Paral_num_thread = 6; static long Paral_num_thread = 14;
/*********************************************** 基础枚举 ********************************************************************/ /*********************************************** 基础枚举 ********************************************************************/
@ -61,7 +64,8 @@ enum POLARTYPEENUM { // 极化类型
POLARHH, POLARHH,
POLARHV, POLARHV,
POLARVH, POLARVH,
POLARVV POLARVV,
POLARUNKOWN
}; };
@ -89,11 +93,28 @@ struct Point3 {
double z = 0; double z = 0;
}; };
struct DemBox {
double min_lon;
double max_lon;
double min_lat;
double max_lat;
};
/*********************************************** FEKO仿真参数 ********************************************************************/ /*********************************************** FEKO仿真参数 ********************************************************************/
struct SatellitePos {
double time;
double Px;
double Py;
double Pz;
double Vx;
double Vy;
double Vz;
};
struct SatelliteAntPos { struct SatelliteAntPos {
double time; double time; // 0
double Px; double Px;
double Py; double Py;
double Pz; double Pz;
@ -108,10 +129,12 @@ struct SatelliteAntPos {
double AVz; double AVz;
double lon; double lon;
double lat; double lat;
double ati; double ati; // 15
}; };
/*********************************************** 指针回收区域 ********************************************************************/ /*********************************************** 指针回收区域 ********************************************************************/
inline void delArrPtr(void* p) inline void delArrPtr(void* p)

View File

@ -8,7 +8,7 @@
#include <Eigen/Dense> #include <Eigen/Dense>
#include <time.h> #include <time.h>
////#include <mkl.h> ////#include <mkl.h>
#include <string>
#include <omp.h> #include <omp.h>
#include <QDir> #include <QDir>
#include < io.h > #include < io.h >
@ -539,3 +539,48 @@ long FindValueInStdVectorLast(std::vector<double>& list, double& insertValue)
return -1; return -1;
} }
ErrorCode polynomial_fit(const std::vector<double>& x, const std::vector<double>& y, int degree, std::vector<double>& 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<SatelliteAntPos> SatellitePos2SatelliteAntPos(QVector<SatellitePos> poses)
{
QVector<SatelliteAntPos> 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<SatellitePos> SatelliteAntPos2SatellitePos(QVector<SatelliteAntPos> poses)
{
QVector<SatellitePos> 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;
}

View File

@ -105,5 +105,13 @@ long InsertValueInStdVector(std::vector<double>& list, double insertValue, bool
long FindValueInStdVectorLast(std::vector<double>& list, double& findv); long FindValueInStdVectorLast(std::vector<double>& list, double& findv);
ErrorCode polynomial_fit(const std::vector<double>& x, const std::vector<double>& y, int degree, std::vector<double>& out_factor, double& out_chisq);
QVector<SatelliteAntPos> SatellitePos2SatelliteAntPos(QVector<SatellitePos> poses);
QVector<SatellitePos> SatelliteAntPos2SatellitePos(QVector<SatelliteAntPos> poses);
#endif #endif

View File

@ -90,6 +90,13 @@ QString getFileNameFromPath(const QString& path)
return fileInfo.fileName(); return fileInfo.fileName();
} }
QString getFileNameWidthoutExtend(QString path)
{
QFileInfo fileInfo(path);
QString fileNameWithoutExtension = fileInfo.baseName(); // 获取无后缀文件名
return fileNameWithoutExtension;
}
bool isDirectory(const QString& path) bool isDirectory(const QString& path)
{ {
QFileInfo fileinfo(path); QFileInfo fileinfo(path);
@ -216,3 +223,31 @@ void copyFile(const QString& sourcePath, const QString& destinationPath) {
QMessageBox::warning(nullptr, QObject::tr("warning"), QObject::tr("Source file not found")); QMessageBox::warning(nullptr, QObject::tr("warning"), QObject::tr("Source file not found"));
} }
} }
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;
}

View File

@ -35,6 +35,8 @@ QString getParantFolderNameFromPath(const QString& path);
QString getFileNameFromPath(const QString& path); QString getFileNameFromPath(const QString& path);
QString getFileNameWidthoutExtend(QString path);
int write_binfile(char* filepath, char* data, size_t data_len); int write_binfile(char* filepath, char* data, size_t data_len);
char* read_textfile(char* text_path, int* length); 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); void copyFile(const QString& sourcePath, const QString& destinationPath);
QString addMaskToFileName(const QString& filePath, QString _zzname); QString addMaskToFileName(const QString& filePath, QString _zzname);
// QT FileOperator // QT FileOperator
bool copyAndReplaceFile(const QString& sourceFilePath, const QString& destinationFilePath);
#endif #endif

View File

@ -25,6 +25,12 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <QProgressDialog> #include <QProgressDialog>
#include <gdal_priv.h>
#include <ogr_spatialref.h> // OGRSpatialReference 用于空间参考转换
#include <gdal_alg.h> // 用于 GDALWarp 操作
#include "../Imageshow/ImageShowDialogClass.h"
/** /**
* ENVI * ENVI
@ -1645,7 +1651,7 @@ ErrorCode MergeRasterProcess(QVector<QString> filepaths, QString outfileptah, QS
Eigen::MatrixXd rgt = Eigen::MatrixXd::Zero(2,3); Eigen::MatrixXd rgt = Eigen::MatrixXd::Zero(2,3);
RasterExtend mainExtend = mainimg.getExtend(); RasterExtend mainExtend = mainimg.getExtend();
rgt(0, 1) = (mainExtend.max_x - mainExtend.min_x) / (mainimg.width - 1); //dx 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<RasterExtend> extendlist(imgdslist.count()); QVector<RasterExtend> extendlist(imgdslist.count());
for (long i = 0; i < imgdslist.count(); i++) { for (long i = 0; i < imgdslist.count(); i++) {
extendlist[i] = imgdslist[i].getExtend(); extendlist[i] = imgdslist[i].getExtend();
@ -1736,15 +1742,14 @@ ErrorCode MergeRasterInGeoCoding(QVector<gdalImage> imgdslist, gdalImage resulti
} }
// 分块计算 // 分块计算
long resultline = Memory1MB * 300 / 8 / resultimg.width; long resultline = Memory1MB * 1000 / 8 / resultimg.width;
resultline = resultline < 1000 ? resultline : 1000; // 最多100行 resultline = resultline < 300 ? resultline : 300; // 最多100行
long bandnum = resultimg.band_num+1; long bandnum = resultimg.band_num+1;
long starti = 0; long starti = 0;
long rasterCount = imgdslist.count(); long rasterCount = imgdslist.count();
long processNumber = 0; long processNumber = 0;
QProgressDialog progressDialog(u8"合并影像", u8"终止", 0, resultimg.height); QProgressDialog progressDialog(u8"合并影像", u8"终止", 0, resultimg.height);
progressDialog.setWindowTitle(u8"合并影像"); progressDialog.setWindowTitle(u8"合并影像");
progressDialog.setWindowModality(Qt::WindowModal); progressDialog.setWindowModality(Qt::WindowModal);
@ -1753,10 +1758,6 @@ ErrorCode MergeRasterInGeoCoding(QVector<gdalImage> imgdslist, gdalImage resulti
progressDialog.setMaximum(resultimg.height); progressDialog.setMaximum(resultimg.height);
progressDialog.setMinimum(0); progressDialog.setMinimum(0);
progressDialog.show(); progressDialog.show();
omp_lock_t lock; omp_lock_t lock;
omp_init_lock(&lock); omp_init_lock(&lock);
@ -1783,13 +1784,20 @@ ErrorCode MergeRasterInGeoCoding(QVector<gdalImage> imgdslist, gdalImage resulti
rid = starti + i; rid = starti + i;
for (long j = 0; j < resultimg.width; j++) {// 列号 for (long j = 0; j < resultimg.width; j++) {// 列号
cid = j; cid = j;
resultimg.getLandPoint(i,j,0,pp); resultimg.getLandPoint(rid, cid,0,pp);
lp = resultimg.getRow_Col(pp.lon, pp.lat); // 获取点坐标 lp = imgdslist[ir].getRow_Col(pp.lon, pp.lat); // 获取点坐标
ridlist(i, j) = lp.lat; ridlist(i, j) = lp.lat;
cidlist(i, j) = lp.lon; 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) { if (ridlist.maxCoeff() < 0 || ridlist.minCoeff() >= imgdslist[ir].height) {
continue; continue;
} }
@ -1833,17 +1841,23 @@ ErrorCode MergeRasterInGeoCoding(QVector<gdalImage> imgdslist, gdalImage resulti
} }
} }
} }
rowcount = ridlist.rows();
colcount = ridlist.cols();
double Bileanervalue = 0;
rowcount = data.rows();
colcount = data.cols();
for (long i = 0; i < rowcount; i++) { for (long i = 0; i < rowcount; i++) {
for (long j = 0; j < colcount; j++) { for (long j = 0; j < colcount; j++) {
ridtemp = ridlist(i, j); ridtemp = ridlist(i, j);
cidtemp = cidlist(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; continue;
} }
else {} else {}
@ -1851,11 +1865,6 @@ ErrorCode MergeRasterInGeoCoding(QVector<gdalImage> imgdslist, gdalImage resulti
r0 = ridtemp - std::floor(ridtemp); r0 = ridtemp - std::floor(ridtemp);
c0 = cidtemp - std::floor(cidtemp); c0 = cidtemp - std::floor(cidtemp);
lastr = std::floor(ridtemp);
nextr = std::ceil(ridtemp);
lastc = std::floor(cidtemp);
lastc = std::ceil(cidtemp);
lastr = lastr - minRid; lastr = lastr - minRid;
nextr = nextr - minRid; nextr = nextr - minRid;
@ -1864,8 +1873,11 @@ ErrorCode MergeRasterInGeoCoding(QVector<gdalImage> imgdslist, gdalImage resulti
p21 = Landpoint{ 0,1,data(nextr,lastc) }; p21 = Landpoint{ 0,1,data(nextr,lastc) };
p12 = Landpoint{ 1,0,data(lastr,nextc) }; p12 = Landpoint{ 1,0,data(lastr,nextc) };
p22 = Landpoint{ 1,1,data(nextr,nextc) }; p22 = Landpoint{ 1,1,data(nextr,nextc) };
Bileanervalue = Bilinear_interpolation(p0, p11, p21, p12, p22);
resultdata(i,j) = resultdata(i, j)+ 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; 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; long EPSGCode = 0;
switch (stripState) { switch (stripState) {
@ -2424,3 +2437,354 @@ void ShowProessAbstract::showProcess(double precent, QString tip)
void ShowProessAbstract::showToolInfo(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;
}

View File

@ -25,7 +25,7 @@
#include <QString> #include <QString>
#include <cpl_conv.h> // for CPLMalloc() #include <cpl_conv.h> // for CPLMalloc()
#include "LogInfoCls.h" #include "LogInfoCls.h"
#include <QObject>
enum ProjectStripDelta { enum ProjectStripDelta {
Strip_6, // 6度带 Strip_6, // 6度带
@ -74,16 +74,17 @@ enum GDALREADARRCOPYMETHOD {
class ShowProessAbstract { class ShowProessAbstract :public QObject{
public:
Q_OBJECT
public: public:
virtual void showProcess(double precent,QString tip); virtual void showProcess(double precent,QString tip);
virtual void showToolInfo( QString tip) ; virtual void showToolInfo( QString tip) ;
}; };
/// 根据经纬度获取 /// 根据经纬度获取
/// EPSG代码根据经纬度返回对应投影坐标系统其中如果在中华人民共和国境内默认使用 /// EPSG代码根据经纬度返回对应投影坐标系统其中如果在中华人民共和国境内默认使用
/// CGCS2000坐标系统(EPSG 4502 ~ 4512 6度带,EPSG 4534 ~ 4554 3度带)其余地方使用WGS坐标系统 /// CGCS2000坐标系统(EPSG 4502 ~ 4512 6度带,EPSG 4534 ~ 4554 3度带)其余地方使用WGS坐标系统
@ -91,7 +92,7 @@ public:
/// \param long 经度 /// \param long 经度
/// \param lat 纬度 /// \param lat 纬度
/// \return 对应投影坐标系统的 EPSG编码,-1 表示计算错误 /// \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); 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); 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); 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); 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); int alignRaster(QString inputPath, QString referencePath, QString outputPath, GDALResampleAlg eResample);
//--------------------- 保存文博 ------------------------------- //--------------------- 保存文博 -------------------------------
@ -258,6 +268,7 @@ ErrorCode MergeRasterProcess(QVector<QString> filepath, QString outfileptah, QSt
ErrorCode MergeRasterInGeoCoding(QVector<gdalImage> inimgs, gdalImage resultimg,gdalImage maskimg, ShowProessAbstract* dia = nullptr); ErrorCode MergeRasterInGeoCoding(QVector<gdalImage> inimgs, gdalImage resultimg,gdalImage maskimg, ShowProessAbstract* dia = nullptr);
template<typename T> template<typename T>
std::shared_ptr<T> readDataArr(gdalImage& imgds, int start_row, int start_col, int rows_count, int cols_count, int band_ids, GDALREADARRCOPYMETHOD method) std::shared_ptr<T> 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<T> readDataArr(gdalImage& imgds, int start_row, int start_col, i
//--------------------- 图像分块 ------------------------------
#endif #endif

View File

@ -7,6 +7,7 @@ std::string errorCode2errInfo(ErrorCode e)
{ {
_CASE_STR(SUCCESS); _CASE_STR(SUCCESS);
_CASE_STR(VIRTUALABSTRACT); _CASE_STR(VIRTUALABSTRACT);
_CASE_STR(FAIL);
_CASE_STR(FILENOFOUND); _CASE_STR(FILENOFOUND);
_CASE_STR(OrbitNodeNotEnough); _CASE_STR(OrbitNodeNotEnough);
_CASE_STR(XYDataPointNotEqual); _CASE_STR(XYDataPointNotEqual);

View File

@ -16,6 +16,7 @@
enum ErrorCode { enum ErrorCode {
SUCCESS = -1,// 执行成功 SUCCESS = -1,// 执行成功
VIRTUALABSTRACT = -2,// virtual abstract function not implement VIRTUALABSTRACT = -2,// virtual abstract function not implement
FAIL=0,
FILENOFOUND = 1, FILENOFOUND = 1,
OrbitNodeNotEnough = 2, OrbitNodeNotEnough = 2,
XYDataPointNotEqual = 3, XYDataPointNotEqual = 3,

View File

@ -6,14 +6,20 @@
#include <QDomDocument> #include <QDomDocument>
#include <QXmlStreamReader> #include <QXmlStreamReader>
SARSimulationImageL1Dataset::SARSimulationImageL1Dataset() SARSimulationImageL1Dataset::SARSimulationImageL1Dataset(RasterLevel level)
{ {
this->Rasterlevel = level;
} }
SARSimulationImageL1Dataset::~SARSimulationImageL1Dataset() SARSimulationImageL1Dataset::~SARSimulationImageL1Dataset()
{ {
} }
RasterLevel SARSimulationImageL1Dataset::getRasterLevel()
{
return this->Rasterlevel;
}
QString SARSimulationImageL1Dataset::getoutFolderPath() QString SARSimulationImageL1Dataset::getoutFolderPath()
{ {
return outFolderPath; return outFolderPath;
@ -46,11 +52,17 @@ QString SARSimulationImageL1Dataset::getImageRasterPath()
QString SARSimulationImageL1Dataset::getGPSPointFilename() QString SARSimulationImageL1Dataset::getGPSPointFilename()
{ {
if (this->Rasterlevel == RasterLevel::RasterL2) {
return "";
}
return GPSPointFilename; return GPSPointFilename;
} }
QString SARSimulationImageL1Dataset::getGPSPointFilePath() QString SARSimulationImageL1Dataset::getGPSPointFilePath()
{ {
if (this->Rasterlevel == RasterLevel::RasterL2) {
return "";
}
return GPSPointFilePath; return GPSPointFilePath;
} }
@ -94,7 +106,7 @@ ErrorCode SARSimulationImageL1Dataset::OpenOrNew(QString folder, QString filenam
this->saveToXml(); this->saveToXml();
} }
if (QFile(this->GPSPointFilePath).exists() == false) { if (this->Rasterlevel!=RasterL2||QFile(this->GPSPointFilePath).exists() == false) {
// 创建新文件 // 创建新文件
omp_lock_t lock; omp_lock_t lock;
omp_init_lock(&lock); omp_init_lock(&lock);
@ -110,7 +122,7 @@ ErrorCode SARSimulationImageL1Dataset::OpenOrNew(QString folder, QString filenam
omp_destroy_lock(&lock); omp_destroy_lock(&lock);
} }
if (QFile(this->ImageRasterPath).exists() == false) { if (this->Rasterlevel == RasterLevel::RasterSLC || QFile(this->ImageRasterPath).exists() == false) {
// 创建新文件 // 创建新文件
omp_lock_t lock; omp_lock_t lock;
@ -127,6 +139,25 @@ ErrorCode SARSimulationImageL1Dataset::OpenOrNew(QString folder, QString filenam
omp_destroy_lock(&lock); // 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<GDALDataset> 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; return ErrorCode::SUCCESS;
} }
@ -198,6 +229,21 @@ void SARSimulationImageL1Dataset::saveToXml()
xmlWriter.writeStartDocument(); xmlWriter.writeStartDocument();
xmlWriter.writeStartElement("Parameters"); 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("RowCount", QString::number(this->rowCount));
xmlWriter.writeTextElement("ColCount", QString::number(this->colCount)); xmlWriter.writeTextElement("ColCount", QString::number(this->colCount));
xmlWriter.writeTextElement("Rnear", QString::number(this->Rnear)); xmlWriter.writeTextElement("Rnear", QString::number(this->Rnear));
@ -208,6 +254,66 @@ void SARSimulationImageL1Dataset::saveToXml()
xmlWriter.writeTextElement("CenterAngle", QString::number(this->CenterAngle)); xmlWriter.writeTextElement("CenterAngle", QString::number(this->CenterAngle));
xmlWriter.writeTextElement("LookSide", this->LookSide); 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(); // 结束 <AntPosParam>
}
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.writeEndElement(); // Parameters
xmlWriter.writeEndDocument(); xmlWriter.writeEndDocument();
@ -232,6 +338,18 @@ ErrorCode SARSimulationImageL1Dataset::loadFromXml()
if (xmlReader.name() == "Parameters") { if (xmlReader.name() == "Parameters") {
continue; 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") { else if (xmlReader.name() == "RowCount") {
this->rowCount = xmlReader.readElementText().toLong(); this->rowCount = xmlReader.readElementText().toLong();
} }
@ -253,12 +371,163 @@ ErrorCode SARSimulationImageL1Dataset::loadFromXml()
else if (xmlReader.name() == "Fs") { else if (xmlReader.name() == "Fs") {
this->Fs = xmlReader.readElementText().toDouble(); 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") { else if (xmlReader.name() == "CenterAngle") {
this->CenterAngle = xmlReader.readElementText().toDouble(); this->CenterAngle = xmlReader.readElementText().toDouble();
} }
else if (xmlReader.name() == "LookSide") { else if (xmlReader.name() == "LookSide") {
this->LookSide = xmlReader.readElementText(); 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();
}
} }
} }
@ -273,6 +542,11 @@ ErrorCode SARSimulationImageL1Dataset::loadFromXml()
std::shared_ptr<double> SARSimulationImageL1Dataset::getAntPos() std::shared_ptr<double> SARSimulationImageL1Dataset::getAntPos()
{ {
if (this->Rasterlevel == RasterLevel::RasterL2) {
return nullptr;
}
omp_lock_t lock; omp_lock_t lock;
omp_init_lock(&lock); omp_init_lock(&lock);
omp_set_lock(&lock); omp_set_lock(&lock);
@ -333,6 +607,10 @@ ErrorCode SARSimulationImageL1Dataset::saveAntPos(std::shared_ptr<double> ptr)
std::shared_ptr<std::complex<double>> SARSimulationImageL1Dataset::getImageRaster() std::shared_ptr<std::complex<double>> SARSimulationImageL1Dataset::getImageRaster()
{ {
if (this->Rasterlevel != RasterLevel::RasterSLC) {
return nullptr;
}
return this->getImageRaster(0, this->rowCount); return this->getImageRaster(0, this->rowCount);
} }
@ -387,6 +665,11 @@ ErrorCode SARSimulationImageL1Dataset::saveImageRaster(std::shared_ptr<std::comp
std::shared_ptr<std::complex<double>> SARSimulationImageL1Dataset::getImageRaster(long startPRF, long PRFLen) std::shared_ptr<std::complex<double>> SARSimulationImageL1Dataset::getImageRaster(long startPRF, long PRFLen)
{ {
if (this->Rasterlevel != RasterLevel::RasterSLC) {
return nullptr;
}
if (!(startPRF < this->rowCount)) { if (!(startPRF < this->rowCount)) {
qDebug() << QString::fromStdString(errorCode2errInfo(ErrorCode::ECHO_L0DATA_PRFIDXOUTRANGE)) << startPRF << " " << this->rowCount; qDebug() << QString::fromStdString(errorCode2errInfo(ErrorCode::ECHO_L0DATA_PRFIDXOUTRANGE)) << startPRF << " " << this->rowCount;
return nullptr; return nullptr;
@ -435,6 +718,11 @@ std::shared_ptr<std::complex<double>> SARSimulationImageL1Dataset::getImageRaste
Eigen::MatrixXcd SARSimulationImageL1Dataset::getImageRasterMatrix() Eigen::MatrixXcd SARSimulationImageL1Dataset::getImageRasterMatrix()
{ {
if (this->Rasterlevel != RasterLevel::RasterSLC) {
return Eigen::MatrixXcd::Zero(0,0);
}
std::shared_ptr<std::complex<double>> data = this->getImageRaster(); std::shared_ptr<std::complex<double>> data = this->getImageRaster();
Eigen::MatrixXcd dataimg = Eigen::MatrixXcd::Zero(this->rowCount, this->colCount); Eigen::MatrixXcd dataimg = Eigen::MatrixXcd::Zero(this->rowCount, this->colCount);
for (long i = 0; i < this->rowCount; i++) { for (long i = 0; i < this->rowCount; i++) {
@ -459,8 +747,43 @@ ErrorCode SARSimulationImageL1Dataset::saveImageRaster(Eigen::MatrixXcd& dataimg
return ErrorCode(); 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<SatelliteAntPos> SARSimulationImageL1Dataset::getXmlSateAntPos()
{
if (this->Rasterlevel == RasterLevel::RasterL2) {
return QVector<SatelliteAntPos>(0);
}
return this->sateposes;
}
void SARSimulationImageL1Dataset::setSateAntPos(QVector<SatelliteAntPos> pos)
{
this->sateposes = pos;
}
// Getter 和 Setter 方法实现 // Getter 和 Setter 方法实现
long SARSimulationImageL1Dataset::getrowCount() { return this->rowCount; } long SARSimulationImageL1Dataset::getrowCount() { return this->rowCount; }
@ -492,7 +815,15 @@ void SARSimulationImageL1Dataset::setCenterFreq(double freq) { this->centerFreq
double SARSimulationImageL1Dataset::getFs() { return this->Fs; } double SARSimulationImageL1Dataset::getFs() { return this->Fs; }
void SARSimulationImageL1Dataset::setFs(double samplingFreq) { this->Fs = samplingFreq; } 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() double SARSimulationImageL1Dataset::getCenterAngle()
{ {
@ -513,3 +844,142 @@ void SARSimulationImageL1Dataset::setLookSide(QString looksides)
{ {
this->LookSide = 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<double> SARSimulationImageL1Dataset::getDopplerParams()
{
QVector<double> 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<double> SARSimulationImageL1Dataset::getDopplerCenterCoff()
{
QVector<double> 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;
}

View File

@ -8,14 +8,25 @@
#include "FileOperator.h" #include "FileOperator.h"
#include "LogInfoCls.h" #include "LogInfoCls.h"
enum RasterLevel {
RasterSLC,
RasterL1B,
RasterL2
};
class SARSimulationImageL1Dataset class SARSimulationImageL1Dataset
{ {
public: public:
SARSimulationImageL1Dataset(); SARSimulationImageL1Dataset(RasterLevel Rasterlevel= RasterLevel::RasterSLC);
~SARSimulationImageL1Dataset(); ~SARSimulationImageL1Dataset();
private:
RasterLevel Rasterlevel;
public:
RasterLevel getRasterLevel();
private : private :
QString outFolderPath; QString outFolderPath;
QString L1DatasetName; QString L1DatasetName;
@ -54,6 +65,8 @@ public:
Eigen::MatrixXcd getImageRasterMatrix(); Eigen::MatrixXcd getImageRasterMatrix();
ErrorCode saveImageRaster(Eigen::MatrixXcd& data, long startPRF); ErrorCode saveImageRaster(Eigen::MatrixXcd& data, long startPRF);
gdalImage getImageRasterGdalImage();
private: // xmlÖвÎÊý private: // xmlÖвÎÊý
long rowCount; long rowCount;
@ -65,11 +78,27 @@ private: // xml
double centerFreq; double centerFreq;
double Fs; double Fs;
double prf;
double CenterAngle; double CenterAngle;
QString LookSide; QString LookSide;
QVector<SatelliteAntPos> sateposes;
double startImageTime;
double EndImageTime;
public: public:
void setStartImageTime(double imageTime);
double getStartImageTime();
void setEndImageTime(double imageTime);
double getEndImageTime();
QVector<SatelliteAntPos> getXmlSateAntPos();
void setSateAntPos(QVector<SatelliteAntPos> pos);
long getrowCount(); long getrowCount();
void setrowCount(long rowCount); void setrowCount(long rowCount);
@ -91,15 +120,81 @@ public:
double getFs(); double getFs();
void setFs(double samplingFreq); void setFs(double samplingFreq);
double getPRF();
void setPRF(double PRF);
double getCenterAngle(); double getCenterAngle();
void setCenterAngle(double angle); void setCenterAngle(double angle);
QString getLookSide(); QString getLookSide();
void setLookSide(QString lookside); 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<double> getDopplerParams();
void setDopplerParams(double d0, double d1, double d2, double d3, double d4);
QVector<double> 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();
}; };