24 #include "ogr_spatialref.h"
28 #include "ImgWriterGdal.h"
35 ImgWriterGdal::ImgWriterGdal(
void)
36 : m_gds(NULL), m_ncol(0), m_nrow(0), m_nband(0)
43 ImgWriterGdal::~ImgWriterGdal(
void)
51 void ImgWriterGdal::open(
const std::string& filename,
const ImgReaderGdal& imgSrc,
const std::vector<std::string>& options)
55 m_ncol=imgSrc.nrOfCol();
56 m_nrow=imgSrc.nrOfRow();
57 m_nband=imgSrc.nrOfBand();
58 m_type=imgSrc.getDataType();
81 void ImgWriterGdal::open(
const std::string& filename,
int ncol,
int nrow,
int nband,
const GDALDataType& dataType,
const std::string& imageType,
const std::vector<std::string>& options)
84 m_filename = filename;
98 void ImgWriterGdal::close(
void)
101 char **papszOptions=NULL;
102 for(std::vector<std::string>::const_iterator optionIt=m_options.begin();optionIt!=m_options.end();++optionIt)
103 papszOptions=CSLAddString(papszOptions,optionIt->c_str());
104 CSLDestroy(papszOptions);
110 GDALDriver *poDriver;
111 poDriver = GetGDALDriverManager()->GetDriverByName(imgSrc.getDriverDescription().c_str());
112 if( poDriver == NULL ){
113 std::string errorString=
"FileOpenError";
116 char **papszMetadata;
117 papszMetadata = poDriver->GetMetadata();
119 assert( CSLFetchBoolean( papszMetadata, GDAL_DCAP_CREATE, FALSE ));
120 char **papszOptions=NULL;
121 for(std::vector<std::string>::const_iterator optionIt=m_options.begin();optionIt!=m_options.end();++optionIt)
122 papszOptions=CSLAddString(papszOptions,optionIt->c_str());
130 m_gds=poDriver->Create(m_filename.c_str(),m_ncol,m_nrow,m_nband,m_type,papszOptions);
132 setProjection(imgSrc.getProjection());
134 imgSrc.getGeoTransform(gt);
137 m_gds->SetMetadata(imgSrc.getMetadata() );
138 m_gds->SetMetadataItem(
"TIFFTAG_DOCUMENTNAME", m_filename.c_str());
139 std::string versionString=
"pktools ";
140 versionString+=VERSION;
141 versionString+=
" by Pieter Kempeneers";
142 m_gds->SetMetadataItem(
"TIFFTAG_SOFTWARE", versionString.c_str());
146 time_t tim=time(NULL);
147 tm *now=localtime(&tim);
148 std::ostringstream datestream;
150 datestream << now->tm_year+1900;
152 datestream <<
":0" << now->tm_mon+1;
154 datestream <<
":" << now->tm_mon+1;
156 datestream <<
":0" << now->tm_mday;
158 datestream <<
":" << now->tm_mday;
160 datestream <<
" 0" << now->tm_hour;
162 datestream <<
" " << now->tm_hour;
164 datestream <<
":0" << now->tm_min;
166 datestream <<
":" << now->tm_min;
168 datestream <<
":0" << now->tm_sec;
170 datestream <<
":" << now->tm_sec;
171 m_gds->SetMetadataItem(
"TIFFTAG_DATETIME", datestream.str().c_str());
181 if(imgSrc.getColorTable()!=NULL)
182 setColorTable(imgSrc.getColorTable());
185 void ImgWriterGdal::setCodec(
const std::string& imageType)
188 GDALDriver *poDriver;
189 poDriver = GetGDALDriverManager()->GetDriverByName(imageType.c_str());
190 if( poDriver == NULL ){
191 std::ostringstream s;
192 s <<
"FileOpenError (" << imageType <<
")";
195 char **papszMetadata;
196 papszMetadata = poDriver->GetMetadata();
198 assert( CSLFetchBoolean( papszMetadata, GDAL_DCAP_CREATE, FALSE ));
199 char **papszOptions=NULL;
200 for(std::vector<std::string>::const_iterator optionIt=m_options.begin();optionIt!=m_options.end();++optionIt)
201 papszOptions=CSLAddString(papszOptions,optionIt->c_str());
208 m_gds=poDriver->Create(m_filename.c_str(),m_ncol,m_nrow,m_nband,m_type,papszOptions);
212 m_gds->SetMetadataItem(
"TIFFTAG_DOCUMENTNAME", m_filename.c_str());
213 std::string versionString=
"pktools ";
214 versionString+=VERSION;
215 versionString+=
" by Pieter Kempeneers";
216 m_gds->SetMetadataItem(
"TIFFTAG_SOFTWARE", versionString.c_str());
220 time_t tim=time(NULL);
221 tm *now=localtime(&tim);
222 std::ostringstream datestream;
224 datestream << now->tm_year+1900;
226 datestream <<
":0" << now->tm_mon+1;
228 datestream <<
":" << now->tm_mon+1;
230 datestream <<
":0" << now->tm_mday;
232 datestream <<
":" << now->tm_mday;
234 datestream <<
" 0" << now->tm_hour;
236 datestream <<
" " << now->tm_hour;
238 datestream <<
":0" << now->tm_min;
240 datestream <<
":" << now->tm_min;
242 datestream <<
":0" << now->tm_sec;
244 datestream <<
":" << now->tm_sec;
245 m_gds->SetMetadataItem(
"TIFFTAG_DATETIME", datestream.str().c_str());
249 void ImgWriterGdal::setMetadata(
char** metadata)
252 m_gds->SetMetadata(metadata);
255 std::string ImgWriterGdal::getProjection(
void)
const
258 std::string theProjection=m_gds->GetProjectionRef();
265 return theProjection;
269 void ImgWriterGdal::setGeoTransform(
double* gt){
278 m_gds->SetGeoTransform(m_gt);
299 void ImgWriterGdal::copyGeoTransform(
const ImgReaderGdal& imgSrc)
301 setProjection(imgSrc.getProjection());
303 imgSrc.getGeoTransform(gt);
309 std::string ImgWriterGdal::setProjectionProj4(
const std::string& projection)
314 OGRSpatialReference theRef;
315 theRef.SetFromUserInput(projection.c_str());
317 theRef.exportToWkt(&wktString);
319 m_gds->SetProjection(wktString);
344 void ImgWriterGdal::setProjection(
const std::string& projection)
348 OGRSpatialReference oSRS;
349 char *pszSRS_WKT = NULL;
351 m_gds->SetProjection(projection.c_str());
356 std::string ImgWriterGdal::setProjection(
void)
358 std::string theProjection;
359 OGRSpatialReference oSRS;
360 char *pszSRS_WKT = NULL;
362 oSRS.SetGeogCS(
"ETRS89",
"European_Terrestrial_Reference_System_1989",
"GRS 1980",6378137,298.2572221010042,
"Greenwich",0,
"degree",0.0174532925199433);
364 oSRS.SetProjCS(
"ETRS89 / ETRS-LAEA" );
365 oSRS.SetLAEA(52,10,4321000,3210000);
366 oSRS.exportToWkt( &pszSRS_WKT );
367 theProjection=pszSRS_WKT;
368 CPLFree( pszSRS_WKT );
370 m_gds->SetProjection(theProjection.c_str());
371 return(theProjection);
374 bool ImgWriterGdal::getBoundingBox(
double& ulx,
double& uly,
double& lrx,
double& lry)
const
377 m_gds->GetGeoTransform(gt);
389 lrx=gt[0]+nrOfCol()*gt[1]+nrOfRow()*gt[2];
390 lry=gt[3]+nrOfCol()*gt[4]+nrOfRow()*gt[5];
407 bool ImgWriterGdal::getCentrePos(
double& x,
double& y)
const
410 m_gds->GetGeoTransform(gt);
419 x=gt[0]+(nrOfCol()/2.0)*gt[1]+(nrOfRow()/2.0)*gt[2];
420 y=gt[3]+(nrOfCol()/2.0)*gt[4]+(nrOfRow()/2.0)*gt[5];
430 bool ImgWriterGdal::geo2image(
double x,
double y,
double& i,
double& j)
const
435 m_gds->GetGeoTransform(gt);
443 double denom=(gt[1]-gt[2]*gt[4]/gt[5]);
446 i=(x-gt[0]-gt[2]/gt[5]*(y-gt[3]))/denom;
447 j=(y-gt[3]-gt[4]*(x-gt[0]-gt[2]/gt[5]*(y-gt[3]))/denom)/gt[5];
464 bool ImgWriterGdal::image2geo(
double i,
double j,
double& x,
double& y)
const
467 m_gds->GetGeoTransform(gt);
477 x=gt[0]+(0.5+i)*gt[1]+(0.5+j)*gt[2];
478 y=gt[3]+(0.5+i)*gt[4]+(0.5+j)*gt[5];
489 bool ImgWriterGdal::covers(
double x,
double y)
const
491 double theULX, theULY, theLRX, theLRY;
492 getBoundingBox(theULX,theULY,theLRX,theLRY);
493 return((x > theULX)&&
499 bool ImgWriterGdal::covers(
double ulx,
double uly,
double lrx,
double lry)
const
501 double theULX, theULY, theLRX, theLRY;
502 getBoundingBox(theULX,theULY,theLRX,theLRY);
503 return((ulx < theLRX)&&(lrx > theULX)&&(lry < theULY)&&(uly > theLRY));
506 std::string ImgWriterGdal::getGeoTransform()
const
510 m_gds->GetGeoTransform(gt);
519 std::ostringstream s;
520 s <<
"[" << gt[0] <<
"," << gt[1] <<
"," << gt[2] <<
"," << gt[3] <<
"," << gt[4] <<
"," << gt[5] <<
"]";
524 void ImgWriterGdal::getGeoTransform(
double* gt)
const{
526 m_gds->GetGeoTransform(gt);
559 GDALDataType ImgWriterGdal::getDataType(
int band)
const
561 assert(band<m_nband+1);
562 return (m_gds->GetRasterBand(band+1))->GetRasterDataType();
565 GDALRasterBand* ImgWriterGdal::getRasterBand(
int band)
567 assert(band<m_nband+1);
568 return (m_gds->GetRasterBand(band+1));
572 void ImgWriterGdal::setColorTable(
const std::string& filename,
int band)
575 std::ifstream ftable(filename.c_str(),std::ios::in);
578 GDALColorTable colorTable;
580 while(getline(ftable,line)){
582 std::istringstream ist(line);
583 GDALColorEntry sEntry;
585 ist >>
id >> sEntry.c1 >> sEntry.c2 >> sEntry.c3 >> sEntry.c4;
587 colorTable.SetColorEntry(
id,&sEntry);
591 (m_gds->GetRasterBand(band+1))->SetColorTable(&colorTable);
594 void ImgWriterGdal::setColorTable(GDALColorTable* colorTable,
int band)
596 (m_gds->GetRasterBand(band+1))->SetColorTable(colorTable);
600 bool ImgWriterGdal::writeData(
void* pdata,
const GDALDataType& dataType,
int band)
const{
602 GDALRasterBand *poBand;
603 if(band>=nrOfBand()+1){
604 std::ostringstream s;
605 s <<
"band (" << band <<
") exceeds nrOfBand (" << nrOfBand() <<
")";
608 poBand = m_gds->GetRasterBand(band+1);
609 poBand->RasterIO(GF_Write,0,0,nrOfCol(),nrOfRow(),pdata,nrOfCol(),nrOfRow(),dataType,0,0);
613 void ImgWriterGdal::rasterizeOgr(
ImgReaderOgr& ogrReader,
const std::vector<double>& burnValues,
const std::vector<std::string>& layernames ){
614 std::vector<int> bands;
615 std::vector<double> burnBands;
616 std::vector<double> burnLayers;
617 if(burnValues.empty()){
618 std::string errorString=
"Error: burn values not provided";
621 burnBands=burnValues;
622 while(burnBands.size()<nrOfBand())
623 burnBands.push_back(burnValues[0]);
624 for(
int iband=0;iband<nrOfBand();++iband)
625 bands.push_back(iband+1);
626 std::vector<OGRLayerH> layers;
628 for(
int ilayer=0;ilayer<ogrReader.getLayerCount();++ilayer){
629 std::string currentLayername=ogrReader.getLayer(ilayer)->GetName();
630 if(layernames.size())
631 if(find(layernames.begin(),layernames.end(),currentLayername)==layernames.end())
633 std::cout <<
"processing layer " << currentLayername << std::endl;
634 layers.push_back((OGRLayerH)ogrReader.getLayer(ilayer));
636 for(
int iband=0;iband<nrOfBand();++iband)
637 burnLayers.insert(burnLayers.end(),burnBands.begin(),burnBands.end());
641 double dfComplete=0.0;
642 const char* pszMessage;
643 void* pProgressArg=NULL;
644 GDALProgressFunc pfnProgress=GDALTermProgress;
645 pfnProgress(dfComplete,pszMessage,pProgressArg);
646 if(GDALRasterizeLayers( (GDALDatasetH)m_gds,nrOfBand(),&(bands[0]),layers.size(),&(layers[0]),NULL,pTransformArg,&(burnLayers[0]),papszOptions,pfnProgress,pProgressArg)!=CE_None){
647 std::cerr << CPLGetLastErrorMsg() << std::endl;
652 pfnProgress(dfComplete,pszMessage,pProgressArg);