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 #if GDAL_VERSION_MAJOR < 2
52 OGRDataSource::DestroyDataSource(m_datasource);
54 GDALClose(m_datasource);
59 void ImgReaderOgr::setCodec(
void){
60 #if GDAL_VERSION_MAJOR < 2
64 m_datasource = OGRSFDriverRegistrar::Open(m_filename.c_str(), FALSE);
69 m_datasource = (GDALDataset*) GDALOpenEx(m_filename.c_str(), GDAL_OF_READONLY, NULL, NULL, NULL);
71 if( m_datasource == NULL ){
72 std::string errorString=
"Open failed";
77 bool ImgReaderOgr::getExtent(
double& ulx,
double& uly,
double& lrx,
double& lry,
int layer)
80 if(getLayer(layer)->GetExtent(&oExt,TRUE)==OGRERR_NONE){
91 bool ImgReaderOgr::getExtent(
double& ulx,
double& uly,
double& lrx,
double& lry)
95 for(
int ilayer=0;ilayer<getLayerCount();++ilayer){
96 if(getLayer(ilayer)->GetExtent(&oExt,TRUE)==OGRERR_NONE){
121 unsigned long int ImgReaderOgr::getFeatureCount(
int layer)
const
123 return(m_datasource->GetLayer(layer)->GetFeatureCount());
126 int ImgReaderOgr::getFieldCount(
int layer)
const
129 layer=m_datasource->GetLayerCount()-1;
130 assert(m_datasource->GetLayerCount()>layer);
132 if((poLayer = m_datasource->GetLayer(layer))==NULL){
133 std::string errorstring=
"Could not get layer";
136 OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
137 return(poFDefn->GetFieldCount());
140 int ImgReaderOgr::getFields(std::vector<std::string>& fields,
int layer)
const
143 layer=m_datasource->GetLayerCount()-1;
144 assert(m_datasource->GetLayerCount()>layer);
146 if((poLayer = m_datasource->GetLayer(layer))==NULL){
147 std::string errorstring=
"Could not get layer";
150 OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
152 fields.resize(poFDefn->GetFieldCount());
153 for(
int iField=0;iField<poFDefn->GetFieldCount();++iField){
154 OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);
155 fields[iField]=poFieldDefn->GetNameRef();
157 return(fields.size());
160 int ImgReaderOgr::getFields(std::vector<OGRFieldDefn*>& fields,
int layer)
const
163 layer=m_datasource->GetLayerCount()-1;
164 assert(m_datasource->GetLayerCount()>layer);
166 if((poLayer = m_datasource->GetLayer(layer))==NULL){
167 std::string errorstring=
"Could not get layer";
170 OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
172 fields.resize(poFDefn->GetFieldCount());
173 for(
int iField=0;iField<poFDefn->GetFieldCount();++iField){
174 OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);
175 fields[iField]=poFDefn->GetFieldDefn(iField);
177 assert(fields.size()==getFieldCount(layer));
178 return(fields.size());
181 std::string ImgReaderOgr::getProjection(
int layer)
const
183 if(m_datasource->GetLayer(layer)->GetSpatialRef()){
185 m_datasource->GetLayer(layer)->GetSpatialRef()->exportToWkt(&ppszResult);
192 OGRwkbGeometryType ImgReaderOgr::getGeometryType(
int layer)
const
194 return m_datasource->GetLayer(layer)->GetLayerDefn()->GetGeomType();
197 std::ostream& operator<<(std::ostream& theOstream,
ImgReaderOgr& theImageReader){
202 int nlayerRead=theImageReader.getDataSource()->GetLayerCount();
204 for(
int ilayer=0;ilayer<nlayerRead;++ilayer){
205 OGRLayer *readLayer=theImageReader.getLayer(ilayer);
206 OGRFeatureDefn *poFDefn = readLayer->GetLayerDefn();
210 for(
int iField=0;iField<poFDefn->GetFieldCount();++iField){
211 OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);
212 std::string fieldname=poFieldDefn->GetNameRef();
213 theOstream << fieldname << theImageReader.getFieldSeparator();
215 theOstream << std::endl;
217 readLayer->ResetReading();
220 OGRFeature *poFeature;
221 unsigned long int ifeature=0;
222 while( (poFeature = readLayer->GetNextFeature()) != NULL ){
223 OGRGeometry *poGeometry;
224 poGeometry = poFeature->GetGeometryRef();
225 assert(poGeometry != NULL);
227 if(wkbFlatten(poGeometry->getGeometryType()) == wkbPoint){
228 OGRPoint *poPoint = (OGRPoint *) poGeometry;
232 std::vector<std::string> vfields(poFDefn->GetFieldCount());
233 std::string featurename;
234 std::vector<std::string>::iterator fit=vfields.begin();
235 for(
int iField=0;iField<poFDefn->GetFieldCount();++iField){
236 *(fit++)=poFeature->GetFieldAsString(iField);
238 theOstream.precision(12);
239 if(wkbFlatten(poGeometry->getGeometryType()) == wkbPoint)
240 theOstream << x << theImageReader.getFieldSeparator() << y;
241 for(fit=vfields.begin();fit!=vfields.end();++fit)
242 theOstream << theImageReader.getFieldSeparator() << *fit;
243 theOstream << std::endl;
264 unsigned int ImgReaderOgr::readDataImageOgr(std::map<std::string,
Vector2d<float> > &mapPixels,
265 std::vector<std::string>& fields,
266 const std::vector<unsigned short>& bands,
267 const std::string& label,
268 const std::vector<std::string>& layers,
276 std::cout <<
"reading OGR dataset " << m_filename << std::endl;
277 for(
int ilayer=0;ilayer<getLayerCount();++ilayer){
278 std::string currentLayername=getLayer(ilayer)->GetName();
280 if(find(layers.begin(),layers.end(),currentLayername)==layers.end())
284 getFields(fields,ilayer);
285 std::vector<std::string>::iterator fit=fields.begin();
287 std::cout <<
"reading fields: ";
288 while(fit!=fields.end()){
290 std::cout << *fit <<
" ";
292 if((*fit).substr(0,1)==
"B"||(*fit).substr(0,1)==
"b"){
293 if((*fit).substr(1).find_first_not_of(
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_ ")!=std::string::npos){
294 int theBand=atoi((*fit).substr(1).c_str());
296 bool validBand=
false;
297 for(
int iband=0;iband<bands.size();++iband){
298 if(theBand==bands[iband])
309 else if((*fit)==
"B" || (*fit)==
"b" || (*fit)==
"Band")
316 std::cout << std::endl;
318 std::cout <<
"fields:";
319 for(std::vector<std::string>::iterator fit=fields.begin();fit!=fields.end();++fit)
320 std::cout <<
" " << *fit;
321 std::cout << std::endl;
325 std::cout <<
"reading data" << std::endl;
326 nband=readData(mapPixels,OFTReal,fields,label,ilayer,
true,verbose==2);
329 assert(nband==readData(mapPixels,OFTReal,fields,label,ilayer,
true,
false));
331 nsample=getFeatureCount(ilayer);
332 totalSamples+=nsample;
334 std::cout <<
": " << nsample <<
" samples read with " << nband <<
" bands" << std::endl;
336 catch(std::string e){
337 std::ostringstream estr;
338 estr << e <<
" " << m_filename;
343 std::cout <<
"total number of samples read " << totalSamples << std::endl;
347 unsigned int ImgReaderOgr::readDataImageOgr(std::map<std::string,
Vector2d<float> > &mapPixels,
348 std::vector<std::string>& fields,
351 const std::string& label,
352 const std::vector<std::string>& layers,
360 std::cout <<
"reading OGR dataset file " << m_filename << std::endl;
361 for(
int ilayer=0;ilayer<getLayerCount();++ilayer){
362 std::string currentLayername=getLayer(ilayer)->GetName();
364 if(find(layers.begin(),layers.end(),currentLayername)==layers.end())
368 getFields(fields,ilayer);
369 std::vector<std::string>::iterator fit=fields.begin();
371 std::cout <<
"reading fields: ";
372 while(fit!=fields.end()){
374 std::cout << *fit <<
" ";
376 if((*fit).substr(0,1)==
"B"||(*fit).substr(0,1)==
"b"){
377 if((*fit).substr(1).find_first_not_of(
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_ ")!=std::string::npos){
378 int iband=atoi((*fit).substr(1).c_str());
379 if((start||end)&&(iband<start||iband>end))
384 else if(*fit==
"B" || *fit==
"b"|| *fit==
"Band")
391 std::cout << std::endl;
393 std::cout <<
"fields:";
394 for(std::vector<std::string>::iterator fit=fields.begin();fit!=fields.end();++fit)
395 std::cout <<
" " << *fit;
396 std::cout << std::endl;
400 std::cout <<
"reading data" << std::endl;
401 nband=readData(mapPixels,OFTReal,fields,label,ilayer,
true,verbose==2);
404 assert(nband==readData(mapPixels,OFTReal,fields,label,ilayer,
true,
false));
406 nsample=getFeatureCount(ilayer);
407 totalSamples+=nsample;
409 std::cout <<
": " << nsample <<
" samples read with " << nband <<
" bands" << std::endl;
411 catch(std::string e){
412 std::ostringstream estr;
413 estr << e <<
" " << m_filename;
417 std::cout <<
": " << nsample <<
" samples read with " << nband <<
" bands" << std::endl;
420 std::cout <<
"total number of samples read " << totalSamples << std::endl;