22 #include "ImgReaderOgr.h"
23 #include "ImgWriterOgr.h"
24 #include "cpl_string.h"
26 ImgReaderOgr::ImgReaderOgr(
void)
29 ImgReaderOgr::ImgReaderOgr(
const std::string& filename)
34 ImgReaderOgr::~ImgReaderOgr(
void)
40 void ImgReaderOgr::open(
const std::string& filename)
42 m_filename = filename;
47 void ImgReaderOgr::close(
void)
49 OGRDataSource::DestroyDataSource(m_datasource);
53 void ImgReaderOgr::setCodec(
void){
57 m_datasource = OGRSFDriverRegistrar::Open(m_filename.c_str(), FALSE);
58 if( m_datasource == NULL ){
59 std::string errorString=
"Open failed";
64 bool ImgReaderOgr::getExtent(
double& ulx,
double& uly,
double& lrx,
double& lry,
int layer)
67 if(getLayer(layer)->GetExtent(&oExt,TRUE)==OGRERR_NONE){
78 unsigned long int ImgReaderOgr::getFeatureCount(
int layer)
const
80 return(m_datasource->GetLayer(layer)->GetFeatureCount());
83 int ImgReaderOgr::getFieldCount(
int layer)
const
86 layer=m_datasource->GetLayerCount()-1;
87 assert(m_datasource->GetLayerCount()>layer);
89 if((poLayer = m_datasource->GetLayer(layer))==NULL){
90 std::string errorstring=
"Could not get layer";
93 OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
94 return(poFDefn->GetFieldCount());
97 int ImgReaderOgr::getFields(std::vector<std::string>& fields,
int layer)
const
100 layer=m_datasource->GetLayerCount()-1;
101 assert(m_datasource->GetLayerCount()>layer);
103 if((poLayer = m_datasource->GetLayer(layer))==NULL){
104 std::string errorstring=
"Could not get layer";
107 OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
109 fields.resize(poFDefn->GetFieldCount());
110 for(
int iField=0;iField<poFDefn->GetFieldCount();++iField){
111 OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);
112 fields[iField]=poFieldDefn->GetNameRef();
114 return(fields.size());
117 int ImgReaderOgr::getFields(std::vector<OGRFieldDefn*>& fields,
int layer)
const
120 layer=m_datasource->GetLayerCount()-1;
121 assert(m_datasource->GetLayerCount()>layer);
123 if((poLayer = m_datasource->GetLayer(layer))==NULL){
124 std::string errorstring=
"Could not get layer";
127 OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
129 fields.resize(poFDefn->GetFieldCount());
130 for(
int iField=0;iField<poFDefn->GetFieldCount();++iField){
131 OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);
132 fields[iField]=poFDefn->GetFieldDefn(iField);
134 assert(fields.size()==getFieldCount(layer));
135 return(fields.size());
138 std::string ImgReaderOgr::getProjection(
int layer)
const
140 if(m_datasource->GetLayer(layer)->GetSpatialRef()){
142 m_datasource->GetLayer(layer)->GetSpatialRef()->exportToWkt(&ppszResult);
149 OGRwkbGeometryType ImgReaderOgr::getGeometryType(
int layer)
const
151 return m_datasource->GetLayer(layer)->GetLayerDefn()->GetGeomType();
154 std::ostream& operator<<(std::ostream& theOstream,
ImgReaderOgr& theImageReader){
159 poLayer = theImageReader.getDataSource()->GetLayer(0);
160 OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
162 poLayer->ResetReading();
167 for(
int iField=0;iField<poFDefn->GetFieldCount();++iField){
168 OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);
169 std::string fieldname=poFieldDefn->GetNameRef();
170 theOstream << fieldname <<
" ";
172 theOstream << std::endl;
174 poLayer->ResetReading();
177 OGRFeature *poFeature;
178 unsigned long int ifeature=0;
179 while( (poFeature = poLayer->GetNextFeature()) != NULL ){
180 OGRGeometry *poGeometry;
181 poGeometry = poFeature->GetGeometryRef();
182 assert(poGeometry != NULL);
184 if(wkbFlatten(poGeometry->getGeometryType()) == wkbPoint){
185 OGRPoint *poPoint = (OGRPoint *) poGeometry;
189 std::vector<std::string> vfields(poFDefn->GetFieldCount());
190 std::string featurename;
191 std::vector<std::string>::iterator fit=vfields.begin();
192 for(
int iField=0;iField<poFDefn->GetFieldCount();++iField){
193 *(fit++)=poFeature->GetFieldAsString(iField);
195 theOstream.precision(12);
196 if(wkbFlatten(poGeometry->getGeometryType()) == wkbPoint)
197 theOstream << x <<
" " << y;
198 for(fit=vfields.begin();fit!=vfields.end();++fit)
199 theOstream <<
" " << *fit;
200 theOstream << std::endl;
220 unsigned int ImgReaderOgr::readDataImageOgr(std::map<std::string,
Vector2d<float> > &mapPixels,
221 std::vector<std::string>& fields,
222 const std::vector<short>& bands,
223 const std::string& label,
224 const std::vector<std::string>& layers,
232 std::cout <<
"reading OGR dataset " << m_filename << std::endl;
233 for(
int ilayer=0;ilayer<getLayerCount();++ilayer){
234 std::string currentLayername=getLayer(ilayer)->GetName();
236 if(find(layers.begin(),layers.end(),currentLayername)==layers.end())
240 getFields(fields,ilayer);
241 std::vector<std::string>::iterator fit=fields.begin();
243 std::cout <<
"reading fields: ";
244 while(fit!=fields.end()){
246 std::cout << *fit <<
" ";
248 if((*fit).substr(0,1)==
"B"||(*fit).substr(0,1)==
"b"){
249 if((*fit).substr(1).find_first_not_of(
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_ ")!=std::string::npos){
250 int theBand=atoi((*fit).substr(1).c_str());
252 bool validBand=
false;
253 for(
int iband=0;iband<bands.size();++iband){
254 if(theBand==bands[iband])
265 else if((*fit)==
"B" || (*fit)==
"b" || (*fit)==
"Band")
272 std::cout << std::endl;
274 std::cout <<
"fields:";
275 for(std::vector<std::string>::iterator fit=fields.begin();fit!=fields.end();++fit)
276 std::cout <<
" " << *fit;
277 std::cout << std::endl;
281 std::cout <<
"reading data" << std::endl;
282 nband=readData(mapPixels,OFTReal,fields,label,ilayer,
true,verbose==2);
285 assert(nband==readData(mapPixels,OFTReal,fields,label,ilayer,
true,
false));
287 nsample=getFeatureCount(ilayer);
288 totalSamples+=nsample;
290 std::cout <<
": " << nsample <<
" samples read with " << nband <<
" bands" << std::endl;
292 catch(std::string e){
293 std::ostringstream estr;
294 estr << e <<
" " << m_filename;
299 std::cout <<
"total number of samples read " << totalSamples << std::endl;
303 unsigned int ImgReaderOgr::readDataImageOgr(std::map<std::string,
Vector2d<float> > &mapPixels,
304 std::vector<std::string>& fields,
307 const std::string& label,
308 const std::vector<std::string>& layers,
316 std::cout <<
"reading OGR dataset file " << m_filename << std::endl;
317 for(
int ilayer=0;ilayer<getLayerCount();++ilayer){
318 std::string currentLayername=getLayer(ilayer)->GetName();
320 if(find(layers.begin(),layers.end(),currentLayername)==layers.end())
324 getFields(fields,ilayer);
325 std::vector<std::string>::iterator fit=fields.begin();
327 std::cout <<
"reading fields: ";
328 while(fit!=fields.end()){
330 std::cout << *fit <<
" ";
332 if((*fit).substr(0,1)==
"B"||(*fit).substr(0,1)==
"b"){
333 if((*fit).substr(1).find_first_not_of(
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_ ")!=std::string::npos){
334 int iband=atoi((*fit).substr(1).c_str());
335 if((start||end)&&(iband<start||iband>end))
340 else if(*fit==
"B" || *fit==
"b"|| *fit==
"Band")
347 std::cout << std::endl;
349 std::cout <<
"fields:";
350 for(std::vector<std::string>::iterator fit=fields.begin();fit!=fields.end();++fit)
351 std::cout <<
" " << *fit;
352 std::cout << std::endl;
356 std::cout <<
"reading data" << std::endl;
357 nband=readData(mapPixels,OFTReal,fields,label,ilayer,
true,verbose==2);
360 assert(nband==readData(mapPixels,OFTReal,fields,label,ilayer,
true,
false));
362 nsample=getFeatureCount(ilayer);
363 totalSamples+=nsample;
365 std::cout <<
": " << nsample <<
" samples read with " << nband <<
" bands" << std::endl;
367 catch(std::string e){
368 std::ostringstream estr;
369 estr << e <<
" " << m_filename;
373 std::cout <<
": " << nsample <<
" samples read with " << nband <<
" bands" << std::endl;
376 std::cout <<
"total number of samples read " << totalSamples << std::endl;