20 #ifndef _IMGREADERGDAL_H_
21 #define _IMGREADERGDAL_H_
23 #include "ImgRasterGdal.h"
28 #include "gdal_priv.h"
29 #include "base/Vector2d.h"
36 ImgReaderGdal(
const std::string& filename,
const GDALAccess& readMode=GA_ReadOnly){open(filename, readMode);};
38 void open(
const std::string& filename,
const GDALAccess& readMode=GA_ReadOnly);
41 void setScale(
double theScale,
int band=0){
43 if(m_scale.size()!=nrOfBand()){
44 m_scale.resize(nrOfBand());
45 for(
int iband=0;iband<nrOfBand();++iband)
48 m_scale[band]=theScale;
51 void setOffset(
double theOffset,
int band=0){
53 if(m_offset.size()!=nrOfBand()){
54 m_offset.resize(nrOfBand());
55 for(
int iband=0;iband<nrOfBand();++iband)
58 m_offset[band]=theOffset;
61 template<
typename T>
void readData(T& value,
const GDALDataType& dataType,
int col,
int row,
int band=0)
const;
62 template<
typename T>
void readData(std::vector<T>& buffer,
const GDALDataType& dataType ,
int minCol,
int maxCol,
int row,
int band=0)
const;
63 template<
typename T>
void readData(std::vector<T>& buffer,
const GDALDataType& dataType ,
int minCol,
int maxCol,
double row,
int band=0, RESAMPLE resample=NEAR)
const;
64 template<
typename T>
void readDataBlock(
Vector2d<T>& buffer,
const GDALDataType& dataType ,
int minCol,
int maxCol,
int minRow,
int maxRow,
int band=0)
const;
65 template<
typename T>
void readDataBlock(std::vector<T>& buffer,
const GDALDataType& dataType ,
int minCol,
int maxCol,
int minRow,
int maxRow,
int band=0)
const;
66 template<
typename T>
void readData(std::vector<T>& buffer,
const GDALDataType& dataType,
int row,
int band=0)
const;
67 template<
typename T>
void readData(std::vector<T>& buffer,
const GDALDataType& dataType,
double row,
int band=0, RESAMPLE resample=NEAR)
const;
68 void getMinMax(
int startCol,
int endCol,
int startRow,
int endRow,
int band,
double& minValue,
double& maxValue)
const;
69 void getMinMax(
double& minValue,
double& maxValue,
int band=0)
const;
70 double getMin(
int& col,
int& row,
int band=0)
const;
71 double getHistogram(std::vector<double>& histvector,
double& min,
double& max,
unsigned int& nbin,
int theBand=0,
bool kde=
false);
72 double getMax(
int& col,
int& row,
int band=0)
const;
73 void getRefPix(
double& refX,
double &refY,
int band=0)
const;
74 void getRange(std::vector<short>& range,
int Band=0)
const;
75 unsigned long int getNvalid(
int band)
const;
78 void setCodec(
const GDALAccess& readMode=GA_ReadOnly);
80 std::vector<double> m_scale;
81 std::vector<double> m_offset;
91 template<
typename T>
void ImgReaderGdal::readData(T& value,
const GDALDataType& dataType,
int col,
int row,
int band)
const
94 GDALRasterBand *poBand;
95 assert(band<nrOfBand()+1);
96 poBand = m_gds->GetRasterBand(band+1);
97 assert(col<nrOfCol());
99 assert(row<nrOfRow());
101 poBand->RasterIO(GF_Read,col,row,1,1,&value,1,1,dataType,0,0);
102 if(m_scale.size()>band)
103 value=static_cast<double>(value)*m_scale[band];
104 if(m_offset.size()>band)
105 value=static_cast<double>(value)+m_offset[band];
108 template<
typename T>
void ImgReaderGdal::readData(std::vector<T>& buffer,
const GDALDataType& dataType,
int minCol,
int maxCol,
int row,
int band)
const
111 GDALRasterBand *poBand;
112 assert(band<nrOfBand()+1);
113 poBand = m_gds->GetRasterBand(band+1);
114 assert(minCol<nrOfCol());
116 assert(maxCol<nrOfCol());
117 assert(minCol<=maxCol);
118 assert(row<nrOfRow());
120 if(buffer.size()!=maxCol-minCol+1)
121 buffer.resize(maxCol-minCol+1);
122 poBand->RasterIO(GF_Read,minCol,row,buffer.size(),1,&(buffer[0]),buffer.size(),1,dataType,0,0);
123 if(m_scale.size()>band||m_offset.size()>band){
126 if(m_scale.size()>band)
127 theScale=m_scale[band];
128 if(m_offset.size()>band)
129 theOffset=m_offset[band];
130 for(
int index=0;index<buffer.size();++index)
131 buffer[index]=theScale*static_cast<double>(buffer[index])+theOffset;
135 template<
typename T>
void ImgReaderGdal::readData(std::vector<T>& buffer,
const GDALDataType& dataType ,
int minCol,
int maxCol,
double row,
int band, RESAMPLE resample)
const
138 std::vector<T> readBuffer_upper;
139 std::vector<T> readBuffer_lower;
140 if(buffer.size()!=maxCol-minCol+1)
141 buffer.resize(maxCol-minCol+1);
142 double upperRow=row-0.5;
143 upperRow=
static_cast<int>(upperRow);
144 double lowerRow=row+0.5;
145 lowerRow=
static_cast<int>(lowerRow);
148 if(lowerRow>=nrOfRow())
149 lowerRow=nrOfRow()-1;
152 readData(readBuffer_upper,GDT_Float64,minCol,maxCol,static_cast<int>(upperRow),band);
153 readData(readBuffer_lower,GDT_Float64,minCol,maxCol,static_cast<int>(lowerRow),band);
155 for(
int icol=0;icol<maxCol-minCol+1;++icol){
156 buffer[icol]=(lowerRow-row+0.5)*readBuffer_upper[icol]+(1-lowerRow+row-0.5)*readBuffer_lower[icol];
160 readData(buffer,GDT_Float64,minCol,maxCol,static_cast<int>(row),band);
165 template<
typename T>
void ImgReaderGdal::readDataBlock(
Vector2d<T>& buffer,
const GDALDataType& dataType ,
int minCol,
int maxCol,
int minRow,
int maxRow,
int band)
const
167 buffer.resize(maxRow-minRow+1);
168 for(
int irow=minRow;irow<=maxRow;++irow){
169 buffer[irow-minRow].resize(maxCol-minCol+1);
170 readData(buffer[irow-minRow],dataType,minCol,maxCol,irow,band);
174 template<
typename T>
void ImgReaderGdal::readDataBlock(std::vector<T>& buffer,
const GDALDataType& dataType ,
int minCol,
int maxCol,
int minRow,
int maxRow,
int band)
const
178 if(m_scale.size()>band)
179 theScale=m_scale[band];
180 if(m_offset.size()>band)
181 theOffset=m_offset[band];
183 GDALRasterBand *poBand;
184 assert(band<nrOfBand()+1);
185 poBand = m_gds->GetRasterBand(band+1);
186 if(minCol>=nrOfCol() ||
188 (maxCol>=nrOfCol()) ||
190 (minRow>=nrOfRow()) ||
192 (maxRow>=nrOfRow()) ||
194 std::string errorString=
"block not within image boundaries";
205 if(buffer.size()!=(maxRow-minRow+1)*(maxCol-minCol+1))
206 buffer.resize((maxRow-minRow+1)*(maxCol-minCol+1));
207 poBand->RasterIO(GF_Read,minCol,minRow,maxCol-minCol+1,maxRow-minRow+1,&(buffer[0]),(maxCol-minCol+1),(maxRow-minRow+1),dataType,0,0);
208 if(m_scale.size()>band||m_offset.size()>band){
209 for(
int index=0;index<buffer.size();++index)
210 buffer[index]=theScale*buffer[index]+theOffset;
235 template<
typename T>
void ImgReaderGdal::readData(std::vector<T>& buffer,
const GDALDataType& dataType,
int row,
int band)
const
237 readData(buffer,dataType,0,nrOfCol()-1,row,band);
240 template<
typename T>
void ImgReaderGdal::readData(std::vector<T>& buffer,
const GDALDataType& dataType,
double row,
int band, RESAMPLE resample)
const
242 readData(buffer,dataType,0,nrOfCol()-1,row,band,resample);
246 #endif // _IMGREADERGDAL_H_