22 #include "base/Optionpk.h"
23 #include "imageclasses/ImgReaderOgr.h"
24 #include "imageclasses/ImgWriterOgr.h"
25 #include "imageclasses/ImgReaderGdal.h"
26 #include "imageclasses/ImgWriterGdal.h"
68 int main(
int argc,
char *argv[])
73 Optionpk<unsigned short> masknodata_opt(
"msknodata",
"msknodata",
"Mask value(s) where image has nodata. Use one value for each mask, or multiple values for a single mask.", 1);
74 Optionpk<int> nodata_opt(
"nodata",
"nodata",
"nodata value to put in image if not valid (0)", 0);
75 Optionpk<string> colorTable_opt(
"ct",
"ct",
"color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid)");
77 Optionpk<string> type_opt(
"ot",
"otype",
"Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image",
"");
78 Optionpk<string> code_opt(
"code",
"code",
"Recode text file (2 colums: from to)");
79 Optionpk<string> class_opt(
"c",
"class",
"list of classes to reclass (in combination with reclass option)");
80 Optionpk<string> reclass_opt(
"r",
"reclass",
"list of recoded classes (in combination with class option)");
81 Optionpk<string> fieldname_opt(
"n",
"fname",
"field name of the shape file to be replaced",
"label");
82 Optionpk<string> option_opt(
"co",
"co",
"Creation option for output file. Multiple options can be specified.");
83 Optionpk<string> description_opt(
"d",
"description",
"Set image description");
88 doProcess=input_opt.retrieveOption(argc,argv);
89 mask_opt.retrieveOption(argc,argv);
90 masknodata_opt.retrieveOption(argc,argv);
91 nodata_opt.retrieveOption(argc,argv);
92 code_opt.retrieveOption(argc,argv);
93 class_opt.retrieveOption(argc,argv);
94 reclass_opt.retrieveOption(argc,argv);
95 colorTable_opt.retrieveOption(argc,argv);
96 output_opt.retrieveOption(argc,argv);
97 type_opt.retrieveOption(argc,argv);
98 band_opt.retrieveOption(argc,argv);
99 fieldname_opt.retrieveOption(argc,argv);
100 option_opt.retrieveOption(argc,argv);
101 description_opt.retrieveOption(argc,argv);
102 verbose_opt.retrieveOption(argc,argv);
104 catch(
string predefinedString){
105 std::cout << predefinedString << std::endl;
110 cout <<
"Usage: pkreclass -i input [-c from -r to]* -o output" << endl;
112 std::cout <<
"short option -h shows basic options only, use long option --help to show all options" << std::endl;
116 if(input_opt.empty()){
117 std::cerr <<
"No input file provided (use option -i). Use --help for help information" << std::endl;
120 if(output_opt.empty()){
121 std::cerr <<
"No output file provided (use option -o). Use --help for help information" << std::endl;
128 map<string,string> codemapString;
129 map<double,double> codemap;
132 cout <<
"opening code text file " << code_opt[0] << endl;
134 codefile.open(code_opt[0].c_str());
137 while(codefile>>theKey){
138 codefile >> theValue;
139 codemapString[theKey]=theValue;
140 codemap[string2type<double>(theKey)]=string2type<double>(theValue);
145 assert(class_opt.size()==reclass_opt.size());
146 for(
int iclass=0;iclass<class_opt.size();++iclass){
147 codemapString[class_opt[iclass]]=reclass_opt[iclass];
148 codemap[string2type<double>(class_opt[iclass])]=string2type<double>(reclass_opt[iclass]);
151 assert(codemapString.size());
152 assert(codemap.size());
155 map<string,string>::iterator mit;
156 cout << codemapString.size() <<
" codes used: " << endl;
157 for(mit=codemapString.begin();mit!=codemapString.end();++mit)
158 cout << (*mit).first <<
" " << (*mit).second << endl;
160 bool refIsRaster=
false;
163 ogrReader.open(input_opt[0]);
165 catch(
string errorString){
171 cout <<
"opening " << input_opt[0] <<
" for reading " << endl;
174 cout <<
"opening " << output_opt[0] <<
" for writing " << endl;
177 cout <<
"copied layer from " << input_opt[0] << endl << flush;
178 OGRFeatureDefn *poFDefn = ogrWriter.getLayer()->GetLayerDefn();
181 cout <<
"reset reading" << endl;
182 ogrReader.getLayer()->ResetReading();
183 unsigned long int ifeature=0;
185 cout <<
"going through features" << endl << flush;
188 OGRFeature *poFeature;
189 poFeature=ogrReader.getLayer()->GetNextFeature();
192 OGRFeatureDefn *poFDefn = ogrWriter.getLayer()->GetLayerDefn();
194 for(
int iField=0;iField<poFDefn->GetFieldCount();++iField){
195 OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);
196 string fieldname=poFieldDefn->GetNameRef();
197 if(fieldname==fieldname_opt[0]){
198 string fromClass=poFeature->GetFieldAsString(iField);
199 string toClass=fromClass;
200 if(codemapString.find(fromClass)!=codemapString.end())
201 toClass=codemapString[fromClass];
202 poFeature->SetField(iField,toClass.c_str());
204 cout <<
"feature " << ifeature <<
": " << fromClass <<
"->" << poFeature->GetFieldAsInteger(iField) << endl << flush;
209 ogrWriter.createFeature(poFeature);
210 OGRFeature::DestroyFeature( poFeature );
214 cout <<
"replaced " << ifeature <<
" features" << endl;
220 vector<ImgReaderGdal> maskReader(mask_opt.size());
223 cout <<
"opening input image file " << input_opt[0] << endl;
224 inputReader.open(input_opt[0]);
225 for(
int imask=0;imask<mask_opt.size();++imask){
227 cout <<
"opening mask image file " << mask_opt[imask] << endl;
228 maskReader[imask].open(mask_opt[imask]);
231 cout <<
"opening output image file " << output_opt[0] << endl;
232 cout <<
"data type: " << type_opt[0] << endl;
235 GDALDataType theType=GDT_Unknown;
237 cout <<
"possible output data types: ";
238 for(
int iType = 0; iType < GDT_TypeCount; ++iType){
240 cout <<
" " << GDALGetDataTypeName((GDALDataType)iType);
241 if( GDALGetDataTypeName((GDALDataType)iType) != NULL
242 && EQUAL(GDALGetDataTypeName((GDALDataType)iType),
243 type_opt[0].c_str()))
244 theType=(GDALDataType) iType;
246 if(theType==GDT_Unknown)
247 theType=inputReader.getDataType();
249 cout << endl <<
"Output pixel type: " << GDALGetDataTypeName(theType) << endl;
250 if(option_opt.findSubstring(
"INTERLEAVE=")==option_opt.end()){
251 string theInterleave=
"INTERLEAVE=";
252 theInterleave+=inputReader.getInterleave();
253 option_opt.push_back(theInterleave);
255 outputWriter.open(output_opt[0],inputReader.nrOfCol(),inputReader.nrOfRow(),inputReader.nrOfBand(),theType,inputReader.getImageType(),option_opt);
256 for(
int iband=0;iband<inputReader.nrOfBand();++iband)
257 outputWriter.GDALSetNoDataValue(nodata_opt[0],iband);
258 if(description_opt.size())
259 outputWriter.setImageDescription(description_opt[0]);
261 if(colorTable_opt.size()){
262 if(colorTable_opt[0]!=
"none")
263 outputWriter.setColorTable(colorTable_opt[0]);
265 else if (inputReader.getColorTable()!=NULL)
266 outputWriter.setColorTable(inputReader.getColorTable());
269 if(inputReader.isGeoRef()){
270 for(
int imask=0;imask<mask_opt.size();++imask)
271 assert(maskReader[imask].isGeoRef());
273 outputWriter.copyGeoTransform(inputReader);
274 outputWriter.setProjection(inputReader.getProjection());
275 double ulx,uly,lrx,lry;
276 inputReader.getBoundingBox(ulx,uly,lrx,lry);
277 outputWriter.copyGeoTransform(inputReader);
278 assert(nodata_opt.size()==masknodata_opt.size());
279 if(verbose_opt[0]&&mask_opt.size()){
280 for(
int iv=0;iv<masknodata_opt.size();++iv)
281 cout << masknodata_opt[iv] <<
"->" << nodata_opt[iv] << endl;
284 assert(outputWriter.nrOfCol()==inputReader.nrOfCol());
288 for(
int imask=0;imask<mask_opt.size();++imask)
289 lineMask[imask].resize(maskReader[imask].nrOfCol());
290 Vector2d<double> lineOutput(outputWriter.nrOfBand(),outputWriter.nrOfCol());
293 const char* pszMessage;
294 void* pProgressArg=NULL;
295 GDALProgressFunc pfnProgress=GDALTermProgress;
297 pfnProgress(progress,pszMessage,pProgressArg);
298 double oldRowMask=-1;
299 for(irow=0;irow<inputReader.nrOfRow();++irow){
301 for(
int iband=0;iband<inputReader.nrOfBand();++iband){
304 inputReader.readData(lineInput[iband],GDT_Float64,irow,iband);
306 catch(
string errorstring){
307 cerr << errorstring << endl;
312 double colMask,rowMask;
313 for(icol=0;icol<inputReader.nrOfCol();++icol){
315 if(mask_opt.size()>1){
316 for(
int imask=0;imask<mask_opt.size();++imask){
317 inputReader.image2geo(icol,irow,x,y);
318 maskReader[imask].geo2image(x,y,colMask,rowMask);
319 if(static_cast<int>(rowMask)!=static_cast<int>(oldRowMask)){
320 assert(rowMask>=0&&rowMask<maskReader[imask].nrOfRow());
322 maskReader[imask].readData(lineMask[imask],GDT_Int16,static_cast<int>(rowMask));
324 catch(
string errorstring){
325 cerr << errorstring << endl;
331 if(mask_opt.size()==masknodata_opt.size())
332 ivalue=masknodata_opt[imask];
334 ivalue=masknodata_opt[0];
335 if(lineMask[imask][colMask]==ivalue){
336 for(
int iband=0;iband<inputReader.nrOfBand();++iband)
337 lineInput[iband][icol]=nodata_opt[imask];
343 else if(mask_opt.size()){
344 inputReader.image2geo(icol,irow,x,y);
345 maskReader[0].geo2image(x,y,colMask,rowMask);
346 if(static_cast<int>(rowMask)!=static_cast<int>(oldRowMask)){
347 assert(rowMask>=0&&rowMask<maskReader[0].nrOfRow());
349 maskReader[0].readData(lineMask[0],GDT_Int16,static_cast<int>(rowMask));
351 catch(
string errorstring){
352 cerr << errorstring << endl;
357 for(
int ivalue=0;ivalue<masknodata_opt.size();++ivalue){
358 assert(masknodata_opt.size()==nodata_opt.size());
359 if(lineMask[0][colMask]==masknodata_opt[ivalue]){
360 for(
int iband=0;iband<inputReader.nrOfBand();++iband)
361 lineInput[iband][icol]=nodata_opt[ivalue];
367 for(
int iband=0;iband<lineOutput.size();++iband){
368 lineOutput[iband][icol]=lineInput[iband][icol];
369 if(find(band_opt.begin(),band_opt.end(),iband)!=band_opt.end()){
370 if(!masked && codemap.find(lineInput[iband][icol])!=codemap.end()){
371 double toValue=codemap[lineInput[iband][icol]];
372 lineOutput[iband][icol]=toValue;
379 for(
int iband=0;iband<outputWriter.nrOfBand();++iband)
380 outputWriter.writeData(lineOutput[iband],GDT_Float64,irow,iband);
382 catch(
string errorstring){
383 cerr << errorstring << endl;
387 progress=
static_cast<float>((irow+1.0)/outputWriter.nrOfRow());
388 pfnProgress(progress,pszMessage,pProgressArg);
391 outputWriter.close();