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){
375 if(!isNoData(lineBuffer[icol])){
379 minValue=lineBuffer[icol];
382 else if(minValue>lineBuffer[icol]){
385 minValue=lineBuffer[icol];
393 throw(static_cast<std::string>(
"Warning: not initialized"));
396 double ImgReaderGdal::getMax(
int& x,
int& y,
int band)
const{
398 std::vector<double> lineBuffer(nrOfCol());
400 for(
int irow=0;irow<nrOfRow();++irow){
401 readData(lineBuffer,GDT_Float64,irow,band);
402 for(
int icol=0;icol<nrOfCol();++icol){
405 if(!isNoData(lineBuffer[icol])){
409 maxValue=lineBuffer[icol];
412 else if(maxValue<lineBuffer[icol]){
415 maxValue=lineBuffer[icol];
423 throw(static_cast<std::string>(
"Warning: not initialized"));
426 void ImgReaderGdal::getMinMax(
int startCol,
int endCol,
int startRow,
int endRow,
int band,
double& minValue,
double& maxValue)
const
441 std::vector<double> lineBuffer(endCol-startCol+1);
443 assert(endRow<nrOfRow());
444 for(
int irow=startCol;irow<endRow+1;++irow){
445 readData(lineBuffer,GDT_Float64,startCol,endCol,irow,band);
446 for(
int icol=0;icol<lineBuffer.size();++icol){
447 if(!isNoData(lineBuffer[icol])){
449 minValue=lineBuffer[icol];
450 maxValue=lineBuffer[icol];
454 if(minValue>lineBuffer[icol])
455 minValue=lineBuffer[icol];
456 if(maxValue<lineBuffer[icol])
457 maxValue=lineBuffer[icol];
463 throw(static_cast<std::string>(
"Warning: not initialized"));
466 void ImgReaderGdal::getMinMax(
double& minValue,
double& maxValue,
int band,
bool exhaustiveSearch)
const
468 if(exhaustiveSearch){
469 std::vector<double> lineBuffer(nrOfCol());
471 for(
int irow=0;irow<nrOfRow();++irow){
472 readData(lineBuffer,GDT_Float64,irow,band);
473 for(
int icol=0;icol<nrOfCol();++icol){
476 if(!isNoData(lineBuffer[icol])){
478 minValue=lineBuffer[icol];
479 maxValue=lineBuffer[icol];
483 if(minValue>lineBuffer[icol])
484 minValue=lineBuffer[icol];
485 if(maxValue<lineBuffer[icol])
486 maxValue=lineBuffer[icol];
492 throw(static_cast<std::string>(
"Warning: not initialized"));
495 GDALRasterBand *poBand;
496 int bGotMin, bGotMax;
499 poBand = m_gds->GetRasterBand(band+1);
500 adfMinMax[0] = poBand->GetMinimum( &bGotMin );
501 adfMinMax[1] = poBand->GetMaximum( &bGotMax );
502 if( ! (bGotMin && bGotMax) )
503 GDALComputeRasterMinMax((GDALRasterBandH)poBand, FALSE, adfMinMax);
504 minValue=adfMinMax[0];
505 maxValue=adfMinMax[1];
506 if(m_scale.size()>band){
507 minValue*=m_scale[band];
508 maxValue*=m_scale[band];
510 if(m_offset.size()>band){
511 minValue+=m_offset[band];
512 maxValue+=m_offset[band];
517 double ImgReaderGdal::getHistogram(std::vector<double>& histvector,
double& min,
double& max,
unsigned int& nbin,
int theBand,
bool kde){
522 getMinMax(minValue,maxValue,theBand);
527 if(min<max&&min>minValue)
529 if(min<max&&max<maxValue)
538 GDALProgressFunc pfnProgress;
540 GDALRasterBand* rasterBand;
541 rasterBand=getRasterBand(theBand);
542 rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev,pfnProgress,pProgressData);
547 if(m_scale.size()>theBand){
548 stdDev*=m_scale[theBand];
550 sigma=1.06*stdDev*pow(getNvalid(theBand),-0.2);
554 if(maxValue>minValue){
556 nbin=maxValue-minValue+1;
557 scale=
static_cast<double>(nbin-1)/(maxValue-minValue);
562 if(histvector.size()!=nbin){
563 histvector.resize(nbin);
564 for(
int i=0;i<nbin;histvector[i++]=0);
567 unsigned long int nsample=0;
568 unsigned long int ninvalid=0;
569 std::vector<double> lineBuffer(nrOfCol());
570 for(
int irow=0;irow<nrOfRow();++irow){
571 readData(lineBuffer,GDT_Float64,irow,theBand);
572 for(
int icol=0;icol<nrOfCol();++icol){
573 if(isNoData(lineBuffer[icol]))
575 else if(lineBuffer[icol]>maxValue)
577 else if(lineBuffer[icol]<minValue)
587 for(
int ibin=0;ibin<nbin;++ibin){
588 double icenter=minValue+
static_cast<double>(maxValue-minValue)*(ibin+0.5)/nbin;
589 double thePdf=gsl_ran_gaussian_pdf(lineBuffer[icol]-icenter, sigma);
590 histvector[ibin]+=thePdf;
595 int theBin=
static_cast<unsigned long int>(scale*(lineBuffer[icol]-minValue));
598 ++histvector[theBin];
612 void ImgReaderGdal::getRange(std::vector<short>& range,
int band)
const
614 std::vector<short> lineBuffer(nrOfCol());
616 for(
int irow=0;irow<nrOfRow();++irow){
617 readData(lineBuffer,GDT_Int16,irow,band);
618 for(
int icol=0;icol<nrOfCol();++icol){
619 if(find(range.begin(),range.end(),lineBuffer[icol])==range.end())
620 range.push_back(lineBuffer[icol]);
623 sort(range.begin(),range.end());
626 unsigned long int ImgReaderGdal::getNvalid(
int band)
const
628 unsigned long int nvalid=0;
629 if(m_noDataValues.size()){
630 std::vector<double> lineBuffer(nrOfCol());
631 for(
int irow=0;irow<nrOfRow();++irow){
632 readData(lineBuffer,GDT_Float64,irow,band);
633 for(
int icol=0;icol<nrOfCol();++icol){
634 if(isNoData(lineBuffer[icol]))
643 return(nrOfCol()*nrOfRow());
646 int ImgReaderGdal::getNoDataValues(std::vector<double>& noDataValues)
const
648 if(m_noDataValues.size()){
649 noDataValues=m_noDataValues;
650 return m_noDataValues.size();
656 int ImgReaderGdal::pushNoDataValue(
double noDataValue)
658 if(find(m_noDataValues.begin(),m_noDataValues.end(),noDataValue)==m_noDataValues.end())
659 m_noDataValues.push_back(noDataValue);
660 return(m_noDataValues.size());
673 void ImgReaderGdal::getRefPix(
double& refX,
double &refY,
int band)
const
675 std::vector<double> lineBuffer(nrOfCol());
680 for(
int irow=0;irow<nrOfRow();++irow){
681 readData(lineBuffer,GDT_Float64,irow,band);
682 for(
int icol=0;icol<nrOfCol();++icol){
685 if(!isNoData(lineBuffer[icol])){
696 double cgravi=validCol/nvalidCol-0.5;
697 double cgravj=validRow/nvalidRow-0.5;
698 double refpixeli=floor(cgravi);
699 double refpixelj=ceil(cgravj-1);
701 image2geo(refpixeli,refpixelj,refX,refY);
703 refX-=0.5*getDeltaX();
704 refY-=0.5*getDeltaY();
707 refX=floor(validCol/nvalidCol-0.5);
708 refY=floor(validRow/nvalidRow-0.5);