20 #include "ImgReaderGdal.h"
24 #include <gsl/gsl_cdf.h>
26 ImgReaderGdal::ImgReaderGdal(
void)
27 : m_gds(NULL), m_ncol(0), m_nrow(0), m_nband(0)
30 void ImgReaderGdal::open(
const std::string& filename)
32 m_filename = filename;
36 ImgReaderGdal::~ImgReaderGdal(
void)
44 void ImgReaderGdal::close(
void)
49 void ImgReaderGdal::setCodec()
52 m_gds = (GDALDataset *) GDALOpen(m_filename.c_str(), GA_ReadOnly );
54 std::string errorString=
"FileOpenError";
57 m_ncol= m_gds->GetRasterXSize();
58 m_nrow= m_gds->GetRasterYSize();
59 m_nband= m_gds->GetRasterCount();
63 double adfGeoTransform[6];
64 m_gds->GetGeoTransform( adfGeoTransform );
66 m_gt[0]=adfGeoTransform[0];
67 m_gt[1]=adfGeoTransform[1];
68 m_gt[2]=adfGeoTransform[2];
69 m_gt[3]=adfGeoTransform[3];
70 m_gt[4]=adfGeoTransform[4];
71 m_gt[5]=adfGeoTransform[5];
83 std::string ImgReaderGdal::getProjection(
void)
const
85 std::string theProjection=m_gds->GetProjectionRef();
94 std::string ImgReaderGdal::getProjectionRef(
void)
const
96 std::string theProjection;
97 if(m_gds->GetProjectionRef())
98 return(m_gds->GetProjectionRef());
103 GDALDataType ImgReaderGdal::getDataType(
int band)
const
105 assert(band<m_nband+1);
106 return (m_gds->GetRasterBand(band+1))->GetRasterDataType();
109 GDALRasterBand* ImgReaderGdal::getRasterBand(
int band)
111 assert(band<m_nband+1);
112 return (m_gds->GetRasterBand(band+1));
115 GDALColorTable* ImgReaderGdal::getColorTable(
int band)
const
117 assert(band<m_nband+1);
118 return (m_gds->GetRasterBand(band+1))->GetColorTable();
121 std::string ImgReaderGdal::getDriverDescription()
const
123 return m_gds->GetDriver()->GetDescription();
126 void ImgReaderGdal::getGeoTransform(
double* gt)
const{
127 m_gds->GetGeoTransform(gt);
142 std::string ImgReaderGdal::getGeoTransform()
const
145 m_gds->GetGeoTransform(gt);
146 std::ostringstream s;
147 s <<
"[" << gt[0] <<
"," << gt[1] <<
"," << gt[2] <<
"," << gt[3] <<
"," << gt[4] <<
"," << gt[5] <<
"]";
166 char** ImgReaderGdal::getMetadata()
168 if(m_gds->GetMetadata()!=NULL)
169 return(m_gds->GetMetadata());
174 char** ImgReaderGdal::getMetadata()
const
176 if(m_gds->GetMetadata()!=NULL)
177 return(m_gds->GetMetadata());
182 void ImgReaderGdal::getMetadata(std::list<std::string>& metadata)
const
184 char** cmetadata=m_gds->GetMetadata();
185 while(*cmetadata!=NULL){
186 metadata.push_back(*(cmetadata));
191 std::string ImgReaderGdal::getDescription()
const
193 if(m_gds->GetDriver()->GetDescription()!=NULL)
194 return m_gds->GetDriver()->GetDescription();
199 std::string ImgReaderGdal::getMetadataItem()
const
201 if(m_gds->GetDriver()->GetMetadataItem( GDAL_DMD_LONGNAME )!=NULL)
202 return m_gds->GetDriver()->GetMetadataItem( GDAL_DMD_LONGNAME );
206 std::string ImgReaderGdal::getImageDescription()
const
208 if(m_gds->GetDriver()->GetMetadataItem(
"TIFFTAG_IMAGEDESCRIPTION")!=NULL)
209 return m_gds->GetDriver()->GetMetadataItem(
"TIFFTAG_IMAGEDESCRIPTION");
214 std::string ImgReaderGdal::getInterleave()
const
216 if(m_gds->GetMetadataItem(
"INTERLEAVE",
"IMAGE_STRUCTURE"))
217 return m_gds->GetMetadataItem(
"INTERLEAVE",
"IMAGE_STRUCTURE");
222 std::string ImgReaderGdal::getCompression()
const
224 if(m_gds->GetMetadataItem(
"COMPRESSION",
"IMAGE_STRUCTURE"))
225 return m_gds->GetMetadataItem(
"COMPRESSION",
"IMAGE_STRUCTURE");
230 bool ImgReaderGdal::getBoundingBox(
double& ulx,
double& uly,
double& lrx,
double& lry)
const
233 m_gds->GetGeoTransform(gt);
244 lrx=gt[0]+nrOfCol()*gt[1]+nrOfRow()*gt[2];
245 lry=gt[3]+nrOfCol()*gt[4]+nrOfRow()*gt[5];
262 bool ImgReaderGdal::getCenterPos(
double& x,
double& y)
const
265 m_gds->GetGeoTransform(gt);
274 x=gt[0]+(nrOfCol()/2.0)*gt[1]+(nrOfRow()/2.0)*gt[2];
275 y=gt[3]+(nrOfCol()/2.0)*gt[4]+(nrOfRow()/2.0)*gt[5];
289 bool ImgReaderGdal::geo2image(
double x,
double y,
double& i,
double& j)
const
293 m_gds->GetGeoTransform(gt);
302 double denom=(gt[1]-gt[2]*gt[4]/gt[5]);
305 i=(x-gt[0]-gt[2]/gt[5]*(y-gt[3]))/denom;
306 j=(y-gt[3]-gt[4]*(x-gt[0]-gt[2]/gt[5]*(y-gt[3]))/denom)/gt[5];
323 bool ImgReaderGdal::image2geo(
double i,
double j,
double& x,
double& y)
const
326 m_gds->GetGeoTransform(gt);
336 x=gt[0]+(0.5+i)*gt[1]+(0.5+j)*gt[2];
337 y=gt[3]+(0.5+i)*gt[4]+(0.5+j)*gt[5];
350 bool ImgReaderGdal::covers(
double x,
double y)
const
352 double theULX, theULY, theLRX, theLRY;
353 getBoundingBox(theULX,theULY,theLRX,theLRY);
354 return((x > theULX)&&
360 bool ImgReaderGdal::covers(
double ulx,
double uly,
double lrx,
double lry)
const
362 double theULX, theULY, theLRX, theLRY;
363 getBoundingBox(theULX,theULY,theLRX,theLRY);
364 return((ulx < theLRX)&&(lrx > theULX)&&(lry < theULY)&&(uly > theLRY));
367 double ImgReaderGdal::getMin(
int& x,
int& y,
int band)
const{
369 std::vector<double> lineBuffer(nrOfCol());
371 for(
int irow=0;irow<nrOfRow();++irow){
372 readData(lineBuffer,GDT_Float64,irow,band);
373 for(
int icol=0;icol<nrOfCol();++icol){
374 if(isNoData(lineBuffer[icol]))
377 if(lineBuffer[icol]<minValue){
380 minValue=lineBuffer[icol];
386 minValue=lineBuffer[icol];
394 throw(static_cast<std::string>(
"Warning: not initialized"));
397 double ImgReaderGdal::getMax(
int& x,
int& y,
int band)
const{
399 std::vector<double> lineBuffer(nrOfCol());
401 for(
int irow=0;irow<nrOfRow();++irow){
402 readData(lineBuffer,GDT_Float64,irow,band);
403 for(
int icol=0;icol<nrOfCol();++icol){
404 if(isNoData(lineBuffer[icol]))
407 if(lineBuffer[icol]>maxValue){
410 maxValue=lineBuffer[icol];
416 maxValue=lineBuffer[icol];
424 throw(static_cast<std::string>(
"Warning: not initialized"));
427 void ImgReaderGdal::getMinMax(
int startCol,
int endCol,
int startRow,
int endRow,
int band,
double& minValue,
double& maxValue)
const
429 bool isConstraint=(maxValue>minValue);
430 double minConstraint=minValue;
431 double maxConstraint=maxValue;
432 std::vector<double> lineBuffer(endCol-startCol+1);
434 assert(endRow<nrOfRow());
435 for(
int irow=startCol;irow<endRow+1;++irow){
436 readData(lineBuffer,GDT_Float64,startCol,endCol,irow,band);
437 for(
int icol=0;icol<lineBuffer.size();++icol){
438 if(isNoData(lineBuffer[icol]))
442 if(lineBuffer[icol]<minConstraint)
444 if(lineBuffer[icol]>maxConstraint)
447 if(lineBuffer[icol]<minValue)
448 minValue=lineBuffer[icol];
449 if(lineBuffer[icol]>maxValue)
450 maxValue=lineBuffer[icol];
454 if(lineBuffer[icol]<minConstraint)
456 if(lineBuffer[icol]>maxConstraint)
459 minValue=lineBuffer[icol];
460 maxValue=lineBuffer[icol];
466 throw(static_cast<std::string>(
"Warning: not initialized"));
469 void ImgReaderGdal::getMinMax(
double& minValue,
double& maxValue,
int band)
const
471 bool isConstraint=(maxValue>minValue);
472 double minConstraint=minValue;
473 double maxConstraint=maxValue;
474 std::vector<double> lineBuffer(nrOfCol());
476 for(
int irow=0;irow<nrOfRow();++irow){
477 readData(lineBuffer,GDT_Float64,irow,band);
478 for(
int icol=0;icol<nrOfCol();++icol){
479 if(isNoData(lineBuffer[icol]))
483 if(lineBuffer[icol]<minConstraint)
485 if(lineBuffer[icol]>maxConstraint)
488 if(lineBuffer[icol]<minValue)
489 minValue=lineBuffer[icol];
490 if(lineBuffer[icol]>maxValue)
491 maxValue=lineBuffer[icol];
495 if(lineBuffer[icol]<minConstraint)
497 if(lineBuffer[icol]>maxConstraint)
500 minValue=lineBuffer[icol];
501 maxValue=lineBuffer[icol];
507 throw(static_cast<std::string>(
"Warning: not initialized"));
510 double ImgReaderGdal::getHistogram(std::vector<double>& histvector,
double& min,
double& max,
unsigned int& nbin,
int theBand,
bool kde){
515 getMinMax(minValue,maxValue,theBand);
520 if(min<max&&min>minValue)
522 if(min<max&&max<maxValue)
531 GDALProgressFunc pfnProgress;
533 GDALRasterBand* rasterBand;
534 rasterBand=getRasterBand(theBand);
535 rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev,pfnProgress,pProgressData);
540 if(m_scale.size()>theBand){
541 stdDev*=m_scale[theBand];
543 sigma=1.06*stdDev*pow(getNvalid(theBand),-0.2);
547 if(maxValue>minValue){
549 nbin=maxValue-minValue+1;
550 scale=
static_cast<double>(nbin-1)/(maxValue-minValue);
555 if(histvector.size()!=nbin){
556 histvector.resize(nbin);
557 for(
int i=0;i<nbin;histvector[i++]=0);
560 unsigned long int nsample=0;
561 unsigned long int ninvalid=0;
562 std::vector<double> lineBuffer(nrOfCol());
563 for(
int irow=0;irow<nrOfRow();++irow){
564 readData(lineBuffer,GDT_Float64,irow,theBand);
565 for(
int icol=0;icol<nrOfCol();++icol){
566 if(isNoData(lineBuffer[icol]))
568 else if(lineBuffer[icol]>maxValue)
570 else if(lineBuffer[icol]<minValue)
580 for(
int ibin=0;ibin<nbin;++ibin){
581 double icenter=minValue+
static_cast<double>(maxValue-minValue)*(ibin+0.5)/nbin;
582 double thePdf=gsl_ran_gaussian_pdf(lineBuffer[icol]-icenter, sigma);
583 histvector[ibin]+=thePdf;
588 int theBin=
static_cast<unsigned long int>(scale*(lineBuffer[icol]-minValue));
591 ++histvector[theBin];
605 void ImgReaderGdal::getRange(std::vector<short>& range,
int band)
const
607 std::vector<short> lineBuffer(nrOfCol());
609 for(
int irow=0;irow<nrOfRow();++irow){
610 readData(lineBuffer,GDT_Int16,irow,band);
611 for(
int icol=0;icol<nrOfCol();++icol){
612 if(find(range.begin(),range.end(),lineBuffer[icol])==range.end())
613 range.push_back(lineBuffer[icol]);
616 sort(range.begin(),range.end());
619 unsigned long int ImgReaderGdal::getNvalid(
int band)
const
621 unsigned long int nvalid=0;
622 if(m_noDataValues.size()){
623 std::vector<double> lineBuffer(nrOfCol());
624 for(
int irow=0;irow<nrOfRow();++irow){
625 readData(lineBuffer,GDT_Float64,irow,band);
626 for(
int icol=0;icol<nrOfCol();++icol){
627 if(isNoData(lineBuffer[icol]))
636 return(nrOfCol()*nrOfRow());
639 int ImgReaderGdal::getNoDataValues(std::vector<double>& noDataValues)
const
641 if(m_noDataValues.size()){
642 noDataValues=m_noDataValues;
643 return m_noDataValues.size();
649 int ImgReaderGdal::pushNoDataValue(
double noDataValue)
651 if(find(m_noDataValues.begin(),m_noDataValues.end(),noDataValue)==m_noDataValues.end())
652 m_noDataValues.push_back(noDataValue);
653 return(m_noDataValues.size());
666 void ImgReaderGdal::getRefPix(
double& refX,
double &refY,
int band)
const
668 std::vector<double> lineBuffer(nrOfCol());
673 for(
int irow=0;irow<nrOfRow();++irow){
674 readData(lineBuffer,GDT_Float64,irow,band);
675 for(
int icol=0;icol<nrOfCol();++icol){
678 if(!isNoData(lineBuffer[icol])){
689 double cgravi=validCol/nvalidCol-0.5;
690 double cgravj=validRow/nvalidRow-0.5;
691 double refpixeli=floor(cgravi);
692 double refpixelj=ceil(cgravj-1);
694 image2geo(refpixeli,refpixelj,refX,refY);
696 refX-=0.5*getDeltaX();
697 refY-=0.5*getDeltaY();
700 refX=floor(validCol/nvalidCol-0.5);
701 refY=floor(validRow/nvalidRow-0.5);