22 #include "imageclasses/ImgReaderGdal.h"
23 #include "imageclasses/ImgWriterGdal.h"
24 #include "base/Optionpk.h"
28 int main(
int argc,
char *argv[])
34 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",
"");
35 Optionpk<string> oformat_opt(
"of",
"oformat",
"Output image format (see also gdal_translate). Empty string: inherit from input image");
36 Optionpk<string> option_opt(
"co",
"co",
"Creation option for output file. Multiple options can be specified.");
37 Optionpk<int> msknodata_opt(
"msknodata",
"msknodata",
"Mask value(s) where image has nodata. Use one value for each mask, or multiple values for a single mask.", 1);
38 Optionpk<short> mskband_opt(
"mskband",
"mskband",
"Mask band to read (0 indexed). Provide band for each mask.", 0);
39 Optionpk<char> operator_opt(
"p",
"operator",
"Operator: < = > !. Use operator for each msknodata option",
'=');
40 Optionpk<int> nodata_opt(
"nodata",
"nodata",
"nodata value to put in image if not valid", 0);
41 Optionpk<string> colorTable_opt(
"ct",
"ct",
"color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid)");
45 oformat_opt.setHide(1);
46 option_opt.setHide(1);
47 colorTable_opt.setHide(1);
48 mskband_opt.setHide(1);
52 doProcess=input_opt.retrieveOption(argc,argv);
53 mask_opt.retrieveOption(argc,argv);
54 msknodata_opt.retrieveOption(argc,argv);
55 mskband_opt.retrieveOption(argc,argv);
56 output_opt.retrieveOption(argc,argv);
57 nodata_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: pksetmask -i input -m mask [-msknodata value] -o output" << endl;
73 std::cout <<
"short option -h shows basic options only, use long option --help to show all options" << std::endl;
78 cout <<
"number of mask images: " << mask_opt.size() << endl;
81 while(mskband_opt.size()<mask_opt.size())
82 mskband_opt.push_back(mskband_opt[0]);
84 vector<ImgReaderGdal> maskReader(mask_opt.size());
85 for(
int imask=0;imask<mask_opt.size();++imask){
87 cout <<
"opening mask image file " << mask_opt[imask] << endl;
88 maskReader[imask].open(mask_opt[imask]);
90 assert(input_opt.size());
92 cout <<
"opening input image file " << input_opt[0] << endl;
94 inputReader.open(input_opt[0]);
95 string imageType=inputReader.getImageType();
96 if(oformat_opt.size())
97 imageType=oformat_opt[0];
98 GDALDataType theType=GDT_Unknown;
100 std::cout <<
"Image type: " << imageType << std::endl;
101 std::cout <<
"possible output data types: ";
103 for(
int iType = 0; iType < GDT_TypeCount; ++iType){
105 cout <<
" " << GDALGetDataTypeName((GDALDataType)iType);
106 if( GDALGetDataTypeName((GDALDataType)iType) != NULL
107 && EQUAL(GDALGetDataTypeName((GDALDataType)iType),
108 otype_opt[0].c_str()))
109 theType=(GDALDataType) iType;
111 if(theType==GDT_Unknown)
112 theType=inputReader.getDataType();
114 assert(output_opt.size());
116 std::cout << std::endl <<
"Output data type: " << GDALGetDataTypeName(theType) << std::endl;
117 std::cout <<
"opening output image for writing: " << output_opt[0] << std::endl;
121 if(option_opt.findSubstring(
"INTERLEAVE=")==option_opt.end()){
122 string theInterleave=
"INTERLEAVE=";
123 theInterleave+=inputReader.getInterleave();
124 option_opt.push_back(theInterleave);
126 outputWriter.open(output_opt[0],inputReader.nrOfCol(),inputReader.nrOfRow(),inputReader.nrOfBand(),theType,imageType,option_opt);
127 for(
int iband=0;iband<inputReader.nrOfBand();++iband)
128 outputWriter.GDALSetNoDataValue(nodata_opt[0],iband);
129 outputWriter.setProjection(inputReader.getProjection());
130 outputWriter.copyGeoTransform(inputReader);
132 catch(
string errorstring){
133 cout << errorstring << endl;
139 if(colorTable_opt.size()){
140 if(colorTable_opt[0]!=
"none")
141 outputWriter.setColorTable(colorTable_opt[0]);
143 else if (inputReader.getColorTable()!=NULL)
144 outputWriter.setColorTable(inputReader.getColorTable());
145 if(inputReader.isGeoRef()){
146 for(
int imask=0;imask<mask_opt.size();++imask)
147 assert(maskReader[imask].isGeoRef());
149 assert(nodata_opt.size()==msknodata_opt.size());
150 assert(operator_opt.size()==msknodata_opt.size()||operator_opt.size()==1);
152 cout <<
" mask files selected: " << mask_opt.size() << endl;
153 for(
int iv=0;iv<msknodata_opt.size();++iv){
154 char op=(operator_opt.size()==msknodata_opt.size())?operator_opt[iv]:operator_opt[0];
155 cout << op <<
" " << msknodata_opt[iv] <<
"->" << nodata_opt[iv] << endl;
160 Vector2d<double> lineOutput(outputWriter.nrOfBand(),outputWriter.nrOfCol());
161 assert(lineOutput.size()==lineInput.size());
162 assert(inputReader.nrOfCol()==outputWriter.nrOfCol());
165 for(
int imask=0;imask<mask_opt.size();++imask){
167 cout <<
"mask " << imask <<
" has " << maskReader[imask].nrOfCol() <<
" columns and " << maskReader[imask].nrOfRow() <<
" rows" << endl;
168 lineMask[imask].resize(maskReader[imask].nrOfCol());
172 const char* pszMessage;
173 void* pProgressArg=NULL;
174 GDALProgressFunc pfnProgress=GDALTermProgress;
177 pfnProgress(progress,pszMessage,pProgressArg);
179 vector<double> oldRowMask(mask_opt.size());
180 for(
int imask=0;imask<mask_opt.size();++imask)
181 oldRowMask[imask]=-1;
182 for(irow=0;irow<inputReader.nrOfRow();++irow){
184 for(
int iband=0;iband<inputReader.nrOfBand();++iband){
186 inputReader.readData(lineInput[iband],GDT_Float64,irow,iband);
188 catch(
string errorstring){
189 cerr << errorstring << endl;
194 double colMask,rowMask;
195 for(icol=0;icol<inputReader.nrOfCol();++icol){
196 if(mask_opt.size()>1){
197 for(
int imask=0;imask<mask_opt.size();++imask){
198 inputReader.image2geo(icol,irow,x,y);
199 maskReader[imask].geo2image(x,y,colMask,rowMask);
200 colMask=
static_cast<int>(colMask);
201 rowMask=
static_cast<int>(rowMask);
203 if(rowMask>=0&&rowMask<maskReader[imask].nrOfRow()&&colMask>=0&&colMask<maskReader[imask].nrOfCol()){
204 if(static_cast<int>(rowMask)!=
static_cast<int>(oldRowMask[imask])){
205 assert(rowMask>=0&&rowMask<maskReader[imask].nrOfRow());
208 maskReader[imask].readData(lineMask[imask],GDT_Float64,static_cast<int>(rowMask),mskband_opt[imask]);
210 catch(
string errorstring){
211 cerr << errorstring << endl;
214 oldRowMask[imask]=rowMask;
220 if(mask_opt.size()==msknodata_opt.size())
221 ivalue=msknodata_opt[imask];
223 ivalue=msknodata_opt[0];
224 char op=(operator_opt.size()==mask_opt.size())?operator_opt[imask]:operator_opt[0];
228 if(lineMask[imask][colMask]==ivalue)
232 if(lineMask[imask][colMask]<ivalue)
236 if(lineMask[imask][colMask]>ivalue)
240 if(lineMask[imask][colMask]!=ivalue)
246 cout <<
"image masked at (col=" << icol <<
",row=" << irow <<
") with mask " << mask_opt[imask] <<
" and value " << ivalue << endl;
247 for(
int iband=0;iband<inputReader.nrOfBand();++iband){
248 if(mask_opt.size()==nodata_opt.size())
249 lineInput[iband][icol]=nodata_opt[imask];
251 lineInput[iband][icol]=nodata_opt[0];
259 inputReader.image2geo(icol,irow,x,y);
260 maskReader[0].geo2image(x,y,colMask,rowMask);
261 colMask=
static_cast<int>(colMask);
262 rowMask=
static_cast<int>(rowMask);
264 if(rowMask>=0&&rowMask<maskReader[0].nrOfRow()&&colMask>=0&&colMask<maskReader[0].nrOfCol()){
265 if(static_cast<int>(rowMask)!=
static_cast<int>(oldRowMask[0])){
266 assert(rowMask>=0&&rowMask<maskReader[0].nrOfRow());
269 maskReader[0].readData(lineMask[0],GDT_Float64,static_cast<int>(rowMask),mskband_opt[0]);
271 catch(
string errorstring){
272 cerr << errorstring << endl;
275 oldRowMask[0]=rowMask;
277 for(
int ivalue=0;ivalue<msknodata_opt.size();++ivalue){
278 assert(msknodata_opt.size()==nodata_opt.size());
279 char op=(operator_opt.size()==msknodata_opt.size())?operator_opt[ivalue]:operator_opt[0];
283 if(lineMask[0][colMask]==msknodata_opt[ivalue])
287 if(lineMask[0][colMask]<msknodata_opt[ivalue])
291 if(lineMask[0][colMask]>msknodata_opt[ivalue])
295 if(lineMask[0][colMask]!=msknodata_opt[ivalue])
300 for(
int iband=0;iband<inputReader.nrOfBand();++iband)
301 lineInput[iband][icol]=nodata_opt[ivalue];
308 for(
int iband=0;iband<lineOutput.size();++iband)
309 lineOutput[iband][icol]=lineInput[iband][icol];
312 for(
int iband=0;iband<outputWriter.nrOfBand();++iband){
314 outputWriter.writeData(lineOutput[iband],GDT_Float64,irow,iband);
316 catch(
string errorstring){
317 cerr << errorstring << endl;
322 progress=
static_cast<float>(irow+1.0)/outputWriter.nrOfRow();
323 pfnProgress(progress,pszMessage,pProgressArg);
326 for(
int imask=0;imask<mask_opt.size();++imask)
327 maskReader[imask].close();
328 outputWriter.close();