[pktools] 219/375: debug ilayer in ogrWriter, copyFields should have two layers: one for read, one for write

Bas Couwenberg sebastic at xs4all.nl
Wed Dec 3 21:54:15 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 28599c1e6e9dd4cad18ca37bf0a70768044db258
Author: Pieter Kempeneers <kempenep at gmail.com>
Date:   Mon Mar 31 23:01:06 2014 +0200

    debug ilayer in ogrWriter, copyFields should have two layers: one for read, one for write
---
 src/apps/pkann.cc                | 22 ++++++++++++----------
 src/apps/pkextract.cc            | 39 ++++++++++++++++++++-------------------
 src/apps/pksvm.cc                | 22 ++++++++++++----------
 src/imageclasses/ImgWriterOgr.cc | 19 +++++++++----------
 src/imageclasses/ImgWriterOgr.h  |  2 +-
 5 files changed, 54 insertions(+), 50 deletions(-)

diff --git a/src/apps/pkann.cc b/src/apps/pkann.cc
index fc8104d..52324f5 100644
--- a/src/apps/pkann.cc
+++ b/src/apps/pkann.cc
@@ -979,18 +979,20 @@ int main(int argc, char *argv[])
 	if(verbose_opt[0])
 	  std::cout << "opening img writer and copying fields from img reader" << output_opt[ivalidation] << std::endl;
 	imgWriterOgr.open(output_opt[ivalidation],imgReaderOgr);
-	if(verbose_opt[0])
-	  std::cout << "creating field class" << std::endl;
-	if(classValueMap.size())
-	  imgWriterOgr.createField("class",OFTInteger);
-	else
-	  imgWriterOgr.createField("class",OFTString);
       }
       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;
+	if(output_opt.size()){
+	  if(verbose_opt[0])
+	    std::cout << "creating field class" << std::endl;
+	  if(classValueMap.size())
+	    imgWriterOgr.createField("class",OFTInteger,ilayer);
+	  else
+	    imgWriterOgr.createField("class",OFTString,ilayer);
+	}
 	unsigned int nFeatures=imgReaderOgr.getFeatureCount(ilayer);
 	unsigned int ifeature=0;
 	progress=0;
@@ -1005,11 +1007,11 @@ int main(int argc, char *argv[])
 	  }
 	  OGRFeature *poDstFeature = NULL;
 	  if(output_opt.size()){
-	    poDstFeature=imgWriterOgr.createFeature();
+	    poDstFeature=imgWriterOgr.createFeature(ilayer);
 	    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() );
+			poFeature->GetFID(), imgWriterOgr.getLayerName(ilayer).c_str() );
 	      OGRFeature::DestroyFeature( poFeature );
 	      OGRFeature::DestroyFeature( poDstFeature );
 	    }
@@ -1094,10 +1096,10 @@ int main(int argc, char *argv[])
 	  }
 	  CPLErrorReset();
 	  if(output_opt.size()){
-	    if(imgWriterOgr.createFeature( poDstFeature ) != OGRERR_NONE){
+	    if(imgWriterOgr.createFeature(poDstFeature,ilayer) != OGRERR_NONE){
 	      CPLError( CE_Failure, CPLE_AppDefined,
 			"Unable to translate feature %d from layer %s.\n",
-			poFeature->GetFID(), imgWriterOgr.getLayerName().c_str() );
+			poFeature->GetFID(), imgWriterOgr.getLayerName(ilayer).c_str() );
 	      OGRFeature::DestroyFeature( poDstFeature );
 	      OGRFeature::DestroyFeature( poDstFeature );
 	    }
diff --git a/src/apps/pkextract.cc b/src/apps/pkextract.cc
index fa16986..b79cc2c 100644
--- a/src/apps/pkextract.cc
+++ b/src/apps/pkextract.cc
@@ -769,17 +769,19 @@ int main(int argc, char *argv[])
     }
       
     //support multiple layers
-    int nlayer=sampleReaderOgr.getDataSource()->GetLayerCount();
+    int nlayerRead=sampleReaderOgr.getDataSource()->GetLayerCount();
+    int ilayerWrite=0;
     if(verbose_opt[0])
-      std::cout << "number of layers: " << nlayer << endl;
+      std::cout << "number of layers: " << nlayerRead << endl;
       
-    for(int ilayer=0;ilayer<nlayer;++ilayer){
+    for(int ilayer=0;ilayer<nlayerRead;++ilayer){
       OGRLayer *readLayer=sampleReaderOgr.getLayer(ilayer);
       string currentLayername=readLayer->GetName();
       if(layer_opt.size())
 	if(find(layer_opt.begin(),layer_opt.end(),currentLayername)==layer_opt.end())
 	  continue;
       cout << "processing layer " << currentLayername << endl;
+      
       readLayer->ResetReading();
       OGRLayer *writeLayer;
       OGRLayer *writeTestLayer;
@@ -805,21 +807,19 @@ int main(int argc, char *argv[])
       }
       if(verbose_opt[0])
 	std::cout << "copy fields from layer " << ilayer << std::flush << std::endl;
-      ogrWriter.copyFields(sampleReaderOgr,ilayer);
+      ogrWriter.copyFields(sampleReaderOgr,ilayer,ilayerWrite);
 
-      //hiero test: todo does not work
-      cout << "debug0" << endl;
       if(test_opt.size()){
 	if(verbose_opt[0])
 	  std::cout << "copy fields test writer" << std::flush << std::endl;
-	ogrTestWriter.copyFields(sampleReaderOgr,ilayer);
+	ogrTestWriter.copyFields(sampleReaderOgr,ilayer,ilayerWrite);
       }
-      vector<std::string> fieldnames;
-      if(verbose_opt[0])
-	std::cout << "get fields" << std::flush << std::endl;
-      sampleReaderOgr.getFields(fieldnames);
-      assert(fieldnames.size()==ogrWriter.getFieldCount(ilayer));
-      map<std::string,double> pointAttributes;
+      // vector<std::string> fieldnames;
+      // if(verbose_opt[0])
+      // 	std::cout << "get fields" << std::flush << std::endl;
+      // sampleReaderOgr.getFields(fieldnames);
+      // assert(fieldnames.size()==ogrWriter.getFieldCount(ilayerWrite));
+      // map<std::string,double> pointAttributes;
 
       switch(ruleMap[rule_opt[0]]){
 	// switch(rule_opt[0]){
@@ -828,7 +828,7 @@ int main(int argc, char *argv[])
 	for(int iclass=0;iclass<class_opt.size();++iclass){
 	  ostringstream cs;
 	  cs << class_opt[iclass];
-	  ogrWriter.createField(cs.str(),fieldType,ilayer);
+	  ogrWriter.createField(cs.str(),fieldType,ilayerWrite);
 	}
 	break;
       }
@@ -837,9 +837,9 @@ int main(int argc, char *argv[])
       case(rule::maximum):
       case(rule::maxvote):
 	assert(class_opt.size());
-      ogrWriter.createField(label_opt[0],fieldType,ilayer);
+      ogrWriter.createField(label_opt[0],fieldType,ilayerWrite);
       if(test_opt.size())
-	ogrTestWriter.createField(label_opt[0],fieldType,ilayer);
+	ogrTestWriter.createField(label_opt[0],fieldType,ilayerWrite);
       break;
       case(rule::point):
       case(rule::mean):
@@ -860,9 +860,9 @@ int main(int argc, char *argv[])
 	      if(verbose_opt[0]>1)
 		std::cout << "creating field " << fs.str() << std::endl;
 
-	      ogrWriter.createField(fs.str(),fieldType,ilayer);
+	      ogrWriter.createField(fs.str(),fieldType,ilayerWrite);
 	      if(test_opt.size())
-		ogrTestWriter.createField(fs.str(),fieldType,ilayer);
+		ogrTestWriter.createField(fs.str(),fieldType,ilayerWrite);
 	    }
 	  }
 	}
@@ -884,7 +884,7 @@ int main(int argc, char *argv[])
       //   std::string fieldname="fid";//number of the point
       //   if(verbose_opt[0]>1)
       //     std::cout << "creating field " << fieldname << std::endl;
-      //   //       ogrWriter.createField(fieldname,OFTInteger,ilayer);
+      //   //       ogrWriter.createField(fieldname,OFTInteger,ilayerWrite);
       //   boxWriter.createField(fieldname,OFTInteger,ilayer);
       // }
       progress=0;
@@ -2418,6 +2418,7 @@ int main(int argc, char *argv[])
       //   boxWriter.close();
       progress=1.0;
       pfnProgress(progress,pszMessage,pProgressArg);
+      ++ilayerWrite;
     }
     ogrWriter.close();
     if(test_opt.size())
diff --git a/src/apps/pksvm.cc b/src/apps/pksvm.cc
index 9e396ed..9e3deaa 100644
--- a/src/apps/pksvm.cc
+++ b/src/apps/pksvm.cc
@@ -977,18 +977,20 @@ int main(int argc, char *argv[])
 	if(verbose_opt[0])
 	  std::cout << "opening img writer and copying fields from img reader" << output_opt[ivalidation] << std::endl;
 	imgWriterOgr.open(output_opt[ivalidation],imgReaderOgr);
-	if(verbose_opt[0])
-	  std::cout << "creating field class" << std::endl;
-	if(classValueMap.size())
-	  imgWriterOgr.createField("class",OFTInteger);
-	else
-	  imgWriterOgr.createField("class",OFTString);
       }
       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;
+	if(output_opt.size()){
+	  if(verbose_opt[0])
+	    std::cout << "creating field class" << std::endl;
+	  if(classValueMap.size())
+	    imgWriterOgr.createField("class",OFTInteger,ilayer);
+	  else
+	    imgWriterOgr.createField("class",OFTString,ilayer);
+	}
 	unsigned int nFeatures=imgReaderOgr.getFeatureCount(ilayer);
 	unsigned int ifeature=0;
 	progress=0;
@@ -1003,11 +1005,11 @@ int main(int argc, char *argv[])
 	  }
 	  OGRFeature *poDstFeature = NULL;
 	  if(output_opt.size()){
-	    poDstFeature=imgWriterOgr.createFeature();
+	    poDstFeature=imgWriterOgr.createFeature(ilayer);
 	    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() );
+			poFeature->GetFID(), imgWriterOgr.getLayerName(ilayer).c_str() );
 	      OGRFeature::DestroyFeature( poFeature );
 	      OGRFeature::DestroyFeature( poDstFeature );
 	    }
@@ -1115,10 +1117,10 @@ int main(int argc, char *argv[])
 	  }
 	  CPLErrorReset();
 	  if(output_opt.size()){
-	    if(imgWriterOgr.createFeature( poDstFeature ) != OGRERR_NONE){
+	    if(imgWriterOgr.createFeature(poDstFeature,ilayer) != OGRERR_NONE){
 	      CPLError( CE_Failure, CPLE_AppDefined,
 			"Unable to translate feature %d from layer %s.\n",
-			poFeature->GetFID(), imgWriterOgr.getLayerName().c_str() );
+			poFeature->GetFID(), imgWriterOgr.getLayerName(ilayer).c_str() );
 	      OGRFeature::DestroyFeature( poDstFeature );
 	      OGRFeature::DestroyFeature( poDstFeature );
 	    }
diff --git a/src/imageclasses/ImgWriterOgr.cc b/src/imageclasses/ImgWriterOgr.cc
index d5e5de2..4f040cf 100644
--- a/src/imageclasses/ImgWriterOgr.cc
+++ b/src/imageclasses/ImgWriterOgr.cc
@@ -45,7 +45,7 @@ ImgWriterOgr::ImgWriterOgr(const std::string& filename, ImgReaderOgr& imgReaderO
   for(int ilayer=0;ilayer<nlayer;++ilayer){
     std::string layername = imgReaderOgr.getLayer(ilayer)->GetName();
     createLayer(layername,imgReaderOgr.getProjection(),imgReaderOgr.getGeometryType(),NULL);
-    copyFields(imgReaderOgr,ilayer);
+    copyFields(imgReaderOgr,ilayer,ilayer);
   }
 }
 
@@ -58,7 +58,7 @@ ImgWriterOgr::ImgWriterOgr(const std::string& filename, ImgReaderOgr& imgReaderO
   for(int ilayer=0;ilayer<nlayer;++ilayer){
     std::string layername = imgReaderOgr.getLayer(ilayer)->GetName();
     createLayer(layername,imgReaderOgr.getProjection(),imgReaderOgr.getGeometryType(),NULL);
-    copyFields(imgReaderOgr,ilayer);
+    copyFields(imgReaderOgr,ilayer,ilayer);
     if(copyData){
       OGRFeature *poFeature;
       while(true){// (poFeature = imgReaderOgr.getLayer()->GetNextFeature()) != NULL ){
@@ -112,7 +112,7 @@ void ImgWriterOgr::open(const std::string& filename, ImgReaderOgr& imgReaderOgr)
   for(int ilayer=0;ilayer<nlayer;++ilayer){
     std::string layername = imgReaderOgr.getLayer(ilayer)->GetName();
     createLayer(layername,imgReaderOgr.getProjection(),imgReaderOgr.getGeometryType(),NULL);
-    copyFields(imgReaderOgr,ilayer);
+    copyFields(imgReaderOgr,ilayer,ilayer);
   }
 }
 
@@ -262,16 +262,15 @@ int ImgWriterOgr::getFields(std::vector<OGRFieldDefn*>& fields, int layer) const
   return(fields.size());
 }
 
-void ImgWriterOgr::copyFields(const ImgReaderOgr& imgReaderOgr, int theLayer){
-  if(theLayer<0)
-    theLayer=m_datasource->GetLayerCount()-1;//get back layer
+void ImgWriterOgr::copyFields(const ImgReaderOgr& imgReaderOgr, int srcLayer, int targetLayer){
+  if(targetLayer<0)
+    targetLayer=m_datasource->GetLayerCount()-1;//get back layer
   //get fields from imgReaderOgr
   std::vector<OGRFieldDefn*> fields;
   
-  imgReaderOgr.getFields(fields,theLayer);
-//   OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
+  imgReaderOgr.getFields(fields,srcLayer);
   for(int iField=0;iField<fields.size();++iField){
-    if(m_datasource->GetLayer(theLayer)->CreateField(fields[iField]) != OGRERR_NONE ){
+    if(m_datasource->GetLayer(targetLayer)->CreateField(fields[iField]) != OGRERR_NONE ){
       std::ostringstream es;
       es << "Creating field " << fields[iField]->GetNameRef() << " failed";
       std::string errorString=es.str();
@@ -602,7 +601,7 @@ int ImgWriterOgr::addData(const ImgReaderGdal& imgReader, int theLayer, bool ver
   for(int iband=0;iband<imgReader.nrOfBand();++iband){
     std::ostringstream fs;
     fs << "band" << iband;
-    createField(fs.str(),OFTReal);
+    createField(fs.str(),OFTReal,theLayer);
   }
   OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
   int nfield=poFDefn->GetFieldCount();
diff --git a/src/imageclasses/ImgWriterOgr.h b/src/imageclasses/ImgWriterOgr.h
index 6d54a69..327b9a7 100644
--- a/src/imageclasses/ImgWriterOgr.h
+++ b/src/imageclasses/ImgWriterOgr.h
@@ -51,7 +51,7 @@ public:
   std::string getLayerName(int layer=0){return m_datasource->GetLayer(layer)->GetLayerDefn()->GetName();};
   int getFields(std::vector<std::string>& fields, int layer=0) const;
   int getFields(std::vector<OGRFieldDefn*>& fields, int layer=0) const;
-  void copyFields(const ImgReaderOgr& imgReaderOgr, int theLayer=0);//default: get back layer
+  void copyFields(const ImgReaderOgr& imgReaderOgr, int srcLayer=0, int targetLayer=0);//default: get back layer
   void addLineString(std::vector<OGRPoint*>& points, const std::string& fieldName, const std::string& theId, int layer=0);
   void addRing(std::vector<OGRPoint*>& points, const std::string& fieldName, int theId, int layer=0);
   void addLineString(std::vector<OGRPoint*>& points, const std::string& fieldName, int theId, int layer=0);

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