Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: DRDC Ottawa GEOINT 4 : * Purpose: Radarsat Constellation Mission - XML Products (product.xml) driver 5 : * Author: Roberto Caron, MDA 6 : * on behalf of DRDC Ottawa 7 : * 8 : ****************************************************************************** 9 : * Copyright (c) 2020, DRDC Ottawa 10 : * 11 : * Based on the RS2 Dataset Class 12 : * 13 : * SPDX-License-Identifier: MIT 14 : ****************************************************************************/ 15 : 16 : #ifndef GDAL_RCM_H_INCLUDED 17 : #define GDAL_RCM_H_INCLUDED 18 : 19 : #include "gdal_pam.h" 20 : 21 : typedef enum eCalibration_t 22 : { 23 : Sigma0 = 0, 24 : Gamma, 25 : Beta0, 26 : Uncalib, 27 : None 28 : } eCalibration; 29 : 30 : /************************************************************************/ 31 : /* ==================================================================== */ 32 : /* RCMDataset */ 33 : /* ==================================================================== */ 34 : /************************************************************************/ 35 : 36 : class RCMDataset final : public GDALPamDataset 37 : { 38 : CPLXMLTreeCloser psProduct{nullptr}; 39 : 40 : int nGCPCount = 0; 41 : GDAL_GCP *pasGCPList = nullptr; 42 : OGRSpatialReference m_oSRS{}; 43 : OGRSpatialReference m_oGCPSRS{}; 44 : char **papszSubDatasets = nullptr; 45 : double adfGeoTransform[6]; 46 : bool bHaveGeoTransform = false; 47 : bool bPerPolarizationScaling = false; 48 : bool isComplexData = false; 49 : int magnitudeBits = 16; 50 : int realBitsComplexData = 32; 51 : int imaginaryBitsComplexData = 32; 52 : char **papszExtraFiles = nullptr; 53 : double *m_nfIncidenceAngleTable = nullptr; 54 : int m_IncidenceAngleTableSize = 0; 55 : 56 : CPL_DISALLOW_COPY_ASSIGN(RCMDataset) 57 : 58 : protected: 59 : virtual int CloseDependentDatasets() override; 60 : 61 : public: 62 : RCMDataset(); 63 : virtual ~RCMDataset(); 64 : 65 : virtual int GetGCPCount() override; 66 : 67 : const OGRSpatialReference *GetGCPSpatialRef() const override; 68 : virtual const GDAL_GCP *GetGCPs() override; 69 : 70 : const OGRSpatialReference *GetSpatialRef() const override; 71 : virtual CPLErr GetGeoTransform(double *) override; 72 : 73 : virtual char **GetMetadataDomainList() override; 74 : virtual char **GetMetadata(const char *pszDomain = "") override; 75 : virtual char **GetFileList(void) override; 76 : 77 : static GDALDataset *Open(GDALOpenInfo *); 78 : 79 : CPLXMLNode *GetProduct() 80 : { 81 : return psProduct.get(); 82 : } 83 : 84 : /* If False, this is Magnitude, True, Complex data with Real and 85 : * Imaginary*/ 86 13 : bool IsComplexData() 87 : { 88 13 : return isComplexData; 89 : } 90 : 91 : /* These 2 variables are used in case of Complex Data */ 92 : int GetRealBitsComplexData() 93 : { 94 : return realBitsComplexData; 95 : } 96 : 97 : int GetImaginaryBitsComplexData() 98 : { 99 : return imaginaryBitsComplexData; 100 : } 101 : 102 : /* This variable is used in case of Magnitude */ 103 : int GetMagnitudeBits() 104 : { 105 : return magnitudeBits; 106 : } 107 : 108 : /* This variable is used to hold the Incidence Angle */ 109 : double *GetIncidenceAngle() 110 : { 111 : return m_nfIncidenceAngleTable; 112 : } 113 : 114 : /* This variable is used to hold the Incidence Angle Table Size */ 115 : int GetIncidenceAngleSize() 116 : { 117 : return m_IncidenceAngleTableSize; 118 : } 119 : }; 120 : 121 : /************************************************************************/ 122 : /* ==================================================================== */ 123 : /* RCMRasterBand */ 124 : /* ==================================================================== */ 125 : /************************************************************************/ 126 : 127 : class RCMRasterBand final : public GDALPamRasterBand 128 : { 129 : private: 130 : eCalibration m_eCalib = eCalibration::Uncalib; 131 : GDALDataset *poBandFile = nullptr; 132 : RCMDataset *poRCMDataset = nullptr; 133 : GDALDataset *m_poBandDataset = nullptr; 134 : 135 : double *m_nfTable = nullptr; 136 : int m_nTableSize = 0; 137 : double m_nfOffset = 0; 138 : char *m_pszLUTFile = nullptr; 139 : int pixelFirstLutValue = 0; 140 : int stepSize = 0; 141 : int numberOfValues = 0; 142 : GDALRasterBand *poBand = nullptr; 143 : 144 : // 2 bands representing I+Q -> one complex band 145 : // otherwise poBandFile is passed straight through 146 : bool twoBandComplex = false; 147 : 148 : bool isOneFilePerPol = false; 149 : bool isNITF = false; 150 : 151 : CPL_DISALLOW_COPY_ASSIGN(RCMRasterBand) 152 : 153 : public: 154 : RCMRasterBand(RCMDataset *poDSIn, int nBandIn, GDALDataType eDataTypeIn, 155 : const char *pszPole, GDALDataset *poBandFile, 156 : bool bTwoBandComplex, bool isOneFilePerPol, bool isNITF); 157 : 158 : virtual ~RCMRasterBand(); 159 : 160 : virtual CPLErr IReadBlock(int, int, void *) override; 161 : 162 : static GDALDataset *Open(GDALOpenInfo *); 163 : }; 164 : 165 : /************************************************************************/ 166 : /* ==================================================================== */ 167 : /* RCMCalibRasterBand */ 168 : /* ==================================================================== */ 169 : /************************************************************************/ 170 : /* Returns data that has been calibrated to sigma nought, gamma */ 171 : /* or beta nought. */ 172 : /************************************************************************/ 173 : 174 : class RCMCalibRasterBand final : public GDALPamRasterBand 175 : { 176 : private: 177 : eCalibration m_eCalib = eCalibration::Uncalib; 178 : GDALDataset *m_poBandDataset = nullptr; 179 : /* data type that used to be before transformation */ 180 : GDALDataType m_eOriginalType = GDT_Unknown; 181 : 182 : double *m_nfTable = nullptr; 183 : int m_nTableSize = 0; 184 : double m_nfOffset = 0; 185 : char *m_pszLUTFile = nullptr; 186 : int pixelFirstLutValue = 0; 187 : int stepSize = 0; 188 : int numberOfValues = 0; 189 : 190 : char *m_pszNoiseLevelsFile = nullptr; 191 : double *m_nfTableNoiseLevels = nullptr; 192 : int pixelFirstLutValueNoiseLevels = 0; 193 : int stepSizeNoiseLevels = 0; 194 : int numberOfValuesNoiseLevels = 0; 195 : int m_nTableNoiseLevelsSize = 0; 196 : 197 : void ReadLUT(); 198 : void ReadNoiseLevels(); 199 : 200 : CPL_DISALLOW_COPY_ASSIGN(RCMCalibRasterBand) 201 : 202 : public: 203 : RCMCalibRasterBand(RCMDataset *poDataset, const char *pszPolarization, 204 : GDALDataType eType, GDALDataset *poBandDataset, 205 : eCalibration eCalib, const char *pszLUT, 206 : const char *pszNoiseLevels, GDALDataType eOriginalType); 207 : ~RCMCalibRasterBand(); 208 : 209 : CPLErr IReadBlock(int nBlockXOff, int nBlockYOff, void *pImage) override; 210 : }; 211 : 212 : #endif /* ndef GDAL_RCM_H_INCLUDED */