20 #include "ImgReaderGdal.h"
24 #include <gsl/gsl_cdf.h>
26 ImgReaderGdal::ImgReaderGdal(
void){};
28 ImgReaderGdal::~ImgReaderGdal(
void)
36 void ImgReaderGdal::open(
const std::string& filename,
const GDALAccess& readMode)
38 m_filename = filename;
42 void ImgReaderGdal::close(
void)
44 ImgRasterGdal::close();
47 void ImgReaderGdal::setCodec(
const GDALAccess& readMode)
50 m_gds = (GDALDataset *) GDALOpen(m_filename.c_str(), readMode );
52 std::string errorString=
"FileOpenError";
55 m_ncol= m_gds->GetRasterXSize();
56 m_nrow= m_gds->GetRasterYSize();
57 m_nband= m_gds->GetRasterCount();
61 double adfGeoTransform[6];
62 m_gds->GetGeoTransform( adfGeoTransform );
64 m_gt[0]=adfGeoTransform[0];
65 m_gt[1]=adfGeoTransform[1];
66 m_gt[2]=adfGeoTransform[2];
67 m_gt[3]=adfGeoTransform[3];
68 m_gt[4]=adfGeoTransform[4];
69 m_gt[5]=adfGeoTransform[5];
82 double ImgReaderGdal::getMin(
int& x,
int& y,
int band)
const{
84 std::vector<double> lineBuffer(nrOfCol());
86 for(
int irow=0;irow<nrOfRow();++irow){
87 readData(lineBuffer,GDT_Float64,irow,band);
88 for(
int icol=0;icol<nrOfCol();++icol){
89 if(isNoData(lineBuffer[icol]))
92 if(lineBuffer[icol]<minValue){
95 minValue=lineBuffer[icol];
101 minValue=lineBuffer[icol];
109 throw(static_cast<std::string>(
"Warning: not initialized"));
112 double ImgReaderGdal::getMax(
int& x,
int& y,
int band)
const{
114 std::vector<double> lineBuffer(nrOfCol());
116 for(
int irow=0;irow<nrOfRow();++irow){
117 readData(lineBuffer,GDT_Float64,irow,band);
118 for(
int icol=0;icol<nrOfCol();++icol){
119 if(isNoData(lineBuffer[icol]))
122 if(lineBuffer[icol]>maxValue){
125 maxValue=lineBuffer[icol];
131 maxValue=lineBuffer[icol];
139 throw(static_cast<std::string>(
"Warning: not initialized"));
142 void ImgReaderGdal::getMinMax(
int startCol,
int endCol,
int startRow,
int endRow,
int band,
double& minValue,
double& maxValue)
const
144 bool isConstraint=(maxValue>minValue);
145 double minConstraint=minValue;
146 double maxConstraint=maxValue;
147 std::vector<double> lineBuffer(endCol-startCol+1);
149 assert(endRow<nrOfRow());
150 for(
int irow=startCol;irow<endRow+1;++irow){
151 readData(lineBuffer,GDT_Float64,startCol,endCol,irow,band);
152 for(
int icol=0;icol<lineBuffer.size();++icol){
153 if(isNoData(lineBuffer[icol]))
157 if(lineBuffer[icol]<minConstraint)
159 if(lineBuffer[icol]>maxConstraint)
162 if(lineBuffer[icol]<minValue)
163 minValue=lineBuffer[icol];
164 if(lineBuffer[icol]>maxValue)
165 maxValue=lineBuffer[icol];
169 if(lineBuffer[icol]<minConstraint)
171 if(lineBuffer[icol]>maxConstraint)
174 minValue=lineBuffer[icol];
175 maxValue=lineBuffer[icol];
181 throw(static_cast<std::string>(
"Warning: not initialized"));
184 void ImgReaderGdal::getMinMax(
double& minValue,
double& maxValue,
int band)
const
186 bool isConstraint=(maxValue>minValue);
187 double minConstraint=minValue;
188 double maxConstraint=maxValue;
189 std::vector<double> lineBuffer(nrOfCol());
191 for(
int irow=0;irow<nrOfRow();++irow){
192 readData(lineBuffer,GDT_Float64,irow,band);
193 for(
int icol=0;icol<nrOfCol();++icol){
194 if(isNoData(lineBuffer[icol]))
198 if(lineBuffer[icol]<minConstraint)
200 if(lineBuffer[icol]>maxConstraint)
203 if(lineBuffer[icol]<minValue)
204 minValue=lineBuffer[icol];
205 if(lineBuffer[icol]>maxValue)
206 maxValue=lineBuffer[icol];
210 if(lineBuffer[icol]<minConstraint)
212 if(lineBuffer[icol]>maxConstraint)
215 minValue=lineBuffer[icol];
216 maxValue=lineBuffer[icol];
222 throw(static_cast<std::string>(
"Warning: not initialized"));
225 double ImgReaderGdal::getHistogram(std::vector<double>& histvector,
double& min,
double& max,
unsigned int& nbin,
int theBand,
bool kde){
230 getMinMax(minValue,maxValue,theBand);
235 if(min<max&&min>minValue)
237 if(min<max&&max<maxValue)
246 GDALProgressFunc pfnProgress;
248 GDALRasterBand* rasterBand;
249 rasterBand=getRasterBand(theBand);
250 rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev,pfnProgress,pProgressData);
255 if(m_scale.size()>theBand){
256 stdDev*=m_scale[theBand];
258 sigma=1.06*stdDev*pow(getNvalid(theBand),-0.2);
262 if(maxValue>minValue){
264 nbin=maxValue-minValue+1;
265 scale=
static_cast<double>(nbin-1)/(maxValue-minValue);
270 if(histvector.size()!=nbin){
271 histvector.resize(nbin);
272 for(
int i=0;i<nbin;histvector[i++]=0);
275 unsigned long int nsample=0;
276 unsigned long int ninvalid=0;
277 std::vector<double> lineBuffer(nrOfCol());
278 for(
int irow=0;irow<nrOfRow();++irow){
279 readData(lineBuffer,GDT_Float64,irow,theBand);
280 for(
int icol=0;icol<nrOfCol();++icol){
281 if(isNoData(lineBuffer[icol]))
283 else if(lineBuffer[icol]>maxValue)
285 else if(lineBuffer[icol]<minValue)
295 for(
int ibin=0;ibin<nbin;++ibin){
296 double icenter=minValue+
static_cast<double>(maxValue-minValue)*(ibin+0.5)/nbin;
297 double thePdf=gsl_ran_gaussian_pdf(lineBuffer[icol]-icenter, sigma);
298 histvector[ibin]+=thePdf;
303 int theBin=
static_cast<unsigned long int>(scale*(lineBuffer[icol]-minValue));
306 ++histvector[theBin];
320 void ImgReaderGdal::getRange(std::vector<short>& range,
int band)
const
322 std::vector<short> lineBuffer(nrOfCol());
324 for(
int irow=0;irow<nrOfRow();++irow){
325 readData(lineBuffer,GDT_Int16,irow,band);
326 for(
int icol=0;icol<nrOfCol();++icol){
327 if(find(range.begin(),range.end(),lineBuffer[icol])==range.end())
328 range.push_back(lineBuffer[icol]);
331 sort(range.begin(),range.end());
334 unsigned long int ImgReaderGdal::getNvalid(
int band)
const
336 unsigned long int nvalid=0;
337 if(m_noDataValues.size()){
338 std::vector<double> lineBuffer(nrOfCol());
339 for(
int irow=0;irow<nrOfRow();++irow){
340 readData(lineBuffer,GDT_Float64,irow,band);
341 for(
int icol=0;icol<nrOfCol();++icol){
342 if(isNoData(lineBuffer[icol]))
351 return(nrOfCol()*nrOfRow());
355 void ImgReaderGdal::getRefPix(
double& refX,
double &refY,
int band)
const
357 std::vector<double> lineBuffer(nrOfCol());
362 for(
int irow=0;irow<nrOfRow();++irow){
363 readData(lineBuffer,GDT_Float64,irow,band);
364 for(
int icol=0;icol<nrOfCol();++icol){
367 if(!isNoData(lineBuffer[icol])){
378 double cgravi=validCol/nvalidCol-0.5;
379 double cgravj=validRow/nvalidRow-0.5;
380 double refpixeli=floor(cgravi);
381 double refpixelj=ceil(cgravj-1);
383 image2geo(refpixeli,refpixelj,refX,refY);
385 refX-=0.5*getDeltaX();
386 refY-=0.5*getDeltaY();
389 refX=floor(validCol/nvalidCol-0.5);
390 refY=floor(validRow/nvalidRow-0.5);