22 #include "ImgReaderOgr.h"
23 #include "ImgWriterOgr.h"
24 #include "cpl_string.h"
26 ImgReaderOgr::ImgReaderOgr(
void)
30 ImgReaderOgr::ImgReaderOgr(
const std::string& filename)
35 ImgReaderOgr::~ImgReaderOgr(
void)
41 void ImgReaderOgr::open(
const std::string& filename)
44 m_filename = filename;
49 void ImgReaderOgr::close(
void)
51 OGRDataSource::DestroyDataSource(m_datasource);
55 void ImgReaderOgr::setCodec(
void){
59 m_datasource = OGRSFDriverRegistrar::Open(m_filename.c_str(), FALSE);
60 if( m_datasource == NULL ){
61 std::string errorString=
"Open failed";
66 bool ImgReaderOgr::getExtent(
double& ulx,
double& uly,
double& lrx,
double& lry,
int layer)
69 if(getLayer(layer)->GetExtent(&oExt,TRUE)==OGRERR_NONE){
80 bool ImgReaderOgr::getExtent(
double& ulx,
double& uly,
double& lrx,
double& lry)
84 for(
int ilayer=0;ilayer<getLayerCount();++ilayer){
85 if(getLayer(ilayer)->GetExtent(&oExt,TRUE)==OGRERR_NONE){
110 unsigned long int ImgReaderOgr::getFeatureCount(
int layer)
const
112 return(m_datasource->GetLayer(layer)->GetFeatureCount());
115 int ImgReaderOgr::getFieldCount(
int layer)
const
118 layer=m_datasource->GetLayerCount()-1;
119 assert(m_datasource->GetLayerCount()>layer);
121 if((poLayer = m_datasource->GetLayer(layer))==NULL){
122 std::string errorstring=
"Could not get layer";
125 OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
126 return(poFDefn->GetFieldCount());
129 int ImgReaderOgr::getFields(std::vector<std::string>& fields,
int layer)
const
132 layer=m_datasource->GetLayerCount()-1;
133 assert(m_datasource->GetLayerCount()>layer);
135 if((poLayer = m_datasource->GetLayer(layer))==NULL){
136 std::string errorstring=
"Could not get layer";
139 OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
141 fields.resize(poFDefn->GetFieldCount());
142 for(
int iField=0;iField<poFDefn->GetFieldCount();++iField){
143 OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);
144 fields[iField]=poFieldDefn->GetNameRef();
146 return(fields.size());
149 int ImgReaderOgr::getFields(std::vector<OGRFieldDefn*>& fields,
int layer)
const
152 layer=m_datasource->GetLayerCount()-1;
153 assert(m_datasource->GetLayerCount()>layer);
155 if((poLayer = m_datasource->GetLayer(layer))==NULL){
156 std::string errorstring=
"Could not get layer";
159 OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
161 fields.resize(poFDefn->GetFieldCount());
162 for(
int iField=0;iField<poFDefn->GetFieldCount();++iField){
163 OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);
164 fields[iField]=poFDefn->GetFieldDefn(iField);
166 assert(fields.size()==getFieldCount(layer));
167 return(fields.size());
170 std::string ImgReaderOgr::getProjection(
int layer)
const
172 if(m_datasource->GetLayer(layer)->GetSpatialRef()){
174 m_datasource->GetLayer(layer)->GetSpatialRef()->exportToWkt(&ppszResult);
181 OGRwkbGeometryType ImgReaderOgr::getGeometryType(
int layer)
const
183 return m_datasource->GetLayer(layer)->GetLayerDefn()->GetGeomType();
186 std::ostream& operator<<(std::ostream& theOstream,
ImgReaderOgr& theImageReader){
191 int nlayerRead=theImageReader.getDataSource()->GetLayerCount();
193 for(
int ilayer=0;ilayer<nlayerRead;++ilayer){
194 OGRLayer *readLayer=theImageReader.getLayer(ilayer);
195 OGRFeatureDefn *poFDefn = readLayer->GetLayerDefn();
199 for(
int iField=0;iField<poFDefn->GetFieldCount();++iField){
200 OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);
201 std::string fieldname=poFieldDefn->GetNameRef();
202 theOstream << fieldname << theImageReader.getFieldSeparator();
204 theOstream << std::endl;
206 readLayer->ResetReading();
209 OGRFeature *poFeature;
210 unsigned long int ifeature=0;
211 while( (poFeature = readLayer->GetNextFeature()) != NULL ){
212 OGRGeometry *poGeometry;
213 poGeometry = poFeature->GetGeometryRef();
214 assert(poGeometry != NULL);
216 if(wkbFlatten(poGeometry->getGeometryType()) == wkbPoint){
217 OGRPoint *poPoint = (OGRPoint *) poGeometry;
221 std::vector<std::string> vfields(poFDefn->GetFieldCount());
222 std::string featurename;
223 std::vector<std::string>::iterator fit=vfields.begin();
224 for(
int iField=0;iField<poFDefn->GetFieldCount();++iField){
225 *(fit++)=poFeature->GetFieldAsString(iField);
227 theOstream.precision(12);
228 if(wkbFlatten(poGeometry->getGeometryType()) == wkbPoint)
229 theOstream << x << theImageReader.getFieldSeparator() << y;
230 for(fit=vfields.begin();fit!=vfields.end();++fit)
231 theOstream << theImageReader.getFieldSeparator() << *fit;
232 theOstream << std::endl;
253 unsigned int ImgReaderOgr::readDataImageOgr(std::map<std::string,
Vector2d<float> > &mapPixels,
254 std::vector<std::string>& fields,
255 const std::vector<unsigned short>& bands,
256 const std::string& label,
257 const std::vector<std::string>& layers,
265 std::cout <<
"reading OGR dataset " << m_filename << std::endl;
266 for(
int ilayer=0;ilayer<getLayerCount();++ilayer){
267 std::string currentLayername=getLayer(ilayer)->GetName();
269 if(find(layers.begin(),layers.end(),currentLayername)==layers.end())
273 getFields(fields,ilayer);
274 std::vector<std::string>::iterator fit=fields.begin();
276 std::cout <<
"reading fields: ";
277 while(fit!=fields.end()){
279 std::cout << *fit <<
" ";
281 if((*fit).substr(0,1)==
"B"||(*fit).substr(0,1)==
"b"){
282 if((*fit).substr(1).find_first_not_of(
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_ ")!=std::string::npos){
283 int theBand=atoi((*fit).substr(1).c_str());
285 bool validBand=
false;
286 for(
int iband=0;iband<bands.size();++iband){
287 if(theBand==bands[iband])
298 else if((*fit)==
"B" || (*fit)==
"b" || (*fit)==
"Band")
305 std::cout << std::endl;
307 std::cout <<
"fields:";
308 for(std::vector<std::string>::iterator fit=fields.begin();fit!=fields.end();++fit)
309 std::cout <<
" " << *fit;
310 std::cout << std::endl;
314 std::cout <<
"reading data" << std::endl;
315 nband=readData(mapPixels,OFTReal,fields,label,ilayer,
true,verbose==2);
318 assert(nband==readData(mapPixels,OFTReal,fields,label,ilayer,
true,
false));
320 nsample=getFeatureCount(ilayer);
321 totalSamples+=nsample;
323 std::cout <<
": " << nsample <<
" samples read with " << nband <<
" bands" << std::endl;
325 catch(std::string e){
326 std::ostringstream estr;
327 estr << e <<
" " << m_filename;
332 std::cout <<
"total number of samples read " << totalSamples << std::endl;
336 unsigned int ImgReaderOgr::readDataImageOgr(std::map<std::string,
Vector2d<float> > &mapPixels,
337 std::vector<std::string>& fields,
340 const std::string& label,
341 const std::vector<std::string>& layers,
349 std::cout <<
"reading OGR dataset file " << m_filename << std::endl;
350 for(
int ilayer=0;ilayer<getLayerCount();++ilayer){
351 std::string currentLayername=getLayer(ilayer)->GetName();
353 if(find(layers.begin(),layers.end(),currentLayername)==layers.end())
357 getFields(fields,ilayer);
358 std::vector<std::string>::iterator fit=fields.begin();
360 std::cout <<
"reading fields: ";
361 while(fit!=fields.end()){
363 std::cout << *fit <<
" ";
365 if((*fit).substr(0,1)==
"B"||(*fit).substr(0,1)==
"b"){
366 if((*fit).substr(1).find_first_not_of(
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_ ")!=std::string::npos){
367 int iband=atoi((*fit).substr(1).c_str());
368 if((start||end)&&(iband<start||iband>end))
373 else if(*fit==
"B" || *fit==
"b"|| *fit==
"Band")
380 std::cout << std::endl;
382 std::cout <<
"fields:";
383 for(std::vector<std::string>::iterator fit=fields.begin();fit!=fields.end();++fit)
384 std::cout <<
" " << *fit;
385 std::cout << std::endl;
389 std::cout <<
"reading data" << std::endl;
390 nband=readData(mapPixels,OFTReal,fields,label,ilayer,
true,verbose==2);
393 assert(nband==readData(mapPixels,OFTReal,fields,label,ilayer,
true,
false));
395 nsample=getFeatureCount(ilayer);
396 totalSamples+=nsample;
398 std::cout <<
": " << nsample <<
" samples read with " << nband <<
" bands" << std::endl;
400 catch(std::string e){
401 std::ostringstream estr;
402 estr << e <<
" " << m_filename;
406 std::cout <<
": " << nsample <<
" samples read with " << nband <<
" bands" << std::endl;
409 std::cout <<
"total number of samples read " << totalSamples << std::endl;