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 b3cabccddaf6feee43030a44200b209c04cf3aed
Author: Pieter Kempeneers <kempe...@gmail.com>
Date:   Fri Jan 3 23:38:56 2014 +0100

    support multi layers in ImgReaderOgr::readDataImageShape (for 
pkclassify_svm and pkclassify_nn)
---
 src/apps/pkextract.cc            |  37 +++++---------
 src/imageclasses/ImgReaderOgr.cc | 102 +++++++++++++++++++++------------------
 src/imageclasses/ImgReaderOgr.h  |  18 -------
 3 files changed, 66 insertions(+), 91 deletions(-)

diff --git a/src/apps/pkextract.cc b/src/apps/pkextract.cc
index 622a350..a831110 100644
--- a/src/apps/pkextract.cc
+++ b/src/apps/pkextract.cc
@@ -49,7 +49,6 @@ int main(int argc, char *argv[])
   Optionpk<string> output_opt("o", "output", "Output sample file (image 
file)");
   Optionpk<string> ogrformat_opt("f", "f", "Output sample file format","ESRI 
Shapefile");
   Optionpk<string> test_opt("test", "test", "Test sample file (use this option 
in combination with threshold<100 to create a training (output) and test set");
-  Optionpk<bool> keepFeatures_opt("k", "keep", "Keep original features in 
output vector file", false);
   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);
@@ -78,7 +77,6 @@ int main(int argc, char *argv[])
     output_opt.retrieveOption(argc,argv);
     ogrformat_opt.retrieveOption(argc,argv);
     test_opt.retrieveOption(argc,argv);
-    keepFeatures_opt.retrieveOption(argc,argv);
     bufferOutput_opt.retrieveOption(argc,argv);
     geo_opt.retrieveOption(argc,argv);
     down_opt.retrieveOption(argc,argv);
@@ -826,8 +824,6 @@ int main(int argc, char *argv[])
          cs << class_opt[iclass];
          ogrWriter.createField(cs.str(),fieldType,ilayer);
        }
-       if(keepFeatures_opt[0])
-         ogrWriter.createField("origId",OFTInteger,ilayer);//the fieldId of 
the original feature
        break;
       }
       case(rule::custom):
@@ -843,11 +839,6 @@ int main(int argc, char *argv[])
       case(rule::mean):
       case(rule::centroid):
       default:{
-       if(keepFeatures_opt[0]){
-         ogrWriter.createField("origId",OFTInteger,ilayer);//the fieldId of 
the original feature
-         if(test_opt.size())
-           ogrTestWriter.createField("origId",OFTInteger,ilayer);
-       }
        for(int windowJ=-theDim/2;windowJ<(theDim+1)/2;++windowJ){
          for(int windowI=-theDim/2;windowI<(theDim+1)/2;++windowI){
            
if(disc_opt[0]&&(windowI*windowI+windowJ*windowJ>(theDim/2)*(theDim/2)))
@@ -892,6 +883,7 @@ int main(int argc, char *argv[])
       progress=0;
       pfnProgress(progress,pszMessage,pProgressArg);
       while( (readFeature = readLayer->GetNextFeature()) != NULL ){
+       bool validFeature=false;
        bool writeTest=false;//write this feature to test_opt[0] instead of 
output_opt
        if(verbose_opt[0]>0)
          std::cout << "reading feature " << readFeature->GetFID() << std::endl;
@@ -990,6 +982,8 @@ int main(int argc, char *argv[])
            }
            if(!valid)
              continue;
+           else
+             validFeature=true;
 
            double value;
            double i_centre,j_centre;
@@ -1146,8 +1140,6 @@ int main(int argc, char *argv[])
                }
              }
            }
-           if(keepFeatures_opt[0])
-             
writeFeature->SetField("origId",static_cast<int>(readFeature->GetFID()));
            if(verbose_opt[0]>1)
              std::cout << "creating point feature" << std::endl;
            if(writeTest){
@@ -1345,6 +1337,8 @@ int main(int argc, char *argv[])
                  }
                  if(!valid)
                    continue;
+                 else
+                   validFeature=true;
                  //check if within raster image
                  if(i<0||i>=imgReader.nrOfCol())
                    continue;
@@ -1448,11 +1442,7 @@ int main(int argc, char *argv[])
                    }
                  }
                  if(!polygon_opt[0]){
-                   // if(keepFeatures_opt[0])
-                   //   
writePointFeature->SetField("origId",static_cast<int>(readFeature->GetFID()));
                    
if(ruleMap[rule_opt[0]]!=rule::mean&&ruleMap[rule_opt[0]]!=rule::centroid){//do 
not create in case of mean value (only at centroid)
-                     if(keepFeatures_opt[0])
-                       
writePointFeature->SetField("origId",static_cast<int>(readFeature->GetFID()));
                      //write feature
                      if(verbose_opt[0]>1)
                        std::cout << "creating point feature" << std::endl;
@@ -1755,8 +1745,6 @@ int main(int argc, char *argv[])
              }
              }
              if(polygon_opt[0]){
-               if(keepFeatures_opt[0])
-                 
writePolygonFeature->SetField("origId",static_cast<int>(readFeature->GetFID()));
                if(verbose_opt[0]>1)
                  std::cout << "creating polygon feature" << std::endl;
                if(writeLayer->CreateFeature( writePolygonFeature ) != 
OGRERR_NONE ){
@@ -1769,8 +1757,6 @@ int main(int argc, char *argv[])
                  std::cout << "ntotalvalid(1): " << ntotalvalid << std::endl;
              }
              else{
-               if(keepFeatures_opt[0])
-                 
writeCentroidFeature->SetField("origId",static_cast<int>(readFeature->GetFID()));
                if(verbose_opt[0]>1)
                  std::cout << "creating point feature in centroid" << 
std::endl;
                if(writeLayer->CreateFeature( writeCentroidFeature ) != 
OGRERR_NONE ){
@@ -1960,6 +1946,8 @@ int main(int argc, char *argv[])
                  }
                  if(!valid)
                    continue;
+                 else
+                   validFeature=true;
                  //check if within raster image
                  if(i<0||i>=imgReader.nrOfCol())
                    continue;
@@ -2063,8 +2051,6 @@ int main(int argc, char *argv[])
                    }
                  }
                  if(!polygon_opt[0]){
-                   if(keepFeatures_opt[0])
-                     
writePointFeature->SetField("origId",static_cast<int>(readFeature->GetFID()));
                    
if(ruleMap[rule_opt[0]]!=rule::mean&&ruleMap[rule_opt[0]]!=rule::centroid){//do 
not create in case of mean value (only at centroid)
                      //write feature
                      if(verbose_opt[0]>1)
@@ -2092,6 +2078,9 @@ 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){
              //add ring to polygon
              if(polygon_opt[0]){
@@ -2351,8 +2340,6 @@ int main(int argc, char *argv[])
              }
              }
              if(polygon_opt[0]){
-               if(keepFeatures_opt[0])
-                 
writePolygonFeature->SetField("origId",static_cast<int>(readFeature->GetFID()));
                if(verbose_opt[0]>1)
                  std::cout << "creating polygon feature" << std::endl;
                if(writeTest){
@@ -2373,8 +2360,6 @@ int main(int argc, char *argv[])
                  std::cout << "ntotalvalid: " << ntotalvalid << std::endl;
              }
              else{
-               if(keepFeatures_opt[0])
-                 
writeCentroidFeature->SetField("origId",static_cast<int>(readFeature->GetFID()));
                if(verbose_opt[0]>1)
                  std::cout << "creating point feature in centroid" << 
std::endl;
                if(writeTest){
@@ -2384,6 +2369,8 @@ int main(int argc, char *argv[])
                  }
                }
                else{
+                 //test
+                 assert(validFeature);
                  if(writeLayer->CreateFeature( writeCentroidFeature ) != 
OGRERR_NONE ){
                    std::string errorString="Failed to create point feature in 
shapefile";
                    throw(errorString);
diff --git a/src/imageclasses/ImgReaderOgr.cc b/src/imageclasses/ImgReaderOgr.cc
index 5d24df8..09e54c5 100644
--- a/src/imageclasses/ImgReaderOgr.cc
+++ b/src/imageclasses/ImgReaderOgr.cc
@@ -230,54 +230,58 @@ unsigned int 
ImgReaderOgr::readDataImageShape(std::map<std::string,Vector2d<floa
   if(verbose)
     std::cout << "reading shape file " << m_filename  << std::endl;
   try{
-    //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;
+    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);
            }
-           if(validBand)
-             ++fit;
            else
-             fields.erase(fit);
+             ++fit;
          }
-         else
+         else if((*fit)=="B" || (*fit)=="b" || (*fit)=="Band")//B is only band
            ++fit;
        }
-       else if((*fit)=="B" || (*fit)=="b" || (*fit)=="Band")//B is only band
-         ++fit;
+       else
+         fields.erase(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;
-    }
-    if(!nband){
       if(verbose)
-        std::cout << "reading data" << std::endl;
-      nband=readData(mapPixels,OFTReal,fields,label,0,true,verbose==2);
-
+       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;
+      }
+      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);
+      }
+      else{
+       for(int ilayer=0;ilayer<m_datasource->GetLayerCount();++ilayer)
+         
assert(nband==readData(mapPixels,OFTReal,fields,label,ilayer,true,false));
+      }
     }
-    else
-      assert(nband==readData(mapPixels,OFTReal,fields,label,0,true,false));
   }
   catch(std::string e){
     std::ostringstream estr;
@@ -314,7 +318,7 @@ unsigned int 
ImgReaderOgr::readDataImageShape(std::map<std::string,Vector2d<floa
       std::cout << "reading fields: ";
     while(fit!=fields.end()){
       if(verbose)
-        std::cout << *fit << " ";
+       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){
@@ -328,24 +332,26 @@ unsigned int 
ImgReaderOgr::readDataImageShape(std::map<std::string,Vector2d<floa
          ++fit;
       }
       else
-        fields.erase(fit);
+       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 << " " << *fit;
       std::cout << std::endl;
     }
     if(!nband){
       if(verbose)
-        std::cout << "reading data" << std::endl;
-      nband=readData(mapPixels,OFTReal,fields,label,0,true,verbose==2);
-
+       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);
+    }
+    else{
+      for(int ilayer=0;ilayer<m_datasource->GetLayerCount();++ilayer)
+       
assert(nband==readData(mapPixels,OFTReal,fields,label,ilayer,true,false));
     }
-    else
-      assert(nband==readData(mapPixels,OFTReal,fields,label,0,true,false));
   }
   catch(std::string e){
     std::ostringstream estr;
diff --git a/src/imageclasses/ImgReaderOgr.h b/src/imageclasses/ImgReaderOgr.h
index 0906527..ea210e4 100644
--- a/src/imageclasses/ImgReaderOgr.h
+++ b/src/imageclasses/ImgReaderOgr.h
@@ -90,8 +90,6 @@ protected:
 //read data from all features in a map, organized by classes
 template <typename T> int ImgReaderOgr::readData(std::map<int,Vector2d<T> >& 
data, const OGRFieldType& fieldType, std::vector<std::string>& fields, const 
std::string& label, int layer, bool pos, bool verbose)
 {
-  if(layer<0)
-    layer=m_datasource->GetLayerCount()-1;
   assert(m_datasource->GetLayerCount()>layer);
   OGRLayer  *poLayer;
   if(verbose)
@@ -223,8 +221,6 @@ template <typename T> int 
ImgReaderOgr::readData(std::map<int,Vector2d<T> >& dat
 //read data from all features in a map, organized by class names
 template <typename T> int 
ImgReaderOgr::readData(std::map<std::string,Vector2d<T> >& data, const 
OGRFieldType& fieldType, std::vector<std::string>& fields, const std::string& 
label, int layer, bool pos, bool verbose)
 {
-  if(layer<0)
-    layer=m_datasource->GetLayerCount()-1;
   assert(m_datasource->GetLayerCount()>layer);
   OGRLayer  *poLayer;
   if(verbose)
@@ -360,8 +356,6 @@ template <typename T> int 
ImgReaderOgr::readData(std::map<std::string,Vector2d<T
 
 //read x positions
 template <typename T> int ImgReaderOgr::readXY(std::vector<T>& xVector, 
std::vector<T>& yVector, int layer, bool verbose){
-  if(layer<0)
-    layer=m_datasource->GetLayerCount()-1;
   assert(m_datasource->GetLayerCount()>layer);
   OGRLayer  *poLayer;
   if(verbose)
@@ -408,8 +402,6 @@ template <typename T> int 
ImgReaderOgr::readXY(std::vector<T>& xVector, std::vec
 //read data from a single feature
 template <typename T> int ImgReaderOgr::readData(std::vector<T>& data, const 
OGRFieldType& fieldType, std::vector<std::string>& fields, OGRFeature 
*poFeature, int layer, bool pos, bool verbose)
 {
-  if(layer<0)
-    layer=m_datasource->GetLayerCount()-1;
   assert(m_datasource->GetLayerCount()>layer);
   OGRLayer  *poLayer;
   if(verbose)
@@ -505,8 +497,6 @@ template <typename T> int 
ImgReaderOgr::readData(std::vector<T>& data, const OGR
 //read one field from all features
 template <typename T> inline int ImgReaderOgr::readData(std::vector<T>& data, 
const OGRFieldType& fieldType, const std::string& theField, int layer, bool 
verbose)
 {
-  if(layer<0)
-    layer=m_datasource->GetLayerCount()-1;
   assert(m_datasource->GetLayerCount()>layer);
   OGRLayer  *poLayer;
   if(verbose)
@@ -581,8 +571,6 @@ template <typename T> inline int 
ImgReaderOgr::readData(std::vector<T>& data, co
 //specialization for string: read one field from all features
 template <> inline int ImgReaderOgr::readData(std::vector<std::string>& data, 
const OGRFieldType& fieldType, const std::string& theField, int layer, bool 
verbose)
 {
-  if(layer<0)
-    layer=m_datasource->GetLayerCount()-1;
   assert(m_datasource->GetLayerCount()>layer);
   OGRLayer  *poLayer;
   if(verbose)
@@ -657,8 +645,6 @@ template <> inline int 
ImgReaderOgr::readData(std::vector<std::string>& data, co
 //read data from all features  
 template <typename T> int ImgReaderOgr::readData(Vector2d<T>& data, const 
OGRFieldType& fieldType, std::vector<std::string>& fields, int layer, bool pos, 
bool verbose)
 {
-  if(layer<0)
-    layer=m_datasource->GetLayerCount()-1;
   assert(m_datasource->GetLayerCount()>layer);
   OGRLayer  *poLayer;
   if(verbose)
@@ -752,8 +738,6 @@ template <typename T> int 
ImgReaderOgr::readData(Vector2d<T>& data, const OGRFie
 
 template<typename T> int ImgReaderOgr::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, bool pos, bool verbose)
 {
-  if(layer<0)
-    layer=m_datasource->GetLayerCount()-1;
   assert(m_datasource->GetLayerCount()>layer);
   OGRLayer *poLayer;
   poLayer = m_datasource->ExecuteSQL(sqlStatement.c_str(), spatialFilter,NULL 
);
@@ -864,8 +848,6 @@ template<typename T> int 
ImgReaderOgr::readSql(std::map<int, Vector2d<T> >& data
 
 template<typename T> int ImgReaderOgr::readSql(Vector2d<T>& data, const 
OGRFieldType& fieldType, std::vector<std::string>& fields, const std::string& 
sqlStatement, OGRGeometry* spatialFilter, int layer, bool pos, bool verbose)
 {
-  if(layer<0)
-    layer=m_datasource->GetLayerCount()-1;
   assert(m_datasource->GetLayerCount()>layer);
   OGRLayer *poLayer;
   poLayer = m_datasource->ExecuteSQL(sqlStatement.c_str(), spatialFilter,NULL 
);

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