#include "ImageNetOperator.h" #include "LogInfoCls.h" #include "PrintMsgToQDebug.h" #include #include "ImageOperatorBase.h" #include "GPUBaseTool.h" #include "GPUBPImageNet.cuh" void InitCreateImageXYZProcess(QString& outImageLLPath, QString& outImageXYZPath, QString& InEchoGPSDataPath, double& NearRange, double& RangeResolution, int64_t& RangeNum) { qDebug() << "---------------------------------------------------------------------------------"; qDebug() << u8"创建粗成像平面斜距投影网格"; gdalImage antimg(InEchoGPSDataPath); qDebug() << u8"1. 回波GPS坐标点文件参数:\t"; qDebug() << u8"文件路径:\t" << InEchoGPSDataPath; qDebug() << u8"GPS 点数:\t" << antimg.height; qDebug() << u8"文件列数:\t" << antimg.width; qDebug() << u8"2.斜距网格参数:"; qDebug() << u8"近距离:\t" << NearRange; qDebug() << u8"分辨率:\t" << RangeResolution; qDebug() << u8"网格点数:\t" << RangeNum; qDebug() << u8"3.输出文件参数:"; gdalImage outimgll = CreategdalImageDouble(outImageLLPath, antimg.height,RangeNum, 3,true,true); gdalImage outimgxyz = CreategdalImageDouble(outImageXYZPath, antimg.height, RangeNum, 3, true, true); qDebug() << u8"成像平面文件(经纬度)网格路径:\t" << outImageLLPath; qDebug() << u8"成像平面文件(XYZ)网格路径:\t" << outImageXYZPath; qDebug() << u8"4.开始创建成像网格XYZ"; long prfcount = antimg.height; long rangeNum = RangeNum; double Rnear = NearRange; double dx = RangeResolution; long blockRangeCount = Memory1GB / sizeof(double) / 4 / prfcount *6; blockRangeCount = blockRangeCount < 1 ? 1 : blockRangeCount; std::shared_ptr Pxs((double*)mallocCUDAHost(sizeof(double) * prfcount), FreeCUDAHost); std::shared_ptr Pys((double*)mallocCUDAHost(sizeof(double) * prfcount), FreeCUDAHost); std::shared_ptr Pzs((double*)mallocCUDAHost(sizeof(double) * prfcount), FreeCUDAHost); std::shared_ptr AntDirectX((double*)mallocCUDAHost(sizeof(double) * prfcount), FreeCUDAHost); std::shared_ptr AntDirectY((double*)mallocCUDAHost(sizeof(double) * prfcount), FreeCUDAHost); std::shared_ptr AntDirectZ((double*)mallocCUDAHost(sizeof(double) * prfcount), FreeCUDAHost); { long colnum = 19; std::shared_ptr antpos =readDataArr(antimg,0,0,prfcount, colnum,1,GDALREADARRCOPYMETHOD::VARIABLEMETHOD); double time = 0; double Px = 0; double Py = 0; double Pz = 0; for (long i = 0; i < prfcount; i++) { Pxs.get()[i] = antpos.get()[i * 19 + 1]; // 卫星坐标 Pys.get()[i] = antpos.get()[i * 19 + 2]; Pzs.get()[i] = antpos.get()[i * 19 + 3]; AntDirectX.get()[i] = antpos.get()[i * 19 + 13];// zero doppler AntDirectY.get()[i] = antpos.get()[i * 19 + 14]; AntDirectZ.get()[i] = antpos.get()[i * 19 + 15]; double NormAnt = std::sqrt(AntDirectX.get()[i] * AntDirectX.get()[i] + AntDirectY.get()[i] * AntDirectY.get()[i] + AntDirectZ.get()[i] * AntDirectZ.get()[i]); AntDirectX.get()[i] = AntDirectX.get()[i] / NormAnt; AntDirectY.get()[i] = AntDirectY.get()[i] / NormAnt; AntDirectZ.get()[i] = AntDirectZ.get()[i] / NormAnt;// 归一化 } antpos.reset(); } std::shared_ptr d_Pxs((double*)mallocCUDADevice(sizeof(double) * prfcount), FreeCUDADevice); std::shared_ptr d_Pys((double*)mallocCUDADevice(sizeof(double) * prfcount), FreeCUDADevice); std::shared_ptr d_Pzs((double*)mallocCUDADevice(sizeof(double) * prfcount), FreeCUDADevice); std::shared_ptr d_AntDirectX((double*)mallocCUDADevice(sizeof(double) * prfcount), FreeCUDADevice); std::shared_ptr d_AntDirectY((double*)mallocCUDADevice(sizeof(double) * prfcount), FreeCUDADevice); std::shared_ptr d_AntDirectZ((double*)mallocCUDADevice(sizeof(double) * prfcount), FreeCUDADevice); HostToDevice(Pxs.get(), d_Pxs.get(), sizeof(double) * prfcount); HostToDevice(Pys.get(), d_Pys.get(), sizeof(double) * prfcount); HostToDevice(Pzs.get(), d_Pzs.get(), sizeof(double) * prfcount); HostToDevice(AntDirectX.get(), d_AntDirectX.get(), sizeof(double) * prfcount); HostToDevice(AntDirectY.get(), d_AntDirectY.get(), sizeof(double) * prfcount); HostToDevice(AntDirectZ.get(), d_AntDirectZ.get(), sizeof(double) * prfcount); for (long startcolidx = 0; startcolidx < RangeNum; startcolidx = startcolidx + blockRangeCount) { long tempechocol = blockRangeCount; if (startcolidx + tempechocol >= RangeNum) { tempechocol = RangeNum - startcolidx; } qDebug() << " imgxyz :\t" << startcolidx << "\t-\t" << startcolidx + tempechocol << " / " << RangeNum; std::shared_ptr demx = readDataArr(outimgxyz, 0, startcolidx, prfcount, tempechocol, 1, GDALREADARRCOPYMETHOD::VARIABLEMETHOD); std::shared_ptr demy = readDataArr(outimgxyz, 0, startcolidx, prfcount, tempechocol, 2, GDALREADARRCOPYMETHOD::VARIABLEMETHOD); std::shared_ptr demz = readDataArr(outimgxyz, 0, startcolidx, prfcount, tempechocol, 3, GDALREADARRCOPYMETHOD::VARIABLEMETHOD); std::shared_ptr h_demx((double*)mallocCUDAHost(sizeof(double) * prfcount * tempechocol), FreeCUDAHost); std::shared_ptr h_demy((double*)mallocCUDAHost(sizeof(double) * prfcount * tempechocol), FreeCUDAHost); std::shared_ptr h_demz((double*)mallocCUDAHost(sizeof(double) * prfcount * tempechocol), FreeCUDAHost); #pragma omp parallel for for (long ii = 0; ii < prfcount; ii++) { for (long jj = 0; jj < tempechocol; jj++) { h_demx.get()[ii * tempechocol + jj] = demx.get()[ii * tempechocol + jj]; h_demy.get()[ii * tempechocol + jj] = demy.get()[ii * tempechocol + jj]; h_demz.get()[ii * tempechocol + jj] = demz.get()[ii * tempechocol + jj]; } } std::shared_ptr d_demx((double*)mallocCUDADevice(sizeof(double) * prfcount * tempechocol), FreeCUDADevice); std::shared_ptr d_demy((double*)mallocCUDADevice(sizeof(double) * prfcount * tempechocol), FreeCUDADevice); std::shared_ptr d_demz((double*)mallocCUDADevice(sizeof(double) * prfcount * tempechocol), FreeCUDADevice); HostToDevice(h_demx.get(), d_demx.get(), sizeof(double) * prfcount * tempechocol); HostToDevice(h_demy.get(), d_demy.get(), sizeof(double) * prfcount * tempechocol); HostToDevice(h_demz.get(), d_demz.get(), sizeof(double) * prfcount * tempechocol); TIMEBPCreateImageGrid( d_Pxs.get(), d_Pys.get(), d_Pzs.get(), d_AntDirectX.get(), d_AntDirectY.get(), d_AntDirectZ.get(), d_demx.get(), d_demy.get(), d_demz.get(), prfcount, tempechocol, 0, Rnear + dx * startcolidx, dx // 更新最近修读 ); DeviceToHost(h_demx.get(), d_demx.get(), sizeof(double) * prfcount * tempechocol); DeviceToHost(h_demy.get(), d_demy.get(), sizeof(double) * prfcount * tempechocol); DeviceToHost(h_demz.get(), d_demz.get(), sizeof(double) * prfcount * tempechocol); #pragma omp parallel for for (long ii = 0; ii < prfcount; ii++) { for (long jj = 0; jj < tempechocol; jj++) { demx.get()[ii * tempechocol + jj] = h_demx.get()[ii * tempechocol + jj]; demy.get()[ii * tempechocol + jj] = h_demy.get()[ii * tempechocol + jj]; demz.get()[ii * tempechocol + jj] = h_demz.get()[ii * tempechocol + jj]; } } outimgxyz.saveImage(demx, 0, startcolidx, prfcount, tempechocol, 1); outimgxyz.saveImage(demy, 0, startcolidx, prfcount, tempechocol, 2); outimgxyz.saveImage(demz, 0, startcolidx, prfcount, tempechocol, 3); // 将XYZ转换为经纬度 std::shared_ptr demllx = readDataArr(outimgll, 0, startcolidx, prfcount, tempechocol, 1, GDALREADARRCOPYMETHOD::VARIABLEMETHOD); std::shared_ptr demlly = readDataArr(outimgll, 0, startcolidx, prfcount, tempechocol, 2, GDALREADARRCOPYMETHOD::VARIABLEMETHOD); std::shared_ptr demllz = readDataArr(outimgll, 0, startcolidx, prfcount, tempechocol, 3, GDALREADARRCOPYMETHOD::VARIABLEMETHOD); #pragma omp parallel for for (long ii = 0; ii < prfcount; ii++) { for (long jj = 0; jj < tempechocol; jj++) { double x = demx.get()[ii * tempechocol + jj]; double y = demy.get()[ii * tempechocol + jj]; double z = demz.get()[ii * tempechocol + jj]; Landpoint point; XYZ2BLH_FixedHeight(x, y, z, 0, point); demllx.get()[ii * tempechocol + jj] = point.lon; demlly.get()[ii * tempechocol + jj] = point.lat; demllz.get()[ii * tempechocol + jj] = point.ati; } } outimgll.saveImage(demllx, 0, startcolidx, prfcount, tempechocol, 1); outimgll.saveImage(demlly, 0, startcolidx, prfcount, tempechocol, 2); outimgll.saveImage(demllz, 0, startcolidx, prfcount, tempechocol, 3); } qDebug() << u8"6.保存成像网格结果"; qDebug() << "---------------------------------------------------------------------------------"; }