22 #include "imageclasses/ImgReaderGdal.h"
23 #include "imageclasses/ImgWriterGdal.h"
24 #include "base/Optionpk.h"
27 int main(
int argc,
char **argv) {
30 Optionpk<double> min_opt(
"min",
"min",
"Values smaller than min threshold(s) are masked as invalid. Use one threshold for each band");
31 Optionpk<double> max_opt(
"max",
"max",
"Values greater than max threshold(s) are masked as invalid. Use one threshold for each band");
36 Optionpk<string> otype_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",
"Byte");
37 Optionpk<string> oformat_opt(
"of",
"oformat",
"Output image format (see also gdal_translate). Empty string: inherit from input image");
38 Optionpk<string> option_opt(
"co",
"co",
"Creation option for output file. Multiple options can be specified.");
39 Optionpk<string> colorTable_opt(
"ct",
"ct",
"color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid)");
43 operator_opt.setHide(1);
45 oformat_opt.setHide(1);
46 option_opt.setHide(1);
47 colorTable_opt.setHide(1);
51 doProcess=input_opt.retrieveOption(argc,argv);
52 output_opt.retrieveOption(argc,argv);
53 min_opt.retrieveOption(argc,argv);
54 max_opt.retrieveOption(argc,argv);
55 data_opt.retrieveOption(argc,argv);
56 nodata_opt.retrieveOption(argc,argv);
57 band_opt.retrieveOption(argc,argv);
58 operator_opt.retrieveOption(argc,argv);
59 otype_opt.retrieveOption(argc,argv);
60 oformat_opt.retrieveOption(argc,argv);
61 option_opt.retrieveOption(argc,argv);
62 colorTable_opt.retrieveOption(argc,argv);
63 verbose_opt.retrieveOption(argc,argv);
65 catch(
string predefinedString){
66 std::cout << predefinedString << std::endl;
71 cout <<
"Usage: pkgetmask -i input -o output" << endl;
73 std::cout <<
"short option -h shows basic options only, use long option --help to show all options" << std::endl;
77 const char* pszMessage;
78 void* pProgressArg=NULL;
79 GDALProgressFunc pfnProgress=GDALTermProgress;
81 pfnProgress(progress,pszMessage,pProgressArg);
82 GDALDataType theType=GDT_Unknown;
84 cout <<
"possible output data types: ";
85 for(
int iType = 0; iType < GDT_TypeCount; ++iType){
87 cout <<
" " << GDALGetDataTypeName((GDALDataType)iType);
88 if( GDALGetDataTypeName((GDALDataType)iType) != NULL
89 && EQUAL(GDALGetDataTypeName((GDALDataType)iType),
90 otype_opt[0].c_str()))
91 theType=(GDALDataType) iType;
95 if(theType==GDT_Unknown)
96 cout <<
"Unknown output pixel type: " << otype_opt[0] << endl;
98 cout <<
"Output pixel type: " << GDALGetDataTypeName(theType) << endl;
101 assert(input_opt.size());
103 assert(band_opt.size()>=0);
104 assert(band_opt.size()<=imgReader.nrOfBand());
106 if(min_opt.size()&&max_opt.size()){
107 if(min_opt.size()!=max_opt.size())
108 cerr <<
"Error: number of min and max options must correspond if both min and max options are provide" << endl;
109 assert(min_opt.size()==max_opt.size());
112 while(band_opt.size()>min_opt.size())
113 min_opt.push_back(min_opt[0]);
114 while(min_opt.size()>data_opt.size())
115 data_opt.push_back(data_opt[0]);
118 while(band_opt.size()>max_opt.size())
119 max_opt.push_back(max_opt[0]);
120 while(max_opt.size()>data_opt.size())
121 data_opt.push_back(data_opt[0]);
135 vector< vector<float> > lineBuffer(band_opt.size());
136 for(
int iband=0;iband<band_opt.size();++iband)
137 lineBuffer.resize(imgReader.nrOfCol());
140 if(theType==GDT_Unknown){
141 theType=imgReader.getDataType();
143 cout <<
"Using data type from input image: " << GDALGetDataTypeName(theType) << endl;
145 string imageType=imgReader.getImageType();
146 if(oformat_opt.size())
147 imageType=oformat_opt[0];
148 if(option_opt.findSubstring(
"INTERLEAVE=")==option_opt.end()){
149 string theInterleave=
"INTERLEAVE=";
150 theInterleave+=imgReader.getInterleave();
151 option_opt.push_back(theInterleave);
153 assert(output_opt.size());
154 imgWriter.open(output_opt[0],imgReader.nrOfCol(),imgReader.nrOfRow(),1,theType,imageType,option_opt);
155 if(colorTable_opt.size()){
156 if(colorTable_opt[0]!=
"none")
157 imgWriter.setColorTable(colorTable_opt[0]);
159 else if (imgReader.getColorTable()!=NULL)
160 imgWriter.setColorTable(imgReader.getColorTable());
162 imgWriter.setProjection(imgReader.getProjection());
164 imgReader.getGeoTransform(gt);
165 imgWriter.setGeoTransform(gt);
167 if(nodata_opt.size())
168 imgWriter.GDALSetNoDataValue(nodata_opt[0]);
170 vector<char> writeBuffer(imgWriter.nrOfCol());
171 for(
int irow=0;irow<imgReader.nrOfRow();++irow){
172 for(
int iband=0;iband<band_opt.size();++iband)
173 imgReader.readData(lineBuffer[iband],GDT_Float32,irow,band_opt[iband]);
174 for(
int icol=0;icol<imgReader.nrOfCol();++icol){
175 bool valid=(operator_opt[0]==
"OR")?
false:
true;
176 unsigned short validValue=data_opt[0];
177 if(min_opt.size()&&max_opt.size()){
178 assert(max_opt.size()==min_opt.size());
179 for(
int ivalid=0;ivalid<min_opt.size();++ivalid){
180 bool validBand=
false;
182 unsigned short theBand=(band_opt.size()==min_opt.size())? ivalid:0;
183 if(lineBuffer[theBand][icol]>=min_opt[ivalid]&&lineBuffer[theBand][icol]<=max_opt[ivalid]){
184 validValue=data_opt[ivalid];
187 valid=(operator_opt[0]==
"OR")?valid||validBand : valid&&validBand;
190 else if(min_opt.size()){
191 for(
int ivalid=0;ivalid<min_opt.size();++ivalid){
192 bool validBand=
false;
194 unsigned short theBand=(band_opt.size()==min_opt.size())? ivalid:0;
195 if(lineBuffer[theBand][icol]>=min_opt[ivalid]){
196 validValue=data_opt[ivalid];
199 valid=(operator_opt[0]==
"OR")?valid||validBand : valid&&validBand;
202 else if(max_opt.size()){
203 for(
int ivalid=0;ivalid<max_opt.size();++ivalid){
204 bool validBand=
false;
206 unsigned short theBand=(band_opt.size()==max_opt.size())? ivalid:0;
207 if(lineBuffer[theBand][icol]<=max_opt[ivalid]){
208 validValue=data_opt[ivalid];
211 valid=(operator_opt[0]==
"OR")?valid||validBand : valid&&validBand;
215 writeBuffer[icol]=validValue;
217 writeBuffer[icol]=nodata_opt[0];
219 imgWriter.writeData(writeBuffer,GDT_Byte,irow);
220 progress=(1.0+irow)/imgWriter.nrOfRow();
221 pfnProgress(progress,pszMessage,pProgressArg);