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 class(es) (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;
71 std::cout <<
"short option -h shows basic options only, use long option --help to show all options" << std::endl;
74 if(input_opt.empty()){
75 std::cerr <<
"No input file provided (use option -i). Use --help for help information" << std::endl;
78 if(output_opt.empty()){
79 std::cerr <<
"No output file provided (use option -o). Use --help for help information" << std::endl;
86 map<string,string> codemapString;
87 map<double,double> codemap;
90 cout <<
"opening code text file " << code_opt[0] << endl;
92 codefile.open(code_opt[0].c_str());
95 while(codefile>>theKey){
97 codemapString[theKey]=theValue;
98 codemap[string2type<double>(theKey)]=string2type<double>(theValue);
103 assert(class_opt.size()==reclass_opt.size());
104 for(
int iclass=0;iclass<class_opt.size();++iclass){
105 codemapString[class_opt[iclass]]=reclass_opt[iclass];
106 codemap[string2type<double>(class_opt[iclass])]=string2type<double>(reclass_opt[iclass]);
109 assert(codemapString.size());
110 assert(codemap.size());
113 map<string,string>::iterator mit;
114 cout << codemapString.size() <<
" codes used: " << endl;
115 for(mit=codemapString.begin();mit!=codemapString.end();++mit)
116 cout << (*mit).first <<
" " << (*mit).second << endl;
118 bool refIsRaster=
false;
121 ogrReader.open(input_opt[0]);
123 catch(
string errorString){
129 cout <<
"opening " << input_opt[0] <<
" for reading " << endl;
132 cout <<
"opening " << output_opt[0] <<
" for writing " << endl;
135 cout <<
"copied layer from " << input_opt[0] << endl << flush;
136 OGRFeatureDefn *poFDefn = ogrWriter.getLayer()->GetLayerDefn();
139 cout <<
"reset reading" << endl;
140 ogrReader.getLayer()->ResetReading();
141 unsigned long int ifeature=0;
143 cout <<
"going through features" << endl << flush;
146 OGRFeature *poFeature;
147 poFeature=ogrReader.getLayer()->GetNextFeature();
150 OGRFeatureDefn *poFDefn = ogrWriter.getLayer()->GetLayerDefn();
152 for(
int iField=0;iField<poFDefn->GetFieldCount();++iField){
153 OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);
154 string fieldname=poFieldDefn->GetNameRef();
155 if(fieldname==fieldname_opt[0]){
156 string fromClass=poFeature->GetFieldAsString(iField);
157 string toClass=fromClass;
158 if(codemapString.find(fromClass)!=codemapString.end())
159 toClass=codemapString[fromClass];
160 poFeature->SetField(iField,toClass.c_str());
162 cout <<
"feature " << ifeature <<
": " << fromClass <<
"->" << poFeature->GetFieldAsInteger(iField) << endl << flush;
167 ogrWriter.createFeature(poFeature);
168 OGRFeature::DestroyFeature( poFeature );
172 cout <<
"replaced " << ifeature <<
" features" << endl;
178 vector<ImgReaderGdal> maskReader(mask_opt.size());
181 cout <<
"opening input image file " << input_opt[0] << endl;
182 inputReader.open(input_opt[0]);
183 for(
int imask=0;imask<mask_opt.size();++imask){
185 cout <<
"opening mask image file " << mask_opt[imask] << endl;
186 maskReader[imask].open(mask_opt[imask]);
189 cout <<
"opening output image file " << output_opt[0] << endl;
190 cout <<
"data type: " << type_opt[0] << endl;
193 GDALDataType theType=GDT_Unknown;
195 cout <<
"possible output data types: ";
196 for(
int iType = 0; iType < GDT_TypeCount; ++iType){
198 cout <<
" " << GDALGetDataTypeName((GDALDataType)iType);
199 if( GDALGetDataTypeName((GDALDataType)iType) != NULL
200 && EQUAL(GDALGetDataTypeName((GDALDataType)iType),
201 type_opt[0].c_str()))
202 theType=(GDALDataType) iType;
204 if(theType==GDT_Unknown)
205 theType=inputReader.getDataType();
207 cout << endl <<
"Output pixel type: " << GDALGetDataTypeName(theType) << endl;
208 if(option_opt.findSubstring(
"INTERLEAVE=")==option_opt.end()){
209 string theInterleave=
"INTERLEAVE=";
210 theInterleave+=inputReader.getInterleave();
211 option_opt.push_back(theInterleave);
213 outputWriter.open(output_opt[0],inputReader.nrOfCol(),inputReader.nrOfRow(),inputReader.nrOfBand(),theType,inputReader.getImageType(),option_opt);
214 for(
int iband=0;iband<inputReader.nrOfBand();++iband)
215 outputWriter.GDALSetNoDataValue(nodata_opt[0],iband);
216 if(description_opt.size())
217 outputWriter.setImageDescription(description_opt[0]);
219 if(colorTable_opt.size()){
220 if(colorTable_opt[0]!=
"none")
221 outputWriter.setColorTable(colorTable_opt[0]);
223 else if (inputReader.getColorTable()!=NULL)
224 outputWriter.setColorTable(inputReader.getColorTable());
227 if(inputReader.isGeoRef()){
228 for(
int imask=0;imask<mask_opt.size();++imask)
229 assert(maskReader[imask].isGeoRef());
231 outputWriter.setProjection(inputReader.getProjection());
232 double ulx,uly,lrx,lry;
233 inputReader.getBoundingBox(ulx,uly,lrx,lry);
234 outputWriter.copyGeoTransform(inputReader);
235 assert(nodata_opt.size()==masknodata_opt.size());
236 if(verbose_opt[0]&&mask_opt.size()){
237 for(
int iv=0;iv<masknodata_opt.size();++iv)
238 cout << masknodata_opt[iv] <<
"->" << nodata_opt[iv] << endl;
241 assert(outputWriter.nrOfCol()==inputReader.nrOfCol());
245 for(
int imask=0;imask<mask_opt.size();++imask)
246 lineMask[imask].resize(maskReader[imask].nrOfCol());
247 Vector2d<double> lineOutput(outputWriter.nrOfBand(),outputWriter.nrOfCol());
250 const char* pszMessage;
251 void* pProgressArg=NULL;
252 GDALProgressFunc pfnProgress=GDALTermProgress;
254 pfnProgress(progress,pszMessage,pProgressArg);
255 double oldRowMask=-1;
256 for(irow=0;irow<inputReader.nrOfRow();++irow){
258 for(
int iband=0;iband<inputReader.nrOfBand();++iband){
261 inputReader.readData(lineInput[iband],GDT_Float64,irow,iband);
263 catch(
string errorstring){
264 cerr << errorstring << endl;
269 double colMask,rowMask;
270 for(icol=0;icol<inputReader.nrOfCol();++icol){
272 if(mask_opt.size()>1){
273 for(
int imask=0;imask<mask_opt.size();++imask){
274 inputReader.image2geo(icol,irow,x,y);
275 maskReader[imask].geo2image(x,y,colMask,rowMask);
276 if(static_cast<int>(rowMask)!=static_cast<int>(oldRowMask)){
277 assert(rowMask>=0&&rowMask<maskReader[imask].nrOfRow());
279 maskReader[imask].readData(lineMask[imask],GDT_Int16,static_cast<int>(rowMask));
281 catch(
string errorstring){
282 cerr << errorstring << endl;
288 if(mask_opt.size()==masknodata_opt.size())
289 ivalue=masknodata_opt[imask];
291 ivalue=masknodata_opt[0];
292 if(lineMask[imask][colMask]==ivalue){
293 for(
int iband=0;iband<inputReader.nrOfBand();++iband)
294 lineInput[iband][icol]=nodata_opt[imask];
300 else if(mask_opt.size()){
301 inputReader.image2geo(icol,irow,x,y);
302 maskReader[0].geo2image(x,y,colMask,rowMask);
303 if(static_cast<int>(rowMask)!=static_cast<int>(oldRowMask)){
304 assert(rowMask>=0&&rowMask<maskReader[0].nrOfRow());
306 maskReader[0].readData(lineMask[0],GDT_Int16,static_cast<int>(rowMask));
308 catch(
string errorstring){
309 cerr << errorstring << endl;
314 for(
int ivalue=0;ivalue<masknodata_opt.size();++ivalue){
315 assert(masknodata_opt.size()==nodata_opt.size());
316 if(lineMask[0][colMask]==masknodata_opt[ivalue]){
317 for(
int iband=0;iband<inputReader.nrOfBand();++iband)
318 lineInput[iband][icol]=nodata_opt[ivalue];
324 for(
int iband=0;iband<lineOutput.size();++iband){
325 lineOutput[iband][icol]=lineInput[iband][icol];
326 if(find(band_opt.begin(),band_opt.end(),iband)!=band_opt.end()){
327 if(!masked && codemap.find(lineInput[iband][icol])!=codemap.end()){
328 double toValue=codemap[lineInput[iband][icol]];
329 lineOutput[iband][icol]=toValue;
336 for(
int iband=0;iband<outputWriter.nrOfBand();++iband)
337 outputWriter.writeData(lineOutput[iband],GDT_Float64,irow,iband);
339 catch(
string errorstring){
340 cerr << errorstring << endl;
344 progress=
static_cast<float>((irow+1.0)/outputWriter.nrOfRow());
345 pfnProgress(progress,pszMessage,pProgressArg);
348 outputWriter.close();