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"
30 int main(
int argc,
char *argv[])
35 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);
36 Optionpk<int> nodata_opt(
"nodata",
"nodata",
"nodata value to put in image if not valid (0)", 0);
37 Optionpk<string> colorTable_opt(
"ct",
"ct",
"color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid)");
39 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",
"");
40 Optionpk<string> code_opt(
"code",
"code",
"Recode text file (2 colums: from to)");
41 Optionpk<string> class_opt(
"c",
"class",
"list of classes to reclass (in combination with reclass option)");
42 Optionpk<string> reclass_opt(
"r",
"reclass",
"list of recoded classes (in combination with class option)");
43 Optionpk<string> fieldname_opt(
"n",
"fname",
"field name of the shape file to be replaced",
"label");
44 Optionpk<string> option_opt(
"co",
"co",
"Creation option for output file. Multiple options can be specified.");
45 Optionpk<string> description_opt(
"d",
"description",
"Set image description");
50 doProcess=input_opt.retrieveOption(argc,argv);
51 mask_opt.retrieveOption(argc,argv);
52 masknodata_opt.retrieveOption(argc,argv);
53 nodata_opt.retrieveOption(argc,argv);
54 code_opt.retrieveOption(argc,argv);
55 class_opt.retrieveOption(argc,argv);
56 reclass_opt.retrieveOption(argc,argv);
57 colorTable_opt.retrieveOption(argc,argv);
58 output_opt.retrieveOption(argc,argv);
59 type_opt.retrieveOption(argc,argv);
60 band_opt.retrieveOption(argc,argv);
61 fieldname_opt.retrieveOption(argc,argv);
62 option_opt.retrieveOption(argc,argv);
63 description_opt.retrieveOption(argc,argv);
64 verbose_opt.retrieveOption(argc,argv);
66 catch(
string predefinedString){
67 std::cout << predefinedString << std::endl;
72 cout <<
"Usage: pkreclass -i input [-c from -r to]* -o output" << endl;
74 std::cout <<
"short option -h shows basic options only, use long option --help to show all options" << std::endl;
78 if(input_opt.empty()){
79 std::cerr <<
"No input file provided (use option -i). Use --help for help information" << std::endl;
82 if(output_opt.empty()){
83 std::cerr <<
"No output file provided (use option -o). Use --help for help information" << std::endl;
90 map<string,string> codemapString;
91 map<double,double> codemap;
94 cout <<
"opening code text file " << code_opt[0] << endl;
96 codefile.open(code_opt[0].c_str());
99 while(codefile>>theKey){
100 codefile >> theValue;
101 codemapString[theKey]=theValue;
102 codemap[string2type<double>(theKey)]=string2type<double>(theValue);
107 assert(class_opt.size()==reclass_opt.size());
108 for(
int iclass=0;iclass<class_opt.size();++iclass){
109 codemapString[class_opt[iclass]]=reclass_opt[iclass];
110 codemap[string2type<double>(class_opt[iclass])]=string2type<double>(reclass_opt[iclass]);
113 assert(codemapString.size());
114 assert(codemap.size());
117 map<string,string>::iterator mit;
118 cout << codemapString.size() <<
" codes used: " << endl;
119 for(mit=codemapString.begin();mit!=codemapString.end();++mit)
120 cout << (*mit).first <<
" " << (*mit).second << endl;
122 bool refIsRaster=
false;
125 ogrReader.open(input_opt[0]);
127 catch(
string errorString){
133 cout <<
"opening " << input_opt[0] <<
" for reading " << endl;
136 cout <<
"opening " << output_opt[0] <<
" for writing " << endl;
139 cout <<
"copied layer from " << input_opt[0] << endl << flush;
140 OGRFeatureDefn *poFDefn = ogrWriter.getLayer()->GetLayerDefn();
143 cout <<
"reset reading" << endl;
144 ogrReader.getLayer()->ResetReading();
145 unsigned long int ifeature=0;
147 cout <<
"going through features" << endl << flush;
150 OGRFeature *poFeature;
151 poFeature=ogrReader.getLayer()->GetNextFeature();
154 OGRFeatureDefn *poFDefn = ogrWriter.getLayer()->GetLayerDefn();
156 for(
int iField=0;iField<poFDefn->GetFieldCount();++iField){
157 OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);
158 string fieldname=poFieldDefn->GetNameRef();
159 if(fieldname==fieldname_opt[0]){
160 string fromClass=poFeature->GetFieldAsString(iField);
161 string toClass=fromClass;
162 if(codemapString.find(fromClass)!=codemapString.end())
163 toClass=codemapString[fromClass];
164 poFeature->SetField(iField,toClass.c_str());
166 cout <<
"feature " << ifeature <<
": " << fromClass <<
"->" << poFeature->GetFieldAsInteger(iField) << endl << flush;
171 ogrWriter.createFeature(poFeature);
172 OGRFeature::DestroyFeature( poFeature );
176 cout <<
"replaced " << ifeature <<
" features" << endl;
182 vector<ImgReaderGdal> maskReader(mask_opt.size());
185 cout <<
"opening input image file " << input_opt[0] << endl;
186 inputReader.open(input_opt[0]);
187 for(
int imask=0;imask<mask_opt.size();++imask){
189 cout <<
"opening mask image file " << mask_opt[imask] << endl;
190 maskReader[imask].open(mask_opt[imask]);
193 cout <<
"opening output image file " << output_opt[0] << endl;
194 cout <<
"data type: " << type_opt[0] << endl;
197 GDALDataType theType=GDT_Unknown;
199 cout <<
"possible output data types: ";
200 for(
int iType = 0; iType < GDT_TypeCount; ++iType){
202 cout <<
" " << GDALGetDataTypeName((GDALDataType)iType);
203 if( GDALGetDataTypeName((GDALDataType)iType) != NULL
204 && EQUAL(GDALGetDataTypeName((GDALDataType)iType),
205 type_opt[0].c_str()))
206 theType=(GDALDataType) iType;
208 if(theType==GDT_Unknown)
209 theType=inputReader.getDataType();
211 cout << endl <<
"Output pixel type: " << GDALGetDataTypeName(theType) << endl;
212 if(option_opt.findSubstring(
"INTERLEAVE=")==option_opt.end()){
213 string theInterleave=
"INTERLEAVE=";
214 theInterleave+=inputReader.getInterleave();
215 option_opt.push_back(theInterleave);
217 outputWriter.open(output_opt[0],inputReader.nrOfCol(),inputReader.nrOfRow(),inputReader.nrOfBand(),theType,inputReader.getImageType(),option_opt);
218 for(
int iband=0;iband<inputReader.nrOfBand();++iband)
219 outputWriter.GDALSetNoDataValue(nodata_opt[0],iband);
220 if(description_opt.size())
221 outputWriter.setImageDescription(description_opt[0]);
223 if(colorTable_opt.size()){
224 if(colorTable_opt[0]!=
"none")
225 outputWriter.setColorTable(colorTable_opt[0]);
227 else if (inputReader.getColorTable()!=NULL)
228 outputWriter.setColorTable(inputReader.getColorTable());
231 if(inputReader.isGeoRef()){
232 for(
int imask=0;imask<mask_opt.size();++imask)
233 assert(maskReader[imask].isGeoRef());
235 outputWriter.copyGeoTransform(inputReader);
236 outputWriter.setProjection(inputReader.getProjection());
237 double ulx,uly,lrx,lry;
238 inputReader.getBoundingBox(ulx,uly,lrx,lry);
239 outputWriter.copyGeoTransform(inputReader);
240 assert(nodata_opt.size()==masknodata_opt.size());
241 if(verbose_opt[0]&&mask_opt.size()){
242 for(
int iv=0;iv<masknodata_opt.size();++iv)
243 cout << masknodata_opt[iv] <<
"->" << nodata_opt[iv] << endl;
246 assert(outputWriter.nrOfCol()==inputReader.nrOfCol());
250 for(
int imask=0;imask<mask_opt.size();++imask)
251 lineMask[imask].resize(maskReader[imask].nrOfCol());
252 Vector2d<double> lineOutput(outputWriter.nrOfBand(),outputWriter.nrOfCol());
255 const char* pszMessage;
256 void* pProgressArg=NULL;
257 GDALProgressFunc pfnProgress=GDALTermProgress;
259 pfnProgress(progress,pszMessage,pProgressArg);
260 double oldRowMask=-1;
261 for(irow=0;irow<inputReader.nrOfRow();++irow){
263 for(
int iband=0;iband<inputReader.nrOfBand();++iband){
266 inputReader.readData(lineInput[iband],GDT_Float64,irow,iband);
268 catch(
string errorstring){
269 cerr << errorstring << endl;
274 double colMask,rowMask;
275 for(icol=0;icol<inputReader.nrOfCol();++icol){
277 if(mask_opt.size()>1){
278 for(
int imask=0;imask<mask_opt.size();++imask){
279 inputReader.image2geo(icol,irow,x,y);
280 maskReader[imask].geo2image(x,y,colMask,rowMask);
281 if(static_cast<int>(rowMask)!=static_cast<int>(oldRowMask)){
282 assert(rowMask>=0&&rowMask<maskReader[imask].nrOfRow());
284 maskReader[imask].readData(lineMask[imask],GDT_Int16,static_cast<int>(rowMask));
286 catch(
string errorstring){
287 cerr << errorstring << endl;
293 if(mask_opt.size()==masknodata_opt.size())
294 ivalue=masknodata_opt[imask];
296 ivalue=masknodata_opt[0];
297 if(lineMask[imask][colMask]==ivalue){
298 for(
int iband=0;iband<inputReader.nrOfBand();++iband)
299 lineInput[iband][icol]=nodata_opt[imask];
305 else if(mask_opt.size()){
306 inputReader.image2geo(icol,irow,x,y);
307 maskReader[0].geo2image(x,y,colMask,rowMask);
308 if(static_cast<int>(rowMask)!=static_cast<int>(oldRowMask)){
309 assert(rowMask>=0&&rowMask<maskReader[0].nrOfRow());
311 maskReader[0].readData(lineMask[0],GDT_Int16,static_cast<int>(rowMask));
313 catch(
string errorstring){
314 cerr << errorstring << endl;
319 for(
int ivalue=0;ivalue<masknodata_opt.size();++ivalue){
320 assert(masknodata_opt.size()==nodata_opt.size());
321 if(lineMask[0][colMask]==masknodata_opt[ivalue]){
322 for(
int iband=0;iband<inputReader.nrOfBand();++iband)
323 lineInput[iband][icol]=nodata_opt[ivalue];
329 for(
int iband=0;iband<lineOutput.size();++iband){
330 lineOutput[iband][icol]=lineInput[iband][icol];
331 if(find(band_opt.begin(),band_opt.end(),iband)!=band_opt.end()){
332 if(!masked && codemap.find(lineInput[iband][icol])!=codemap.end()){
333 double toValue=codemap[lineInput[iband][icol]];
334 lineOutput[iband][icol]=toValue;
341 for(
int iband=0;iband<outputWriter.nrOfBand();++iband)
342 outputWriter.writeData(lineOutput[iband],GDT_Float64,irow,iband);
344 catch(
string errorstring){
345 cerr << errorstring << endl;
349 progress=
static_cast<float>((irow+1.0)/outputWriter.nrOfRow());
350 pfnProgress(progress,pszMessage,pProgressArg);
353 outputWriter.close();