RasterProcessTool/Toolbox/SimulationSARTool/SimulationSAR/SigmaDatabase.cpp

221 lines
10 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 "SigmaDatabase.h"
#include <set>
#include <map>
#include "BaseConstVariable.h"
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::writePolarData(std::ofstream& 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";
}
}
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><CABD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD>
writePolarData(outfile, "HH", HH_sigmaParam);
writePolarData(outfile, "HV", HV_sigmaParam);
writePolarData(outfile, "VH", VH_sigmaParam);
writePolarData(outfile, "VV", VV_sigmaParam);
outfile.close();
}