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