[pktools] 174/375: support multi layers in ImgReaderOgr::readDataImageShape (for pkclassify_svm and pkclassify_nn)

Bas Couwenberg sebastic at xs4all.nl
Wed Dec 3 21:54:11 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 b3cabccddaf6feee43030a44200b209c04cf3aed
Author: Pieter Kempeneers <kempenep at 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



More information about the Pkg-grass-devel mailing list