RasterProcessTool/Toolbox/SimulationSARTool/SimulationSAR/SigmaDatabase.cpp

227 lines
10 KiB
C++
Raw Blame History

#include "stdafx.h"
#include "SigmaDatabase.h"
#include <set>
#include <map>
#include "BaseConstVariable.h"
struct SigmaParam {
double p1;
double p2;
double p3;
double p4;
double p5;
double p6;
};
double getSigma(double& theta, SigmaParam& param) {
return param.p1 + param.p2 * exp(-param.p3 * theta) + param.p4 * cos(param.p5 * theta + param.p6);
}
SigmaDatabase::SigmaDatabase()
{
this->HH_sigmaParam = std::map<long, SigmaParam>();
this->HV_sigmaParam = std::map<long, SigmaParam>();
this->VH_sigmaParam = std::map<long, SigmaParam>();
this->VV_sigmaParam = std::map<long, SigmaParam>();
this->HH_sigmaParam.clear();
this->HV_sigmaParam.clear();
this->VH_sigmaParam.clear();
this->VV_sigmaParam.clear();
//0
this->HH_sigmaParam.insert(std::pair<long, SigmaParam>(0, SigmaParam{ 0,0,0, 0, 0,0 }));
this->HV_sigmaParam.insert(std::pair<long, SigmaParam>(0, SigmaParam{ 0,0,0, 0, 0,0 }));
this->VH_sigmaParam.insert(std::pair<long, SigmaParam>(0, SigmaParam{ 0,0,0, 0, 0,0 }));
this->VV_sigmaParam.insert(std::pair<long, SigmaParam>(0, SigmaParam{ 0,0,0, 0, 0,0 }));
//12
this->HH_sigmaParam.insert(std::pair<long, SigmaParam>(12, SigmaParam{ -21.1019701821713, 9.00621457243906, 6.52932182540331, - 1.11157376729893, - 15.8022895411007, 11.4690828129602 }));
this->HV_sigmaParam.insert(std::pair<long, SigmaParam>(12, SigmaParam{ -30.0103645753547, 27.1700862271921, 11.8007376386356, - 0.933835390422269, - 16.4640776105300, 11.8318838032267 }));
this->VH_sigmaParam.insert(std::pair<long, SigmaParam>(12, SigmaParam{ -30.0103645753547, 27.1700862271921, 11.8007376386356, -0.933835390422269, -16.4640776105300, 11.8318838032267 }));
this->VV_sigmaParam.insert(std::pair<long, SigmaParam>(12, SigmaParam{ -21.1019701821713, 9.00621457243906, 6.52932182540331, -1.11157376729893, -15.8022895411007, 11.4690828129602 }));
//22
this->HH_sigmaParam.insert(std::pair<long, SigmaParam>(22, SigmaParam{ -43.6677042155964, 32.0245140457417, 0.511060658303930, - 2.68482232690106, 6.29783274559538, 1.96648609622833 }));
this->HV_sigmaParam.insert(std::pair<long, SigmaParam>(22, SigmaParam{ -36.3971634075803, 13.1296247093899, 1.12707368693158, - 1.88195857790977, 6.57450737122974, 2.11755051297951 }));
this->VH_sigmaParam.insert(std::pair<long, SigmaParam>(22, SigmaParam{ -36.3971634075803, 13.1296247093899, 1.12707368693158, -1.88195857790977, 6.57450737122974, 2.11755051297951 }));
this->VV_sigmaParam.insert(std::pair<long, SigmaParam>(22, SigmaParam{ -43.6677042155964, 32.0245140457417, 0.511060658303930, -2.68482232690106, 6.29783274559538, 1.96648609622833 }));
//30
this->HH_sigmaParam.insert(std::pair<long, SigmaParam>(30, SigmaParam{ -59.1080014669385, 47.6710707363975, 0.300193452564135, - 3.93463636916976, 5.99799798331127, - 10.3772604045974 }));
this->HV_sigmaParam.insert(std::pair<long, SigmaParam>(30, SigmaParam{ -55.1864353240982, 32.2453149408716, 0.333758208816865, - 3.38774208141056, 6.12774897769798, - 10.1192846531823 }));
this->VH_sigmaParam.insert(std::pair<long, SigmaParam>(30, SigmaParam{ -55.1864353240982, 32.2453149408716, 0.333758208816865, - 3.38774208141056, 6.12774897769798, - 10.1192846531823 }));
this->VV_sigmaParam.insert(std::pair<long, SigmaParam>(30, SigmaParam{ -59.1080014669385, 47.6710707363975, 0.300193452564135, -3.93463636916976, 5.99799798331127, -10.3772604045974 }));
//50
this->HH_sigmaParam.insert(std::pair<long, SigmaParam>(50, SigmaParam{ -22.9105602882378, 8170.54100628307, 15.4916054293135, - 0.970580847008280, 28.9025325818511, - 21.4319176514170 }));
this->HV_sigmaParam.insert(std::pair<long, SigmaParam>(50, SigmaParam{ -39.7459019584805, 151.391039247574, 5.17117231380975, - 4.10303899418773, 8.04893424718507, - 3.17171678851531 }));
this->VH_sigmaParam.insert(std::pair<long, SigmaParam>(50, SigmaParam{ -39.7459019584805, 151.391039247574, 5.17117231380975, -4.10303899418773, 8.04893424718507, -3.17171678851531 }));
this->VV_sigmaParam.insert(std::pair<long, SigmaParam>(50, SigmaParam{ -22.9105602882378, 8170.54100628307, 15.4916054293135, -0.970580847008280, 28.9025325818511, -21.4319176514170 }));
//61
this->HH_sigmaParam.insert(std::pair<long, SigmaParam>(61, SigmaParam{ 27.2590864500905, 95.6840751800642, 3.98975084647232, 50.3262749621072, 3.09962879546370, - 5.10400310274333 }));
this->HV_sigmaParam.insert(std::pair<long, SigmaParam>(61, SigmaParam{ -65.9799383836613, 106.831320929437, 1.53821651203361, 0.704332523237733, 36.3654715437260, - 13.7449876973719 }));
this->VH_sigmaParam.insert(std::pair<long, SigmaParam>(61, SigmaParam{ -65.9799383836613, 106.831320929437, 1.53821651203361, 0.704332523237733, 36.3654715437260, -13.7449876973719 }));
this->VV_sigmaParam.insert(std::pair<long, SigmaParam>(61, SigmaParam{ 27.2590864500905, 95.6840751800642, 3.98975084647232, 50.3262749621072, 3.09962879546370, -5.10400310274333 }));
//62
this->HH_sigmaParam.insert(std::pair<long, SigmaParam>(62, SigmaParam{ -34.3961764495281, 21.7503968763591, 1.15914650010176, - 2.83950292185421, 10.3519995095232, 2.75293811408200 }));
this->HV_sigmaParam.insert(std::pair<long, SigmaParam>(62, SigmaParam{ -34.0710914034599, 14.1778732014224, 3.47049853590805, - 1.73813229616801, 10.9627971440838, 2.19731364578002 }));
this->VH_sigmaParam.insert(std::pair<long, SigmaParam>(62, SigmaParam{ -34.0710914034599, 14.1778732014224, 3.47049853590805, -1.73813229616801, 10.9627971440838, 2.19731364578002 }));
this->VV_sigmaParam.insert(std::pair<long, SigmaParam>(62, SigmaParam{ -34.3961764495281, 21.7503968763591, 1.15914650010176, -2.83950292185421, 10.3519995095232, 2.75293811408200 }));
//80
this->HH_sigmaParam.insert(std::pair<long, SigmaParam>(80, SigmaParam{ -5.76486750987210, - 7.80014668607246, 0.0880097904597720, - 5.44564720816575, - 0.530358195545799, 1.04332202699956 }));
this->HV_sigmaParam.insert(std::pair<long, SigmaParam>(80, SigmaParam{ 484.928701445606, - 0.992170190244375, - 1.98914783519718, - 507.127544388772, 0.195180814149377, 6.21339949756719 }));
this->VH_sigmaParam.insert(std::pair<long, SigmaParam>(80, SigmaParam{ 484.928701445606, -0.992170190244375, -1.98914783519718, -507.127544388772, 0.195180814149377, 6.21339949756719 }));
this->VV_sigmaParam.insert(std::pair<long, SigmaParam>(80, SigmaParam{ -5.76486750987210, -7.80014668607246, 0.0880097904597720, -5.44564720816575, -0.530358195545799, 1.04332202699956 }));
//90
this->HH_sigmaParam.insert(std::pair<long, SigmaParam>(90, SigmaParam{ -20.1761798059391, 13.2752519275021, 2.74667225608397, 3.63052241744923, 8.99932188120922, 34.8246533269446 }));
this->HV_sigmaParam.insert(std::pair<long, SigmaParam>(90, SigmaParam{ -26.8776515733889, 10.4251866500052, 8.43273666535992, 4.33165922141213, 8.68204389555939, - 2.51718779582920 }));
this->VH_sigmaParam.insert(std::pair<long, SigmaParam>(90, SigmaParam{ -26.8776515733889, 10.4251866500052, 8.43273666535992, 4.33165922141213, 8.68204389555939, - 2.51718779582920 }));
this->VV_sigmaParam.insert(std::pair<long, SigmaParam>(90, SigmaParam{ -20.1761798059391, 13.2752519275021, 2.74667225608397, 3.63052241744923, 8.99932188120922, 34.8246533269446 }));
}
SigmaDatabase::~SigmaDatabase()
{
this->HH_sigmaParam.clear();
this->HV_sigmaParam.clear();
this->VH_sigmaParam.clear();
this->VV_sigmaParam.clear();
}
double SigmaDatabase::getAmpHH(long cls, double angle)
{
if (this->HH_sigmaParam.find(cls) == this->HH_sigmaParam.end()) {
return 0;
}
else {
return std::pow(10, getSigma(angle, this->HH_sigmaParam[cls]) / 10.0);
}
}
double SigmaDatabase::getAmpHV(long cls, double angle)
{
if (this->HV_sigmaParam.find(cls) == this->HV_sigmaParam.end()) {
return 0;
}
else {
return std::pow(10, getSigma(angle, this->HV_sigmaParam[cls]) / 10.0);
}
}
double SigmaDatabase::getAmpVH(long cls, double angle)
{
if (this->VH_sigmaParam.find(cls) == this->VH_sigmaParam.end()) {
return 0;
}
else {
return std::pow(10, getSigma(angle, this->VH_sigmaParam[cls]) / 10.0);
}
}
double SigmaDatabase::getAmpVV(long cls, double angle)
{
if (this->VV_sigmaParam.find(cls) == this->VV_sigmaParam.end()) {
return 0;
}
else {
return std::pow(10, getSigma(angle, this->VV_sigmaParam[cls]) / 10.0);
}
}
double SigmaDatabase::getAmp(long cls, double angle, POLARTYPEENUM polartype)
{
switch (polartype)
{
case(POLARHH): { return this->getAmpHH(cls, angle); }
case(POLARHV): { return this->getAmpHV(cls, angle); }
case(POLARVH): { return this->getAmpVH(cls, angle); }
case(POLARVV): { return this->getAmpVV(cls, angle); }
default:
return 1;
}
}
std::map<long, SigmaParam> SigmaDatabase::getsigmaParams(POLARTYPEENUM polartype)
{
switch (polartype)
{
case(POLARHH): { return this->HH_sigmaParam; }
case(POLARHV): { return this->HV_sigmaParam; }
case(POLARVH): { return this->VH_sigmaParam; }
case(POLARVV): { return this->VV_sigmaParam; }
default:
return std::map<long, SigmaParam>();
}
}
void SigmaDatabase::readParamsFromFile(const std::string& filename) {
std::ifstream infile(filename);
if (!infile.is_open()) {
std::cerr << "Failed to open file: " << filename << std::endl;
return;
}
std::string line;
while (std::getline(infile, line)) {
std::istringstream iss(line);
std::string polarType;
long cls;
SigmaParam param;
if (!(iss >> polarType >> cls >> param.p1 >> param.p2 >> param.p3
>> param.p4 >> param.p5 >> param.p6)) {
std::cerr << "Error parsing line: " << line << std::endl;
continue;
}
if (polarType == "HH") HH_sigmaParam[cls] = param;
else if (polarType == "HV") HV_sigmaParam[cls] = param;
else if (polarType == "VH") VH_sigmaParam[cls] = param;
else if (polarType == "VV") VV_sigmaParam[cls] = param;
else
std::cerr << "Unknown polarization type: " << polarType << std::endl;
}
infile.close();
}
void SigmaDatabase::writeParamsToFile(const std::string& filename) {
std::ofstream outfile(filename);
if (!outfile.is_open()) {
std::cerr << "Failed to create file: " << filename << std::endl;
return;
}
// <20><><EFBFBD><EFBFBD>C++11<31><31>lambdaд<61><D0B4>
auto writePolarData = [&outfile](const std::string& polarType,
const std::map<long, SigmaParam>& params) {
for (const auto& entry : params) {
const long cls = entry.first;
const SigmaParam& param = entry.second;
outfile << polarType << " " << cls << " "
<< param.p1 << " " << param.p2 << " "
<< param.p3 << " " << param.p4 << " "
<< param.p5 << " " << param.p6 << "\n";
}
};
writePolarData("HH", HH_sigmaParam);
writePolarData("HV", HV_sigmaParam);
writePolarData("VH", VH_sigmaParam);
writePolarData("VV", VV_sigmaParam);
outfile.close();
}