[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