[pktools] 186/375: support median filter in pkextract

Bas Couwenberg sebastic at xs4all.nl
Wed Dec 3 21:54:12 UTC 2014


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 <kempenep at 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



More information about the Pkg-grass-devel mailing list