24 #include "base/Optionpk.h"
25 #include "imageclasses/ImgReaderOgr.h"
26 #include "algorithms/StatFactory.h"
30 int main(
int argc,
char *argv[])
33 Optionpk<string> layer_opt(
"ln",
"lname",
"Layer name(s) in sample (leave empty to select all)");
34 Optionpk<string> fieldname_opt(
"n",
"fname",
"Fields on which to calculate statistics",
"");
36 Optionpk<double> src_min_opt(
"src_min",
"src_min",
"Set minimum value for histogram");
37 Optionpk<double> src_max_opt(
"src_max",
"src_max",
"Set maximum value for histogram");
38 Optionpk<bool> size_opt(
"s",
"size",
"Sample size (number of points)",
false);
39 Optionpk<bool> minmax_opt(
"mm",
"minmax",
"Calculate minimum and maximum value",
false);
42 Optionpk<bool> mean_opt(
"mean",
"mean",
"Calculate mean value",
false);
43 Optionpk<bool> median_opt(
"median",
"median",
"Calculate median value",
false);
44 Optionpk<bool> stdev_opt(
"stdev",
"stdev",
"Calculate standard deviation",
false);
45 Optionpk<bool> histogram_opt(
"hist",
"hist",
"Calculate histogram",
false);
47 Optionpk<bool> relative_opt(
"rel",
"relative",
"Use percentiles for histogram to calculate histogram",
false);
48 Optionpk<bool> kde_opt(
"kde",
"kde",
"Use Kernel density estimation when producing histogram. The standard deviation is estimated based on Silverman's rule of thumb",
false);
53 doProcess=input_opt.retrieveOption(argc,argv);
54 fieldname_opt.retrieveOption(argc,argv);
55 layer_opt.retrieveOption(argc,argv);
56 nodata_opt.retrieveOption(argc,argv);
57 src_min_opt.retrieveOption(argc,argv);
58 src_max_opt.retrieveOption(argc,argv);
59 size_opt.retrieveOption(argc,argv);
60 minmax_opt.retrieveOption(argc,argv);
61 min_opt.retrieveOption(argc,argv);
62 max_opt.retrieveOption(argc,argv);
63 mean_opt.retrieveOption(argc,argv);
64 median_opt.retrieveOption(argc,argv);
65 stdev_opt.retrieveOption(argc,argv);
66 histogram_opt.retrieveOption(argc,argv);
67 nbin_opt.retrieveOption(argc,argv);
68 relative_opt.retrieveOption(argc,argv);
69 kde_opt.retrieveOption(argc,argv);
70 verbose_opt.retrieveOption(argc,argv);
72 catch(
string predefinedString){
73 cout << predefinedString << endl;
78 cout <<
"Usage: pkstatogr -i input [-n attribute]*" << endl;
80 cout <<
"short option -h shows basic options only, use long option --help to show all options" << endl;
86 imgReader.open(input_opt[0]);
88 catch(
string errorstring){
89 cerr << errorstring << endl;
93 vector<double> theData;
97 stat.setNoDataValues(nodata_opt);
100 int nlayerRead=inputReader.getDataSource()->GetLayerCount();
102 cout <<
"number of layers: " << nlayerRead << endl;
104 for(
int ilayer=0;ilayer<nlayerRead;++ilayer){
105 OGRLayer *readLayer=inputReader.getLayer(ilayer);
106 string currentLayername=readLayer->GetName();
108 if(find(layer_opt.begin(),layer_opt.end(),currentLayername)==layer_opt.end())
111 cout <<
"processing layer " << currentLayername << endl;
113 cout <<
" --lname " << currentLayername;
115 for(
int ifield=0;ifield<fieldname_opt.size();++ifield){
117 cout <<
"field: " << ifield << endl;
119 inputReader.readData(theData,OFTReal,fieldname_opt[ifield],ilayer,verbose_opt[0]);
120 vector<double> binData;
123 stat.minmax(theData,theData.begin(),theData.end(),minValue,maxValue);
124 if(src_min_opt.size())
125 minValue=src_min_opt[0];
126 if(src_max_opt.size())
127 maxValue=src_max_opt[0];
128 unsigned int nbin=(nbin_opt.size())? nbin_opt[0]:0;
130 if(histogram_opt[0]){
136 sigma=1.06*sqrt(stat.var(theData))*pow(theData.size(),-0.2);
139 nbin=(maxValue-minValue+1);
141 stat.distribution(theData,theData.begin(),theData.end(),binData,nbin,minValue,maxValue,sigma);
143 catch(
string theError){
144 cerr <<
"Warning: all identical values in data" << endl;
149 cout <<
" --fname " << fieldname_opt[ifield];
153 stat.meanVar(theData,theMean,theVar);
155 cout <<
" --mean " << theMean;
157 cout <<
" --stdev " << sqrt(theVar);
158 if(minmax_opt[0]||min_opt[0]||max_opt[0]){
160 cout <<
" --min " << minValue <<
" --max " << maxValue <<
" ";
163 cout <<
" --min " << minValue <<
" ";
165 cout <<
" --max " << maxValue <<
" ";
169 cout <<
" -median " << stat.median(theData);
171 cout <<
" -size " << theData.size();
173 if(histogram_opt[0]){
174 for(
int ibin=0;ibin<nbin;++ibin){
176 if(nbin==maxValue-minValue+1)
177 binValue=minValue+ibin;
179 binValue=minValue+
static_cast<double>(maxValue-minValue)*(ibin+0.5)/nbin;
180 cout << binValue <<
" ";
181 if(relative_opt[0]||kde_opt[0])
182 cout << 100.0*
static_cast<double>(binData[ibin])/theData.size() << endl;
184 cout << binData[ibin] << endl;
188 catch(
string theError){
190 cout <<
" --mean " << theData.back();
192 cout <<
" --stdev " <<
"0";
194 cout <<
" -min " << theData.back();
196 cout <<
" -max " << theData.back();
198 cout <<
" -median " << theData.back();
200 cout <<
" -size " << theData.size();
202 cerr <<
"Warning: all identical values in data" << endl;