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"
69 int main(
int argc,
char *argv[])
74 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);
75 Optionpk<int> nodata_opt(
"nodata",
"nodata",
"nodata value to put in image if not valid (0)", 0);
76 Optionpk<string> colorTable_opt(
"ct",
"ct",
"color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid)");
78 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",
"");
79 Optionpk<string> oformat_opt(
"of",
"oformat",
"Output image format (see also gdal_translate).",
"GTiff");
80 Optionpk<string> code_opt(
"code",
"code",
"Recode text file (2 colums: from to)");
81 Optionpk<string> class_opt(
"c",
"class",
"list of classes to reclass (in combination with reclass option)");
82 Optionpk<string> reclass_opt(
"r",
"reclass",
"list of recoded classes (in combination with class option)");
83 Optionpk<string> fieldname_opt(
"n",
"fname",
"field name of the shape file to be replaced",
"label");
84 Optionpk<string> option_opt(
"co",
"co",
"Creation option for output file. Multiple options can be specified.");
85 Optionpk<string> description_opt(
"d",
"description",
"Set image description");
90 doProcess=input_opt.retrieveOption(argc,argv);
91 mask_opt.retrieveOption(argc,argv);
92 masknodata_opt.retrieveOption(argc,argv);
93 nodata_opt.retrieveOption(argc,argv);
94 code_opt.retrieveOption(argc,argv);
95 class_opt.retrieveOption(argc,argv);
96 reclass_opt.retrieveOption(argc,argv);
97 colorTable_opt.retrieveOption(argc,argv);
98 output_opt.retrieveOption(argc,argv);
99 type_opt.retrieveOption(argc,argv);
100 oformat_opt.retrieveOption(argc,argv);
101 band_opt.retrieveOption(argc,argv);
102 fieldname_opt.retrieveOption(argc,argv);
103 option_opt.retrieveOption(argc,argv);
104 description_opt.retrieveOption(argc,argv);
105 verbose_opt.retrieveOption(argc,argv);
107 catch(
string predefinedString){
108 std::cout << predefinedString << std::endl;
113 cout <<
"Usage: pkreclass -i input [-c from -r to]* -o output" << endl;
115 std::cout <<
"short option -h shows basic options only, use long option --help to show all options" << std::endl;
119 if(input_opt.empty()){
120 std::cerr <<
"No input file provided (use option -i). Use --help for help information" << std::endl;
123 if(output_opt.empty()){
124 std::cerr <<
"No output file provided (use option -o). Use --help for help information" << std::endl;
131 map<string,string> codemapString;
132 map<double,double> codemap;
135 cout <<
"opening code text file " << code_opt[0] << endl;
137 codefile.open(code_opt[0].c_str());
140 while(codefile>>theKey){
141 codefile >> theValue;
142 codemapString[theKey]=theValue;
143 codemap[string2type<double>(theKey)]=string2type<double>(theValue);
148 assert(class_opt.size()==reclass_opt.size());
149 for(
int iclass=0;iclass<class_opt.size();++iclass){
150 codemapString[class_opt[iclass]]=reclass_opt[iclass];
151 codemap[string2type<double>(class_opt[iclass])]=string2type<double>(reclass_opt[iclass]);
154 assert(codemapString.size());
155 assert(codemap.size());
158 map<string,string>::iterator mit;
159 cout << codemapString.size() <<
" codes used: " << endl;
160 for(mit=codemapString.begin();mit!=codemapString.end();++mit)
161 cout << (*mit).first <<
" " << (*mit).second << endl;
163 bool refIsRaster=
false;
166 ogrReader.open(input_opt[0]);
168 catch(
string errorString){
174 cout <<
"opening " << input_opt[0] <<
" for reading " << endl;
177 cout <<
"opening " << output_opt[0] <<
" for writing " << endl;
180 cout <<
"copied layer from " << input_opt[0] << endl << flush;
181 OGRFeatureDefn *poFDefn = ogrWriter.getLayer()->GetLayerDefn();
184 cout <<
"reset reading" << endl;
185 ogrReader.getLayer()->ResetReading();
186 unsigned long int ifeature=0;
188 cout <<
"going through features" << endl << flush;
191 OGRFeature *poFeature;
192 poFeature=ogrReader.getLayer()->GetNextFeature();
195 OGRFeatureDefn *poFDefn = ogrWriter.getLayer()->GetLayerDefn();
197 for(
int iField=0;iField<poFDefn->GetFieldCount();++iField){
198 OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);
199 string fieldname=poFieldDefn->GetNameRef();
200 if(fieldname==fieldname_opt[0]){
201 string fromClass=poFeature->GetFieldAsString(iField);
202 string toClass=fromClass;
203 if(codemapString.find(fromClass)!=codemapString.end())
204 toClass=codemapString[fromClass];
205 poFeature->SetField(iField,toClass.c_str());
207 cout <<
"feature " << ifeature <<
": " << fromClass <<
"->" << poFeature->GetFieldAsInteger(iField) << endl << flush;
212 ogrWriter.createFeature(poFeature);
213 OGRFeature::DestroyFeature( poFeature );
217 cout <<
"replaced " << ifeature <<
" features" << endl;
223 vector<ImgReaderGdal> maskReader(mask_opt.size());
226 cout <<
"opening input image file " << input_opt[0] << endl;
227 inputReader.open(input_opt[0]);
228 for(
int imask=0;imask<mask_opt.size();++imask){
230 cout <<
"opening mask image file " << mask_opt[imask] << endl;
231 maskReader[imask].open(mask_opt[imask]);
234 cout <<
"opening output image file " << output_opt[0] << endl;
235 cout <<
"data type: " << type_opt[0] << endl;
238 GDALDataType theType=GDT_Unknown;
240 cout <<
"possible output data types: ";
241 for(
int iType = 0; iType < GDT_TypeCount; ++iType){
243 cout <<
" " << GDALGetDataTypeName((GDALDataType)iType);
244 if( GDALGetDataTypeName((GDALDataType)iType) != NULL
245 && EQUAL(GDALGetDataTypeName((GDALDataType)iType),
246 type_opt[0].c_str()))
247 theType=(GDALDataType) iType;
249 if(theType==GDT_Unknown)
250 theType=inputReader.getDataType();
252 cout << endl <<
"Output pixel type: " << GDALGetDataTypeName(theType) << endl;
253 if(option_opt.findSubstring(
"INTERLEAVE=")==option_opt.end()){
254 string theInterleave=
"INTERLEAVE=";
255 theInterleave+=inputReader.getInterleave();
256 option_opt.push_back(theInterleave);
258 outputWriter.open(output_opt[0],inputReader.nrOfCol(),inputReader.nrOfRow(),inputReader.nrOfBand(),theType,oformat_opt[0],option_opt);
259 for(
int iband=0;iband<inputReader.nrOfBand();++iband)
260 outputWriter.GDALSetNoDataValue(nodata_opt[0],iband);
261 if(description_opt.size())
262 outputWriter.setImageDescription(description_opt[0]);
264 if(colorTable_opt.size()){
265 if(colorTable_opt[0]!=
"none")
266 outputWriter.setColorTable(colorTable_opt[0]);
268 else if (inputReader.getColorTable()!=NULL)
269 outputWriter.setColorTable(inputReader.getColorTable());
272 if(inputReader.isGeoRef()){
273 for(
int imask=0;imask<mask_opt.size();++imask)
274 assert(maskReader[imask].isGeoRef());
276 outputWriter.copyGeoTransform(inputReader);
277 outputWriter.setProjection(inputReader.getProjection());
278 double ulx,uly,lrx,lry;
279 inputReader.getBoundingBox(ulx,uly,lrx,lry);
280 outputWriter.copyGeoTransform(inputReader);
281 assert(nodata_opt.size()==masknodata_opt.size());
282 if(verbose_opt[0]&&mask_opt.size()){
283 for(
int iv=0;iv<masknodata_opt.size();++iv)
284 cout << masknodata_opt[iv] <<
"->" << nodata_opt[iv] << endl;
287 assert(outputWriter.nrOfCol()==inputReader.nrOfCol());
291 for(
int imask=0;imask<mask_opt.size();++imask)
292 lineMask[imask].resize(maskReader[imask].nrOfCol());
293 Vector2d<double> lineOutput(outputWriter.nrOfBand(),outputWriter.nrOfCol());
296 const char* pszMessage;
297 void* pProgressArg=NULL;
298 GDALProgressFunc pfnProgress=GDALTermProgress;
300 pfnProgress(progress,pszMessage,pProgressArg);
301 double oldRowMask=-1;
302 for(irow=0;irow<inputReader.nrOfRow();++irow){
304 for(
int iband=0;iband<inputReader.nrOfBand();++iband){
307 inputReader.readData(lineInput[iband],GDT_Float64,irow,iband);
309 catch(
string errorstring){
310 cerr << errorstring << endl;
315 double colMask,rowMask;
316 for(icol=0;icol<inputReader.nrOfCol();++icol){
318 if(mask_opt.size()>1){
319 for(
int imask=0;imask<mask_opt.size();++imask){
320 inputReader.image2geo(icol,irow,x,y);
321 maskReader[imask].geo2image(x,y,colMask,rowMask);
322 if(static_cast<int>(rowMask)!=static_cast<int>(oldRowMask)){
323 assert(rowMask>=0&&rowMask<maskReader[imask].nrOfRow());
325 maskReader[imask].readData(lineMask[imask],GDT_Int16,static_cast<int>(rowMask));
327 catch(
string errorstring){
328 cerr << errorstring << endl;
334 if(mask_opt.size()==masknodata_opt.size())
335 ivalue=masknodata_opt[imask];
337 ivalue=masknodata_opt[0];
338 if(lineMask[imask][colMask]==ivalue){
339 for(
int iband=0;iband<inputReader.nrOfBand();++iband)
340 lineInput[iband][icol]=nodata_opt[imask];
346 else if(mask_opt.size()){
347 inputReader.image2geo(icol,irow,x,y);
348 maskReader[0].geo2image(x,y,colMask,rowMask);
349 if(static_cast<int>(rowMask)!=static_cast<int>(oldRowMask)){
350 assert(rowMask>=0&&rowMask<maskReader[0].nrOfRow());
352 maskReader[0].readData(lineMask[0],GDT_Int16,static_cast<int>(rowMask));
354 catch(
string errorstring){
355 cerr << errorstring << endl;
360 for(
int ivalue=0;ivalue<masknodata_opt.size();++ivalue){
361 assert(masknodata_opt.size()==nodata_opt.size());
362 if(lineMask[0][colMask]==masknodata_opt[ivalue]){
363 for(
int iband=0;iband<inputReader.nrOfBand();++iband)
364 lineInput[iband][icol]=nodata_opt[ivalue];
370 for(
int iband=0;iband<lineOutput.size();++iband){
371 lineOutput[iband][icol]=lineInput[iband][icol];
372 if(find(band_opt.begin(),band_opt.end(),iband)!=band_opt.end()){
373 if(!masked && codemap.find(lineInput[iband][icol])!=codemap.end()){
374 double toValue=codemap[lineInput[iband][icol]];
375 lineOutput[iband][icol]=toValue;
382 for(
int iband=0;iband<outputWriter.nrOfBand();++iband)
383 outputWriter.writeData(lineOutput[iband],GDT_Float64,irow,iband);
385 catch(
string errorstring){
386 cerr << errorstring << endl;
390 progress=
static_cast<float>((irow+1.0)/outputWriter.nrOfRow());
391 pfnProgress(progress,pszMessage,pProgressArg);
394 outputWriter.close();