RasterProcessTool/BaseCommonLibrary/BaseTool/SARSimulationImageL1.cpp

1002 lines
38 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "stdafx.h"
#include "SARSimulationImageL1.h"
#include "LogInfoCls.h"
#include <memory>
#include <QFile>
#include <QDomDocument>
#include <QXmlStreamReader>
SARSimulationImageL1Dataset::SARSimulationImageL1Dataset(RasterLevel level)
{
this->Rasterlevel = level;
}
SARSimulationImageL1Dataset::~SARSimulationImageL1Dataset()
{
}
RasterLevel SARSimulationImageL1Dataset::getRasterLevel()
{
return this->Rasterlevel;
}
QString SARSimulationImageL1Dataset::getoutFolderPath()
{
return outFolderPath;
}
QString SARSimulationImageL1Dataset::getDatesetName()
{
return L1DatasetName;
}
QString SARSimulationImageL1Dataset::getxmlfileName()
{
return xmlfileName;
}
QString SARSimulationImageL1Dataset::getxmlFilePath()
{
return xmlFilePath;
}
QString SARSimulationImageL1Dataset::getImageRasterName()
{
return ImageRasterName;
}
QString SARSimulationImageL1Dataset::getImageRasterPath()
{
return ImageRasterPath;
}
QString SARSimulationImageL1Dataset::getGPSPointFilename()
{
if (this->Rasterlevel == RasterLevel::RasterL2) {
return "";
}
return GPSPointFilename;
}
QString SARSimulationImageL1Dataset::getGPSPointFilePath()
{
if (this->Rasterlevel == RasterLevel::RasterL2) {
return "";
}
return GPSPointFilePath;
}
ErrorCode SARSimulationImageL1Dataset::OpenOrNew(QString folder, QString filename, long inrowCount, long incolCount)
{
qDebug() << "--------------Image Raster L1 Data OpenOrNew ---------------------------------------";
qDebug() << "Folder: " << folder;
qDebug() << "Filename: " << filename;
QDir dir(folder);
if (dir.exists() == false)
{
dir.mkpath(folder);
}
else {}
if (dir.exists() == false) {
return ErrorCode::FOLDER_NOT_EXIST;
}
else {}
QString filePath = dir.filePath(filename); // Éú³ÉÍêÕûµÄÎļþ·¾¶
this->rowCount = inrowCount;
this->colCount = incolCount;
this->outFolderPath = folder;
this->L1DatasetName = filename;
this->xmlfileName = filename + ".xml";
this->GPSPointFilename = filename + ".gpspos.data";
this->ImageRasterName = filename + ".bin";
this->xmlFilePath = dir.filePath(this->xmlfileName);
this->GPSPointFilePath = dir.filePath(this->GPSPointFilename);
this->ImageRasterPath = dir.filePath(this->ImageRasterName);
if (QFile(this->xmlFilePath).exists())
{
this->loadFromXml();
}
else
{
this->saveToXml();
}
if (this->Rasterlevel==RasterL2||QFile(this->GPSPointFilePath).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->GPSPointFilePath.toUtf8().constData(), 19, rowCount, 1, GDT_Float64, NULL));
GDALFlushCache((GDALDatasetH)poDstDS.get());
poDstDS.reset();
omp_unset_lock(&lock);
omp_destroy_lock(&lock);
}
else 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); //
}
else if (this->Rasterlevel == RasterLevel::RasterL1B || 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->GPSPointFilePath.toUtf8().constData(), 19, rowCount, 1, GDT_Float64, NULL));
GDALFlushCache((GDALDatasetH)poDstDS.get());
poDstDS.reset();
omp_unset_lock(&lock);
omp_destroy_lock(&lock);
}
return ErrorCode::SUCCESS;
}
ErrorCode SARSimulationImageL1Dataset::Open(QString folder, QString filename)
{
QDir dir(folder);
if (dir.exists() == false)
{
return ErrorCode::FOLDER_NOT_EXIST;
}
else {}
if (dir.exists() == false) {
return ErrorCode::FOLDER_NOT_EXIST;
}
else {}
QString filePath = dir.filePath(filename); // Éú³ÉÍêÕûµÄÎļþ·¾¶
this->outFolderPath = folder;
this->L1DatasetName = filename;
this->xmlfileName = filename + ".xml";
this->GPSPointFilename = filename + ".gpspos.data";
this->ImageRasterName = filename + ".bin";
this->xmlFilePath = dir.filePath(this->xmlfileName);
this->GPSPointFilePath = dir.filePath(this->GPSPointFilename);
this->ImageRasterPath = dir.filePath(this->ImageRasterName);
if (QFile(this->xmlFilePath).exists())
{
this->loadFromXml();
}
else
{
return ErrorCode::ECHO_L0DATA_ECHOFILEFORMATERROR;
}
}
ErrorCode SARSimulationImageL1Dataset::Open(QString xmlPath)
{
QFileInfo fileInfo(xmlPath);
QString fileName = fileInfo.fileName(); // »ñÈ¡ÎļþÃû
QString fileSuffix = fileInfo.suffix(); // »ñÈ¡ºó׺Ãû
QString fileNameWithoutSuffix = fileInfo.completeBaseName(); // »ñÈ¡²»´øºó׺µÄÎļþÃû
QString directoryPath = fileInfo.path(); // »ñÈ¡Îļþ¼Ð·¾¶
if (fileSuffix.toLower() == "xml" || fileSuffix.toLower() == ".xml") {
return this->Open(directoryPath, fileNameWithoutSuffix);
}
else {
return ErrorCode::IMAGE_L1DATA_XMLNAMEERROR;
}
return ErrorCode::SUCCESS;
}
void SARSimulationImageL1Dataset::saveToXml()
{
QFile file(this->xmlFilePath);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
qDebug() << "Cannot open file for writing:" << file.errorString();
return;
}
QXmlStreamWriter xmlWriter(&file);
xmlWriter.setAutoFormatting(true);
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, 'e', 18));
xmlWriter.writeTextElement("Rfar", QString::number(this->Rfar, 'e', 18));
xmlWriter.writeTextElement("Rref", QString::number(this->Rref, 'e', 18));
xmlWriter.writeTextElement("CenterFreq", QString::number(this->centerFreq, 'e', 18));
xmlWriter.writeTextElement("Fs", QString::number(this->Fs, 'e', 18));
xmlWriter.writeTextElement("PRF", QString::number(this->prf, 'e', 18));
xmlWriter.writeTextElement("CenterAngle", QString::number(this->CenterAngle, 'e', 18));
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, 'e', 18)); // time
xmlWriter.writeTextElement("Px", QString::number(this->sateposes[i].Px, 'e', 18)); // Px
xmlWriter.writeTextElement("Py", QString::number(this->sateposes[i].Py, 'e', 18)); // Py
xmlWriter.writeTextElement("Pz", QString::number(this->sateposes[i].Pz, 'e', 18)); // Pz
xmlWriter.writeTextElement("Vx", QString::number(this->sateposes[i].Vx, 'e', 18)); // Vx
xmlWriter.writeTextElement("Vy", QString::number(this->sateposes[i].Vy, 'e', 18)); // Vy
xmlWriter.writeTextElement("Vz", QString::number(this->sateposes[i].Vz, 'e', 18)); // Vz
xmlWriter.writeTextElement("AntDirectX", QString::number(this->sateposes[i].AntDirectX, 'e', 18)); // AntDirectX
xmlWriter.writeTextElement("AntDirectY", QString::number(this->sateposes[i].AntDirectY, 'e', 18)); // AntDirectY
xmlWriter.writeTextElement("AntDirectZ", QString::number(this->sateposes[i].AntDirectZ, 'e', 18)); // AntDirectZ
xmlWriter.writeTextElement("AVx", QString::number(this->sateposes[i].AVx, 'e', 18)); // AVx
xmlWriter.writeTextElement("AVy", QString::number(this->sateposes[i].AVy, 'e', 18)); // AVy
xmlWriter.writeTextElement("AVz", QString::number(this->sateposes[i].AVz, 'e', 18)); // AVz
xmlWriter.writeTextElement("lon", QString::number(this->sateposes[i].lon, 'e', 18)); // lon
xmlWriter.writeTextElement("lat", QString::number(this->sateposes[i].lat, 'e', 18)); // lat
xmlWriter.writeTextElement("ati", QString::number(this->sateposes[i].ati, 'e', 18)); // ati
xmlWriter.writeEndElement(); // ½áÊø <AntPosParam>
}
xmlWriter.writeTextElement("ImageStartTime", QString::number(this->startImageTime, 'e', 18));
xmlWriter.writeTextElement("ImageEndTime", QString::number(this->EndImageTime, 'e', 18));
xmlWriter.writeTextElement("incidenceAngleNearRange", QString::number(this->incidenceAngleNearRange, 'e', 18));
xmlWriter.writeTextElement("incidenceAngleFarRange", QString::number(this->incidenceAngleFarRange, 'e', 18));
xmlWriter.writeTextElement("TotalProcessedAzimuthBandWidth", QString::number(this->TotalProcessedAzimuthBandWidth, 'e', 18));
xmlWriter.writeTextElement("DopplerParametersReferenceTime", QString::number(this->DopplerParametersReferenceTime, 'e', 18));
xmlWriter.writeStartElement("DopplerCentroidCoefficients");
xmlWriter.writeTextElement("d0", QString::number(this->d0, 'e', 18));
xmlWriter.writeTextElement("d1", QString::number(this->d1, 'e', 18));
xmlWriter.writeTextElement("d2", QString::number(this->d2, 'e', 18));
xmlWriter.writeTextElement("d3", QString::number(this->d3, 'e', 18));
xmlWriter.writeTextElement("d4", QString::number(this->d4, 'e', 18));
xmlWriter.writeEndElement(); // DopplerCentroidCoefficients
xmlWriter.writeStartElement("DopplerRateValuesCoefficients");
xmlWriter.writeTextElement("r0", QString::number(this->r0, 'e', 18));
xmlWriter.writeTextElement("r1", QString::number(this->r1, 'e', 18));
xmlWriter.writeTextElement("r2", QString::number(this->r2, 'e', 18));
xmlWriter.writeTextElement("r3", QString::number(this->r3, 'e', 18));
xmlWriter.writeTextElement("r4", QString::number(this->r4, 'e', 18));
xmlWriter.writeEndElement(); // DopplerRateValuesCoefficients
xmlWriter.writeTextElement("latitude_center", QString::number(this->latitude_center, 'e', 18));
xmlWriter.writeTextElement("longitude_center", QString::number(this->longitude_center, 'e', 18));
xmlWriter.writeTextElement("latitude_topLeft", QString::number(this->latitude_topLeft, 'e', 18));
xmlWriter.writeTextElement("longitude_topLeft", QString::number(this->longitude_topLeft, 'e', 18));
xmlWriter.writeTextElement("latitude_topRight", QString::number(this->latitude_topRight, 'e', 18));
xmlWriter.writeTextElement("longitude_topRight", QString::number(this->longitude_topRight, 'e', 18));
xmlWriter.writeTextElement("latitude_bottomLeft", QString::number(this->latitude_bottomLeft, 'e', 18));
xmlWriter.writeTextElement("longitude_bottomLeft", QString::number(this->longitude_bottomLeft, 'e', 18));
xmlWriter.writeTextElement("latitude_bottomRight", QString::number(this->latitude_bottomRight, 'e', 18));
xmlWriter.writeTextElement("longitude_bottomRight", QString::number(this->longitude_bottomRight, 'e', 18));
xmlWriter.writeEndElement(); // Parameters
xmlWriter.writeEndDocument();
file.close();
}
ErrorCode SARSimulationImageL1Dataset::loadFromXml()
{
QFile file(this->xmlFilePath);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
qDebug() << "Cannot open file for reading:" << file.errorString();
return ErrorCode::IMAGE_L1DATA_XMLNAMEOPENERROR;
}
QXmlStreamReader xmlReader(&file);
while (!xmlReader.atEnd() && !xmlReader.hasError()) {
QXmlStreamReader::TokenType token = xmlReader.readNext();
if (token == QXmlStreamReader::StartDocument) {
continue;
}
if (token == QXmlStreamReader::StartElement) {
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();
}
else if (xmlReader.name() == "ColCount") {
this->colCount = xmlReader.readElementText().toLong();
}
else if (xmlReader.name() == "Rnear") {
this->Rnear = xmlReader.readElementText().toDouble();
}
else if (xmlReader.name() == "Rfar") {
this->Rfar = xmlReader.readElementText().toDouble();
}
else if (xmlReader.name() == "Rref") {
this->Rref = xmlReader.readElementText().toDouble();
}
else if (xmlReader.name() == "CenterFreq") {
this->centerFreq = xmlReader.readElementText().toDouble();
}
else if (xmlReader.name() == "Fs") {
this->Fs = xmlReader.readElementText().toDouble();
}
else if (xmlReader.name() == "PRF") {
this->prf = 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;
}
file.close();
return ErrorCode::SUCCESS;
}
std::shared_ptr<double> SARSimulationImageL1Dataset::getAntPos()
{
if (this->Rasterlevel == RasterLevel::RasterL2) {
return nullptr;
}
omp_lock_t lock;
omp_init_lock(&lock);
omp_set_lock(&lock);
// ¶ÁÈ¡Îļþ
std::shared_ptr<GDALDataset> rasterDataset = OpenDataset(this->GPSPointFilePath, GDALAccess::GA_ReadOnly);
GDALDataType gdal_datatype = rasterDataset->GetRasterBand(1)->GetRasterDataType();
GDALRasterBand* demBand = rasterDataset->GetRasterBand(1);
long width = rasterDataset->GetRasterXSize();
long height = rasterDataset->GetRasterYSize();
long band_num = rasterDataset->GetRasterCount();
std::shared_ptr<double> temp = nullptr;
if (gdal_datatype == GDT_Float64) {
temp = std::shared_ptr<double>(new double[this->rowCount * 19], delArrPtr);
demBand->RasterIO(GF_Read, 0, 0, 19, this->rowCount, temp.get(), 19, this->rowCount, gdal_datatype, 0, 0);
}
else {
qDebug() << QString::fromStdString(errorCode2errInfo(ErrorCode::ECHO_L0DATA_GPSFILEFORMATERROR));
}
rasterDataset.reset();
omp_unset_lock(&lock); //
omp_destroy_lock(&lock); //
return temp;
}
ErrorCode SARSimulationImageL1Dataset::saveAntPos(std::shared_ptr<double> ptr)
{
omp_lock_t lock;
omp_init_lock(&lock);
omp_set_lock(&lock);
// ¶ÁÈ¡Îļþ
std::shared_ptr<GDALDataset> rasterDataset = OpenDataset(this->GPSPointFilePath, GDALAccess::GA_Update);
GDALDataType gdal_datatype = rasterDataset->GetRasterBand(1)->GetRasterDataType();
GDALRasterBand* demBand = rasterDataset->GetRasterBand(1);
long width = rasterDataset->GetRasterXSize();
long height = rasterDataset->GetRasterYSize();
long band_num = rasterDataset->GetRasterCount();
if (gdal_datatype == GDT_Float64) {
demBand->RasterIO(GF_Write, 0, 0, 19, this->rowCount, ptr.get(), 19, this->rowCount, gdal_datatype, 0, 0);
}
else {
qDebug() << QString::fromStdString(errorCode2errInfo(ErrorCode::ECHO_L0DATA_GPSFILEFORMATERROR));
omp_unset_lock(&lock);
omp_destroy_lock(&lock);
return ErrorCode::ECHO_L0DATA_GPSFILEFORMATERROR;
}
rasterDataset.reset();
omp_unset_lock(&lock);
omp_destroy_lock(&lock);
return ErrorCode::SUCCESS;
}
std::shared_ptr<std::complex<double>> SARSimulationImageL1Dataset::getImageRaster()
{
if (this->Rasterlevel != RasterLevel::RasterSLC) {
return nullptr;
}
return this->getImageRaster(0, this->rowCount);
}
ErrorCode SARSimulationImageL1Dataset::saveImageRaster(std::shared_ptr<std::complex<double>> echoPtr, long startPRF, long PRFLen)
{
if (!(startPRF < this->rowCount)) {
qDebug() << QString::fromStdString(errorCode2errInfo(ErrorCode::ECHO_L0DATA_PRFIDXOUTRANGE));
return ErrorCode::ECHO_L0DATA_PRFIDXOUTRANGE;
}
else {}
omp_lock_t lock;
omp_init_lock(&lock);
omp_set_lock(&lock);
std::shared_ptr<GDALDataset> rasterDataset = OpenDataset(this->ImageRasterPath, GDALAccess::GA_Update);
GDALDataType gdal_datatype = rasterDataset->GetRasterBand(1)->GetRasterDataType();
GDALRasterBand* poBand = rasterDataset->GetRasterBand(1);
if (NULL == poBand || nullptr == poBand) {
omp_lock_t lock;
omp_init_lock(&lock);
omp_set_lock(&lock);
qDebug() << QString::fromStdString(errorCode2errInfo(ErrorCode::ECHO_L0DATA_ECHOFILEFORMATERROR));
return ErrorCode::ECHO_L0DATA_ECHOFILEFORMATERROR;
}
else {}
long width = rasterDataset->GetRasterXSize();
long height = rasterDataset->GetRasterYSize();
long band_num = rasterDataset->GetRasterCount();
if (height != this->rowCount || width != this->colCount) {
qDebug() << QString::fromStdString(errorCode2errInfo(ErrorCode::ECHO_L0DATA_ECHOFILEFORMATERROR));
omp_unset_lock(&lock); //
omp_destroy_lock(&lock); //
return ErrorCode::ECHO_L0DATA_ECHOFILEFORMATERROR;
}
else {
if (gdal_datatype == GDT_CFloat32) {
poBand->RasterIO(GF_Write, 0, startPRF, width, PRFLen, echoPtr.get(), width, PRFLen, GDT_CFloat32, 0, 0);
GDALFlushCache((GDALDatasetH)rasterDataset.get());
}
else {
qDebug() << QString::fromStdString(errorCode2errInfo(ErrorCode::ECHO_L0DATA_ECHOFILEFORMATERROR));
}
}
rasterDataset.reset();
omp_unset_lock(&lock); //
omp_destroy_lock(&lock); //
return ErrorCode::SUCCESS;
}
std::shared_ptr<std::complex<double>> 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;
}
else {}
omp_lock_t lock;
omp_init_lock(&lock);
omp_set_lock(&lock);
std::shared_ptr<GDALDataset> rasterDataset = OpenDataset(this->ImageRasterPath, GDALAccess::GA_ReadOnly);
GDALDataType gdal_datatype = rasterDataset->GetRasterBand(1)->GetRasterDataType();
GDALRasterBand* poBand = rasterDataset->GetRasterBand(1);
if (NULL == poBand || nullptr == poBand) {
omp_lock_t lock;
omp_init_lock(&lock);
omp_set_lock(&lock);
qDebug() << QString::fromStdString(errorCode2errInfo(ErrorCode::ECHO_L0DATA_ECHOFILEFORMATERROR));
return nullptr;
}
else {}
long width = rasterDataset->GetRasterXSize();
long height = rasterDataset->GetRasterYSize();
long band_num = rasterDataset->GetRasterCount();
std::shared_ptr<std::complex<double>> temp = nullptr;
if (height != this->rowCount || width != this->colCount) {
qDebug() << QString::fromStdString(errorCode2errInfo(ErrorCode::ECHO_L0DATA_ECHOFILEFORMATERROR));
}
else {
if (gdal_datatype == GDT_CFloat32) {
temp = std::shared_ptr<std::complex<double>>(new std::complex<double>[PRFLen * width], delArrPtr);
poBand->RasterIO(GF_Read, 0, startPRF, width, PRFLen, temp.get(), width, PRFLen, GDT_CFloat32, 0, 0);
GDALFlushCache((GDALDatasetH)rasterDataset.get());
}
else {
qDebug() << QString::fromStdString(errorCode2errInfo(ErrorCode::ECHO_L0DATA_ECHOFILEFORMATERROR));
}
}
rasterDataset.reset();
omp_unset_lock(&lock); //
omp_destroy_lock(&lock); //
return temp;
}
Eigen::MatrixXcd SARSimulationImageL1Dataset::getImageRasterMatrix()
{
if (this->Rasterlevel != RasterLevel::RasterSLC) {
return Eigen::MatrixXcd::Zero(0,0);
}
std::shared_ptr<std::complex<double>> data = this->getImageRaster();
Eigen::MatrixXcd dataimg = Eigen::MatrixXcd::Zero(this->rowCount, this->colCount);
for (long i = 0; i < this->rowCount; i++) {
for (long j = 0; j < this->colCount; j++) {
dataimg(i, j) = data.get()[i*colCount+j];
}
}
return Eigen::MatrixXcd();
}
ErrorCode SARSimulationImageL1Dataset::saveImageRaster(Eigen::MatrixXcd& dataimg, long startPRF)
{
std::shared_ptr<std::complex<double>> data(new std::complex<double>[dataimg.rows()* dataimg.cols()]);
long dataimgrows = dataimg.rows();
long dataimgcols = dataimg.cols();
for (long i = 0; i < dataimgrows; i++) {
for (long j = 0; j < dataimgcols; j++) {
data.get()[i * dataimgcols + j] = dataimg(i, j);
}
}
this->saveImageRaster(data, startPRF,dataimgrows);
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 ·½·¨ÊµÏÖ
long SARSimulationImageL1Dataset::getrowCount() { return this->rowCount; }
void SARSimulationImageL1Dataset::setrowCount(long rowCountin) { this->rowCount = rowCountin; }
long SARSimulationImageL1Dataset::getcolCount() { return this->colCount; }
void SARSimulationImageL1Dataset::setcolCount(long pulsePointsin) { this->colCount = pulsePointsin; }
double SARSimulationImageL1Dataset::getNearRange() { return this->Rnear; }
void SARSimulationImageL1Dataset::setNearRange(double nearRange) { this->Rnear = nearRange; }
double SARSimulationImageL1Dataset::getFarRange() { return this->Rfar; }
void SARSimulationImageL1Dataset::setFarRange(double farRange) { this->Rfar = farRange; }
double SARSimulationImageL1Dataset::getRefRange()
{
return this->Rref;
}
void SARSimulationImageL1Dataset::setRefRange(double refRange)
{
this->Rref = refRange;
}
double SARSimulationImageL1Dataset::getCenterFreq() { return this->centerFreq; }
void SARSimulationImageL1Dataset::setCenterFreq(double freq) { this->centerFreq = freq; }
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()
{
return this->CenterAngle;
}
void SARSimulationImageL1Dataset::setCenterAngle(double angle)
{
this->CenterAngle = angle;
}
QString SARSimulationImageL1Dataset::getLookSide()
{
return this->LookSide;
}
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<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; }
double SARSimulationImageL1Dataset::getdrange() { return this->dr; }
void SARSimulationImageL1Dataset::setdrange(double idr) { this->dr = idr; }
double SARSimulationImageL1Dataset::getdAz() { return this->dAz; }
void SARSimulationImageL1Dataset::setdAz(double idAz) { this->dAz = idAz; }
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;
}