24 #include "ogr_spatialref.h"
28 #include "ImgWriterGdal.h"
40 ImgWriterGdal::ImgWriterGdal(
void){};
42 ImgWriterGdal::~ImgWriterGdal(
void)
50 void ImgWriterGdal::open(
const std::string& filename,
const ImgReaderGdal& imgSrc,
const std::vector<std::string>& options)
54 m_ncol=imgSrc.nrOfCol();
55 m_nrow=imgSrc.nrOfRow();
56 m_nband=imgSrc.nrOfBand();
80 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)
83 m_filename = filename;
93 setCodec(dataType,imageType);
97 void ImgWriterGdal::close(
void)
99 ImgRasterGdal::close();
100 char **papszOptions=NULL;
101 for(std::vector<std::string>::const_iterator optionIt=m_options.begin();optionIt!=m_options.end();++optionIt)
102 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,imgSrc.getDataType(),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 GDALDataType& dataType,
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,dataType,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);
256 void ImgWriterGdal::setGeoTransform(
double* gt){
265 m_gds->SetGeoTransform(m_gt);
286 void ImgWriterGdal::copyGeoTransform(
const ImgReaderGdal& imgSrc)
288 setProjection(imgSrc.getProjection());
290 imgSrc.getGeoTransform(gt);
296 std::string ImgWriterGdal::setProjectionProj4(
const std::string& projection)
301 OGRSpatialReference theRef;
302 theRef.SetFromUserInput(projection.c_str());
304 theRef.exportToWkt(&wktString);
306 m_gds->SetProjection(wktString);
331 void ImgWriterGdal::setProjection(
const std::string& projection)
335 OGRSpatialReference oSRS;
336 char *pszSRS_WKT = NULL;
338 m_gds->SetProjection(projection.c_str());
362 void ImgWriterGdal::setColorTable(
const std::string& filename,
int band)
365 std::ifstream ftable(filename.c_str(),std::ios::in);
368 GDALColorTable colorTable;
370 while(getline(ftable,line)){
372 std::istringstream ist(line);
373 GDALColorEntry sEntry;
375 ist >>
id >> sEntry.c1 >> sEntry.c2 >> sEntry.c3 >> sEntry.c4;
377 colorTable.SetColorEntry(
id,&sEntry);
381 (m_gds->GetRasterBand(band+1))->SetColorTable(&colorTable);
384 void ImgWriterGdal::setColorTable(GDALColorTable* colorTable,
int band)
386 (m_gds->GetRasterBand(band+1))->SetColorTable(colorTable);
390 bool ImgWriterGdal::writeData(
void* pdata,
const GDALDataType& dataType,
int band)
const{
392 GDALRasterBand *poBand;
393 if(band>=nrOfBand()+1){
394 std::ostringstream s;
395 s <<
"band (" << band <<
") exceeds nrOfBand (" << nrOfBand() <<
")";
398 poBand = m_gds->GetRasterBand(band+1);
399 poBand->RasterIO(GF_Write,0,0,nrOfCol(),nrOfRow(),pdata,nrOfCol(),nrOfRow(),dataType,0,0);
403 void ImgWriterGdal::rasterizeOgr(
ImgReaderOgr& ogrReader,
const std::vector<double>& burnValues,
const std::vector<std::string>& layernames ){
404 std::vector<int> bands;
405 std::vector<double> burnBands;
406 std::vector<double> burnLayers;
407 if(burnValues.empty()){
408 std::string errorString=
"Error: burn values not provided";
411 burnBands=burnValues;
412 while(burnBands.size()<nrOfBand())
413 burnBands.push_back(burnValues[0]);
414 for(
int iband=0;iband<nrOfBand();++iband)
415 bands.push_back(iband+1);
416 std::vector<OGRLayerH> layers;
418 for(
int ilayer=0;ilayer<ogrReader.getLayerCount();++ilayer){
419 std::string currentLayername=ogrReader.getLayer(ilayer)->GetName();
420 if(layernames.size())
421 if(find(layernames.begin(),layernames.end(),currentLayername)==layernames.end())
423 std::cout <<
"processing layer " << currentLayername << std::endl;
424 layers.push_back((OGRLayerH)ogrReader.getLayer(ilayer));
426 for(
int iband=0;iband<nrOfBand();++iband)
427 burnLayers.insert(burnLayers.end(),burnBands.begin(),burnBands.end());
431 double dfComplete=0.0;
432 const char* pszMessage;
433 void* pProgressArg=NULL;
434 GDALProgressFunc pfnProgress=GDALTermProgress;
435 pfnProgress(dfComplete,pszMessage,pProgressArg);
436 if(GDALRasterizeLayers( (GDALDatasetH)m_gds,nrOfBand(),&(bands[0]),layers.size(),&(layers[0]),NULL,pTransformArg,&(burnLayers[0]),papszOptions,pfnProgress,pProgressArg)!=CE_None){
437 std::cerr << CPLGetLastErrorMsg() << std::endl;
442 pfnProgress(dfComplete,pszMessage,pProgressArg);