Processing Kernel for remote sensing data
ImgReaderOgr.h
1 /**********************************************************************
2 ImgReaderOgr.h: class to read vector files using OGR API library
3 Copyright (C) 2008-2012 Pieter Kempeneers
4 
5 This file is part of pktools
6 
7 pktools is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
11 
12 pktools is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with pktools. If not, see <http://www.gnu.org/licenses/>.
19 ***********************************************************************/
20 #ifndef _IMGREADEROGR_H_
21 #define _IMGREADEROGR_H_
22 
23 #include <assert.h>
24 #include <fstream>
25 #include <string>
26 #include <sstream>
27 #include <map>
28 #include <vector>
29 #include <iostream>
30 #include "ogrsf_frmts.h"
31 #include "base/Vector2d.h"
32 #include "ImgReaderGdal.h"
33 
34 //--------------------------------------------------------------------------
36 {
37 public:
38  ImgReaderOgr(void);
39  ImgReaderOgr(const std::string& filename);
40  ~ImgReaderOgr(void);
41  void open(const std::string& filename);
42  void close(void);
43  // int readData(Vector2d<double>& data, const OGRFieldType& fieldType, std::vector<std::string>& fields, int layer=0, bool pos=false);//default layer 0 and no pos information in data
44  template <typename T> int readXY(std::vector<T>& xVector, std::vector<T>& yVector, int layer=0, bool verbose=false);
45  template <typename T> int readY(std::vector<T>& yVector, int layer=0, bool verbose=false);
46  template <typename T> int readData(std::vector<T>& data, const OGRFieldType& fieldType, std::vector<std::string>& fields, OGRFeature *poFeature, int layer=0, bool pos=false, bool verbose=false);
47  template <typename T> int readData(std::vector<T>& data, const OGRFieldType& fieldType, const std::string& theField, int layer=0, bool verbose=false);
48  template <typename T> int readData(Vector2d<T>& data, const OGRFieldType& fieldType, std::vector<std::string>& fields, int layer=0, bool pos=false, bool verbose=false);//default layer 0 and no pos information in data
49  template <typename T> int readData(std::map<int,Vector2d<T> >& data, const OGRFieldType& fieldType, std::vector<std::string>& fields, const std::string& label, int layer=0, bool pos=false, bool verbose=false);//default layer 0 and no pos information in data
50  template <typename T> int readData(std::map<std::string,Vector2d<T> >& data, const OGRFieldType& fieldType, std::vector<std::string>& fields, const std::string& label, int layer=0, bool pos=false, bool verbose=false);//default layer 0 and no pos information in data
51  unsigned int readDataImageOgr(std::map<std::string,Vector2d<float> > &mapPixels, //[classNr][pixelNr][bandNr],
52  std::vector<std::string>& fields,
53  const std::vector<short>& bands,
54  const std::string& label,
55  const std::vector<std::string>& layers,
56  int verbose=false);
57 
58  unsigned int readDataImageOgr(std::map<std::string,Vector2d<float> > &mapPixels, //[classNr][pixelNr][bandNr],
59  std::vector<std::string>& fields,
60  double start,
61  double end,
62  const std::string& label,
63  const std::vector<std::string>& layers,
64  int verbose=false);
65 
66  // void shape2ascii(std::ostream& theOstream, const std::string& pointname, int layer=0, bool verbose=false);
67  unsigned long int getFeatureCount(int layer=0) const;
68  int getFieldCount(int layer=0) const;
69  OGRLayer* getLayer(int layer=0){return m_datasource->GetLayer(layer);};
70  std::string getProjection(int layer=0) const;
71  OGRwkbGeometryType getGeometryType(int layer=0) const;
72  std::string getLayerName(int layer=0){return m_datasource->GetLayer(layer)->GetLayerDefn()->GetName();};
73  // int getLayer(int layer=0) const;
74  int getFields(std::vector<std::string>& fields, int layer=0) const;
75  int getFields(std::vector<OGRFieldDefn*>& fields, int layer=0) const;
76  OGRDataSource* getDataSource(void) {return m_datasource;};
77  OGRSFDriver* getDriver(void) const {return m_datasource->GetDriver();};
78  int getLayerCount(void) const {return m_datasource->GetLayerCount();};
79 // OGRLayer *executeSql(const std::string& output,const std::string& sqlStatement, OGRGeometry* spatialFilter=NULL);
80  template<typename T> int readSql(Vector2d<T>& data, const OGRFieldType& fieldType, std::vector<std::string>& fields, const std::string& sqlStatement, OGRGeometry* spatialFilter=NULL, int layer=0, bool pos=false, bool verbose=false);
81  template<typename T> int 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=0, bool pos=false, bool verbose=false);
82  bool getExtent(double& ulx, double& uly, double& lrx, double& lry, int layer=0);
83 
84  friend std::ostream& operator<<(std::ostream& theOstream, ImgReaderOgr& theImageReader);
85 
86 protected:
87  void setCodec(void);
88 
89  std::string m_filename;
90  OGRDataSource *m_datasource;
91 };
92 
93 //read data from all features in a map, organized by classes
94 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)
95 {
96  assert(m_datasource->GetLayerCount()>layer);
97  OGRLayer *poLayer;
98  if(verbose)
99  std::cout << "number of layers: " << m_datasource->GetLayerCount() << std::endl;
100  poLayer = m_datasource->GetLayer(layer);
101  if(poLayer!=NULL){
102  OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
103  if(fields.empty()){
104  fields.resize(poFDefn->GetFieldCount());
105  if(verbose)
106  std::cout << "resized fields to " << fields.size() << std::endl;
107  }
108  //start reading features from the layer
109  OGRFeature *poFeature;
110  if(verbose)
111  std::cout << "reset reading" << std::endl;
112  poLayer->ResetReading();
113  unsigned long int ifeature=0;
114  int posOffset=(pos)?2:0;
115  if(verbose)
116  std::cout << "going through features" << std::endl << std::flush;
117  int theClass=0;
118  while( (poFeature = poLayer->GetNextFeature()) != NULL ){
119  std::vector<T> theFeature;//(fields.size()+posOffset);//x,y+selectedfields
120  if(verbose)
121  std::cout << "reading feature " << ifeature << std::endl << std::flush;
122  OGRGeometry *poGeometry;
123  poGeometry = poFeature->GetGeometryRef();
124  if(verbose){
125  if(poGeometry == NULL)
126  std::cerr << "no geometry defined" << std::endl << std::flush;
127  else if(wkbFlatten(poGeometry->getGeometryType()) != wkbPoint)
128  std::cerr << "Warning: poGeometry type: " << wkbFlatten(poGeometry->getGeometryType()) << std::endl << std::flush;
129  }
130  assert(poGeometry != NULL );
131  // && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint);
132  if(pos){
133  if(wkbFlatten(poGeometry->getGeometryType()) == wkbPoint){
134  OGRPoint *poPoint;
135  poPoint = (OGRPoint *) poGeometry;
136  theFeature.push_back(poPoint->getX());
137  theFeature.push_back(poPoint->getY());
138  }
139  else if(wkbFlatten(poGeometry->getGeometryType()) == wkbPolygon){
140  OGRPoint thePoint;
141  OGRPolygon * poPolygon = (OGRPolygon *) poGeometry;
142  poPolygon->Centroid(&thePoint);
143  theFeature.push_back(thePoint.getX());
144  theFeature.push_back(thePoint.getY());
145  }
146  else{
147  //Centroid for non polygon geometry not supported until OGR 1.8.0, comment out if version < 1.8.0 is installed...";
148  OGRPoint thePoint;
149  poGeometry->Centroid(&thePoint);
150  theFeature.push_back(thePoint.getX());
151  theFeature.push_back(thePoint.getY());
152  }
153  }
154  // OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
155  std::string featurename;
156  for(int iField=0;iField<poFDefn->GetFieldCount();++iField){
157  OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);
158  std::string fieldname=poFieldDefn->GetNameRef();
159  if(fieldname==label)
160  theClass=poFeature->GetFieldAsInteger(iField);
161  else{
162  switch(fieldType){
163  case(OFTReal):
164  if(fields.size()<poFDefn->GetFieldCount()){
165  if(find(fields.begin(),fields.end(),fieldname)!=fields.end())
166  theFeature.push_back(poFeature->GetFieldAsDouble(iField));
167  }
168  else{
169  fields[iField]=fieldname;
170  theFeature.push_back(poFeature->GetFieldAsDouble(iField));
171  }
172  break;
173  case(OFTInteger):
174  if(fields.size()<poFDefn->GetFieldCount()){
175  if(find(fields.begin(),fields.end(),fieldname)!=fields.end())
176  theFeature.push_back(poFeature->GetFieldAsDouble(iField));
177  }
178  else{
179  fields[iField]=fieldname;
180  theFeature.push_back(poFeature->GetFieldAsDouble(iField));
181  }
182  break;
183  default:
184  {
185  std::string errorstring="field type not supported in ImgReaderOgr::ReadData";
186  throw(errorstring);
187  }
188  break;
189  }
190  }
191  }
192  data[theClass].push_back(theFeature);
193  ++ifeature;
194  ++ifeature;
195  }
196  if(verbose)
197  std::cout << "number of features read: " << ifeature << std::endl << std::flush;
198  typename std::map<int,Vector2d<T> >::const_iterator mit=data.begin();
199  int nband=0;
200  if(verbose)
201  std::cout << "read classes: " << std::flush;
202  while(mit!=data.end()){
203  if(verbose)
204  std::cout << mit->first << " " << std::flush;
205  if(!nband)
206  nband=fields.size();
207  if(pos)
208  assert((mit->second)[0].size()==nband+2);
209  else
210  assert((mit->second)[0].size()==nband);
211  ++mit;
212  }
213  if(verbose)
214  std::cout << std::endl << std::flush;
215  return(nband);
216  }
217  else{
218  std::ostringstream ess;
219  ess << "no layer in " << m_filename;
220  throw(ess.str());
221  }
222 }
223 
224 //read data from all features in a map, organized by class names
225 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)
226 {
227  assert(m_datasource->GetLayerCount()>layer);
228  OGRLayer *poLayer;
229  if(verbose)
230  std::cout << "number of layers: " << m_datasource->GetLayerCount() << std::endl;
231  poLayer = m_datasource->GetLayer(layer);
232  if(poLayer!=NULL){
233  OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
234  assert(poFDefn!=NULL);
235 
236  if(fields.empty()){
237  fields.resize(poFDefn->GetFieldCount());
238  if(verbose)
239  std::cout << "resized fields to " << fields.size() << std::endl;
240  }
241 
242  //start reading features from the layer
243  OGRFeature *poFeature;
244  if(verbose)
245  std::cout << "reset reading" << std::endl;
246  poLayer->ResetReading();
247  unsigned long int ifeature=0;
248  int posOffset=(pos)?2:0;
249  if(verbose)
250  std::cout << "going through features to fill in string map" << std::endl << std::flush;
251  std::string theClass;
252  while( (poFeature = poLayer->GetNextFeature()) != NULL ){
253  std::vector<T> theFeature;//(fields.size()+posOffset);//x,y+selectedfields
254  if(verbose)
255  std::cout << "reading feature " << ifeature << std::endl << std::flush;
256  OGRGeometry *poGeometry;
257  poGeometry = poFeature->GetGeometryRef();
258  if(verbose){
259  if(poGeometry == NULL)
260  std::cerr << "no geometry defined" << std::endl << std::flush;
261  else if(wkbFlatten(poGeometry->getGeometryType()) != wkbPoint)
262  std::cerr << "Warning: poGeometry type: " << wkbFlatten(poGeometry->getGeometryType()) << std::endl << std::flush;
263  }
264  assert(poGeometry != NULL );
265  // && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint);
266  if(pos){
267  if(wkbFlatten(poGeometry->getGeometryType()) == wkbPoint){
268  OGRPoint *poPoint;
269  poPoint = (OGRPoint *) poGeometry;
270  theFeature.push_back(poPoint->getX());
271  theFeature.push_back(poPoint->getY());
272  }
273  else if(wkbFlatten(poGeometry->getGeometryType()) == wkbPolygon){
274  OGRPoint thePoint;
275  poGeometry->Centroid(&thePoint);
276  theFeature.push_back(thePoint.getX());
277  theFeature.push_back(thePoint.getY());
278  }
279  else{
280  //Centroid for non polygon geometry not supported until OGR 1.8.0, comment out if version < 1.8.0 is installed...";
281  OGRPoint thePoint;
282  poGeometry->Centroid(&thePoint);
283  theFeature.push_back(thePoint.getX());
284  theFeature.push_back(thePoint.getY());
285  }
286  }
287  // OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();//got LayerDefn already...
288  std::string featurename;
289  for(int iField=0;iField<poFDefn->GetFieldCount();++iField){
290  OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);
291  std::string fieldname=poFieldDefn->GetNameRef();
292  if(fieldname==label){
293  theClass=poFeature->GetFieldAsString(iField);
294  if(verbose)
295  std::cout << "read feature for " << theClass << std::endl;
296  }
297  else{
298  switch(fieldType){
299  case(OFTReal):
300  if(fields.size()<poFDefn->GetFieldCount()){
301  if(find(fields.begin(),fields.end(),fieldname)!=fields.end())
302  theFeature.push_back(poFeature->GetFieldAsDouble(iField));
303  }
304  else{
305  fields[iField]=fieldname;
306  theFeature.push_back(poFeature->GetFieldAsDouble(iField));
307  }
308  break;
309  case(OFTInteger):
310  if(fields.size()<poFDefn->GetFieldCount()){
311  if(find(fields.begin(),fields.end(),fieldname)!=fields.end())
312  theFeature.push_back(poFeature->GetFieldAsDouble(iField));
313  }
314  else{
315  fields[iField]=fieldname;
316  theFeature.push_back(poFeature->GetFieldAsDouble(iField));
317  }
318  break;
319  default:
320  {
321  std::string errorstring="field type not supported in ImgReaderOgr::ReadData";
322  throw(errorstring);
323  }
324  break;
325  }
326  }
327  assert(poFDefn!=NULL);
328  }
329  data[theClass].push_back(theFeature);
330  ++ifeature;
331  }
332  if(verbose)
333  std::cout << "number of features read: " << ifeature << std::endl << std::flush;
334  typename std::map<std::string,Vector2d<T> >::const_iterator mit=data.begin();
335  int nband=0;
336  if(verbose)
337  std::cout << "read classes: " << std::flush;
338  while(mit!=data.end()){
339  if(verbose)
340  std::cout << mit->first << " " << std::flush;
341  if(!nband)
342  nband=fields.size();
343  if(pos)
344  assert((mit->second)[0].size()==nband+2);
345  else
346  assert((mit->second)[0].size()==nband);
347  ++mit;
348  }
349  if(verbose)
350  std::cout << std::endl << std::flush;
351  return(nband);
352  }
353  else{
354  std::ostringstream ess;
355  ess << "no layer in " << m_filename;
356  throw(ess.str());
357  }
358 }
359 
360 //read x positions
361 template <typename T> int ImgReaderOgr::readXY(std::vector<T>& xVector, std::vector<T>& yVector, int layer, bool verbose){
362  assert(m_datasource->GetLayerCount()>layer);
363  OGRLayer *poLayer;
364  if(verbose)
365  std::cout << "number of layers: " << m_datasource->GetLayerCount() << std::endl;
366  poLayer = m_datasource->GetLayer(layer);
367  OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
368  //start reading features from the layer
369  OGRFeature *poFeature;
370  if(verbose)
371  std::cout << "reset reading" << std::endl;
372  poLayer->ResetReading();
373  unsigned long int ifeature=0;
374  if(verbose)
375  std::cout << "going through features" << std::endl << std::flush;
376  while( (poFeature = poLayer->GetNextFeature()) != NULL ){
377  if(verbose)
378  std::cout << "reading feature " << ifeature << std::endl << std::flush;
379  OGRGeometry *poGeometry;
380  poGeometry = poFeature->GetGeometryRef();
381  if(verbose){
382  if(poGeometry == NULL)
383  std::cerr << "no geometry defined" << std::endl << std::flush;
384  else// if(wkbFlatten(poGeometry->getGeometryType()) != wkbPoint)
385  std::cout << "poGeometry type: " << wkbFlatten(poGeometry->getGeometryType()) << std::endl;
386  }
387  // assert(poGeometry != NULL
388  // && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint);
389  OGRPoint *poPoint = (OGRPoint *) poGeometry;
390  xVector.push_back(poPoint->getX());
391  yVector.push_back(poPoint->getY());
392  ++ifeature;
393  }
394  assert(xVector.size()==yVector.size());
395  if(xVector.size()){
396  return xVector.size();
397  }
398  else{
399  std::ostringstream ess;
400  ess << "no layer in " << m_filename;
401  throw(ess.str());
402  }
403 }
404 
405 //read data from a single feature
406 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)
407 {
408  assert(m_datasource->GetLayerCount()>layer);
409  OGRLayer *poLayer;
410  if(verbose)
411  std::cout << "number of layers: " << m_datasource->GetLayerCount() << std::endl;
412  poLayer = m_datasource->GetLayer(layer);
413  OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
414  if(fields.empty()){
415  fields.resize(poFDefn->GetFieldCount());
416  if(verbose)
417  std::cout << "resized fields to " << fields.size() << std::endl;
418  }
419  OGRGeometry *poGeometry;
420  poGeometry = poFeature->GetGeometryRef();
421  if(verbose){
422  if(poGeometry == NULL)
423  std::cerr << "no geometry defined" << std::endl << std::flush;
424  else if(wkbFlatten(poGeometry->getGeometryType()) != wkbPoint)
425  std::cerr << "poGeometry type: " << wkbFlatten(poGeometry->getGeometryType()) << std::endl << std::flush;
426  }
427  assert(poGeometry != NULL);
428  // && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint);
429  OGRPoint *poPoint = (OGRPoint *) poGeometry;
430  if(pos){
431  if(wkbFlatten(poGeometry->getGeometryType()) == wkbPoint){
432  OGRPoint *poPoint;
433  poPoint = (OGRPoint *) poGeometry;
434  data.push_back(poPoint->getX());
435  data.push_back(poPoint->getY());
436  }
437  else if(wkbFlatten(poGeometry->getGeometryType()) == wkbPolygon){
438  OGRPoint thePoint;
439  poGeometry->Centroid(&thePoint);
440  data.push_back(thePoint.getX());
441  data.push_back(thePoint.getY());
442  }
443  else{
444  //Centroid for non polygon geometry not supported until OGR 1.8.0, comment out if version < 1.8.0 is installed...";
445  OGRPoint thePoint;
446  poGeometry->Centroid(&thePoint);
447  data.push_back(thePoint.getX());
448  data.push_back(thePoint.getY());
449  }
450 
451  }
452  std::string featurename;
453  for(int iField=0;iField<poFDefn->GetFieldCount();++iField){
454  OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);
455  std::string fieldname=poFieldDefn->GetNameRef();
456  switch(fieldType){
457  case(OFTReal):
458  if(fields.size()<poFDefn->GetFieldCount()){
459  if(find(fields.begin(),fields.end(),fieldname)!=fields.end())
460  data.push_back(poFeature->GetFieldAsDouble(iField));
461  }
462  else{
463  fields[iField]=fieldname;
464  data.push_back(poFeature->GetFieldAsDouble(iField));
465  }
466  break;
467  case(OFTInteger):
468  if(fields.size()<poFDefn->GetFieldCount()){
469  if(find(fields.begin(),fields.end(),fieldname)!=fields.end())
470  data.push_back(poFeature->GetFieldAsDouble(iField));
471  }
472  else{
473  fields[iField]=fieldname;
474  data.push_back(poFeature->GetFieldAsDouble(iField));
475  }
476  break;
477  default:
478  {
479  std::string errorstring="field type not supported in ImgReaderOgr::ReadData";
480  throw(errorstring);
481  }
482  break;
483  }
484  }
485  // assert(data.size()==ifeature);
486  if(data.size()){
487  if(pos)
488  assert(data.size()==fields.size()+2);
489  else
490  assert(data.size()==fields.size());
491  return fields.size();
492  }
493  else{
494  std::ostringstream ess;
495  ess << "no layer in " << m_filename;
496  throw(ess.str());
497  }
498 }
499 
500 //read one field from all features
501 template <typename T> inline int ImgReaderOgr::readData(std::vector<T>& data, const OGRFieldType& fieldType, const std::string& theField, int layer, bool verbose)
502 {
503  assert(m_datasource->GetLayerCount()>layer);
504  OGRLayer *poLayer;
505  if(verbose)
506  std::cout << "number of layers: " << m_datasource->GetLayerCount() << std::endl;
507  poLayer = m_datasource->GetLayer(layer);
508  OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
509  int nfield=(theField!="")? poFDefn->GetFieldCount() : 1;
510  if(theField==""){
511  //read first field available
512  if(verbose)
513  std::cout << "read first field from total of " << nfield << std::endl;
514  }
515 
516  //start reading features from the layer
517  OGRFeature *poFeature;
518  if(verbose)
519  std::cout << "reset reading" << std::endl;
520  poLayer->ResetReading();
521  unsigned long int ifeature=0;
522  if(verbose)
523  std::cout << "going through features" << std::endl << std::flush;
524  while( (poFeature = poLayer->GetNextFeature()) != NULL ){
525  // std::vector<T> theFeature;//(fields.size()+posOffset);//x,y+selectedfields
526  T theFeature;
527  if(verbose)
528  std::cout << "reading feature " << ifeature << std::endl << std::flush;
529  OGRGeometry *poGeometry;
530  poGeometry = poFeature->GetGeometryRef();
531  if(verbose){
532  if(poGeometry == NULL)
533  std::cerr << "no geometry defined" << std::endl << std::flush;
534  else// if(wkbFlatten(poGeometry->getGeometryType()) != wkbPoint)
535  std::cout << "poGeometry type: " << wkbFlatten(poGeometry->getGeometryType()) << std::endl;
536  }
537  // assert(poGeometry != NULL
538  // && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint);
539  OGRPoint *poPoint = (OGRPoint *) poGeometry;
540 
541  for(int iField=0;iField<nfield;++iField){
542  OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);
543  std::string fieldname=poFieldDefn->GetNameRef();
544  if(fieldname!=theField)
545  continue;
546  switch(fieldType){
547  case(OFTInteger):
548  case(OFTReal):
549  theFeature=poFeature->GetFieldAsDouble(iField);
550  break;
551  default:
552  {
553  std::string errorstring="field type not supported in ImgReaderOgr::ReadData";
554  throw(errorstring);
555  }
556  break;
557  }
558  }
559  data.push_back(theFeature);
560  if(verbose)
561  std::cout << "feature is: " << theFeature << std::endl;
562  ++ifeature;
563  }
564  if(data.size()){
565  return data.size();
566  }
567  else{
568  std::ostringstream ess;
569  ess << "no layer in " << m_filename;
570  throw(ess.str());
571  }
572 }
573 
574 //specialization for string: read one field from all features
575 template <> inline int ImgReaderOgr::readData(std::vector<std::string>& data, const OGRFieldType& fieldType, const std::string& theField, int layer, bool verbose)
576 {
577  assert(m_datasource->GetLayerCount()>layer);
578  OGRLayer *poLayer;
579  if(verbose)
580  std::cout << "number of layers: " << m_datasource->GetLayerCount() << std::endl;
581  poLayer = m_datasource->GetLayer(layer);
582  OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
583  int nfield=(theField!="")? poFDefn->GetFieldCount() : 1;
584  if(theField==""){
585  //read first field available
586  if(verbose)
587  std::cout << "read first field from total of " << nfield << std::endl;
588  }
589 
590  //start reading features from the layer
591  OGRFeature *poFeature;
592  if(verbose)
593  std::cout << "reset reading" << std::endl;
594  poLayer->ResetReading();
595  unsigned long int ifeature=0;
596  if(verbose)
597  std::cout << "going through features" << std::endl << std::flush;
598  while( (poFeature = poLayer->GetNextFeature()) != NULL ){
599  std::string theFeature;
600  if(verbose)
601  std::cout << "reading feature " << ifeature << std::endl << std::flush;
602  OGRGeometry *poGeometry;
603  poGeometry = poFeature->GetGeometryRef();
604  if(verbose){
605  if(poGeometry == NULL)
606  std::cerr << "no geometry defined" << std::endl << std::flush;
607  else// if(wkbFlatten(poGeometry->getGeometryType()) != wkbPoint)
608  std::cout << "poGeometry type: " << wkbFlatten(poGeometry->getGeometryType()) << std::endl;
609  }
610  // assert(poGeometry != NULL
611  // && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint);
612  OGRPoint *poPoint = (OGRPoint *) poGeometry;
613 
614  for(int iField=0;iField<nfield;++iField){
615  OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);
616  std::string fieldname=poFieldDefn->GetNameRef();
617  if(fieldname!=theField)
618  continue;
619  switch(fieldType){
620  case(OFTInteger):
621  case(OFTReal):
622  case(OFTString):
623  theFeature=poFeature->GetFieldAsString(iField);
624  break;
625  default:
626  {
627  std::string errorstring="field type not supported in ImgReaderOgr::ReadData";
628  throw(errorstring);
629  }
630  break;
631  }
632  }
633  data.push_back(theFeature);
634  if(verbose)
635  std::cout << "feature is: " << theFeature << std::endl;
636  ++ifeature;
637  }
638  if(data.size()){
639  return data.size();
640  }
641  else{
642  std::ostringstream ess;
643  ess << "no layer in " << m_filename;
644  throw(ess.str());
645  }
646 }
647 
648 //read data from all features
649 template <typename T> int ImgReaderOgr::readData(Vector2d<T>& data, const OGRFieldType& fieldType, std::vector<std::string>& fields, int layer, bool pos, bool verbose)
650 {
651  assert(m_datasource->GetLayerCount()>layer);
652  OGRLayer *poLayer;
653  if(verbose)
654  std::cout << "number of layers: " << m_datasource->GetLayerCount() << std::endl;
655  poLayer = m_datasource->GetLayer(layer);
656  OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
657  if(fields.empty()){
658  fields.resize(poFDefn->GetFieldCount());
659  if(verbose)
660  std::cout << "resized fields to " << fields.size() << std::endl;
661  }
662  //start reading features from the layer
663  OGRFeature *poFeature;
664  if(verbose)
665  std::cout << "reset reading" << std::endl;
666  poLayer->ResetReading();
667  unsigned long int ifeature=0;
668  int posOffset=(pos)?2:0;
669  if(verbose)
670  std::cout << "going through features" << std::endl << std::flush;
671  while( (poFeature = poLayer->GetNextFeature()) != NULL ){
672  std::vector<T> theFeature;//(fields.size()+posOffset);//x,y+selectedfields
673  if(verbose)
674  std::cout << "reading feature " << ifeature << std::endl << std::flush;
675  OGRGeometry *poGeometry;
676  poGeometry = poFeature->GetGeometryRef();
677  if(verbose){
678  if(poGeometry == NULL)
679  std::cerr << "no geometry defined" << std::endl << std::flush;
680  else if(wkbFlatten(poGeometry->getGeometryType()) != wkbPoint)
681  std::cerr << "poGeometry type: " << wkbFlatten(poGeometry->getGeometryType()) << std::endl << std::flush;
682  }
683  assert(poGeometry != NULL
684  && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint);
685  OGRPoint *poPoint = (OGRPoint *) poGeometry;
686  if(pos){
687  theFeature.push_back(poPoint->getX());
688  theFeature.push_back(poPoint->getY());
689  }
690  OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
691  std::string featurename;
692  for(int iField=0;iField<poFDefn->GetFieldCount();++iField){
693  OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);
694  std::string fieldname=poFieldDefn->GetNameRef();
695  switch(fieldType){
696  case(OFTReal):
697  if(fields.size()<poFDefn->GetFieldCount()){
698  if(find(fields.begin(),fields.end(),fieldname)!=fields.end())
699  theFeature.push_back(poFeature->GetFieldAsDouble(iField));
700  }
701  else{
702  fields[iField]=fieldname;
703  theFeature.push_back(poFeature->GetFieldAsDouble(iField));
704  }
705  break;
706  case(OFTInteger):
707  if(fields.size()<poFDefn->GetFieldCount()){
708  if(find(fields.begin(),fields.end(),fieldname)!=fields.end())
709  theFeature.push_back(poFeature->GetFieldAsDouble(iField));
710  }
711  else{
712  fields[iField]=fieldname;
713  theFeature.push_back(poFeature->GetFieldAsDouble(iField));
714  }
715  break;
716  default:
717  {
718  std::string errorstring="field type not supported in ImgReaderOgr::ReadData";
719  throw(errorstring);
720  }
721  break;
722  }
723  }
724  data.push_back(theFeature);
725  ++ifeature;
726  }
727 // assert(data.size()==ifeature);
728  if(data.size()){
729  if(pos)
730  assert(data[0].size()==fields.size()+2);
731  else
732  assert(data[0].size()==fields.size());
733  return fields.size();
734  }
735  else{
736  std::ostringstream ess;
737  ess << "no layer in " << m_filename;
738  throw(ess.str());
739  }
740 }
741 
742 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)
743 {
744  assert(m_datasource->GetLayerCount()>layer);
745  OGRLayer *poLayer;
746  poLayer = m_datasource->ExecuteSQL(sqlStatement.c_str(), spatialFilter,NULL );
747  if(poLayer!=NULL){
748  OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
749  if(fields.empty()){
750  fields.resize(poFDefn->GetFieldCount());
751  if(verbose)
752  std::cout << "resized fields to " << fields.size() << std::endl;
753  }
754  //start reading features from the layer
755  OGRFeature *poFeature;
756  if(verbose)
757  std::cout << "reset reading" << std::endl;
758  poLayer->ResetReading();
759  unsigned long int ifeature=0;
760  int posOffset=(pos)?2:0;
761  if(verbose)
762  std::cout << "going through features" << std::endl << std::flush;
763  int theClass=0;
764  while( (poFeature = poLayer->GetNextFeature()) != NULL ){
765  std::vector<T> theFeature;//(fields.size()+posOffset);//x,y+selectedfields
766  if(verbose)
767  std::cout << "reading feature " << ifeature << std::endl << std::flush;
768  OGRGeometry *poGeometry;
769  poGeometry = poFeature->GetGeometryRef();
770  if(verbose){
771  if(poGeometry == NULL)
772  std::cerr << "no geometry defined" << std::endl << std::flush;
773  else if(wkbFlatten(poGeometry->getGeometryType()) != wkbPoint)
774  std::cerr << "poGeometry type: " << wkbFlatten(poGeometry->getGeometryType()) << std::endl << std::flush;
775  }
776  assert(poGeometry != NULL
777  && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint);
778  OGRPoint *poPoint = (OGRPoint *) poGeometry;
779  if(pos){
780  theFeature.push_back(poPoint->getX());
781  theFeature.push_back(poPoint->getY());
782  }
783  OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
784  std::string featurename;
785  for(int iField=0;iField<poFDefn->GetFieldCount();++iField){
786  OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);
787  std::string fieldname=poFieldDefn->GetNameRef();
788  if(fieldname==label)
789  theClass=poFeature->GetFieldAsInteger(iField);
790  else{
791  switch(fieldType){
792  case(OFTReal):
793  if(fields.size()<poFDefn->GetFieldCount()){
794  if(find(fields.begin(),fields.end(),fieldname)!=fields.end())
795  theFeature.push_back(poFeature->GetFieldAsDouble(iField));
796  }
797  else{
798  fields[iField]=fieldname;
799  theFeature.push_back(poFeature->GetFieldAsDouble(iField));
800  }
801  break;
802  case(OFTInteger):
803  if(fields.size()<poFDefn->GetFieldCount()){
804  if(find(fields.begin(),fields.end(),fieldname)!=fields.end())
805  theFeature.push_back(poFeature->GetFieldAsDouble(iField));
806  }
807  else{
808  fields[iField]=fieldname;
809  theFeature.push_back(poFeature->GetFieldAsDouble(iField));
810  }
811  break;
812  default:
813  {
814  std::string errorstring="field type not supported in ImgReaderOgr::ReadData";
815  throw(errorstring);
816  }
817  break;
818  }
819  }
820  }
821  data[theClass].push_back(theFeature);
822  ++ifeature;
823  }
824  if(verbose)
825  std::cout << "number of features read: " << ifeature << std::endl << std::flush;
826  typename std::map<int,Vector2d<T> >::const_iterator mit=data.begin();
827  int nband=0;
828  if(verbose)
829  std::cout << "read classes: " << std::flush;
830  while(mit!=data.end()){
831  if(verbose)
832  std::cout << mit->first << " " << std::flush;
833  if(!nband)
834  nband=fields.size();
835  if(pos)
836  assert((mit->second)[0].size()==nband+2);
837  else
838  assert((mit->second)[0].size()==nband);
839  ++mit;
840  }
841  if(verbose)
842  std::cout << std::endl << std::flush;
843  return(nband);
844  }
845  else{
846  std::ostringstream ess;
847  ess << "no layer in " << m_filename;
848  throw(ess.str());
849  }
850 }
851 
852 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)
853 {
854  assert(m_datasource->GetLayerCount()>layer);
855  OGRLayer *poLayer;
856  poLayer = m_datasource->ExecuteSQL(sqlStatement.c_str(), spatialFilter,NULL );
857  if(poLayer!=NULL){
858  OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
859  if(fields.empty()){
860  fields.resize(poFDefn->GetFieldCount());
861  if(verbose)
862  std::cout << "resized fields to " << fields.size() << std::endl;
863  }
864  //start reading features from the layer
865  OGRFeature *poFeature;
866  if(verbose)
867  std::cout << "reset reading" << std::endl;
868  poLayer->ResetReading();
869  unsigned long int ifeature=0;
870  int posOffset=(pos)?2:0;
871  if(verbose)
872  std::cout << "going through features" << std::endl << std::flush;
873  while( (poFeature = poLayer->GetNextFeature()) != NULL ){
874  std::vector<T> theFeature;//(fields.size()+posOffset);//x,y+selectedfields
875  if(verbose)
876  std::cout << "reading feature " << ifeature << std::endl << std::flush;
877  OGRGeometry *poGeometry;
878  poGeometry = poFeature->GetGeometryRef();
879  if(verbose){
880  if(poGeometry == NULL)
881  std::cerr << "no geometry defined" << std::endl << std::flush;
882  else if(wkbFlatten(poGeometry->getGeometryType()) != wkbPoint)
883  std::cerr << "poGeometry type: " << wkbFlatten(poGeometry->getGeometryType()) << std::endl << std::flush;
884  }
885  assert(poGeometry != NULL
886  && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint);
887  OGRPoint *poPoint = (OGRPoint *) poGeometry;
888  if(pos){
889  theFeature.push_back(poPoint->getX());
890  theFeature.push_back(poPoint->getY());
891  }
892  OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
893  std::string featurename;
894  for(int iField=0;iField<poFDefn->GetFieldCount();++iField){
895  OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);
896  std::string fieldname=poFieldDefn->GetNameRef();
897  switch(fieldType){
898  case(OFTReal):
899  if(fields.size()<poFDefn->GetFieldCount()){
900  if(find(fields.begin(),fields.end(),fieldname)!=fields.end())
901  theFeature.push_back(poFeature->GetFieldAsDouble(iField));
902  }
903  else{
904  fields[iField]=fieldname;
905  theFeature.push_back(poFeature->GetFieldAsDouble(iField));
906  }
907  break;
908  case(OFTInteger):
909  if(fields.size()<poFDefn->GetFieldCount()){
910  if(find(fields.begin(),fields.end(),fieldname)!=fields.end())
911  theFeature.push_back(poFeature->GetFieldAsDouble(iField));
912  }
913  else{
914  fields[iField]=fieldname;
915  theFeature.push_back(poFeature->GetFieldAsDouble(iField));
916  }
917  break;
918  default:
919  {
920  std::string errorstring="field type not supported in ImgReaderOgr::ReadData";
921  throw(errorstring);
922  }
923  break;
924  }
925  }
926  data.push_back(theFeature);
927  ++ifeature;
928  }
929  m_datasource->ReleaseResultSet( poLayer );
930  // assert(data.size()==ifeature);
931  if(data.size()){
932  if(pos)
933  assert(data[0].size()==fields.size()+2);
934  else
935  assert(data[0].size()==fields.size());
936  return fields.size();
937  }
938  else
939  return(0);
940  }
941  else{
942  std::ostringstream ess;
943  ess << "no layer in " << m_filename;
944  throw(ess.str());
945  }
946 }
947 
948 #endif // _IMGREADEROGR_H_