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 8f2c83b00c79924faa51b65434cc134e42faace4
Author: Pieter Kempeneers <kempe...@gmail.com>
Date:   Sat Jan 4 21:36:07 2014 +0100

    redundant ilayer loop in readDataImageShape in ImgReaderOgr.cc
---
 src/apps/pkclassify_nn.cc        | 230 +++++++++++++++++----------------
 src/apps/pkclassify_svm.cc       | 272 ++++++++++++++++++++-------------------
 src/apps/pkextract.cc            |   2 +-
 src/imageclasses/ImgReaderOgr.cc | 104 +++++++--------
 src/imageclasses/ImgReaderOgr.h  |   1 +
 5 files changed, 315 insertions(+), 294 deletions(-)

diff --git a/src/apps/pkclassify_nn.cc b/src/apps/pkclassify_nn.cc
index e369096..3fadf15 100644
--- a/src/apps/pkclassify_nn.cc
+++ b/src/apps/pkclassify_nn.cc
@@ -981,121 +981,131 @@ int main(int argc, char *argv[])
        else
          imgWriterOgr.createField("class",OFTString);
       }
-      OGRFeature *poFeature;
-      unsigned int ifeature=0;
-      unsigned int nFeatures=imgReaderOgr.getFeatureCount();
-      while( (poFeature = imgReaderOgr.getLayer()->GetNextFeature()) != NULL ){
-        if(verbose_opt[0]>1)
-          cout << "feature " << ifeature << endl;
-        if( poFeature == NULL )
-          break;
-        OGRFeature *poDstFeature = NULL;
-       if(output_opt.size()){
-          poDstFeature=imgWriterOgr.createFeature();
-          if( poDstFeature->SetFrom( poFeature, TRUE ) != OGRERR_NONE ){
-            CPLError( CE_Failure, CPLE_AppDefined,
-                      "Unable to translate feature %d from layer %s.\n",
-                      poFeature->GetFID(), imgWriterOgr.getLayerName().c_str() 
);
-            OGRFeature::DestroyFeature( poFeature );
-            OGRFeature::DestroyFeature( poDstFeature );
-          }
-        }
-        vector<float> validationPixel;
-        vector<float> validationFeature;
+      if(verbose_opt[0])
+       cout << "number of layers in input ogr file: " << 
imgReaderOgr.getLayerCount() << endl;
+      for(int ilayer=0;ilayer<imgReaderOgr.getLayerCount();++ilayer){
+       if(verbose_opt[0])
+         cout << "processing input layer " << ilayer << endl;
+       unsigned int nFeatures=imgReaderOgr.getFeatureCount(ilayer);
+       unsigned int ifeature=0;
+       progress=0;
+       pfnProgress(progress,pszMessage,pProgressArg);
+       OGRFeature *poFeature;
+       while( (poFeature = imgReaderOgr.getLayer(ilayer)->GetNextFeature()) != 
NULL ){
+         if(verbose_opt[0]>1)
+           cout << "feature " << ifeature << endl;
+         if( poFeature == NULL ){
+           cout << "Warning: could not read feature " << ifeature << " in 
layer " << imgReaderOgr.getLayerName(ilayer) << endl;
+           continue;
+         }
+         OGRFeature *poDstFeature = NULL;
+         if(output_opt.size()){
+           poDstFeature=imgWriterOgr.createFeature();
+           if( poDstFeature->SetFrom( poFeature, TRUE ) != OGRERR_NONE ){
+             CPLError( CE_Failure, CPLE_AppDefined,
+                       "Unable to translate feature %d from layer %s.\n",
+                       poFeature->GetFID(), 
imgWriterOgr.getLayerName().c_str() );
+             OGRFeature::DestroyFeature( poFeature );
+             OGRFeature::DestroyFeature( poDstFeature );
+           }
+         }
+         vector<float> validationPixel;
+         vector<float> validationFeature;
         
-        imgReaderOgr.readData(validationPixel,OFTReal,fields,poFeature);
-        assert(validationPixel.size()==nband);
-        vector<float> probOut(nclass);//posterior prob for each class
-        for(int iclass=0;iclass<nclass;++iclass)
-          probOut[iclass]=0;
-        for(int ibag=0;ibag<nbag;++ibag){
-          for(int iband=0;iband<nband;++iband){
-            
validationFeature.push_back((validationPixel[iband]-offset[ibag][iband])/scale[ibag][iband]);
-            if(verbose_opt[0]==2)
-              std:: cout << " " << validationFeature.back();
-          }
-          if(verbose_opt[0]==2)
-            std::cout << std:: endl;
-          vector<float> result(nclass);
-          result=net[ibag].run(validationFeature);
+         
imgReaderOgr.readData(validationPixel,OFTReal,fields,poFeature,ilayer);
+         assert(validationPixel.size()==nband);
+         vector<float> probOut(nclass);//posterior prob for each class
+         for(int iclass=0;iclass<nclass;++iclass)
+           probOut[iclass]=0;
+         for(int ibag=0;ibag<nbag;++ibag){
+           for(int iband=0;iband<nband;++iband){
+             
validationFeature.push_back((validationPixel[iband]-offset[ibag][iband])/scale[ibag][iband]);
+             if(verbose_opt[0]==2)
+               std:: cout << " " << validationFeature.back();
+           }
+           if(verbose_opt[0]==2)
+             std::cout << std:: endl;
+           vector<float> result(nclass);
+           result=net[ibag].run(validationFeature);
 
-          if(verbose_opt[0]>1){
-            for(int iclass=0;iclass<result.size();++iclass)
-              std::cout << result[iclass] << " ";
-            std::cout << std::endl;
-          }
-          //calculate posterior prob of bag 
-          for(int iclass=0;iclass<nclass;++iclass){
-           result[iclass]=(result[iclass]+1.0)/2.0;//bring back to scale [0,1]
-            switch(comb_opt[0]){
-            default:
-            case(0)://sum rule
-              probOut[iclass]+=result[iclass]*priors[iclass];//add 
probabilities for each bag
-              break;
-            case(1)://product rule
-              
probOut[iclass]*=pow(priors[iclass],static_cast<float>(1.0-nbag)/nbag)*result[iclass];//multiply
 probabilities for each bag
+           if(verbose_opt[0]>1){
+             for(int iclass=0;iclass<result.size();++iclass)
+               std::cout << result[iclass] << " ";
+             std::cout << std::endl;
+           }
+           //calculate posterior prob of bag 
+           for(int iclass=0;iclass<nclass;++iclass){
+             result[iclass]=(result[iclass]+1.0)/2.0;//bring back to scale 
[0,1]
+             switch(comb_opt[0]){
+             default:
+             case(0)://sum rule
+               probOut[iclass]+=result[iclass]*priors[iclass];//add 
probabilities for each bag
               break;
-            case(2)://max rule
-              if(priors[iclass]*result[iclass]>probOut[iclass])
-                probOut[iclass]=priors[iclass]*result[iclass];
-              break;
-            }
-          }
-        }//for ibag
-        //search for max class prob
-        float maxBag=0;
-        float normBag=0;
-        string classOut="Unclassified";
-        for(int iclass=0;iclass<nclass;++iclass){
-          if(verbose_opt[0]>1)
-            std::cout << probOut[iclass] << " ";
-          if(probOut[iclass]>maxBag){
-            maxBag=probOut[iclass];
-           classOut=nameVector[iclass];
-          }
-        }
-        //look for class name
-        if(verbose_opt[0]>1){
-         if(classValueMap.size())
-           std::cout << "->" << classValueMap[classOut] << std::endl;
-         else      
-           std::cout << "->" << classOut << std::endl;
-       }
-       if(output_opt.size()){
-         if(classValueMap.size())
-           poDstFeature->SetField("class",classValueMap[classOut]);
-         else      
-           poDstFeature->SetField("class",classOut.c_str());
-         poDstFeature->SetFID( poFeature->GetFID() );
-       }
-       int labelIndex=poFeature->GetFieldIndex(label_opt[0].c_str());
-       if(labelIndex>=0){
-         string classRef=poFeature->GetFieldAsString(labelIndex);
-         if(classRef!="0"){
+             case(1)://product rule
+               
probOut[iclass]*=pow(priors[iclass],static_cast<float>(1.0-nbag)/nbag)*result[iclass];//multiply
 probabilities for each bag
+               break;
+             case(2)://max rule
+               if(priors[iclass]*result[iclass]>probOut[iclass])
+                 probOut[iclass]=priors[iclass]*result[iclass];
+               break;
+             }
+           }
+         }//for ibag
+         //search for max class prob
+         float maxBag=0;
+         float normBag=0;
+         string classOut="Unclassified";
+         for(int iclass=0;iclass<nclass;++iclass){
+           if(verbose_opt[0]>1)
+             std::cout << probOut[iclass] << " ";
+           if(probOut[iclass]>maxBag){
+             maxBag=probOut[iclass];
+             classOut=nameVector[iclass];
+           }
+         }
+         //look for class name
+         if(verbose_opt[0]>1){
            if(classValueMap.size())
-             
cm.incrementResult(type2string<short>(classValueMap[classRef]),type2string<short>(classValueMap[classOut]),1);
-           else
-             cm.incrementResult(classRef,classOut,1);
+             std::cout << "->" << classValueMap[classOut] << std::endl;
+           else            
+             std::cout << "->" << classOut << std::endl;
          }
-       }
-        CPLErrorReset();
-       if(output_opt.size()){
-          if(imgWriterOgr.createFeature( poDstFeature ) != OGRERR_NONE){
-            CPLError( CE_Failure, CPLE_AppDefined,
-                      "Unable to translate feature %d from layer %s.\n",
-                      poFeature->GetFID(), imgWriterOgr.getLayerName().c_str() 
);
-            OGRFeature::DestroyFeature( poDstFeature );
-            OGRFeature::DestroyFeature( poDstFeature );
-          }
-        }
-        ++ifeature;
-        if(!verbose_opt[0]){
-          progress=static_cast<float>(ifeature+1.0)/nFeatures;
-          pfnProgress(progress,pszMessage,pProgressArg);
-        }
-        OGRFeature::DestroyFeature( poFeature );
-        OGRFeature::DestroyFeature( poDstFeature );
-      }
+         if(output_opt.size()){
+           if(classValueMap.size())
+             poDstFeature->SetField("class",classValueMap[classOut]);
+           else            
+             poDstFeature->SetField("class",classOut.c_str());
+           poDstFeature->SetFID( poFeature->GetFID() );
+         }
+         int labelIndex=poFeature->GetFieldIndex(label_opt[0].c_str());
+         if(labelIndex>=0){
+           string classRef=poFeature->GetFieldAsString(labelIndex);
+           if(classRef!="0"){
+             if(classValueMap.size())
+               
cm.incrementResult(type2string<short>(classValueMap[classRef]),type2string<short>(classValueMap[classOut]),1);
+             else
+               cm.incrementResult(classRef,classOut,1);
+           }
+         }
+         CPLErrorReset();
+         if(output_opt.size()){
+           if(imgWriterOgr.createFeature( poDstFeature ) != OGRERR_NONE){
+             CPLError( CE_Failure, CPLE_AppDefined,
+                       "Unable to translate feature %d from layer %s.\n",
+                       poFeature->GetFID(), 
imgWriterOgr.getLayerName().c_str() );
+             OGRFeature::DestroyFeature( poDstFeature );
+             OGRFeature::DestroyFeature( poDstFeature );
+           }
+         }
+         ++ifeature;
+         if(!verbose_opt[0]){
+           progress=static_cast<float>(ifeature+1.0)/nFeatures;
+           pfnProgress(progress,pszMessage,pProgressArg);
+         }
+         OGRFeature::DestroyFeature( poFeature );
+         OGRFeature::DestroyFeature( poDstFeature );
+       }//get next feature
+      }//next layer
       imgReaderOgr.close();
       if(output_opt.size())
       imgWriterOgr.close();
diff --git a/src/apps/pkclassify_svm.cc b/src/apps/pkclassify_svm.cc
index 8a1512c..1ed2ffa 100644
--- a/src/apps/pkclassify_svm.cc
+++ b/src/apps/pkclassify_svm.cc
@@ -57,7 +57,7 @@ int main(int argc, char *argv[])
   Optionpk<short> band_opt("b", "band", "band index (starting from 0, either 
use band option or use start to end)");
   Optionpk<double> offset_opt("\0", "offset", "offset value for each spectral 
band input features: refl[band]=(DN[band]-offset[band])/scale[band]", 0.0);
   Optionpk<double> scale_opt("\0", "scale", "scale value for each spectral 
band input features: refl=(DN[band]-offset[band])/scale[band] (use 0 if scale 
min and max in each band to -1.0 and 1.0)", 0.0);
-  Optionpk<double> priors_opt("p", "prior", "prior probabilities for each 
class (e.g., -p 0.3 -p 0.3 -p 0.2 )", 0.0); 
+  Optionpk<double> priors_opt("p", "prior", "prior probabilities for each 
class (e.g., -p 0.3 -p 0.3 -p 0.2 ). Used for input only (ignored for cross 
validation)", 0.0); 
   Optionpk<string> priorimg_opt("pim", "priorimg", "prior probability image 
(multi-band img with band for each class"); 
   Optionpk<unsigned short> cv_opt("cv", "cv", "n-fold cross validation 
mode",0);
   Optionpk<std::string> svm_type_opt("svmt", "svmtype", "type of SVM (C_SVC, 
nu_SVC,one_class, epsilon_SVR, nu_SVR)","C_SVC");
@@ -979,144 +979,154 @@ int main(int argc, char *argv[])
        else
          imgWriterOgr.createField("class",OFTString);
       }
-      OGRFeature *poFeature;
-      unsigned int ifeature=0;
-      unsigned int nFeatures=imgReaderOgr.getFeatureCount();
-      while( (poFeature = imgReaderOgr.getLayer()->GetNextFeature()) != NULL ){
-        if(verbose_opt[0]>1)
-          std::cout << "feature " << ifeature << std::endl;
-        if( poFeature == NULL )
-          break;
-        OGRFeature *poDstFeature = NULL;
-       if(output_opt.size()){
-         poDstFeature=imgWriterOgr.createFeature();
-         if( poDstFeature->SetFrom( poFeature, TRUE ) != OGRERR_NONE ){
-           CPLError( CE_Failure, CPLE_AppDefined,
-                     "Unable to translate feature %d from layer %s.\n",
-                     poFeature->GetFID(), imgWriterOgr.getLayerName().c_str() 
);
-           OGRFeature::DestroyFeature( poFeature );
-           OGRFeature::DestroyFeature( poDstFeature );
+      if(verbose_opt[0])
+       cout << "number of layers in input ogr file: " << 
imgReaderOgr.getLayerCount() << endl;
+      for(int ilayer=0;ilayer<imgReaderOgr.getLayerCount();++ilayer){
+       if(verbose_opt[0])
+         cout << "processing input layer " << ilayer << endl;
+       unsigned int nFeatures=imgReaderOgr.getFeatureCount(ilayer);
+       unsigned int ifeature=0;
+       progress=0;
+       pfnProgress(progress,pszMessage,pProgressArg);
+       OGRFeature *poFeature;
+       while( (poFeature = imgReaderOgr.getLayer(ilayer)->GetNextFeature()) != 
NULL ){
+         if(verbose_opt[0]>1)
+           std::cout << "feature " << ifeature << std::endl;
+         if( poFeature == NULL ){
+             cout << "Warning: could not read feature " << ifeature << " in 
layer " << imgReaderOgr.getLayerName(ilayer) << endl;
+             continue;
          }
-       }
-        vector<float> validationPixel;
-        vector<float> validationFeature;
+         OGRFeature *poDstFeature = NULL;
+         if(output_opt.size()){
+           poDstFeature=imgWriterOgr.createFeature();
+           if( poDstFeature->SetFrom( poFeature, TRUE ) != OGRERR_NONE ){
+             CPLError( CE_Failure, CPLE_AppDefined,
+                       "Unable to translate feature %d from layer %s.\n",
+                       poFeature->GetFID(), 
imgWriterOgr.getLayerName().c_str() );
+             OGRFeature::DestroyFeature( poFeature );
+             OGRFeature::DestroyFeature( poDstFeature );
+           }
+         }
+         vector<float> validationPixel;
+         vector<float> validationFeature;
         
-        imgReaderOgr.readData(validationPixel,OFTReal,fields,poFeature);
-        assert(validationPixel.size()==nband);
-        vector<float> probOut(nclass);//posterior prob for each class
-        for(short iclass=0;iclass<nclass;++iclass)
-          probOut[iclass]=0;
-        for(int ibag=0;ibag<nbag;++ibag){
-          for(int iband=0;iband<nband;++iband){
-            
validationFeature.push_back((validationPixel[iband]-offset[ibag][iband])/scale[ibag][iband]);
-            if(verbose_opt[0]==2)
-              std::cout << " " << validationFeature.back();
-          }
-          if(verbose_opt[0]==2)
-            std::cout << std::endl;
-          vector<double> result(nclass);
-          struct svm_node *x;
-          x = (struct svm_node *) 
malloc((validationFeature.size()+1)*sizeof(struct svm_node));
-          for(int i=0;i<validationFeature.size();++i){
-            x[i].index=i+1;
-            x[i].value=validationFeature[i];
-          }
+         
imgReaderOgr.readData(validationPixel,OFTReal,fields,poFeature,ilayer);
+         assert(validationPixel.size()==nband);
+         vector<float> probOut(nclass);//posterior prob for each class
+         for(short iclass=0;iclass<nclass;++iclass)
+           probOut[iclass]=0;
+         for(int ibag=0;ibag<nbag;++ibag){
+           for(int iband=0;iband<nband;++iband){
+             
validationFeature.push_back((validationPixel[iband]-offset[ibag][iband])/scale[ibag][iband]);
+             if(verbose_opt[0]==2)
+               std::cout << " " << validationFeature.back();
+           }
+           if(verbose_opt[0]==2)
+             std::cout << std::endl;
+           vector<double> result(nclass);
+           struct svm_node *x;
+           x = (struct svm_node *) 
malloc((validationFeature.size()+1)*sizeof(struct svm_node));
+           for(int i=0;i<validationFeature.size();++i){
+             x[i].index=i+1;
+             x[i].value=validationFeature[i];
+           }
 
-          x[validationFeature.size()].index=-1;//to end svm feature vector
-          double predict_label=0;
-          if(!prob_est_opt[0]){
-            predict_label = svm_predict(svm[ibag],x);
-            for(short iclass=0;iclass<nclass;++iclass){
-              if(iclass==static_cast<short>(predict_label))
-                result[iclass]=1;
-              else
-                result[iclass]=0;
-            }
-          }
-          else{
-            assert(svm_check_probability_model(svm[ibag]));
-            predict_label = svm_predict_probability(svm[ibag],x,&(result[0]));
-          }
-          if(verbose_opt[0]>1){
-            std::cout << "predict_label: " << predict_label << std::endl;
-            for(int iclass=0;iclass<result.size();++iclass)
-              std::cout << result[iclass] << " ";
-            std::cout << std::endl;
-          }
+           x[validationFeature.size()].index=-1;//to end svm feature vector
+           double predict_label=0;
+           if(!prob_est_opt[0]){
+             predict_label = svm_predict(svm[ibag],x);
+             for(short iclass=0;iclass<nclass;++iclass){
+               if(iclass==static_cast<short>(predict_label))
+                 result[iclass]=1;
+               else
+                 result[iclass]=0;
+             }
+           }
+           else{
+             assert(svm_check_probability_model(svm[ibag]));
+             predict_label = svm_predict_probability(svm[ibag],x,&(result[0]));
+           }
+           if(verbose_opt[0]>1){
+             std::cout << "predict_label: " << predict_label << std::endl;
+             for(int iclass=0;iclass<result.size();++iclass)
+               std::cout << result[iclass] << " ";
+             std::cout << std::endl;
+           }
 
-          //calculate posterior prob of bag 
-          for(short iclass=0;iclass<nclass;++iclass){
-            switch(comb_opt[0]){
-            default:
-            case(0)://sum rule
-              probOut[iclass]+=result[iclass]*priors[iclass];//add 
probabilities for each bag
-               break;
-            case(1)://product rule
-              
probOut[iclass]*=pow(priors[iclass],static_cast<float>(1.0-nbag)/nbag)*result[iclass];//multiply
 probabilities for each bag
-              break;
-            case(2)://max rule
-              if(priors[iclass]*result[iclass]>probOut[iclass])
-                probOut[iclass]=priors[iclass]*result[iclass];
-              break;
-            }
-          }
-          free(x);
-        }//for ibag
+           //calculate posterior prob of bag 
+           for(short iclass=0;iclass<nclass;++iclass){
+             switch(comb_opt[0]){
+             default:
+             case(0)://sum rule
+               probOut[iclass]+=result[iclass]*priors[iclass];//add 
probabilities for each bag
+             break;
+             case(1)://product rule
+               
probOut[iclass]*=pow(priors[iclass],static_cast<float>(1.0-nbag)/nbag)*result[iclass];//multiply
 probabilities for each bag
+               break;
+             case(2)://max rule
+               if(priors[iclass]*result[iclass]>probOut[iclass])
+                 probOut[iclass]=priors[iclass]*result[iclass];
+               break;
+             }
+           }
+           free(x);
+         }//for ibag
 
-        //search for max class prob
-        float maxBag=0;
-        float normBag=0;
-        string classOut="Unclassified";
-        for(short iclass=0;iclass<nclass;++iclass){
-          if(verbose_opt[0]>1)
-            std::cout << probOut[iclass] << " ";
-          if(probOut[iclass]>maxBag){
-            maxBag=probOut[iclass];
-           classOut=nameVector[iclass];
-          }
-        }
-        //look for class name
-        if(verbose_opt[0]>1){
-         if(classValueMap.size())
-           std::cout << "->" << classValueMap[classOut] << std::endl;
-         else      
-           std::cout << "->" << classOut << std::endl;
-       }
-       if(output_opt.size()){
-         if(classValueMap.size())
-           poDstFeature->SetField("class",classValueMap[classOut]);
-         else      
-           poDstFeature->SetField("class",classOut.c_str());
-         poDstFeature->SetFID( poFeature->GetFID() );
-       }
-       int labelIndex=poFeature->GetFieldIndex(label_opt[0].c_str());
-       if(labelIndex>=0){
-         string classRef=poFeature->GetFieldAsString(labelIndex);
-         if(classRef!="0"){
+         //search for max class prob
+         float maxBag=0;
+         float normBag=0;
+         string classOut="Unclassified";
+         for(short iclass=0;iclass<nclass;++iclass){
+           if(verbose_opt[0]>1)
+             std::cout << probOut[iclass] << " ";
+           if(probOut[iclass]>maxBag){
+             maxBag=probOut[iclass];
+             classOut=nameVector[iclass];
+           }
+         }
+         //look for class name
+         if(verbose_opt[0]>1){
            if(classValueMap.size())
-             
cm.incrementResult(type2string<short>(classValueMap[classRef]),type2string<short>(classValueMap[classOut]),1);
-           else
-             cm.incrementResult(classRef,classOut,1);
+             std::cout << "->" << classValueMap[classOut] << std::endl;
+           else            
+             std::cout << "->" << classOut << std::endl;
          }
-       }
-        CPLErrorReset();
-       if(output_opt.size()){
-         if(imgWriterOgr.createFeature( poDstFeature ) != OGRERR_NONE){
-           CPLError( CE_Failure, CPLE_AppDefined,
-                     "Unable to translate feature %d from layer %s.\n",
-                     poFeature->GetFID(), imgWriterOgr.getLayerName().c_str() 
);
-           OGRFeature::DestroyFeature( poDstFeature );
-           OGRFeature::DestroyFeature( poDstFeature );
+         if(output_opt.size()){
+           if(classValueMap.size())
+             poDstFeature->SetField("class",classValueMap[classOut]);
+           else            
+             poDstFeature->SetField("class",classOut.c_str());
+           poDstFeature->SetFID( poFeature->GetFID() );
          }
-       }
-        ++ifeature;
-        if(!verbose_opt[0]){
-          progress=static_cast<float>(ifeature+1.0)/nFeatures;
-          pfnProgress(progress,pszMessage,pProgressArg);
-        }
-        OGRFeature::DestroyFeature( poFeature );
-        OGRFeature::DestroyFeature( poDstFeature );
-      }
+         int labelIndex=poFeature->GetFieldIndex(label_opt[0].c_str());
+         if(labelIndex>=0){
+           string classRef=poFeature->GetFieldAsString(labelIndex);
+           if(classRef!="0"){
+             if(classValueMap.size())
+               
cm.incrementResult(type2string<short>(classValueMap[classRef]),type2string<short>(classValueMap[classOut]),1);
+             else
+               cm.incrementResult(classRef,classOut,1);
+           }
+         }
+         CPLErrorReset();
+         if(output_opt.size()){
+           if(imgWriterOgr.createFeature( poDstFeature ) != OGRERR_NONE){
+             CPLError( CE_Failure, CPLE_AppDefined,
+                       "Unable to translate feature %d from layer %s.\n",
+                       poFeature->GetFID(), 
imgWriterOgr.getLayerName().c_str() );
+             OGRFeature::DestroyFeature( poDstFeature );
+             OGRFeature::DestroyFeature( poDstFeature );
+           }
+         }
+         ++ifeature;
+         if(!verbose_opt[0]){
+           progress=static_cast<float>(ifeature+1.0)/nFeatures;
+           pfnProgress(progress,pszMessage,pProgressArg);
+         }
+         OGRFeature::DestroyFeature( poFeature );
+         OGRFeature::DestroyFeature( poDstFeature );
+       }//get next feature
+      }//next layer
       imgReaderOgr.close();
       if(output_opt.size())
        imgWriterOgr.close();
diff --git a/src/apps/pkextract.cc b/src/apps/pkextract.cc
index a831110..5d6820a 100644
--- a/src/apps/pkextract.cc
+++ b/src/apps/pkextract.cc
@@ -52,7 +52,7 @@ int main(int argc, char *argv[])
   Optionpk<string> bufferOutput_opt("bu", "bu", "Buffer output shape file");
   Optionpk<short> geo_opt("g", "geo", "geo coordinates", 1);
   Optionpk<short> down_opt("down", "down", "down sampling factor. Can be used 
to create grid points", 1);
-  Optionpk<float> threshold_opt("t", "threshold", "threshold for selecting 
samples (randomly). Provide probability in percentage (>0) or absolute (<0). 
Use multiple threshold values (e.g. -t 80 -t 60) if more classes are to be 
extracted with random selection. Use value 100 to select all pixels for 
selected class(es)", 100);
+  Optionpk<float> threshold_opt("t", "threshold", "threshold for selecting 
samples (randomly). Provide probability in percentage (>0) or absolute (<0). 
Use a single threshold for vector sample files. If using raster land cover maps 
as a sample file, you can provide a threshold value for each class (e.g. -t 80 
-t 60). Use value 100 to select all pixels for selected class(es)", 100);
   Optionpk<double> min_opt("min", "min", "minimum number of samples to select 
(0)", 0);
   Optionpk<short> boundary_opt("bo", "boundary", "boundary for selecting the 
sample", 1);
   // Optionpk<short> rbox_opt("rb", "rbox", "rectangular boundary box (total 
width in m) to draw around the selected pixel. Can not combined with class 
option. Use multiple rbox options for multiple boundary boxes. Use value 0 for 
no box)", 0);
diff --git a/src/imageclasses/ImgReaderOgr.cc b/src/imageclasses/ImgReaderOgr.cc
index 09e54c5..7adf657 100644
--- a/src/imageclasses/ImgReaderOgr.cc
+++ b/src/imageclasses/ImgReaderOgr.cc
@@ -230,57 +230,59 @@ unsigned int 
ImgReaderOgr::readDataImageShape(std::map<std::string,Vector2d<floa
   if(verbose)
     std::cout << "reading shape file " << m_filename  << std::endl;
   try{
-    for(int ilayer=0;ilayer<m_datasource->GetLayerCount();++ilayer){
-      //only retain bands in fields
-      getFields(fields);
-      std::vector<std::string>::iterator fit=fields.begin();
-      if(verbose>1)
-       std::cout << "reading fields: ";
-      while(fit!=fields.end()){
-       if(verbose)
-         std::cout << *fit << " ";
-       // size_t 
pos=(*fit).find_first_not_of("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_
 ");
-       if((*fit).substr(0,1)=="B"||(*fit).substr(0,1)=="b"){
-         
if((*fit).substr(1).find_first_not_of("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_
 ")!=std::string::npos){
-           int theBand=atoi((*fit).substr(1).c_str());
-           if(bands.size()){
-             bool validBand=false;
-             for(int iband=0;iband<bands.size();++iband){
-               if(theBand==bands[iband])
-                 validBand=true;
-             }
-             if(validBand)
-               ++fit;
-             else
-               fields.erase(fit);
+    //only retain bands in fields
+    getFields(fields);
+    std::vector<std::string>::iterator fit=fields.begin();
+    if(verbose>1)
+      std::cout << "reading fields: ";
+    while(fit!=fields.end()){
+      if(verbose)
+       std::cout << *fit << " ";
+      // size_t 
pos=(*fit).find_first_not_of("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_
 ");
+      if((*fit).substr(0,1)=="B"||(*fit).substr(0,1)=="b"){
+       
if((*fit).substr(1).find_first_not_of("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_
 ")!=std::string::npos){
+         int theBand=atoi((*fit).substr(1).c_str());
+         if(bands.size()){
+           bool validBand=false;
+           for(int iband=0;iband<bands.size();++iband){
+             if(theBand==bands[iband])
+               validBand=true;
            }
-           else
+           if(validBand)
              ++fit;
+           else
+             fields.erase(fit);
          }
-         else if((*fit)=="B" || (*fit)=="b" || (*fit)=="Band")//B is only band
+         else
            ++fit;
        }
-       else
-         fields.erase(fit);
-      }
-      if(verbose)
-       std::cout << std::endl;
-      if(verbose){
-       std::cout << "fields:";
-       for(std::vector<std::string>::iterator 
fit=fields.begin();fit!=fields.end();++fit)
-         std::cout << " " << *fit;
-       std::cout << std::endl;
+       else if((*fit)=="B" || (*fit)=="b" || (*fit)=="Band")//B is only band
+         ++fit;
       }
+      else
+       fields.erase(fit);
+    }
+    if(verbose)
+      std::cout << std::endl;
+    if(verbose){
+      std::cout << "fields:";
+      for(std::vector<std::string>::iterator 
fit=fields.begin();fit!=fields.end();++fit)
+       std::cout << " " << *fit;
+      std::cout << std::endl;
+    }
+    for(int ilayer=0;ilayer<m_datasource->GetLayerCount();++ilayer){
       if(!nband){
        if(verbose)
          std::cout << "reading data" << std::endl;
-       for(int ilayer=0;ilayer<m_datasource->GetLayerCount();++ilayer)
-         nband=readData(mapPixels,OFTReal,fields,label,ilayer,true,verbose==2);
+       nband=readData(mapPixels,OFTReal,fields,label,ilayer,true,verbose==2);
       }
       else{
-       for(int ilayer=0;ilayer<m_datasource->GetLayerCount();++ilayer)
-         
assert(nband==readData(mapPixels,OFTReal,fields,label,ilayer,true,false));
+       
assert(nband==readData(mapPixels,OFTReal,fields,label,ilayer,true,false));
       }
+      nsample=getFeatureCount(ilayer);
+      totalSamples+=nsample;
+      if(verbose)
+       std::cout << ": " << nsample << " samples read with " << nband << " 
bands" << std::endl;
     }
   }
   catch(std::string e){
@@ -288,10 +290,6 @@ unsigned int 
ImgReaderOgr::readDataImageShape(std::map<std::string,Vector2d<floa
     estr << e << " " << m_filename;
     throw(estr.str());
   }
-  nsample=getFeatureCount();
-  totalSamples+=nsample;
-  if(verbose)
-    std::cout << ": " << nsample << " samples read with " << nband << " bands" 
<< std::endl;
   if(verbose)
     std::cout << "total number of samples read " << totalSamples << std::endl;
   return totalSamples;
@@ -342,15 +340,19 @@ unsigned int 
ImgReaderOgr::readDataImageShape(std::map<std::string,Vector2d<floa
        std::cout << " " << *fit;
       std::cout << std::endl;
     }
-    if(!nband){
-      if(verbose)
-       std::cout << "reading data" << std::endl;
-      for(int ilayer=0;ilayer<m_datasource->GetLayerCount();++ilayer)
+    for(int ilayer=0;ilayer<m_datasource->GetLayerCount();++ilayer){
+      if(!nband){
+       if(verbose)
+         std::cout << "reading data" << std::endl;
        nband=readData(mapPixels,OFTReal,fields,label,ilayer,true,verbose==2);
-    }
-    else{
-      for(int ilayer=0;ilayer<m_datasource->GetLayerCount();++ilayer)
+      }
+      else{
        
assert(nband==readData(mapPixels,OFTReal,fields,label,ilayer,true,false));
+      }
+      nsample=getFeatureCount(ilayer);
+      totalSamples+=nsample;
+      if(verbose)
+       std::cout << ": " << nsample << " samples read with " << nband << " 
bands" << std::endl;
     }
   }
   catch(std::string e){
@@ -358,8 +360,6 @@ unsigned int 
ImgReaderOgr::readDataImageShape(std::map<std::string,Vector2d<floa
     estr << e << " " << m_filename;
     throw(estr.str());
   }
-  nsample=getFeatureCount();
-  totalSamples+=nsample;
   if(verbose)
     std::cout << ": " << nsample << " samples read with " << nband << " bands" 
<< std::endl;
   if(verbose)
diff --git a/src/imageclasses/ImgReaderOgr.h b/src/imageclasses/ImgReaderOgr.h
index ea210e4..36653e6 100644
--- a/src/imageclasses/ImgReaderOgr.h
+++ b/src/imageclasses/ImgReaderOgr.h
@@ -73,6 +73,7 @@ public:
   int getFields(std::vector<OGRFieldDefn*>& fields, int layer=0) const;
   OGRDataSource* getDataSource(void) {return m_datasource;};
   OGRSFDriver* getDriver(void) const {return m_datasource->GetDriver();};
+  int getLayerCount(void) const {return m_datasource->GetLayerCount();};
 //   OGRLayer *executeSql(const std::string& output,const std::string& 
sqlStatement, OGRGeometry* spatialFilter=NULL);
   template<typename T> int readSql(Vector2d<T>& data, const OGRFieldType& 
fieldType, std::vector<std::string>& fields, const std::string& sqlStatement, 
OGRGeometry* spatialFilter=NULL, int layer=0, bool pos=false, bool 
verbose=false);
   template<typename T> int readSql(std::map<int,Vector2d<T> >& data, const 
OGRFieldType& fieldType, std::vector<std::string>& fields, const std::string& 
label, const std::string& sqlStatement, OGRGeometry* spatialFilter, int 
layer=0, bool pos=false, bool verbose=false);

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