This is an automated email from the git hooks/post-receive script.

sebastic-guest pushed a commit to branch upstream-master
in repository pktools.

commit 1dd21849f179c0bd870494659f8cd707c9611c1a
Author: Pieter Kempeneers <kempe...@gmail.com>
Date:   Sun Feb 16 23:52:29 2014 +0100

    support median filter in pkextract
---
 ChangeLog                 | 11 +++++++
 src/algorithms/Filter2d.h |  2 +-
 src/apps/pkextract.cc     | 81 +++++++++++++++++++++++++++++------------------
 src/apps/pkfillnodata.cc  |  2 +-
 src/apps/pkfilter.cc      |  8 ++---
 src/apps/pkinfo.cc        |  4 +--
 src/apps/pkpolygonize.cc  |  7 ++--
 src/apps/pkstatascii.cc   | 22 +++++++++++--
 src/apps/pkstatogr.cc     | 10 ++++--
 9 files changed, 100 insertions(+), 47 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 9709d29..50ad0a3 100755
--- a/ChangeLog
+++ b/ChangeLog
@@ -248,10 +248,21 @@ version 2.5
 version 2.5.1
  - pkinfo
        -stats instead of -stat to be conform to gdalinfo
+       bin values match actual values in case nbin=max-min+1
+ - pkstatascii
+       bin values match actual values in case nbin=max-min+1
+ - pkstatogr
+       bin values match actual values in case nbin=max-min+1
  - pkextract
        support sum rule
  - pkfilter
        support of density filter
        debug down option (forgot to adapt xres and yres)
+       no automatic normalization user provided filter taps
  - pkcrop
        correct bounding box when dx_opt and dy_opt are set
+version 2.5.2 (todo)
+ - pkcrop -> pkcropnmerge
+       name was confusing as pkcrop supports spatial and spectral subsetting 
and merging
+ - pkmosaic -> pkcomposit
+       name was confusing as also compositing is supported (unlike 
gdal_merge.py and gdalwarp)
diff --git a/src/algorithms/Filter2d.h b/src/algorithms/Filter2d.h
index 70f33cb..de44136 100644
--- a/src/algorithms/Filter2d.h
+++ b/src/algorithms/Filter2d.h
@@ -86,7 +86,7 @@ public:
   void pushThreshold(double 
theThreshold){m_threshold.push_back(theThreshold);};
   void setThresholds(const std::vector<double>& 
theThresholds){m_threshold=theThresholds;};
   void setClasses(const std::vector<short>& theClasses){m_class=theClasses;};
-  void filter(const ImgReaderGdal& input, ImgWriterGdal& output, bool 
absolute=false, bool normalize=true, bool noData=false);
+  void filter(const ImgReaderGdal& input, ImgWriterGdal& output, bool 
absolute=false, bool normalize=false, bool noData=false);
   void smooth(const ImgReaderGdal& input, ImgWriterGdal& output,int dim);
   void smooth(const ImgReaderGdal& input, ImgWriterGdal& output,int dimX, int 
dimY);
   void smoothNoData(const ImgReaderGdal& input, ImgWriterGdal& output,int dim);
diff --git a/src/apps/pkextract.cc b/src/apps/pkextract.cc
index 8b61bbd..eac8c8d 100644
--- a/src/apps/pkextract.cc
+++ b/src/apps/pkextract.cc
@@ -34,7 +34,7 @@ along with pktools.  If not, see 
<http://www.gnu.org/licenses/>.
 #endif
 
 namespace rule{
-  enum RULE_TYPE {point=0, mean=1, proportion=2, custom=3, minimum=4, 
maximum=5, maxvote=6, centroid=7, sum=8};
+  enum RULE_TYPE {point=0, mean=1, proportion=2, custom=3, minimum=4, 
maximum=5, maxvote=6, centroid=7, sum=8, median=9};
 }
 
 using namespace std;
@@ -64,7 +64,7 @@ int main(int argc, char *argv[])
   Optionpk<string> label_opt("cn", "cname", "name of the class label in the 
output vector file", "label");
   Optionpk<bool> polygon_opt("polygon", "polygon", "create OGRPolygon as 
geometry instead of OGRPoint. Only if sample option is also of polygon type.", 
false);
   Optionpk<int> band_opt("b", "band", "band index to crop. Use -1 to use all 
bands)", -1);
-  Optionpk<string> rule_opt("r", "rule", "rule how to report image information 
per feature. point (value at each point or at centroid if polygon), centroid, 
mean (of polygon), proportion, minimum (of polygon), maximum (of polygon), 
maxvote, sum.", "point");
+  Optionpk<string> rule_opt("r", "rule", "rule how to report image information 
per feature. point (value at each point or at centroid if polygon), centroid, 
mean (of polygon), median (of polygon), proportion, minimum (of polygon), 
maximum (of polygon), maxvote, sum.", "point");
   Optionpk<short> verbose_opt("v", "verbose", "verbose mode if > 0", 0);
 
   bool doProcess;//stop process when program was invoked with help option (-h 
--help)
@@ -109,6 +109,7 @@ int main(int argc, char *argv[])
   ruleMap["point"]=rule::point;
   ruleMap["centroid"]=rule::centroid;
   ruleMap["mean"]=rule::mean;
+  ruleMap["median"]=rule::median;
   ruleMap["proportion"]=rule::proportion;
   ruleMap["minimum"]=rule::minimum;
   ruleMap["maximum"]=rule::maximum;
@@ -834,6 +835,7 @@ int main(int argc, char *argv[])
       break;
       case(rule::point):
       case(rule::mean):
+      case(rule::median):
       case(rule::sum):
       case(rule::centroid):
       default:{
@@ -1222,7 +1224,7 @@ int main(int argc, char *argv[])
              else
                writePolygonFeature = 
OGRFeature::CreateFeature(writeLayer->GetLayerDefn());
            }
-           else 
if(ruleMap[rule_opt[0]]==rule::mean||ruleMap[rule_opt[0]]==rule::centroid||ruleMap[rule_opt[0]]==rule::sum){
+           else 
if(ruleMap[rule_opt[0]]==rule::mean||ruleMap[rule_opt[0]]==rule::median||ruleMap[rule_opt[0]]==rule::centroid||ruleMap[rule_opt[0]]==rule::sum){
              if(writeTest)
                writeCentroidFeature = 
OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());
              else
@@ -1230,7 +1232,10 @@ int main(int argc, char *argv[])
            }
            //previously here
            vector<double> polyValues;
+           vector< vector<double> > polyValuesVector;
            switch(ruleMap[rule_opt[0]]){
+           case(rule::median):
+             polyValuesVector.resize(nband);
            case(rule::point):
            case(rule::mean):
            case(rule::sum):
@@ -1350,7 +1355,7 @@ int main(int argc, char *argv[])
                  OGRFeature *writePointFeature;
                  if(!polygon_opt[0]){
                    //create feature
-                   
if(ruleMap[rule_opt[0]]!=rule::mean&&ruleMap[rule_opt[0]]!=rule::centroid&&ruleMap[rule_opt[0]]!=rule::sum){//do
 not create in case of mean, sum or centroid (only create point at centroid)
+                   
if(ruleMap[rule_opt[0]]!=rule::mean&&ruleMap[rule_opt[0]]!=rule::median&&ruleMap[rule_opt[0]]!=rule::centroid&&ruleMap[rule_opt[0]]!=rule::sum){//do
 not create in case of mean, median, sum or centroid (only create point at 
centroid)
                      if(writeTest)
                        writePointFeature = 
OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());
                      else
@@ -1375,18 +1380,9 @@ int main(int argc, char *argv[])
                    imgReader.readData(value,GDT_Float64,i,j,theBand);
                    if(verbose_opt[0]>1)
                      std::cout << ": " << value << std::endl;
-                   
if(polygon_opt[0]||ruleMap[rule_opt[0]]==rule::mean||ruleMap[rule_opt[0]]==rule::centroid||ruleMap[rule_opt[0]]==rule::sum){
+                   
if(polygon_opt[0]||ruleMap[rule_opt[0]]==rule::mean||ruleMap[rule_opt[0]]==rule::median||ruleMap[rule_opt[0]]==rule::centroid||ruleMap[rule_opt[0]]==rule::sum){
                      int iclass=0;
                      switch(ruleMap[rule_opt[0]]){
-                     case(rule::point)://in centroid if polygon_opt==true or 
all values as points if polygon_opt!=true
-                     case(rule::centroid):
-                     default:
-                       polyValues[iband]=value;
-                     break;
-                     case(rule::sum):
-                     case(rule::mean)://mean as polygon if polygon_opt==true 
or as point in centroid if polygon_opt!=true
-                       polyValues[iband]+=value;
-                       break;
                      case(rule::proportion):
                      case(rule::custom):
                      case(rule::minimum):
@@ -1400,14 +1396,26 @@ int main(int argc, char *argv[])
                          }
                        }
                      break;
+                     case(rule::sum):
+                     case(rule::mean)://mean as polygon if polygon_opt==true 
or as point in centroid if polygon_opt!=true
+                       polyValues[iband]+=value;
+                     break;
+                     case(rule::median):
+                       polyValuesVector[iband].push_back(value);
+                     break;
+                     case(rule::point)://in centroid if polygon_opt==true or 
all values as points if polygon_opt!=true
+                     case(rule::centroid):
+                     default:
+                       polyValues[iband]=value;
+                     break;
                      }
                    }
                    else{
-                     // ostringstream fs;
-                     // if(imgReader.nrOfBand()==1)
-                     //   fs << fieldname_opt[0];
-                     // else
-                     //   fs << fieldname_opt[0] << theBand;
+                   // ostringstream fs;
+                   // if(imgReader.nrOfBand()==1)
+                   //   fs << fieldname_opt[0];
+                   // else
+                   //   fs << fieldname_opt[0] << theBand;
                      if(verbose_opt[0]>1)
                        std::cout << "set field " << fieldname_opt[iband] << " 
to " << value << std::endl;
                      switch( fieldType ){
@@ -1440,9 +1448,9 @@ int main(int argc, char *argv[])
                        break;
                      }
                    }
-                 }
+             }
                  if(!polygon_opt[0]){
-                   
if(ruleMap[rule_opt[0]]!=rule::mean&&ruleMap[rule_opt[0]]!=rule::centroid&&ruleMap[rule_opt[0]]!=rule::sum){//do
 not create in case of mean value (only at centroid)
+                   
if(ruleMap[rule_opt[0]]!=rule::mean&&ruleMap[rule_opt[0]]!=rule::median&&ruleMap[rule_opt[0]]!=rule::centroid&&ruleMap[rule_opt[0]]!=rule::sum){//do
 not create in case of mean value (only at centroid)
                      //write feature
                      if(verbose_opt[0]>1)
                        std::cout << "creating point feature" << std::endl;
@@ -1469,7 +1477,7 @@ int main(int argc, char *argv[])
                }
              }
            }
-           
if(polygon_opt[0]||ruleMap[rule_opt[0]]==rule::mean||ruleMap[rule_opt[0]]==rule::centroid||ruleMap[rule_opt[0]]==rule::sum){
+           
if(polygon_opt[0]||ruleMap[rule_opt[0]]==rule::mean||ruleMap[rule_opt[0]]==rule::median||ruleMap[rule_opt[0]]==rule::centroid||ruleMap[rule_opt[0]]==rule::sum){
              //do not create if no points found within polygon
              if(!nPointPolygon)
                continue;
@@ -1487,7 +1495,7 @@ int main(int argc, char *argv[])
                  std::cout << "write feature has " << 
writePolygonFeature->GetFieldCount() << " fields" << std::endl;
                //write polygon feature
              }
-             else{//write mean value of polygon to centroid point 
(ruleMap[rule_opt[0]]==rule::mean)
+             else{//write mean value of polygon to centroid point 
(ruleMap[rule_opt[0]]==rule::mean||ruleMap[rule_opt[0]]==rule::median)
                //create feature
                if(verbose_opt[0]>1)
                  std::cout << "copying fields from polygons " << sample_opt[0] 
<< std::endl;
@@ -1574,6 +1582,7 @@ int main(int argc, char *argv[])
                break;
              }
              case(rule::mean):
+             case(rule::median):
              case(rule::sum):
              case(rule::centroid):{//mean value (written to centroid of 
polygon if line is not set)
                if(verbose_opt[0])
@@ -1586,6 +1595,8 @@ int main(int argc, char *argv[])
                  // ostringstream fs;
                  if(ruleMap[rule_opt[0]]==rule::mean)
                    theValue/=nPointPolygon;
+                 else if(ruleMap[rule_opt[0]]==rule::median)
+                   theValue=stat.median(polyValuesVector[index]);
                  int theBand=(band_opt[0]<0)?index:band_opt[index];
                  // if(nband==1)
                  //   fs << fieldname_opt[0];
@@ -1835,15 +1846,17 @@ int main(int argc, char *argv[])
              else
                writePolygonFeature = 
OGRFeature::CreateFeature(writeLayer->GetLayerDefn());
            }
-           else 
if(ruleMap[rule_opt[0]]==rule::mean||ruleMap[rule_opt[0]]==rule::centroid||ruleMap[rule_opt[0]]==rule::sum){
+           else 
if(ruleMap[rule_opt[0]]==rule::mean||ruleMap[rule_opt[0]]==rule::median||ruleMap[rule_opt[0]]==rule::centroid||ruleMap[rule_opt[0]]==rule::sum){
              if(writeTest)
                writeCentroidFeature = 
OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());
              else
                writeCentroidFeature = 
OGRFeature::CreateFeature(writeLayer->GetLayerDefn());
            }
-           //previously here
            vector<double> polyValues;
+           vector< vector<double> > polyValuesVector;
            switch(ruleMap[rule_opt[0]]){
+           case(rule::median):
+             polyValuesVector.resize(nband);
            case(rule::point):
            case(rule::mean):
            case(rule::sum):
@@ -1963,7 +1976,7 @@ int main(int argc, char *argv[])
                  OGRFeature *writePointFeature;
                  if(!polygon_opt[0]){
                    //create feature
-                   
if(ruleMap[rule_opt[0]]!=rule::mean&&ruleMap[rule_opt[0]]!=rule::centroid&&ruleMap[rule_opt[0]]!=rule::sum){//do
 not create in case of mean or sum (only create point at centroid)
+                   
if(ruleMap[rule_opt[0]]!=rule::mean&&ruleMap[rule_opt[0]]!=rule::median&&ruleMap[rule_opt[0]]!=rule::centroid&&ruleMap[rule_opt[0]]!=rule::sum){//do
 not create in case of mean or sum (only create point at centroid)
                      if(writeTest)
                        writePointFeature = 
OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());
                      else
@@ -1988,7 +2001,7 @@ int main(int argc, char *argv[])
                    imgReader.readData(value,GDT_Float64,i,j,theBand);
                    if(verbose_opt[0]>1)
                      std::cout << ": " << value << std::endl;
-                   
if(polygon_opt[0]||ruleMap[rule_opt[0]]==rule::mean||ruleMap[rule_opt[0]]==rule::centroid||ruleMap[rule_opt[0]]==rule::sum){
+                   
if(polygon_opt[0]||ruleMap[rule_opt[0]]==rule::mean||ruleMap[rule_opt[0]]==rule::median||ruleMap[rule_opt[0]]==rule::centroid||ruleMap[rule_opt[0]]==rule::sum){
                      int iclass=0;
                      switch(ruleMap[rule_opt[0]]){
                      case(rule::point)://in centroid if polygon_opt==true or 
all values as points if polygon_opt!=true
@@ -1997,9 +2010,12 @@ int main(int argc, char *argv[])
                        polyValues[iband]=value;
                      break;
                      case(rule::sum):
-                     case(rule::mean)://mean or sum polygon if 
polygon_opt==true or as point in centroid if polygon_opt!=true
+                     case(rule::mean)://mean sum polygon if polygon_opt==true 
or as point in centroid if polygon_opt!=true
                        polyValues[iband]+=value;
                        break;
+                     case(rule::median):
+                       polyValuesVector[iband].push_back(value);
+                       break;
                      case(rule::proportion):
                      case(rule::custom):
                      case(rule::minimum):
@@ -2055,7 +2071,7 @@ int main(int argc, char *argv[])
                    }
                  }
                  if(!polygon_opt[0]){
-                   
if(ruleMap[rule_opt[0]]!=rule::mean&&ruleMap[rule_opt[0]]!=rule::centroid&&ruleMap[rule_opt[0]]!=rule::sum){//do
 not create in case of mean value (only at centroid)
+                   
if(ruleMap[rule_opt[0]]!=rule::mean&&ruleMap[rule_opt[0]]!=rule::median&&ruleMap[rule_opt[0]]!=rule::centroid&&ruleMap[rule_opt[0]]!=rule::sum){//do
 not create in case of mean or median value (only at centroid)
                      //write feature
                      if(verbose_opt[0]>1)
                        std::cout << "creating point feature" << std::endl;
@@ -2085,7 +2101,7 @@ int main(int argc, char *argv[])
            //test
            if(!validFeature)
              continue;
-           
if(polygon_opt[0]||ruleMap[rule_opt[0]]==rule::mean||ruleMap[rule_opt[0]]==rule::centroid||ruleMap[rule_opt[0]]==rule::sum){
+           
if(polygon_opt[0]||ruleMap[rule_opt[0]]==rule::mean||ruleMap[rule_opt[0]]==rule::median||ruleMap[rule_opt[0]]==rule::centroid||ruleMap[rule_opt[0]]==rule::sum){
              //add ring to polygon
              if(polygon_opt[0]){
                writePolygon.addRing(&writeRing);
@@ -2100,7 +2116,7 @@ int main(int argc, char *argv[])
                  std::cout << "write feature has " << 
writePolygonFeature->GetFieldCount() << " fields" << std::endl;
                //write polygon feature
              }
-             else{//write mean value of polygon to centroid point 
(ruleMap[rule_opt[0]]==rule::mean)
+             else{//write mean value of polygon to centroid point 
(ruleMap[rule_opt[0]]==rule::mean||ruleMap[rule_opt[0]]==rule::median)
                //create feature
                if(verbose_opt[0]>1)
                  std::cout << "copying fields from polygons " << sample_opt[0] 
<< std::endl;
@@ -2183,6 +2199,7 @@ int main(int argc, char *argv[])
                break;
              }//case 0 and default
              case(rule::mean):
+             case(rule::median):
              case(rule::sum):
              case(rule::centroid):{//mean value (written to centroid of 
polygon if line is not set)
                if(verbose_opt[0])
@@ -2195,6 +2212,8 @@ int main(int argc, char *argv[])
                  // ostringstream fs;
                  if(ruleMap[rule_opt[0]]==rule::mean)
                    theValue/=nPointPolygon;
+                 else if(ruleMap[rule_opt[0]]==rule::median)
+                   theValue=stat.median(polyValuesVector[index]);
                  int theBand=(band_opt[0]<0)?index:band_opt[index];
                  // if(nband==1)
                  //   fs << fieldname_opt[0];
diff --git a/src/apps/pkfillnodata.cc b/src/apps/pkfillnodata.cc
index ab87dc8..6ad1bab 100644
--- a/src/apps/pkfillnodata.cc
+++ b/src/apps/pkfillnodata.cc
@@ -27,7 +27,7 @@ extern "C" {
 #include "base/Optionpk.h"
 
 int main(int argc,char **argv) {
-  Optionpk<std::string> input_opt("i", "input", "Input image file (WARNING: 
will be overwritten with output!");
+  Optionpk<std::string> input_opt("i", "input", "Input image file");
   Optionpk<int> band_opt("b", "band", "band(s) to process (Default is -1: 
process all bands)");
   Optionpk<std::string> mask_opt("m", "mask", "Mask band indicating pixels to 
be interpolated (zero valued) ");
   Optionpk<std::string> output_opt("o", "output", "Output image file");
diff --git a/src/apps/pkfilter.cc b/src/apps/pkfilter.cc
index 6684631..7d78386 100644
--- a/src/apps/pkfilter.cc
+++ b/src/apps/pkfilter.cc
@@ -562,7 +562,7 @@ int main(int argc,char **argv) {
       theTaps[2][1]=0.0;
       theTaps[2][2]=1.0;
       filter2d.setTaps(theTaps);
-      filter2d.filter(input,output,true);//absolute and normalize
+      filter2d.filter(input,output,true,true);//absolute and normalize
       break;
     }
     case(filter2d::sobely):{//Sobel edge detection in Y
@@ -581,7 +581,7 @@ int main(int argc,char **argv) {
       theTaps[2][1]=-2.0;
       theTaps[2][2]=-1.0;
       filter2d.setTaps(theTaps);
-      filter2d.filter(input,output,true);//absolute and normalize
+      filter2d.filter(input,output,true,true);//absolute and normalize
       break;
     }
     case(filter2d::sobelxy):{//Sobel edge detection in XY
@@ -600,7 +600,7 @@ int main(int argc,char **argv) {
       theTaps[2][1]=-1.0;
       theTaps[2][2]=0.0;
       filter2d.setTaps(theTaps);
-      filter2d.filter(input,output,true);//absolute and normalize
+      filter2d.filter(input,output,true,true);//absolute and normalize
       break;
     }
     case(filter2d::sobelyx):{//Sobel edge detection in XY
@@ -619,7 +619,7 @@ int main(int argc,char **argv) {
       theTaps[2][1]=-1.0;
       theTaps[2][2]=-2.0;
       filter2d.setTaps(theTaps);
-      filter2d.filter(input,output,true);//absolute and normalize
+      filter2d.filter(input,output,true,true);//absolute and normalize
       break;
     }
     case(filter2d::smooth):{//Smoothing filter
diff --git a/src/apps/pkinfo.cc b/src/apps/pkinfo.cc
index 1282dff..6469263 100644
--- a/src/apps/pkinfo.cc
+++ b/src/apps/pkinfo.cc
@@ -306,17 +306,15 @@ int main(int argc, char *argv[])
       std::cout.precision(10);
       for(int bin=0;bin<nbin;++bin){
        double binValue=0;
-       // nsample+=output[bin];
        if(nbin==maxValue-minValue+1)
          binValue=minValue+bin;
        else
          
binValue=minValue+static_cast<double>(maxValue-minValue)*(bin+0.5)/nbin;
        std::cout << binValue << " ";
-       // std::cout << 
minValue+static_cast<double>(maxValue-minValue)*(bin+0.5)/nbin << " ";
        if(relative_opt[0])
          std::cout << 
100.0*static_cast<double>(output[bin])/static_cast<double>(nsample) << 
std::endl;
        else
-         std::cout << static_cast<double>(output[bin])  << std::endl;
+         std::cout << static_cast<double>(output[bin]) << std::endl;
       }
     }
     // else{
diff --git a/src/apps/pkpolygonize.cc b/src/apps/pkpolygonize.cc
index 5eece54..55b0b5c 100644
--- a/src/apps/pkpolygonize.cc
+++ b/src/apps/pkpolygonize.cc
@@ -37,8 +37,9 @@ extern "C" {
 using namespace std;
 
 int main(int argc,char **argv) {
-  Optionpk<string> input_opt("i", "input", "Input image file (WARNING: will be 
overwritten with output!");
+  Optionpk<string> input_opt("i", "input", "Input image file");
   Optionpk<string> mask_opt("m", "mask", "All pixels in the mask band with a 
value other than zero will be considered suitable for collection as polygons. 
Use input file as mask to remove background polygon! ");
+  Optionpk<double> nodata_opt("nodata", "nodata", "Disgard this nodata value 
when creating polygons.");
   Optionpk<string> output_opt("o", "output", "Output vector file");
   Optionpk<string> ogrformat_opt("f", "f", "Output OGR file format","ESRI 
Shapefile");
   Optionpk<int> band_opt("b", "band", "the band to be used from input file", 
0);
@@ -49,6 +50,7 @@ int main(int argc,char **argv) {
   try{
     doProcess=input_opt.retrieveOption(argc,argv);
     mask_opt.retrieveOption(argc,argv);
+    nodata_opt.retrieveOption(argc,argv);
     output_opt.retrieveOption(argc,argv);
     ogrformat_opt.retrieveOption(argc,argv);
     band_opt.retrieveOption(argc,argv);
@@ -93,7 +95,8 @@ int main(int argc,char **argv) {
   ImgReaderGdal inputReader(input_opt[0]);
   GDALRasterBand  *inputBand;
   inputBand=inputReader.getRasterBand(0);
-
+  if(nodata_opt.size())
+    inputBand->SetNoDataValue(nodata_opt[0]);
   ImgWriterOgr ogrWriter(output_opt[0],ogrformat_opt[0]);
   OGRLayer* 
theLayer=ogrWriter.createLayer(output_opt[0].substr(output_opt[0].rfind('/')+1),
 inputReader.getProjectionRef());
   if(verbose_opt[0])
diff --git a/src/apps/pkstatascii.cc b/src/apps/pkstatascii.cc
index 4cf297d..787607e 100644
--- a/src/apps/pkstatascii.cc
+++ b/src/apps/pkstatascii.cc
@@ -294,8 +294,13 @@ int main(int argc, char *argv[])
   }
   if(histogram_opt[0]){
     for(int irow=0;irow<statVector.begin()->size();++irow){
-
-      std::cout << 
minValue+static_cast<double>(maxValue-minValue)*(irow+0.5)/nbin << " ";
+      double binValue=0;
+      if(nbin==maxValue-minValue+1)
+       binValue=minValue+irow;
+      else
+       
binValue=minValue+static_cast<double>(maxValue-minValue)*(irow+0.5)/nbin;
+      std::cout << binValue << " ";
+      // std::cout << 
minValue+static_cast<double>(maxValue-minValue)*(irow+0.5)/nbin << " ";
       for(int icol=0;icol<col_opt.size();++icol){
         if(relative_opt[0])
           std::cout << 
100.0*static_cast<double>(statVector[icol][irow])/static_cast<double>(dataVector[icol].size());
@@ -332,9 +337,20 @@ int main(int argc, char *argv[])
     for(int binX=0;binX<nbin;++binX){
       std::cout << std::endl;
       for(int binY=0;binY<nbin;++binY){
+       double binValueX=0;
+       if(nbin==maxX-minX+1)
+         binValueX=minX+binX;
+       else
+         binValueX=minX+static_cast<double>(maxX-minX)*(binX+0.5)/nbin;
+       double binValueY=0;
+       if(nbin==maxY-minY+1)
+         binValueY=minY+binY;
+       else
+         binValueY=minY+static_cast<double>(maxY-minY)*(binY+0.5)/nbin;
         double value=0;
         value=static_cast<double>(histVector[binX][binY])/dataVector[0].size();
-       std::cout << minX+static_cast<double>(maxX-minX)*(binX+0.5)/nbin << " " 
<< minY+static_cast<double>(maxY-minY)*(binY+0.5)/nbin << " " << value << 
std::endl;
+       std::cout << binValueX << " " << binValueY << " " << value << std::endl;
+       // std::cout << minX+static_cast<double>(maxX-minX)*(binX+0.5)/nbin << 
" " << minY+static_cast<double>(maxY-minY)*(binY+0.5)/nbin << " " << value << 
std::endl;
       }
     }
   }
diff --git a/src/apps/pkstatogr.cc b/src/apps/pkstatogr.cc
index 139e721..5e8b43e 100644
--- a/src/apps/pkstatogr.cc
+++ b/src/apps/pkstatogr.cc
@@ -148,10 +148,16 @@ int main(int argc, char *argv[])
       std::cout << std::endl;
       if(histogram_opt[0]){
         for(int ibin=0;ibin<nbin;++ibin){
+         double binValue=0;
+         if(nbin==maxValue-minValue+1)
+           binValue=minValue+ibin;
+         else
+           
binValue=minValue+static_cast<double>(maxValue-minValue)*(ibin+0.5)/nbin;
+         std::cout << binValue << " ";
           if(relative_opt[0])
-            std::cout << 
minValue+static_cast<double>(maxValue-minValue)*(ibin+0.5)/nbin << " " << 
100.0*static_cast<double>(binData[ibin])/theData.size() << std::endl;
+            std::cout << 
100.0*static_cast<double>(binData[ibin])/theData.size() << std::endl;
           else
-            std::cout << 
minValue+static_cast<double>(maxValue-minValue)*(ibin+0.5)/nbin << " " << 
binData[ibin] << std::endl;
+            std::cout << binData[ibin] << std::endl;
         }
       }
     }

-- 
Alioth's /usr/local/bin/git-commit-notice on 
/srv/git.debian.org/git/pkg-grass/pktools.git

_______________________________________________
Pkg-grass-devel mailing list
Pkg-grass-devel@lists.alioth.debian.org
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-grass-devel

Reply via email to