#include "ParameterInFile.h" #include #include #include #include #include #include #include #include #include #include ////gdal #include "gdal_priv.h" #include "ogr_geometry.h" #include "gdalwarper.h" #include "common.h" using namespace std; // // 参数文件解析 // //参数文件标准格式 // 文件值 类型 对应的代号 // DEM文件的路径 str dem_path // 模拟影像输出路径 str sar_sim_path // 模拟影像的匹配坐标X输出路径 str sar_sim_match_point_x_path // 模拟影像的匹配坐标Y输出路径 str sar_sim_match_point_y_path // 模拟影像的匹配坐标Z输出路径 str sar_sim_match_point_z_path // 采样率 long double sample_f // 近斜距 long double R0 // 成像起始时间 long double starttime ---UTC 时间 // 光速 long double // 波长 long double // 多普勒参考时间 long double TO ---UTC 时间 // 脉冲重复频率 long double PRF // 斜距采样间隔 long double delta_R // 多普勒系数个数 int // 多普勒系数1 long double // 多普勒系数2 long double // .... // 卫星轨道模型是否为多项式模型 // 卫星轨道模型多项式次数 int 4 5 // 卫星轨道模型X值系数1 long double // .... // 卫星轨道模型Y值系数1 long double // ... // 卫星轨道模型Z值系数1 long double // ... // 卫星轨道模型Vx值系数1 long double // ... // 卫星轨道模型Vy值系数1 long double // ... // 卫星轨道模型Vz值系数1 long double // ... // // /// /// 将地固参心坐标系转换为经纬度 /// /// 固参心坐标系 /// 经纬度--degree point XYZ2LLA(point& XYZ) { long double tmpX = XYZ.x; long double temY = XYZ.y; long double temZ = XYZ.z; long double curB = 0; long double N = 0; long double sqrtTempXY = sqrt(tmpX * tmpX + temY * temY); long double calB = atan2(temZ, sqrtTempXY); int counter = 0; long double sinCurB = 0; while (abs(curB - calB) * r2d > epsilon && counter < 25) { curB = calB; sinCurB = sin(curB); N = a / sqrt(1 - eSquare * sinCurB * sinCurB); calB = atan2(temZ + N * eSquare * sinCurB, sqrtTempXY); counter++; } point result = { 0,0,0 }; result.x = atan2(temY, tmpX) * r2d; result.y = curB * r2d; result.z = temZ / sinCurB - N * (1 - eSquare); return result; } ParameterInFile::ParameterInFile(std::string infile_path) { // 解析文件 ifstream infile(infile_path, ios::in); if (!infile.is_open()) { throw "参数文件未打开"; } try { int line_ids = 0; string buf; getline(infile, buf); this->dem_path = buf; getline(infile, buf); this->out_sar_sim_path = buf; getline(infile, buf); this->out_sar_sim_dem_path = buf; getline(infile, buf); this->out_sar_sim_resampling_path = buf; getline(infile, buf); this->out_sar_sim_resampling_rc = buf; getline(infile, buf); this->sim_height = stoi(buf); getline(infile, buf); this->sim_width = stoi(buf); getline(infile, buf); this->sar_sim_match_point_path = buf; getline(infile, buf); this->sar_sim_match_point_xyz_path = buf; getline(infile, buf); this->sample_f = stoi(buf); getline(infile, buf); this->R0 = stod(buf); getline(infile, buf); this->LightSpeed = stod(buf); getline(infile, buf); this->lamda = stod(buf); getline(infile, buf); this->delta_R = stod(buf); getline(infile, buf); this->imgStartTime = stod(buf); getline(infile, buf); this->PRF = stod(buf); getline(infile, buf); this->delta_t = stod(buf); getline(infile, buf); this->refrange = stod(buf); getline(infile, buf); this->widthspace = stod(buf); getline(infile, buf); cout << buf << endl; getline(infile, buf); this->doppler_paramenter_number = stoi(buf); // 读取多普勒系数 this->doppler_para = (long double*)calloc(this->doppler_paramenter_number, sizeof(long double)); if (this->doppler_para) { for (int i = 0; i < this->doppler_paramenter_number; i++) { getline(infile, buf); this->doppler_para[i] = stod(buf); } } else { throw "内存不足"; } // 读取卫星轨道 getline(infile, buf); this->polySatelliteModel = stoi(buf); if (this->polySatelliteModel != 1) { throw "不是多项式轨道模型"; } getline(infile, buf); this->polynum = stoi(buf) + 1; // 多项式项数 getline(infile, buf); this->SatelliteModelStartTime = stod(buf); // 轨道模型起始时间 this->polySatellitePara = (long double*)calloc(this->polynum * 6, sizeof(long double)); if (this->polySatellitePara) { for (int i = 0; i < this->polynum * 6; i++) { getline(infile, buf); this->polySatellitePara[i] = stod(buf); } } else { throw "内存不足"; } } catch (exception e) { infile.close(); throw "文件读取错误"; } infile.close(); } ParameterInFile::ParameterInFile(const ParameterInFile& paras) { //参数组 this->dem_path = paras.dem_path; this->out_sar_sim_path = paras.out_sar_sim_path; this->out_sar_sim_dem_path = paras.out_sar_sim_dem_path; this->out_sar_sim_resampling_path = paras.out_sar_sim_resampling_path; this->out_sar_sim_resampling_rc = paras.out_sar_sim_resampling_rc; this->sim_height = paras.sim_height; this->sim_width = paras.sim_width; this->sar_sim_match_point_path = paras.sar_sim_match_point_path; this->sar_sim_match_point_xyz_path = paras.sar_sim_match_point_xyz_path; this->sample_f = paras.sample_f; this->R0 = paras.R0; this->LightSpeed = paras.LightSpeed; this->lamda = paras.lamda; this->delta_R = paras.delta_R; this->imgStartTime = paras.imgStartTime; this->PRF = paras.PRF; this->delta_t = paras.delta_t; this->refrange = paras.refrange; // 多普勒 this->widthspace = paras.widthspace; this->doppler_paramenter_number = paras.doppler_paramenter_number; //卫星轨道模型 this->polySatelliteModel = paras.polySatelliteModel; this->polynum = paras.polynum; this->SatelliteModelStartTime = paras.SatelliteModelStartTime; this->doppler_para = (long double*)calloc(this->doppler_paramenter_number, sizeof(long double)); memcpy(this->doppler_para, paras.doppler_para, paras.doppler_paramenter_number * sizeof(long double)); this->polySatellitePara = (long double*)calloc(paras.polynum * 6, sizeof(long double)); memcpy(this->polySatellitePara, paras.polySatellitePara, paras.polynum * 6 * sizeof(long double)); } ParameterInFile::~ParameterInFile() { // 析构函数 free(this->doppler_para); free(this->polySatellitePara); } /// /// 根据卫星轨道模型计算卫星 /// /// 卫星轨道点时间 /// 卫星轨道模型起始时间 /// 卫星轨道X坐标模型参数 /// 卫星轨道Y坐标模型参数 /// 卫星轨道Z坐标模型参数 /// 卫星轨道Vx坐标模型参数 /// 卫星轨道Vy坐标模型参数 /// 卫星轨道Vz坐标模型参数 /// 多项式项数 /// inline SatelliteSpacePoint getSatellitePostion(long double satelliteTime, long double SatelliteModelStartTime, long double* polySatellitePara, int polynum = 4) { satelliteTime = satelliteTime - SatelliteModelStartTime; SatelliteSpacePoint result_point = { 0,0,0,0,0,0 }; if (polynum <= 0)return result_point; int ptr_indx = 0; int yStep = polynum; int zStep = polynum*2; int vxStep = polynum*3; int vyStep = polynum*4; int vzStep = polynum*5; //x result_point.x += polySatellitePara[ptr_indx]; result_point.y += polySatellitePara[ptr_indx + yStep]; result_point.z += polySatellitePara[ptr_indx + zStep]; result_point.vx += polySatellitePara[ptr_indx + vxStep]; result_point.vy += polySatellitePara[ptr_indx + vyStep]; result_point.vz += polySatellitePara[ptr_indx + vzStep]; if (polynum == 1)return result_point; ptr_indx++; long double powTime = satelliteTime; result_point.x += powTime * polySatellitePara[ptr_indx]; result_point.y += powTime * polySatellitePara[ptr_indx + yStep]; result_point.z += powTime * polySatellitePara[ptr_indx + zStep]; result_point.vx += powTime * polySatellitePara[ptr_indx + vxStep]; result_point.vy += powTime * polySatellitePara[ptr_indx + vyStep]; result_point.vz += powTime * polySatellitePara[ptr_indx + vzStep]; if (polynum == 2)return result_point; ptr_indx++; powTime *= satelliteTime; result_point.x += powTime * polySatellitePara[ptr_indx]; result_point.y += powTime * polySatellitePara[ptr_indx + yStep]; result_point.z += powTime * polySatellitePara[ptr_indx + zStep]; result_point.vx += powTime * polySatellitePara[ptr_indx + vxStep]; result_point.vy += powTime * polySatellitePara[ptr_indx + vyStep]; result_point.vz += powTime * polySatellitePara[ptr_indx + vzStep]; if (polynum == 3)return result_point; ptr_indx++; powTime *= satelliteTime; result_point.x += powTime * polySatellitePara[ptr_indx]; result_point.y += powTime * polySatellitePara[ptr_indx + yStep]; result_point.z += powTime * polySatellitePara[ptr_indx + zStep]; result_point.vx += powTime * polySatellitePara[ptr_indx + vxStep]; result_point.vy += powTime * polySatellitePara[ptr_indx + vyStep]; result_point.vz += powTime * polySatellitePara[ptr_indx + vzStep]; if (polynum == 4)return result_point; ptr_indx++; powTime *= satelliteTime; result_point.x += powTime * polySatellitePara[ptr_indx]; result_point.y += powTime * polySatellitePara[ptr_indx + yStep]; result_point.z += powTime * polySatellitePara[ptr_indx + zStep]; result_point.vx += powTime * polySatellitePara[ptr_indx + vxStep]; result_point.vy += powTime * polySatellitePara[ptr_indx + vyStep]; result_point.vz += powTime * polySatellitePara[ptr_indx + vzStep]; ptr_indx++; if (polynum == 5)return result_point; for (int i = 5; i < polynum; i++) { powTime *= satelliteTime; result_point.x += powTime * polySatellitePara[ptr_indx]; result_point.y += powTime * polySatellitePara[ptr_indx+ yStep]; result_point.z += powTime * polySatellitePara[ptr_indx + zStep]; result_point.vx += powTime * polySatellitePara[ptr_indx + vxStep]; result_point.vy += powTime * polySatellitePara[ptr_indx + vyStep]; result_point.vz += powTime * polySatellitePara[ptr_indx + vzStep]; ptr_indx++; } return result_point; } inline SatelliteSpacePoint getSatellitePostion_orange(long double satelliteTime, long double SatelliteModelStartTime, long double* polySatellitePara, int polynum = 4) { satelliteTime = satelliteTime - SatelliteModelStartTime; SatelliteSpacePoint result_point = { 0,0,0,0,0,0 }; int ptr_indx = 0; //x for (int i = 0; i < polynum; i++) { result_point.x += pow(satelliteTime, i) * polySatellitePara[ptr_indx]; ptr_indx++; } //y for (int i = 0; i < polynum; i++) { result_point.y += pow(satelliteTime, i) * polySatellitePara[ptr_indx]; ptr_indx++; } //z for (int i = 0; i < polynum; i++) { result_point.z += pow(satelliteTime, i) * polySatellitePara[ptr_indx]; ptr_indx++; } //vx for (int i = 0; i < polynum; i++) { result_point.vx += pow(satelliteTime, i) * polySatellitePara[ptr_indx]; ptr_indx++; } //vy for (int i = 0; i < polynum; i++) { result_point.vy += pow(satelliteTime, i) * polySatellitePara[ptr_indx]; ptr_indx++; } //vz for (int i = 0; i < polynum; i++) { result_point.vz += pow(satelliteTime, i) * polySatellitePara[ptr_indx]; ptr_indx++; } return result_point; } /// /// 数值模拟法计算多普勒频移值 /// 修改时间:2022.07.03 /// /// 斜距 /// 光速 /// 多普勒参考时间 /// 多普勒参数 /// 多普勒频移值 inline long double calNumericalDopplerValue(long double R, long double LightSpeed, long double refrange, long double* doppler_para, int doppler_paramenter_number) { //R = R * 2 / LightSpeed - T0; long double result = 0; result = doppler_para[0]; R = (R - refrange) * (1000000 / LightSpeed); for (int i = 1; i < doppler_paramenter_number; i++) { result =result+ doppler_para[i]*pow(R,i); } return result; } /// /// 根据理论模型计算多普勒频移值 /// /// 斜距 /// 波长 /// 地面->卫星的空间向量 /// 地面->卫星之间的速度向量 /// 多普勒频移值 inline long double calTheoryDopplerValue(long double R, long double lamda, VectorPoint R_sl, VectorPoint V_sl) { long double result = -2 * (R_sl.x * V_sl.x + R_sl.y * V_sl.y + R_sl.z * V_sl.z) / (lamda * R); return result; } /// /// 根据地面点求解对应的sar影像坐标 /// 修改2022.07.03 /// /// 地面点的坐标--地固坐标系 /// 影片开始成像时间 /// 波长 /// 多普勒参考斜距 /// 光速 /// 时间间隔 /// 近斜距 /// 斜距间隔 /// 卫星轨道模型时间 /// 卫星轨道坐标模型参数 /// 卫星轨道模型项数 /// 多普勒模型数 /// 影像坐标(x:行号,y:列号,z:成像时刻) inline point PSTN(point& landpoint, long double Starttime, long double lamda, long double refrange, long double* doppler_para, long double LightSpeed, long double prf, long double R0, long double widthspace, long double SatelliteModelStartTime, long double* polySatellitePara, int polynum, int doppler_paramenter_number) { long double ti = Starttime; long double dt = 0.01; long double R = 0; long double FdThory1 = 0; long double FdThory2 = 0; long double FdNumber = 0; long double FdTheory_grad = 0; SatelliteSpacePoint spacepoint{ 0,0,0,0,0,0 }; VectorPoint R_sl{ 0,0,0 }; VectorPoint V_sl{ 0,0,0 }; long double int_time = 0; long double endfactor = 1e-4;//exp((floor(log10(1/prf))-1)* 2.302585092994046); long double error = 0; for (int i = 0; i < 100; i++) { spacepoint = getSatellitePostion(ti + dt, SatelliteModelStartTime, polySatellitePara, polynum); R_sl.x = spacepoint.x - landpoint.x; // 卫星->地面坐标 R_sl.y = spacepoint.y - landpoint.y; // R_sl.z = spacepoint.z - landpoint.z; V_sl.x = spacepoint.vx; V_sl.y = spacepoint.vy; V_sl.z = spacepoint.vz; R = getModule(R_sl); FdThory1 = calTheoryDopplerValue(R, lamda, R_sl, V_sl); spacepoint = getSatellitePostion(ti, SatelliteModelStartTime, polySatellitePara, polynum); R_sl.x = spacepoint.x - landpoint.x; R_sl.y = spacepoint.y - landpoint.y; R_sl.z = spacepoint.z - landpoint.z; V_sl.x = spacepoint.vx; V_sl.y = spacepoint.vy; V_sl.z = spacepoint.vz; R = getModule(R_sl); FdThory2 = calTheoryDopplerValue(R, lamda, R_sl, V_sl); FdNumber = calNumericalDopplerValue(R, LightSpeed, refrange, doppler_para, doppler_paramenter_number); FdTheory_grad = (FdThory1 - FdThory2); error = FdNumber - FdThory2; int_time = error * dt / FdTheory_grad; if (abs(error) < endfactor) { ti = ti + int_time; break; } ti = ti + int_time; } point result{ 0,0,0 }; result.x = (ti - Starttime) * prf; result.y = (R - R0) / widthspace; result.z = ti; return result; } /// /// 双线性插值 /// 11 12 /// c /// 21 22 /// /// c的x,y坐标以左上角的行列号为起始点 /// /// /// /// /// inline point bilineadInterpolation(point& p, point& p11, point& p12, point& p21, point& p22) { long double r = 1 - p.x; long double c = 1 - p.y; long double rc = r * c; long double r_c_1 = r * p.y;// r* (1 - c); long double r_1_c = p.x * c; //(1 - r) * c; long double r_1_c_1 = p.x * p.y;// (1 - r)* (1 - c); // 计算插值结果 p.x = rc * p11.x + r_c_1 * p12.x + r_1_c * p21.x + r_1_c_1 * p22.x; p.y = rc * p11.y + r_c_1 * p12.y + r_1_c * p21.y + r_1_c_1 * p22.y; p.z = rc * p11.z + r_c_1 * p12.z + r_1_c * p21.z + r_1_c_1 * p22.z; return p; } /// /// 三次卷积插值 /// 11 12 13 14 /// 21 22 23 24 /// c /// 31 32 33 34 /// 41 42 43 44 /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// inline point cubicInterpolation(point& p, point& p11, point& p12, point& p13, point& p14, point& p21, point& p22, point& p23, point& p24, point& p31, point& p32, point& p33, point& p34, point& p41, point& p42, point& p43, point& p44) { long double r = p.x; long double c = p.y; long double r1 = r, r2 = r - 1, r3 = 2 - r, r4 = 3 - r; long double c1 = c, c2 = c - 1, c3 = 2 - c, c4 = 3 - c; long double wr1 = 4 - 8 * r1 + 5 * r1 * r1 - r1 * r1 * r1; long double wr2 = 1 - 2 * r2 * r2 + r2 * r2 * r2; long double wr3 = 1 - 2 * r3 * r3 + r3 * r3 * r3; long double wr4 = 4 - 8 * r4 + 5 * r4 * r4 - r4 * r4 * r4; long double wc1 = 4 - 8 * c1 + 5 * c1 * c1 - c1 * c1 * c1; long double wc2 = 1 - 2 * c2 * c2 + c2 * c2 * c2; long double wc3 = 1 - 2 * c3 * c3 + c3 * c3 * c3; long double wc4 = 4 - 8 * c4 + 5 * c4 * c4 - c4 * c4 * c4; long double wr1_wc1 = wr1 * wc1; long double wr2_wc1 = wr2 * wc1; long double wr3_wc1 = wr3 * wc1; long double wr4_wc1 = wr4 * wc1; long double wr1_wc2 = wr1 * wc2; long double wr2_wc2 = wr2 * wc2; long double wr3_wc2 = wr3 * wc2; long double wr4_wc2 = wr4 * wc2; long double wr1_wc3 = wr1 * wc3; long double wr2_wc3 = wr2 * wc3; long double wr3_wc3 = wr3 * wc3; long double wr4_wc3 = wr4 * wc3; long double wr1_wc4 = wr1 * wc4; long double wr2_wc4 = wr2 * wc4; long double wr3_wc4 = wr3 * wc4; long double wr4_wc4 = wr4 * wc4; p.x = 0; p.x = p.x + wr1_wc1 * p11.x + wr1_wc2 * p12.x + wr1_wc3 * p13.x + wr1_wc4 * p14.x; p.x = p.x + wr2_wc1 * p11.x + wr2_wc2 * p12.x + wr2_wc3 * p13.x + wr2_wc4 * p14.x; p.x = p.x + wr3_wc1 * p11.x + wr3_wc2 * p12.x + wr3_wc3 * p13.x + wr3_wc4 * p14.x; p.x = p.x + wr4_wc1 * p11.x + wr4_wc2 * p12.x + wr4_wc3 * p13.x + wr4_wc4 * p14.x; p.y = 0; p.y = p.y + wr1_wc1 * p11.y + wr1_wc2 * p12.y + wr1_wc3 * p13.y + wr1_wc4 * p14.y; p.y = p.y + wr2_wc1 * p11.y + wr2_wc2 * p12.y + wr2_wc3 * p13.y + wr2_wc4 * p14.y; p.y = p.y + wr3_wc1 * p11.y + wr3_wc2 * p12.y + wr3_wc3 * p13.y + wr3_wc4 * p14.y; p.y = p.y + wr4_wc1 * p11.y + wr4_wc2 * p12.y + wr4_wc3 * p13.y + wr4_wc4 * p14.y; p.z = 0; p.z = p.z + wr1_wc1 * p11.z + wr1_wc2 * p12.z + wr1_wc3 * p13.z + wr1_wc4 * p14.z; p.z = p.z + wr2_wc1 * p11.z + wr2_wc2 * p12.z + wr2_wc3 * p13.z + wr2_wc4 * p14.z; p.z = p.z + wr3_wc1 * p11.z + wr3_wc2 * p12.z + wr3_wc3 * p13.z + wr3_wc4 * p14.z; p.z = p.z + wr4_wc1 * p11.z + wr4_wc2 * p12.z + wr4_wc3 * p13.z + wr4_wc4 * p14.z; return p; } // // GDAL 数组操作---内置函数不进入头文件声明 // float* ReadRasterArray(GDALRasterBand* demBand, int arrayWidth, int arrayHeight, GDALDataType gdal_datatype) { float* result = new float[arrayWidth * arrayHeight]; // 别忘了释放内存 if (gdal_datatype == GDALDataType::GDT_UInt16) { unsigned short* temp = (unsigned short*)calloc(arrayHeight * arrayWidth, sizeof(unsigned short)); demBand->RasterIO(GF_Read, 0, 0, arrayWidth, arrayHeight, temp, arrayWidth, arrayHeight, gdal_datatype, 0, 0); for (int i = 0; i < arrayHeight * arrayWidth; i++) { result[i] = temp[i] * 1.0; } free(temp); } else if (gdal_datatype == GDALDataType::GDT_Int16) { short* temp = (short*)calloc(arrayHeight * arrayWidth, sizeof(short)); demBand->RasterIO(GF_Read, 0, 0, arrayWidth, arrayHeight, temp, arrayWidth, arrayHeight, gdal_datatype, 0, 0); for (int i = 0; i < arrayHeight * arrayWidth; i++) { result[i] = temp[i] * 1.0; } free(temp); } else if (gdal_datatype == GDALDataType::GDT_Float32) { float* temp = (float*)calloc(arrayHeight * arrayWidth, sizeof(float)); demBand->RasterIO(GF_Read, 0, 0, arrayWidth, arrayHeight, temp, arrayWidth, arrayHeight, gdal_datatype, 0, 0); for (int i = 0; i < arrayHeight * arrayWidth; i++) { result[i] = temp[i] * 1.0; } free(temp); } return result; } int WriteMatchPoint(string path, std::vector* matchps) { std::cout << "输出匹配文件中:" << path; fstream f; //追加写入,在原来基础上加了ios::app f.open(path, ios::out | ios::app); for (int i = 0; i < matchps->size(); i++) { matchPoint matchP = (*matchps)[i]; //f << matchP.r << "," << matchP.c << "," << matchP.ti << "," << matchP.x << "," << matchP.y << "," << matchP.z << "\n"; } f.close(); std::cout << "输出匹配文件over:" << path; return 0; } sim_block::sim_block(int start_row, int end_row, int start_col, int end_col, int height, int width) { this->start_row = start_row; this->end_row = end_row; this->start_col = start_col; this->end_col = end_col; this->height = height; this->width = width; this->size = height * width; this->block = (short*)calloc(this->size, sizeof(short)); this->distanceblock = (long double*)calloc(this->size, sizeof(long double)); this->pointblock = (matchPoint*)calloc(this->size, sizeof(matchPoint)); for (int i = 0; i < this->size; i++) { this->distanceblock[i] = -1; } } /// /// 深度拷贝 /// /// sim_block::sim_block(const sim_block& sim_blocks) { this->height = sim_blocks.width; this->width = sim_blocks.height; this->start_row = sim_blocks.start_row; this->start_col = sim_blocks.start_col; this->end_col = sim_blocks.end_col; this->end_row = sim_blocks.end_row; this->size = sim_blocks.size; // 声明块 this->block = (short*)calloc(this->size, sizeof(short)); this->distanceblock = (long double*)calloc(this->size, sizeof(long double)); this->pointblock = (matchPoint*)calloc(this->size, sizeof(matchPoint)); // 移动并复制块 memcpy(this->block, sim_blocks.block, this->size * sizeof(short)); memcpy(this->distanceblock, sim_blocks.distanceblock, this->size * sizeof(long double)); memcpy(this->pointblock, sim_blocks.pointblock, this->size * sizeof(matchPoint)); } sim_block::~sim_block() { if (this->block) { free(this->block); this->block = NULL; } if (this->distanceblock) { free(this->distanceblock); this->distanceblock = NULL; } if (this->pointblock) { free(this->pointblock); this->pointblock = NULL; } } int sim_block::rowcol2blockids(int row_ids, int col_ids) { if (this->start_row > row_ids && this->end_row <= row_ids && this->start_col > col_ids && this->end_col <= col_ids) { return -1; } int ids = (row_ids - this->start_row) * this->width + col_ids - this->start_col; return ids; } /// /// 根据行列号设置指定块的数值 /// /// 行号 /// 列号 /// 设置的值 /// int sim_block::setsimblock(int row_ids, int col_ids, short value) { int ids = this->rowcol2blockids(row_ids, col_ids); if (ids < 0) { return -1; } this->block[ids] = value; /* try { this->block[ids] = value; } catch (exception e) { throw "Error"; return -1; } */ return 0; } int sim_block::addsimblock(int row_ids, int col_ids, short value) { int ids = this->rowcol2blockids(row_ids, col_ids); if (ids < 0) { return -1; } this->block[ids] += value; /* try { this->block[ids] += value; } catch (exception e) { throw "Error"; return -1; } */ return 0; } /// /// 根据行列号,获取指定行列号块的数值 /// /// 行号 /// 列号 /// short sim_block::getsimblock(int row_ids, int col_ids) { int ids = this->rowcol2blockids(row_ids, col_ids); if (ids < 0) { return -1; } short result; result = this->block[ids]; /* try { result = this->block[ids]; } catch (exception e) { throw "Error"; return -1; } */ return result; } /// /// 获取模拟坐标对应的点坐标 /// /// 行号 /// 列号 /// matchPoint sim_block::getpointblock(int row_ids, int col_ids) { int ids = this->rowcol2blockids(row_ids, col_ids); if (ids < 0) { throw "坐标错误"; return matchPoint{ 0,0,0,0,0,0 }; } matchPoint result = this->pointblock[ids]; return result; } /// /// 设置模拟块对应的点坐标 /// /// 行号 /// 列号 /// 坐标点 /// 更新结果 int sim_block::setpointblock(int row_ids, int col_ids, matchPoint value) { int ids = this->rowcol2blockids(row_ids, col_ids); if (ids < 0) { return -1; } this->pointblock[ids] = value; return 0; } long double sim_block::getdistanceblock(int row_ids, int col_ids) { int ids = this->rowcol2blockids(row_ids, col_ids); if (ids < 0) { return -1; } long double result; result = this->distanceblock[ids]; /* try { result = this->distanceblock[ids]; } catch (exception e) { throw "Error"; return -1; } */ return result; } int sim_block::setdistanceblock(int row_ids, int col_ids, long double value) { int ids = this->rowcol2blockids(row_ids, col_ids); if (ids < 0) { return -1; } this->distanceblock[ids] = value; /* try { this->distanceblock[ids] = value; } catch (exception e) { throw "Error"; return -1; } */ return 0; } /// /// 初始化dem_block /// /// /// /// /// /// /// /// dem_block::dem_block(int all_start_row, int all_start_col, int start_row, int end_row, int start_col, int end_col, int height, int width, int sample_f) { this->all_start_row = all_start_row; this->all_start_col = all_start_col; this->start_row = start_row; this->end_row = end_row; this->start_col = start_col; this->end_col = end_col; this->height = height; this->width = width; this->size = height * width; this->pointblock = (point*)calloc(this->size, sizeof(point)); this->sample_f = sample_f; } dem_block::dem_block(const dem_block& demblocks) { this->all_start_row = demblocks.all_start_row; this->all_start_col = demblocks.all_start_col; this->start_row = demblocks.start_row; this->end_row = demblocks.end_row; this->start_col = demblocks.start_col; this->end_col = demblocks.end_col; this->height = demblocks.height; this->width = demblocks.width; this->size = this->height * this->width; this->pointblock = (point*)calloc(this->size, sizeof(point)); this->sample_f = sample_f; memcpy(this->pointblock, demblocks.pointblock, this->size * sizeof(point)); } dem_block::~dem_block() { if (this->pointblock) { free(this->pointblock); this->pointblock = NULL; //delete this; } } /// /// 重采样dem--三次卷积插值-- 必须在地理坐标系下进行(经纬度) /// 为了保证采样左右各舍弃了1格 /// /// //dem_block dem_block::resample_dem() //{ // int height = this->height -2;//[1,2 ....., n-1,n] // int width = this->width -2;//[1,2 ....., n-1,n] // height = height * this->sample_f; //重采样之后的高度 // width = width * this->sample_f; // 重采样之后的宽度 // // int start_row = (this->start_row-1) * this ->sample_f; // int start_col = (this->start_col-1) * this->sample_f; // int end_row = (this->end_row-1) * this->sample_f; // int end_col = (this->end_col-1) * this->sample_f; // dem_block resample_dem = dem_block(start_row, end_row, start_col, end_col, height, width, this->sample_f); // // // 执行dem重采样,采用双曲线插值 // for (int i = sample_f; i < height; i++) { // 行 从第一行 // int ori_i_2 = i / sample_f; // int ori_i_1, ori_i_3, ori_i_4; // if (ori_i_2 - 1 < 0) { continue; } // ori_i_1 = ori_i_2 - 1; // if (ori_i_2 + 1 > this->height || ori_i_2 + 2 > this->height) { break; } // ori_i_3 = ori_i_2 + 1; // ori_i_4 = ori_i_2 + 2; // for (int j = sample_f; j < width; j++) { //列 从第一列 // point p{0,0,0}; // int ori_j_2 = j / sample_f; // int ori_j_1, ori_j_3, ori_j_4; // if (ori_i_2 - 1 < 0) { continue; } // ori_j_1 = ori_j_2 - 1; // if (ori_j_2 + 1 > this->height || ori_j_2 + 2 > this->height) { break; } // ori_j_3 = ori_j_2 + 1; // ori_j_4 = ori_j_2 + 2; // // 获取插值需要的数据--三次重采样差值 // p.x = (i % sample_f) * 1.0 / sample_f; p.x = p.x + 1; // p.y = (j % sample_f) * 1.0 / sample_f; p.y = p.y + 1; // point p11, p12, p13, p14, p21, p22, p23, p24, p31, p32, p33, p34, p41, p42, p43, p44; // // 获取对应节点 // p11 = this->getpointblock(ori_i_1, ori_j_1); // p12 = this->getpointblock(ori_i_1, ori_j_2); // p13 = this->getpointblock(ori_i_1, ori_j_3); // p14 = this->getpointblock(ori_i_1, ori_j_4); // p21 = this->getpointblock(ori_i_2, ori_j_1); // p22 = this->getpointblock(ori_i_2, ori_j_2); // p23 = this->getpointblock(ori_i_2, ori_j_3); // p24 = this->getpointblock(ori_i_2, ori_j_4); // p31 = this->getpointblock(ori_i_3, ori_j_1); // p32 = this->getpointblock(ori_i_3, ori_j_2); // p33 = this->getpointblock(ori_i_3, ori_j_3); // p34 = this->getpointblock(ori_i_3, ori_j_4); // p41 = this->getpointblock(ori_i_4, ori_j_1); // p42 = this->getpointblock(ori_i_4, ori_j_2); // p43 = this->getpointblock(ori_i_4, ori_j_3); // p44 = this->getpointblock(ori_i_4, ori_j_4); // p = cubicInterpolation(p, p11, p12, p13, p14, p21, p22, p23, p24, p31, p32, p33, p34, p41, p42, p43, p44); // // 计算p 对应的行列号 // resample_dem.setpointblock(i - sample_f, j - sample_f, p); // } // } // // // return resample_dem; //} /* -------需要优化的方法--------*/ dem_block dem_block::resample_dem() { int height = this->height - 2;//[1,2 ....., n-1,n] int width = this->width - 2;//[1,2 ....., n-1,n] height = height * this->sample_f; //重采样之后的高度 width = width * this->sample_f; // 重采样之后的宽度 int start_row = (this->start_row - 1) * this->sample_f; int start_col = (this->start_col - 1) * this->sample_f; int end_row = (this->end_row - 1) * this->sample_f; int end_col = (this->end_col - 1) * this->sample_f; dem_block resample_dem = dem_block(all_start_row,all_start_col,start_row, end_row, start_col, end_col, height, width, this->sample_f); long double sample_f_1 = 1.0 / sample_f; // 执行dem重采样,采用双曲线插值 int ori_i_2 =0; int ori_i_1, ori_i_3, ori_i_4; point p{ 0,0,0 }; point p11, p12, p13, p14; for (int i = sample_f; i < height; i++) { // 行 从第一行 ori_i_2 = i * sample_f_1; if (ori_i_2 - 1 < 0) { continue; } ori_i_1 = ori_i_2 - 1; if (ori_i_2 + 1 > this->height || ori_i_2 + 2 > this->height) { break; } ori_i_3 = ori_i_2 + 1; ori_i_4 = ori_i_2 + 2; for (int j = sample_f; j < width; j++) { //列 从第一列 p={ 0,0,0 }; int ori_j_2 = j * sample_f_1; int ori_j_1, ori_j_3, ori_j_4; if (ori_i_2 - 1 < 0) { continue; } ori_j_1 = ori_j_2 - 1; if (ori_j_2 + 1 > this->height || ori_j_2 + 2 > this->height) { break; } ori_j_3 = ori_j_2 + 1; ori_j_4 = ori_j_2 + 2; // 获取插值需要的数据--三次重采样差值 p.x = (i % sample_f) * sample_f_1 + 1; //p.x = p.x + 1; p.y = (j % sample_f) * sample_f_1 + 1; //p.y = p.y + 1; // 获取对应节点 p11 = this->getpointblock(ori_i_2, ori_j_2); p12 = this->getpointblock(ori_i_2, ori_j_3); p13 = this->getpointblock(ori_i_3, ori_j_2); p14 = this->getpointblock(ori_i_3, ori_j_3); p = bilineadInterpolation(p, p11, p12, p13, p14); // ----- 优化 // 计算p 对应的行列号 resample_dem.setpointblock(i - sample_f, j - sample_f, p); } } return resample_dem; } /// /// 根据重采样结果获取对应行列号的坡面法式向量( /// 必须提前调用UpdatePointCoodinarary()方法,保证坐标系为地固坐标系 /// /// 行号 /// 列号 /// VectorPoint dem_block::getslopeVector(int row_ids, int col_ids) { if (row_ids == 0 || col_ids == 0 || row_ids > this->height - 1 || col_ids > this->width - 1) { return VectorPoint{ 0,0,0 }; } // 无效值 VectorPoint result{ 0,0,0 }; // 计算向量值,注意向量值的计算初值结果 point p1 = this->getpointblock(row_ids - 1, col_ids); point p2 = this->getpointblock(row_ids, col_ids - 1); point p3 = this->getpointblock(row_ids + 1, col_ids); point p4 = this->getpointblock(row_ids, col_ids + 1); VectorPoint n24 = getVector(p2, p4); VectorPoint n31 = getVector(p3, p1); result = VectorFork(n24, n31); // 目标向量 return result; } int dem_block::rowcol2blockids(int row_ids, int col_ids) { return row_ids * this->width + col_ids; } /// /// 根据行列号获取对应的点 /// /// /// /// point dem_block::getpointblock(int row_ids, int col_ids) { int ids = this->rowcol2blockids(row_ids, col_ids); //try { return this->pointblock[ids]; //} //catch (exception e) { //throw "error"; //return point{ -1,-1,-1 }; //} } /// /// 根据行列号更新值 /// /// /// /// /// int dem_block::setpointblock(int row_ids, int col_ids, point& value) { this->pointblock[row_ids * this->width + col_ids]= value; /* int ids = this->rowcol2blockids(row_ids, col_ids); try { this->pointblock[ids] = value; } catch (exception ex) { throw "error"; return -1; } */ return 0; } point dem_block::getpointblock(int ids) { return this->pointblock[ids]; /*try { point result = this->pointblock[ids]; return result; } catch (exception e) { throw "error"; return point{ -1,-1,-1 }; }*/ } int dem_block::setpointblock(int ids, point& value) { this->pointblock[ids] = value; /* try { this->pointblock[ids] = value; } catch (exception ex) { throw "error"; return -1; } */ return 0; } /// /// 将点坐标由经纬度->地固坐标系 /// /// /// int dem_block::UpdatePointCoodinarary() { for (int i = 0; i < this->size; i++) { this->pointblock[i] = LLA2XYZ(this->pointblock[i]); } return 0; } ConvertResampleParameter::ConvertResampleParameter(string path) { // 解析文件 ifstream infile(path, ios::in); if (!infile.is_open()) { throw "参数文件未打开"; } try { int line_ids = 0; string buf; getline(infile, buf); this->in_ori_dem_path = buf; getline(infile, buf); this->ori_sim = buf; getline(infile, buf); this->out_sar_xyz_path = buf; getline(infile, buf); this->out_sar_xyz_incidence_path = buf; getline(infile, buf); this->out_orth_sar_incidence_path = buf; getline(infile, buf); this->out_orth_sar_local_incidence_path = buf; getline(infile, buf); this->outFolder_path = buf; getline(infile, buf); this->file_count = stoi(buf); this->inputFile_paths = std::vector(this->file_count); this->outFile_paths = std::vector(this->file_count); this->outFile_pow_paths = std::vector(this->file_count); for (int i = 0; i < this->file_count; i++) { getline(infile, buf); this->inputFile_paths[i] = buf; getline(infile, buf); this->outFile_paths[i] = buf; getline(infile, buf); this->outFile_pow_paths[i] = buf; } getline(infile, buf); this->ori2sim_num = stoi(buf); this->ori2sim_paras = (long double*)calloc(this->ori2sim_num, sizeof(long double)); for (int i = 0; i < this->ori2sim_num; i++) { getline(infile, buf); this->ori2sim_paras[i] = stod(buf); } getline(infile, buf); this->sim2ori_num = stoi(buf); this->sim2ori_paras = (long double*)calloc(this->sim2ori_num, sizeof(long double)); for (int i = 0; i < this->sim2ori_num; i++) { getline(infile, buf); this->sim2ori_paras[i] = stod(buf); } } catch (exception e) { infile.close(); throw "文件读取错误"; } infile.close(); } ConvertResampleParameter::ConvertResampleParameter(const ConvertResampleParameter& para) { this->in_ori_dem_path = para.in_ori_dem_path; this->ori_sim = para.ori_sim; this->out_sar_xyz_path = para.out_sar_xyz_path; this->out_sar_xyz_incidence_path = para.out_sar_xyz_incidence_path; this->out_orth_sar_incidence_path = para.out_orth_sar_incidence_path; this->out_orth_sar_local_incidence_path = para.out_orth_sar_local_incidence_path; this->outFolder_path = para.outFolder_path; this->file_count = para.file_count; this->inputFile_paths = std::vector(this->file_count); this->outFile_paths = std::vector(this->file_count); this->outFile_pow_paths = std::vector(this->file_count); for (int i = 0; i < this->file_count; i++) { this->inputFile_paths[i] = para.inputFile_paths[i]; this->outFile_paths[i] = para.outFile_paths[i]; this->outFile_pow_paths[i] = para.outFile_pow_paths[i]; } this->ori2sim_num = para.ori2sim_num; this->ori2sim_paras = (long double*)calloc(this->ori2sim_num, sizeof(long double)); memcpy(this->ori2sim_paras, para.ori2sim_paras, this->ori2sim_num * sizeof(long double)); this->sim2ori_num = para.sim2ori_num; this->sim2ori_paras = (long double*)calloc(this->sim2ori_num, sizeof(long double)); memcpy(this->sim2ori_paras, para.sim2ori_paras, this->sim2ori_num * sizeof(long double)); } ConvertResampleParameter::~ConvertResampleParameter() { free(this->sim2ori_paras); free(this->ori2sim_paras); this->outFile_paths.clear(); this->outFile_paths.swap(this->outFile_paths); this->inputFile_paths.clear(); this->inputFile_paths.swap(this->inputFile_paths); this->outFile_pow_paths.clear(); this->outFile_pow_paths.swap(this->outFile_pow_paths); } #include "threadpool.hpp" //int SimProcessBlock(dem_block demblock, ParameterInFile paras, matchPoint* result_shared, int* Pcount) // 插值算法 /// /// 分块模拟求解 /// T0 变更为 refrange, delta_R: widthspace /// /// /// /// int SimProcessBlock(dem_block demblock, ParameterInFile paras, matchPoint* result_shared, int* Pcount) { long double Starttime = paras.imgStartTime; long double lamda = paras.lamda; long double refrange = paras.refrange; long double* doppler_para = paras.doppler_para; long double LightSpeed = paras.LightSpeed; long double delta_t = paras.delta_t; long double prf = paras.PRF; long double R0 = paras.R0; long double widthspace = paras.widthspace; long double SatelliteModelStartTime = paras.SatelliteModelStartTime; long double* polySatellitePara = paras.polySatellitePara; int sim_sar_width = paras.sim_width; int sim_sar_height = paras.sim_height; int polynum = paras.polynum; int doppler_paramenter_number = paras.doppler_paramenter_number; bool haspoint = true; for (int i = 0; i < demblock.size; i++) { point tempPoint = demblock.getpointblock(i); tempPoint = LLA2XYZ(tempPoint); // T0 变更为 refrange, delta_R: widthspace point pixelpoint = PSTN(tempPoint, Starttime, lamda, refrange, doppler_para, LightSpeed, prf, R0, widthspace, SatelliteModelStartTime, polySatellitePara, polynum, doppler_paramenter_number); if (pixelpoint.x >= -3000-paras.sample_f*5 && pixelpoint.x < paras.sim_height + paras.sample_f * 5 && pixelpoint.y >= -paras.sample_f * 5 && pixelpoint.y < paras.sim_width + paras.sample_f * 5) { haspoint = false; break; } } if (haspoint) { *Pcount = -1; return -1; } // dem重采样 demblock.sample_f = paras.sample_f; dem_block resample = demblock.resample_dem(); // 重采样的时候经纬度, resample.UpdatePointCoodinarary(); // 可以优化 //声明 int sim_height = resample.end_row - resample.start_row; int sim_width = resample.end_col - resample.start_col; int sim_pixel_count = sim_width * sim_height; // 计算对应的行列号 int ids = 0; SatelliteSpacePoint satepoint_; *Pcount = 0; try { // 计算间接定位法结果 for (int i = resample.start_row; i < resample.end_row; i++) { for (int j = resample.start_col; j < resample.end_col; j++) { point landPoint = resample.getpointblock(i, j); point pixelpoint = PSTN(landPoint, Starttime, lamda, refrange, doppler_para, LightSpeed, prf, R0, widthspace, SatelliteModelStartTime, polySatellitePara, polynum, doppler_paramenter_number); point temppoint{ round(pixelpoint.x),round(pixelpoint.y),pixelpoint.z }; if (temppoint.x < -3000 || temppoint.x >= paras.sim_height || temppoint.y < 0 || temppoint.y >= paras.sim_width) { continue; } VectorPoint n = resample.getslopeVector(i, j); satepoint_ = getSatellitePostion(pixelpoint.z, SatelliteModelStartTime, polySatellitePara, polynum); point satepoint{ satepoint_.x,satepoint_.y,satepoint_.z };//卫星坐标 IncidenceAngle pixelIncidence = calIncidence(satepoint, landPoint, n); if (pixelIncidence.localincidenceAngle >= 0 && pixelIncidence.localincidenceAngle <= 1) { matchPoint matchp{ temppoint.x, temppoint.y, pixelpoint.z,0,0,0,0,pixelIncidence.incidenceAngle,pixelIncidence.localincidenceAngle}; result_shared[ids] = matchp; *Pcount = *Pcount + 1; ids = ids + 1; } } } return 0; } catch (exception e) { //free(pixelpoints); throw "计算错误"; return -1; } } static std::mutex s_sim_dem_Mutex; //数据锁 void taskFunc(ParameterInFile& paras, int dem_block_size, int width, short* sim_dem, int count_cure, int count_sum, int i, int j, int block_height, int block_width, int end_row_ex, int end_col_ex, float* demarray, translateArray& gtt, translateArray& inv_gtt) { //dem_block *demblock, int Pcount = 0; dem_block* demblock = new dem_block(i - 3, j - 3, 3, block_height - 3, 3, block_width - 3, block_height, block_width, paras.sample_f);// 构建块结构 for (int ii = i - 3; ii < end_row_ex; ii++) { for (int jj = j - 3; jj < end_col_ex; jj++) { // 构建点集 int dem_ids = ii * width + jj; point tempPoint = Translation(ii, jj, demarray[dem_ids], gtt); demblock->setpointblock(ii - i + 3, jj - j + 3, tempPoint); } } matchPoint* result_shared = (matchPoint*)calloc((dem_block_size + 7) * (dem_block_size + 7) * paras.sample_f * paras.sample_f, sizeof(matchPoint)); int nRet= SimProcessBlock(*demblock, paras,result_shared, &Pcount); int tempstate = Pcount; int row_ids = 0; int col_ids = 0; int ids = 0; matchPoint* pixelpoint = NULL; { //std::lock_guard guard(s_sim_dem_Mutex); s_sim_dem_Mutex.lock(); for (int ii = 0; ii < tempstate; ii++) { pixelpoint = &result_shared[ii]; row_ids = int(pixelpoint->r)+3000; col_ids = int(pixelpoint->c); ids = row_ids *paras.sim_width + col_ids; sim_dem[ids] ++; } s_sim_dem_Mutex.unlock(); } //根据匹配结果,尝试计算插值结果 delete demblock; free(result_shared); } void taskFunc_Calsim2ori(ParameterInFile& paras, ConvertResampleParameter& conveparas, int start_row, int end_row, int start_col, int end_col, int dem_width,int dem_height, float* sar_local_angle, float* sar_angle, float* sar_dem_x, float* sar_dem_y, float* demarray, translateArray& gtt, translateArray& inv_gtt) { /* // 计算向量值,注意向量值的计算初值结果 point p1 = this->getpointblock(row_ids - 1, col_ids); point p2 = this->getpointblock(row_ids, col_ids - 1); point p3 = this->getpointblock(row_ids + 1, col_ids); point p4 = this->getpointblock(row_ids, col_ids + 1); VectorPoint n24 = getVector(p2, p4); VectorPoint n31 = getVector(p3, p1); result = // 目标向量 */ double templocalincidenceAngle = 0; double tempincidenceAngle = 0; double templocalincidenceAngle1 = 0; double tempincidenceAngle1 = 0; for (int i = start_row; i <= end_row; i++) { if (i - 1 < 0 || i + 1 >= dem_height) { continue; } for (int j = start_col; j <= end_col; j++) { if (j - 1 < 0 || j + 1 >= dem_width) { continue; } int dem_ids = i * dem_width + j; point landPoint = Translation(i, j, demarray[dem_ids], gtt); landPoint =LLA2XYZ(landPoint); point pixelpoint = PSTN(landPoint, paras.imgStartTime, paras.lamda, paras.refrange, paras.doppler_para, paras.LightSpeed, paras.PRF, paras.R0, paras.delta_R, paras.SatelliteModelStartTime, paras.polySatellitePara, paras.polynum, paras.doppler_paramenter_number); long double r, c; // 结果的行列号 sim2ori(pixelpoint.x, pixelpoint.y, r, c, conveparas.sim2ori_paras); // 计算得到的行列号 --> // 计算向量1 dem_ids = (i - 1) * dem_width + j; point p1 = Translation(i - 1, j, demarray[dem_ids], gtt); p1 = LLA2XYZ(p1); dem_ids = i * dem_width + (j - 1); point p2 = Translation(i, j - 1, demarray[dem_ids], gtt); p2 = LLA2XYZ(p2); dem_ids = (i + 1) * dem_width + j; point p3 = Translation(i + 1, j, demarray[dem_ids], gtt); p3 = LLA2XYZ(p3); dem_ids = i * dem_width + (j + 1); point p4 = Translation(i, j + 1, demarray[dem_ids], gtt); p4 = LLA2XYZ(p4); VectorPoint n24 = getVector(p2, p4); VectorPoint n31 = getVector(p3, p1); VectorPoint n = VectorFork(n24, n31); long double satelliteTime =r / paras.PRF + paras.imgStartTime;// pixelpoint.z;// SatelliteSpacePoint satepoint_ = getSatellitePostion(satelliteTime, paras.SatelliteModelStartTime, paras.polySatellitePara, paras.polynum); point satepoint{ satepoint_.x,satepoint_.y,satepoint_.z };//卫星坐标 IncidenceAngle pixelIncidence = calIncidence(satepoint, landPoint, n); dem_ids = i * dem_width + j; sar_local_angle[dem_ids] = acos(pixelIncidence.localincidenceAngle) * r2d; sar_angle[dem_ids] =90- acos(pixelIncidence.incidenceAngle) * r2d; sar_dem_x[dem_ids] = r; sar_dem_y[dem_ids] = c; } } //std::cout << "\r" << end_row << "/" << dem_height << "," << end_col << "/" << dem_width << "," << end_row*100.0 * end_col / (dem_width * dem_height) << " ------------------"; } int SimProcess_LVY(ParameterInFile paras, int thread_num) { std::cout << "begin time:" << getCurrentTimeString() << std::endl; GDALAllRegister();// 注册格式的驱动 // 打开DEM影像 GDALDataset* demDataset = (GDALDataset*)(GDALOpen(paras.dem_path.c_str(), GA_ReadOnly));//以只读方式读取地形影像 int width = demDataset->GetRasterXSize(); int height = demDataset->GetRasterYSize(); int nCount = demDataset->GetRasterCount(); double* gt = (double*)calloc(6, sizeof(double)); // 仿射矩阵 demDataset->GetGeoTransform(gt); // 获得仿射矩阵 translateArray gtt{ gt[0],gt[1],gt[2],gt[3],gt[4],gt[5] }; double* inv_gt = (double*)calloc(6, sizeof(double)); // 仿射矩阵 GDALInvGeoTransform(gt, inv_gt); // 逆矩阵 translateArray inv_gtt{ inv_gt[0],inv_gt[1],inv_gt[2],inv_gt[3],inv_gt[4],inv_gt[5] }; GDALDataType gdal_datatype = demDataset->GetRasterBand(1)->GetRasterDataType(); const char* Projection = demDataset->GetProjectionRef(); GDALRasterBand* demBand = demDataset->GetRasterBand(1); float* demarray = ReadRasterArray(demBand, width, height, gdal_datatype); int dem_pixel_count = width * height; int psize = (paras.sim_height+3000) * paras.sim_width; short* sim_dem = (short*)calloc(psize, sizeof(short)); //// 计算每个块的尺寸 int dem_block_size = int(ceil(sqrt(10*1024* 1024 / (paras.sample_f* paras.sample_f *sizeof(gdal_datatype))))); // 获取每块dem的尺寸 //构建内存储空间对象 // try { int a = 2; int i = 3; int j = 3; int thread_ids = 0; bool hasfullpool = false; int count_sum = height * width / (dem_block_size * dem_block_size); int count_cure = 0; // 标志文件是否正在写出 //bool outmatchpointing = false; //std::vector outmatchpointthread(0); int tempstate = 0; ThreadPool* subthreadPool = new ThreadPool(thread_num, true); ThreadPoolPtr poolPtr(subthreadPool); poolPtr->start(); int start_row =0; int start_col =0; int end_row = 0; int end_col = 0; // 扩充 int end_row_ex = 0; int end_col_ex = 0; int block_height = 0; int block_width = 0; while (i < height - 1) { j = 3; while (j < width - 1) { count_cure++; // 计算起始行列数 start_row = i; start_col = j; end_row = start_row + dem_block_size; end_col = start_col + dem_block_size; // 扩充 end_row_ex = end_row + 3; end_col_ex = end_col + 3; if (end_row_ex > height) { end_row = height - 3; end_row_ex = height; } if (end_col_ex > width) { end_col = width - 3; end_col_ex = width; } block_height = end_row - start_row + 6; block_width = end_col - start_col + 6; poolPtr->append(std::bind(taskFunc, paras, dem_block_size, width, sim_dem, count_cure, count_sum, i, j, block_height, block_width, end_row_ex, end_col_ex, demarray, gtt, inv_gtt)); thread_ids++; j = j + dem_block_size; } i = i + dem_block_size; } std::cout << "SimProcess doing"<waiteFinish(); // 输出文件 std::cout << "输出成果文件:" << getCurrentTimeString() << std::endl; GDALDriver* poDriver = GetGDALDriverManager()->GetDriverByName("GTiff"); const char* out_sar_sim = paras.out_sar_sim_path.c_str(); GDALDataset* poDstDS = poDriver->Create(out_sar_sim, paras.sim_width, paras.sim_height + 3000, 1, GDT_Int16, NULL); poDstDS->GetRasterBand(1)->RasterIO(GF_Write, 0, 0, paras.sim_width, paras.sim_height + 3000, sim_dem, paras.sim_width, paras.sim_height + 3000, GDT_Int16, 0, 0); GDALFlushCache(poDstDS); GDALClose(poDstDS); free(sim_dem); GDALClose(demDataset); delete demarray; std::cout << "输出成果文件-over" << std::endl; std::cout << "end time:" << getCurrentTimeString() << std::endl; return 0; } int SimProcess_Calsim2ori(ParameterInFile paras, ConvertResampleParameter conveparas, int thread_num) { std::cout << "begin time:" << getCurrentTimeString() << std::endl; GDALAllRegister();// 注册格式的驱动 // 打开DEM影像 GDALDataset* demDataset = (GDALDataset*)(GDALOpen(conveparas.in_ori_dem_path.c_str(), GA_ReadOnly));//以只读方式读取地形影像 int width = demDataset->GetRasterXSize(); int height = demDataset->GetRasterYSize(); int nCount = demDataset->GetRasterCount(); double* gt = (double*)calloc(6, sizeof(double)); // 仿射矩阵 demDataset->GetGeoTransform(gt); // 获得仿射矩阵 translateArray gtt{ gt[0],gt[1],gt[2],gt[3],gt[4],gt[5] }; double*inv_gt = (double*)calloc(6, sizeof(double)); // 仿射矩阵 GDALInvGeoTransform(gt, inv_gt); // 逆矩阵 translateArray inv_gtt{ inv_gt[0],inv_gt[1],inv_gt[2],inv_gt[3],inv_gt[4],inv_gt[5] }; GDALDataType gdal_datatype = demDataset->GetRasterBand(1)->GetRasterDataType(); const char* Projection = demDataset->GetProjectionRef(); GDALRasterBand* demBand = demDataset->GetRasterBand(1); float* demarray = ReadRasterArray(demBand, width, height, gdal_datatype); int dem_pixel_count = width * height; int psize = width * height; float* sar_local_angle = (float*)calloc(psize, sizeof(float)); float* sar_angle = (float*)calloc(psize, sizeof(float)); float* sar_dem_x = (float*)calloc(psize, sizeof(float)); float* sar_dem_y = (float*)calloc(psize, sizeof(float)); for (int i = 0; i < psize; i++) { sar_dem_x[i] = -100000; sar_dem_y[i] = -100000; sar_local_angle[i] = -9999; sar_angle[i] = -9999; } int blocksize =1000 ; // 获取每块dem的尺寸 int tempstate = 0; ThreadPool* subthreadPool = new ThreadPool(thread_num, true); ThreadPoolPtr poolPtr(subthreadPool); poolPtr->start(); for (int start_row = 1; start_row = height-2 )? height-2 : (start_row + blocksize); for(int start_col =1; start_col < width -2;) { int end_col = (start_col + blocksize >= width-2) ? width-2 : (start_col + blocksize); poolPtr->append(std::bind(taskFunc_Calsim2ori, paras, conveparas, start_row, end_row, start_col, end_col,width, height, sar_local_angle,sar_angle, sar_dem_x,sar_dem_y, demarray, gtt, inv_gtt)); start_col = end_col; } start_row = end_row; } std::cout << "doing...." << std::endl; poolPtr->waiteFinish(); // 输出文件; std::cout << "输出成果文件:" << getCurrentTimeString() << std::endl; GDALDriver* poDriver = GetGDALDriverManager()->GetDriverByName("GTiff"); const char* out_sar_sim = paras.out_sar_sim_path.c_str(); poolPtr->stop(); GDALClose(demDataset); delete demarray, demBand, subthreadPool; out_sar_sim = conveparas.ori_sim.c_str(); GDALDataset* poDstDS = poDriver->Create(out_sar_sim, width, height, 2, GDT_Float32, NULL); poDstDS->SetGeoTransform(gt); poDstDS->SetProjection(Projection); poDstDS->GetRasterBand(1)->RasterIO(GF_Write, 0, 0, width, height, sar_dem_x, width, height, GDT_Float32, 0, 0); poDstDS->GetRasterBand(1)->SetNoDataValue(-100000); poDstDS->GetRasterBand(2)->RasterIO(GF_Write, 0, 0, width, height, sar_dem_y, width, height, GDT_Float32, 0, 0); poDstDS->GetRasterBand(2)->SetNoDataValue(-100000); GDALFlushCache(poDstDS); GDALClose(poDstDS); poDstDS = poDriver->Create(conveparas.out_orth_sar_local_incidence_path.c_str(), width, height, 1, GDT_Float32, NULL); poDstDS->GetRasterBand(1)->RasterIO(GF_Write, 0, 0, width, height, sar_local_angle, width, height, GDT_Float32, 0, 0); poDstDS->GetRasterBand(1)->SetNoDataValue(-9999); poDstDS->SetGeoTransform(gt); poDstDS->SetProjection(Projection); GDALFlushCache(poDstDS); GDALClose(poDstDS); poDstDS = poDriver->Create(conveparas.out_orth_sar_incidence_path.c_str(), width, height, 1, GDT_Float32, NULL); poDstDS->GetRasterBand(1)->RasterIO(GF_Write, 0, 0, width, height, sar_angle, width, height, GDT_Float32, 0, 0); poDstDS->GetRasterBand(1)->SetNoDataValue(-9999); poDstDS->SetGeoTransform(gt); poDstDS->SetProjection(Projection); GDALFlushCache(poDstDS); GDALClose(poDstDS); std::cout << "输出成果文件-over" << std::endl; std::cout << "end time:" << getCurrentTimeString() << std::endl; free(sar_dem_x); free(sar_dem_y); free(sar_local_angle); free(sar_angle); free(gt); free(inv_gt); return 0; } /* 11 12 13 14 21 22 23 24 31 32 33 34 41 42 43 44 */ //分块重采样 int orth_ReSampling(int start_row,int end_row,int start_col,int end_col, int width,int height,int ori_width,int ori_height , float* ori_array, float* result_arr, float* ori_r_array, float* ori_c_array) { for (int i = start_row; i < end_row; i++) { for (int j = start_col; j < end_col; j++) { int ori_ids = i * width + j; int p_ids = 0; point p{ ori_r_array[ori_ids] ,ori_c_array[ori_ids],0 }; point p22 { floor(ori_r_array[ori_ids]),floor(ori_c_array[ori_ids]),0 }; if (p22.x < 0 || p22.y < 0 || p22.x >= ori_height - 1 || p22.y >= ori_width - 1) { continue; } else if (p22.x < 1 || p22.y < 1 || p22.x >= ori_height - 2 || p22.y >= ori_width - 2) { //双线性 point p23{ p22.x ,p22.y + 1,0 }; p_ids = p23.x * ori_width + p23.y; p23.z = ori_array[p_ids]; point p32{ p22.x + 1,p22.y ,0 }; p_ids = p32.x * ori_width + p32.y; p32.z = ori_array[p_ids]; point p33{ p22.x + 1,p22.y + 1,0 }; p_ids = p33.x * ori_width + p33.y; p33.z = ori_array[p_ids]; p.x = p.x - p22.x; p.y = p.y - p22.y; p=bilineadInterpolation(p, p22, p23, p32, p33); result_arr[ori_ids] = p.z; } else { // p22.x >= 1 && p22.y >= 1 && p22.x < ori_height - 2&& p22.y < ori_width - 2 // 三次 point p11{ p22.x - 1,p22.y - 1,0 }; p_ids = p11.x * ori_width + p11.y; p11.z = ori_array[p_ids]; point p12{ p22.x - 1,p22.y ,0 }; p_ids = p12.x * ori_width + p12.y; p12.z = ori_array[p_ids]; point p13{ p22.x - 1,p22.y + 1,0 }; p_ids = p13.x * ori_width + p13.y; p13.z = ori_array[p_ids]; point p14{ p22.x - 1,p22.y + 2,0 }; p_ids = p14.x * ori_width + p14.y; p14.z = ori_array[p_ids]; point p21{ p22.x ,p22.y - 1,0 }; p_ids = p21.x * ori_width + p21.y; p21.z = ori_array[p_ids]; point p23{ p22.x ,p22.y + 1,0 }; p_ids = p23.x * ori_width + p23.y; p23.z = ori_array[p_ids]; point p24{ p22.x ,p22.y + 2,0 }; p_ids = p24.x * ori_width + p24.y; p24.z = ori_array[p_ids]; point p31{ p22.x + 1,p22.y - 1,0 }; p_ids = p31.x * ori_width + p31.y; p31.z = ori_array[p_ids]; point p32{ p22.x + 1,p22.y ,0 }; p_ids = p32.x * ori_width + p32.y; p32.z = ori_array[p_ids]; point p33{ p22.x + 1,p22.y + 1,0 }; p_ids = p33.x * ori_width + p33.y; p33.z = ori_array[p_ids]; point p34{ p22.x + 1,p22.y + 2,0 }; p_ids = p34.x * ori_width + p34.y; p34.z = ori_array[p_ids]; point p41{ p22.x + 2,p22.y - 1,0 }; p_ids = p41.x * ori_width + p41.y; p41.z = ori_array[p_ids]; point p42{ p22.x + 2,p22.y ,0 }; p_ids = p42.x * ori_width + p42.y; p42.z = ori_array[p_ids]; point p43{ p22.x + 2,p22.y + 1,0 }; p_ids = p43.x * ori_width + p43.y; p43.z = ori_array[p_ids]; point p44{ p22.x + 2,p22.y + 2,0 }; p_ids = p44.x * ori_width + p44.y; p44.z = ori_array[p_ids]; p.x = p.x - p11.x; p.y = p.y - p11.y; p = cubicInterpolation(p, p11, p12, p13, p14, p21, p22, p23, p24, p31, p32, p33, p34, p41, p42, p43, p44); result_arr[ori_ids] = p.z; } } } //std::cout << "\r" << end_row << "/" << height << "," << end_col << "/" << width << ","<GetRasterXSize(); int height = sim2oriDataset->GetRasterYSize(); int nCount = sim2oriDataset->GetRasterCount(); double*gt = (double*)calloc(6, sizeof(double)); // 仿射矩阵 sim2oriDataset->GetGeoTransform(gt); // 获得仿射矩阵 translateArray gtt{ gt[0],gt[1],gt[2],gt[3],gt[4],gt[5] }; double*inv_gt = (double*)calloc(6, sizeof(double)); // 仿射矩阵 GDALInvGeoTransform(gt, inv_gt); // 逆矩阵 translateArray inv_gtt{ inv_gt[0],inv_gt[1],inv_gt[2],inv_gt[3],inv_gt[4],inv_gt[5] }; GDALDataType gdal_datatype = sim2oriDataset->GetRasterBand(1)->GetRasterDataType(); const char* Projection = sim2oriDataset->GetProjectionRef(); GDALRasterBand* ori_r_Band = sim2oriDataset->GetRasterBand(1); float* ori_r_array = ReadRasterArray(ori_r_Band, width, height, gdal_datatype); GDALRasterBand* ori_c_Band = sim2oriDataset->GetRasterBand(2); float* ori_c_array = ReadRasterArray(ori_c_Band, width, height, gdal_datatype); // 读取行列号 delete ori_r_Band, ori_c_Band; for (int t = 0; t < conveparas.file_count; t++) { // 读 // 创建 GDALAllRegister();// 注册格式的驱动 GDALDriver* poDriver = GetGDALDriverManager()->GetDriverByName("GTiff"); string in_file_path = conveparas.inputFile_paths[t]; string out_file_path = conveparas.outFile_paths[t]; GDALDataset* inDataset = (GDALDataset*)(GDALOpen(in_file_path.c_str(), GA_ReadOnly)); int orth_width = inDataset->GetRasterXSize(); int orth_height = inDataset->GetRasterYSize(); int orth_num = inDataset->GetRasterCount(); // 写 GDALDataset* outDstDS = poDriver->Create(out_file_path.c_str(), width, height, orth_num, GDT_Float32, NULL); outDstDS->SetGeoTransform(gt); outDstDS->SetProjection(Projection); float* result_arr = (float*)calloc(width * height, sizeof(float)); int psize = width * height; int blocksize = 1000; for (int b = 1; b <= orth_num; b++) { for (int i = 0; i < psize; i++) { result_arr[i] = -9999; } GDALRasterBand* ori_Band = inDataset->GetRasterBand(b); float* ori_arr= ReadRasterArray(ori_Band, orth_width, orth_height, gdal_datatype); // 线程池 ThreadPool* subthreadPool = new ThreadPool(thread_num, true); ThreadPoolPtr poolPtr(subthreadPool); poolPtr->start(); // 三次样条重采样 for (int start_row = 0; start_row < height; start_row = start_row + blocksize) { int end_row = start_row + blocksize >= height ? height : start_row + blocksize; for (int start_col = 0; start_col < width; start_col = start_col + blocksize) { int end_col = start_col + blocksize >= width ? width : start_col + blocksize; // 分块计算结果 poolPtr->append(std::bind(orth_ReSampling,start_row,end_row,start_col,end_col,width,height, orth_width, orth_height, ori_arr, result_arr, ori_r_array, ori_c_array)); } } std::cout << "resampling...." << std::endl; poolPtr->waiteFinish(); // 输出文件 std::cout<GetRasterBand(b)->RasterIO(GF_Write, 0, 0, width, height, result_arr, width, height, GDT_Float32, 0, 0); outDstDS->GetRasterBand(b)->SetNoDataValue(-9999); poolPtr->stop(); delete ori_arr, ori_Band, subthreadPool; } free(result_arr); GDALFlushCache(outDstDS); GDALClose(outDstDS); GDALClose(inDataset); } free(gt); free(inv_gt); delete ori_r_array, ori_c_array;// , sim2oriDataset; //GDALClose(sim2oriDataset); return 0; } /// /// 生成影像的强度图 /// /// /// /// /// int SimProcess_Calspow(ParameterInFile paras, ConvertResampleParameter conveparas, int thread_num) { for (int t = 0; t < conveparas.file_count; t++) { // 读 // 创建 GDALAllRegister();// 注册格式的驱动 GDALDriver* poDriver = GetGDALDriverManager()->GetDriverByName("GTiff"); string in_file_path = conveparas.outFile_paths[t]; string out_file_path = conveparas.outFile_pow_paths[t]; GDALDataset* inDataset = (GDALDataset*)(GDALOpen(in_file_path.c_str(), GA_ReadOnly)); int width = inDataset->GetRasterXSize(); int height = inDataset->GetRasterYSize(); int num = inDataset->GetRasterCount(); double*gt = (double*)calloc(6, sizeof(double)); // 仿射矩阵 inDataset->GetGeoTransform(gt); // 获得仿射矩阵 translateArray gtt{ gt[0],gt[1],gt[2],gt[3],gt[4],gt[5] }; double*inv_gt = (double*)calloc(6, sizeof(double)); // 仿射矩阵 GDALInvGeoTransform(gt, inv_gt); // 逆矩阵 translateArray inv_gtt{ inv_gt[0],inv_gt[1],inv_gt[2],inv_gt[3],inv_gt[4],inv_gt[5] }; const char* Projection = inDataset->GetProjectionRef(); GDALDataset* outDstDS = poDriver->Create(out_file_path.c_str(), width, height, 1, GDT_Float32, NULL); outDstDS->SetGeoTransform(gt); outDstDS->SetProjection(Projection); GDALDataType gdal_datatype = inDataset->GetRasterBand(1)->GetRasterDataType(); GDALRasterBand* ori_Band = inDataset->GetRasterBand(1); float* ori_a_array = ReadRasterArray(ori_Band, width, height, gdal_datatype); ori_Band = inDataset->GetRasterBand(2); float* ori_b_array = ReadRasterArray(ori_Band, width, height, gdal_datatype); float* result_arr = (float*)calloc(width * height, sizeof(float)); int psize = width * height; int blocksize = 1000; for (int i = 0; i < psize; i++) { result_arr[i] = -9999; } // 线程池 ThreadPool* subthreadPool = new ThreadPool(thread_num, true); ThreadPoolPtr poolPtr(subthreadPool); poolPtr->start(); // 三次样条重采样 for (int start_row = 0; start_row < height; start_row = start_row + blocksize) { int end_row = start_row + blocksize >= height ? height : start_row + blocksize; for (int start_col = 0; start_col < width; start_col = start_col + blocksize) { int end_col = start_col + blocksize >= width ? width : start_col + blocksize; // 分块计算结果 poolPtr->append(std::bind(orth_pow, start_row, end_row, start_col, end_col, width, height, result_arr, ori_a_array, ori_b_array)); } } std::cout << "pow resampling ..." << std::endl; poolPtr->waiteFinish(); // 输出文件 std::cout << t << " , " << 1 << ",输出成果文件:" << getCurrentTimeString() << std::endl; outDstDS->GetRasterBand(1)->RasterIO(GF_Write, 0, 0, width, height, result_arr, width, height, GDT_Float32, 0, 0); outDstDS->GetRasterBand(1)->SetNoDataValue(-9999); poolPtr->stop(); delete ori_a_array, ori_b_array, ori_Band, subthreadPool; free(gt); free(inv_gt); free(result_arr); //GDALFlushCache(outDstDS); //GDALClose(outDstDS); //GDALClose(inDataset); //delete poDriver; } //GDALClose(sim2oriDataset); return 0; } int ResamplingSim(ParameterInFile paras) { GDALAllRegister(); // 打开DEM影像 GDALDataset* simDataset = (GDALDataset*)(GDALOpen(paras.out_sar_sim_path.c_str(), GA_ReadOnly));//以只读方式读取地形影像 int ori_sim_width = simDataset->GetRasterXSize(); int ori_sim_height = simDataset->GetRasterYSize(); int width = paras.sim_width; int height = paras.sim_height; float width_scales = width * 1.0 / ori_sim_width; float height_scales = height * 1.0 / ori_sim_height; GDALClose(simDataset); ResampleGDAL(paras.out_sar_sim_path.c_str(), paras.out_sar_sim_resampling_path.c_str(), width_scales, height_scales, GDALResampleAlg::GRA_CubicSpline); return 0; } int ResampleGDAL(const char* pszSrcFile, const char* pszOutFile, float fResX = 1.0, float fResY = 1.0, GDALResampleAlg eResample = GRA_Bilinear) { GDALAllRegister(); CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO"); GDALDataset* pDSrc = (GDALDataset*)GDALOpen(pszSrcFile, GA_ReadOnly); if (pDSrc == NULL) { return -1; } GDALDriver* pDriver = GetGDALDriverManager()->GetDriverByName("GTiff"); if (pDriver == NULL) { GDALClose((GDALDatasetH)pDSrc); return -2; } int width = pDSrc->GetRasterXSize(); int height = pDSrc->GetRasterYSize(); int nBandCount = pDSrc->GetRasterCount(); GDALDataType dataType = GDALDataType::GDT_Float32;// pDSrc->GetRasterBand(1)->GetRasterDataType(); char* pszSrcWKT = NULL; pszSrcWKT = const_cast(pDSrc->GetProjectionRef()); double dGeoTrans[6] = { 0 }; int nNewWidth = width, nNewHeight = height; pDSrc->GetGeoTransform(dGeoTrans); bool bNoGeoRef = false; long double dOldGeoTrans0 = dGeoTrans[0]; //如果没有投影,人为设置一个 if (strlen(pszSrcWKT) <= 0) { //OGRSpatialReference oSRS; //oSRS.SetUTM(50,true); //北半球 东经120度 //oSRS.SetWellKnownGeogCS("WGS84"); //oSRS.exportToWkt(&pszSrcWKT); //pDSrc->SetProjection(pszSrcWKT); ////////////////////////////////////////////////////////////////////////// dGeoTrans[0] = 1.0; pDSrc->SetGeoTransform(dGeoTrans); ////////////////////////////////////////////////////////////////////////// bNoGeoRef = true; } //adfGeoTransform[0] /* top left x */ //adfGeoTransform[1] /* w-e pixel resolution */ //adfGeoTransform[2] /* rotation, 0 if image is "north up" */ //adfGeoTransform[3] /* top left y */ //adfGeoTransform[4] /* rotation, 0 if image is "north up" */ //adfGeoTransform[5] /* n-s pixel resolution */ dGeoTrans[1] = dGeoTrans[1] / fResX; dGeoTrans[5] = dGeoTrans[5] / fResY; nNewWidth = static_cast(nNewWidth * fResX + 0.5); nNewHeight = static_cast(nNewHeight * fResY + 0.5); //创建结果数据集 GDALDataset* pDDst = pDriver->Create(pszOutFile, nNewWidth, nNewHeight, nBandCount, dataType, NULL); if (pDDst == NULL) { GDALClose((GDALDatasetH)pDSrc); return -2; } pDDst->SetProjection(pszSrcWKT); pDDst->SetGeoTransform(dGeoTrans); void* hTransformArg = NULL; hTransformArg = GDALCreateGenImgProjTransformer2((GDALDatasetH)pDSrc, (GDALDatasetH)pDDst, NULL); //GDALCreateGenImgProjTransformer((GDALDatasetH) pDSrc,pszSrcWKT,(GDALDatasetH) pDDst,pszSrcWKT,FALSE,0.0,1); if (hTransformArg == NULL) { GDALClose((GDALDatasetH)pDSrc); GDALClose((GDALDatasetH)pDDst); return -3; } GDALWarpOptions* psWo = GDALCreateWarpOptions(); psWo->papszWarpOptions = CSLDuplicate(NULL); psWo->eWorkingDataType = dataType; psWo->eResampleAlg = eResample; psWo->hSrcDS = (GDALDatasetH)pDSrc; psWo->hDstDS = (GDALDatasetH)pDDst; psWo->pfnTransformer = GDALGenImgProjTransform; psWo->pTransformerArg = hTransformArg; psWo->nBandCount = nBandCount; psWo->panSrcBands = (int*)CPLMalloc(nBandCount * sizeof(int)); psWo->panDstBands = (int*)CPLMalloc(nBandCount * sizeof(int)); for (int i = 0; i < nBandCount; i++) { psWo->panSrcBands[i] = i + 1; psWo->panDstBands[i] = i + 1; } GDALWarpOperation oWo; if (oWo.Initialize(psWo) != CE_None) { GDALClose((GDALDatasetH)pDSrc); GDALClose((GDALDatasetH)pDDst); return -3; } oWo.ChunkAndWarpImage(0, 0, nNewWidth, nNewHeight); GDALDestroyGenImgProjTransformer(hTransformArg); GDALDestroyWarpOptions(psWo); if (bNoGeoRef) { dGeoTrans[0] = dOldGeoTrans0; pDDst->SetGeoTransform(dGeoTrans); //pDDst->SetProjection(""); } GDALFlushCache(pDDst); GDALClose((GDALDatasetH)pDSrc); GDALClose((GDALDatasetH)pDDst); return 0; } /// /// 根据地面坐标获取计算结果 /// /// /// /// /// point GetOriRC(point& landp, ParameterInFile& paras, ConvertResampleParameter& convparas) { long double Starttime = paras.imgStartTime; long double lamda = paras.lamda; long double refrange = paras.refrange; long double* doppler_para = paras.doppler_para; long double LightSpeed = paras.LightSpeed; long double delta_t = paras.delta_t; long double R0 = paras.R0; long double delta_R = paras.delta_R; long double SatelliteModelStartTime = paras.SatelliteModelStartTime; long double* polySatellitePara = paras.polySatellitePara; int sim_sar_width = paras.sim_width; int sim_sar_height = paras.sim_height; int polynum = paras.polynum; int doppler_paramenter_number = paras.doppler_paramenter_number; point pixelpoint = PSTN(landp, paras.imgStartTime, paras.lamda, paras.refrange, paras.doppler_para, paras.LightSpeed, paras.PRF, paras.R0, paras.delta_R, paras.SatelliteModelStartTime, paras.polySatellitePara, paras.polynum, paras.doppler_paramenter_number); long double r, c; sim2ori(pixelpoint.x, pixelpoint.y, r, c, convparas.sim2ori_paras); return point{ r,c,0 }; } // 根据坐标变换求解行列号 int calSARPosition(ParameterInFile paras, ConvertResampleParameter converPara) { // return 0; } /// /// 测试代码 /// int testPP() { point landpoint; landpoint.x = -1945072.5; landpoint.y = 5344083.0; landpoint.z = 2878316.0; point targetpoint; targetpoint.x = 31; targetpoint.y = 118; targetpoint.z = 33; landpoint = LLA2XYZ(targetpoint); std::cout << "PTSN\nX:" << landpoint.x<< "\nY:" << landpoint.y << "\nZ:" << landpoint.z << "\n"; // <0.1 return 0; } int testPTSN(ParameterInFile paras) { point landpoint; landpoint.x = -1945072.5; landpoint.y = 5344083.0; landpoint.z = 2878316.0; point targetpoint; targetpoint.x = 31; targetpoint.y = 118; targetpoint.z = 1592144812.73686337471008300781; landpoint=LLA2XYZ(targetpoint); point pixelpoint = PSTN(landpoint, paras.imgStartTime, paras.lamda, paras.refrange, paras.doppler_para, paras.LightSpeed, paras.PRF, paras.R0, paras.delta_R, paras.SatelliteModelStartTime, paras.polySatellitePara, paras.polynum, paras.doppler_paramenter_number); std::cout << "PTSN\nX:" << targetpoint.x - pixelpoint.x << "\nY:" << targetpoint.y - pixelpoint.y << "\nZ:" << targetpoint.z - pixelpoint.z << "\n"; // <0.1 SatelliteSpacePoint sateP = getSatellitePostion(1592144812.7368634, paras.SatelliteModelStartTime, paras.polySatellitePara, paras.polynum); SatelliteSpacePoint sateT{ -3044863.2137617283, 5669112.1303918585, 3066571.1073331647, -26.15659591374557, 3600.8531673370803, -6658.59211430739 }; std::cout << "Sate\nX:" << sateP.x - sateT.x << "\nY:" << sateP.y - sateT.y << "\nZ:" << sateP.z - sateT.z << "\nVx" << sateP.vx - sateT.vx << "\nVy:" << sateP.vy - sateT.vy << "\nVz:" << sateP.vz - sateT.vz << "\n"; return 0; }