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 1b76c5edcaac8a524b198ee08fa3f71c35c73a0a
Author: Pieter Kempeneers <kempe...@gmail.com>
Date:   Sun Dec 29 22:27:21 2013 +0100

    fixed pkedit output for non shape OGR files
---
 src/apps/pkdiff.cc               | 90 +++++++++++++++++++++++-----------------
 src/imageclasses/ImgReaderOgr.cc |  2 +-
 2 files changed, 53 insertions(+), 39 deletions(-)

diff --git a/src/apps/pkdiff.cc b/src/apps/pkdiff.cc
index ea0a597..3a89ec8 100644
--- a/src/apps/pkdiff.cc
+++ b/src/apps/pkdiff.cc
@@ -189,12 +189,6 @@ int main(int argc, char *argv[])
   }
   
   bool isDifferent=false;
-  const char* pszMessage;
-  void* pProgressArg=NULL;
-  GDALProgressFunc pfnProgress=GDALTermProgress;
-  double progress=0;
-  if(!verbose_opt[0])
-    pfnProgress(progress,pszMessage,pProgressArg);
 
   bool refIsRaster=false;
   ImgReaderOgr referenceReaderOgr;
@@ -205,14 +199,18 @@ int main(int argc, char *argv[])
   catch(string errorString){
     refIsRaster=true;
   }
+  const char* pszMessage;
+  void* pProgressArg=NULL;
+  GDALProgressFunc pfnProgress=GDALTermProgress;
+  float progress=0;
   // if(reference_opt[0].find(".shp")!=string::npos){
   if(!refIsRaster){
     for(int iinput=0;iinput<input_opt.size();++iinput){
+      cout << "Processing input " << input_opt[iinput] << endl;
       if(output_opt.size())
         assert(reference_opt.size()==output_opt.size());
       for(int iref=0;iref<reference_opt.size();++iref){
-        if(verbose_opt[0])
-          cout << "reference is " << reference_opt[iref] << endl;
+       cout << "reference " << reference_opt[iref] << endl;
         // assert(reference_opt[iref].find(".shp")!=string::npos);
         try{
           
inputReader.open(input_opt[iinput]);//,imagicX_opt[0],imagicY_opt[0]);
@@ -231,7 +229,21 @@ int main(int argc, char *argv[])
           referenceRange=inputRange;
 
         ImgWriterOgr ogrWriter;
-       for(int 
ilayer=0;ilayer<referenceReaderOgr.getDataSource()->GetLayerCount();++ilayer){
+       if(output_opt.size()){
+         try{
+           ogrWriter.open(output_opt[iref],ogrformat_opt[0]);
+         }
+         catch(string error){
+           cerr << error << endl;
+           exit(1);
+         }
+       }
+       int nlayer=referenceReaderOgr.getDataSource()->GetLayerCount();
+       for(int ilayer=0;ilayer<nlayer;++ilayer){
+         progress=0;
+         cout << "processing layer " << ilayer << endl;
+         if(!verbose_opt[0])
+           pfnProgress(progress,pszMessage,pProgressArg);
          OGRLayer  *readLayer;
          readLayer = referenceReaderOgr.getDataSource()->GetLayer(ilayer);
          readLayer->ResetReading();
@@ -240,23 +252,17 @@ int main(int argc, char *argv[])
            if(verbose_opt[0])
              cout << "creating output vector file " << output_opt[0] << endl;
            // assert(output_opt[0].find(".shp")!=string::npos);
-           try{
-             ogrWriter.open(output_opt[iref],ogrformat_opt[0]);
-           }
-           catch(string error){
-             cerr << error << endl;
-             exit(1);
-           }
            char     **papszOptions=NULL;
            string 
layername=type2string<int>(ilayer);//output_opt[0].substr(0,output_opt[0].find(".shp"));
            if(verbose_opt[0])
              cout << "creating layer: " << layername << endl;
-           if(ogrWriter.createLayer(layername, 
referenceReaderOgr.getProjection(ilayer), 
referenceReaderOgr.getGeometryType(ilayer), papszOptions)==NULL)
-             cout << "Error: create layer failed!" << endl;
-           else if(verbose_opt[0])
+           // if(ogrWriter.createLayer(layername, 
referenceReaderOgr.getProjection(ilayer), 
referenceReaderOgr.getGeometryType(ilayer), papszOptions)==NULL)
+           writeLayer=ogrWriter.createLayer(layername, 
referenceReaderOgr.getProjection(ilayer), wkbPoint, papszOptions);
+           assert(writeLayer);
+           if(verbose_opt[0]){
              cout << "created layer" << endl;
-           if(verbose_opt[0])
              cout << "copy fields from " << reference_opt[iref] << endl;
+           }
            ogrWriter.copyFields(referenceReaderOgr,ilayer);
            //create extra field for classified label
            short theDim=boundary_opt[0];
@@ -274,10 +280,12 @@ int main(int argc, char *argv[])
                ogrWriter.createField(fs.str(),OFTInteger,ilayer);
              }
            }
-           writeLayer=ogrWriter.getDataSource()->GetLayer(ilayer);
          }
          OGRFeature *readFeature;
+         OGRFeature *writeFeature;
          int isample=0;
+         unsigned int nfeatureInLayer=readLayer->GetFeatureCount();
+         unsigned int ifeature=0;
          while( (readFeature = readLayer->GetNextFeature()) != NULL ){
            if(verbose_opt[0])
              cout << "sample " << ++isample << endl;
@@ -349,22 +357,24 @@ int main(int argc, char *argv[])
            //check if i_centre is out of bounds
            
if(static_cast<int>(i_centre)<0||static_cast<int>(i_centre)>=inputReader.nrOfCol())
              continue;
-           OGRFeature *writeFeature;
            if(output_opt.size()){
              writeFeature = 
OGRFeature::CreateFeature(writeLayer->GetLayerDefn());
+             assert(readFeature);
+             int nfield=readFeature->GetFieldCount();
+             writeFeature->SetGeometry(poPoint);
              if(verbose_opt[0])
-               cout << "copying fields from " << reference_opt[0] << endl;
-             //todo: segmentation fault when more than one layer...?
-             //test
-             // assert(readFeature);
-             // cout << 
readFeature->GetFieldAsString(readFeature->GetFieldIndex(labelref_opt[0].c_str()))
 << endl;
-             // assert(writeFeature);
-             // cout << "number of fields in writeFeature: " << 
writeFeature->GetFieldCount() << endl;
-             //end test              
-             if(writeFeature->SetFrom(readFeature)!= OGRERR_NONE)
-               cerr << "writing feature failed" << endl;
-             if(verbose_opt[0])
-               cout << "feature written" << endl;
+               cout << "copying fields from " << reference_opt[0] << endl;
+             assert(readFeature);
+             assert(writeFeature);
+             vector<int> panMap(nfield);
+             vector<int>::iterator panit=panMap.begin();
+             for(int ifield=0;ifield<nfield;++ifield)
+               panMap[ifield]=ifield;
+             writeFeature->SetFieldsFrom(readFeature,&(panMap[0]));
+             // if(writeFeature->SetFrom(readFeature)!= OGRERR_NONE)
+             //        cerr << "writing feature failed" << endl;
+             // if(verbose_opt[0])
+             //        cout << "feature written" << endl;
            }
            bool windowAllFlagged=true;
            bool windowHasFlag=false;
@@ -536,16 +546,20 @@ int main(int argc, char *argv[])
              }
              OGRFeature::DestroyFeature( writeFeature );
            }
-         }
-       }
+           ++ifeature;
+           progress=static_cast<float>(ifeature+1)/nfeatureInLayer;
+           pfnProgress(progress,pszMessage,pProgressArg);
+         }//next feature
+       }//next layer
         if(output_opt.size())
           ogrWriter.close();
         referenceReaderOgr.close();
         inputReader.close();
         if(mask_opt.size())
           maskReader.close();
-      }
-    }
+      }//next reference
+    }//next input
+    pfnProgress(1.0,pszMessage,pProgressArg);
   }//reference is OGR
   else{
     ImgWriterGdal gdalWriter;
diff --git a/src/imageclasses/ImgReaderOgr.cc b/src/imageclasses/ImgReaderOgr.cc
index c0d8671..5d24df8 100644
--- a/src/imageclasses/ImgReaderOgr.cc
+++ b/src/imageclasses/ImgReaderOgr.cc
@@ -131,7 +131,7 @@ int ImgReaderOgr::getFields(std::vector<OGRFieldDefn*>& 
fields, int layer) const
     OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);
     fields[iField]=poFDefn->GetFieldDefn(iField);
   }
-  assert(fields.size()==getFieldCount());
+  assert(fields.size()==getFieldCount(layer));
   return(fields.size());
 }
 

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