20 #ifndef _IMGREADEROGR_H_
21 #define _IMGREADEROGR_H_
30 #include "ogrsf_frmts.h"
31 #include "base/Vector2d.h"
32 #include "ImgReaderGdal.h"
41 void open(
const std::string& filename);
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);
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);
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);
51 unsigned int readDataImageOgr(std::map<std::string,
Vector2d<float> > &mapPixels,
52 std::vector<std::string>& fields,
53 const std::vector<unsigned short>& bands,
54 const std::string& label,
55 const std::vector<std::string>& layers,
58 unsigned int readDataImageOgr(std::map<std::string,
Vector2d<float> > &mapPixels,
59 std::vector<std::string>& fields,
62 const std::string& label,
63 const std::vector<std::string>& layers,
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();};
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();};
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);
83 bool getExtent(
double& ulx,
double& uly,
double& lrx,
double& lry);
85 void setFieldSeparator(
const char fs){ m_fs=fs;};
86 char getFieldSeparator()
const {
return m_fs;};
87 friend std::ostream& operator<<(std::ostream& theOstream,
ImgReaderOgr& theImageReader);
92 std::string m_filename;
93 OGRDataSource *m_datasource;
98 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)
100 assert(m_datasource->GetLayerCount()>layer);
103 std::cout <<
"number of layers: " << m_datasource->GetLayerCount() << std::endl;
104 poLayer = m_datasource->GetLayer(layer);
106 OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
108 fields.resize(poFDefn->GetFieldCount());
110 std::cout <<
"resized fields to " << fields.size() << std::endl;
113 OGRFeature *poFeature;
115 std::cout <<
"reset reading" << std::endl;
116 poLayer->ResetReading();
117 unsigned long int ifeature=0;
118 int posOffset=(pos)?2:0;
120 std::cout <<
"going through features" << std::endl << std::flush;
122 while( (poFeature = poLayer->GetNextFeature()) != NULL ){
123 std::vector<T> theFeature;
125 std::cout <<
"reading feature " << ifeature << std::endl << std::flush;
126 OGRGeometry *poGeometry;
127 poGeometry = poFeature->GetGeometryRef();
129 if(poGeometry == NULL)
130 std::cerr <<
"no geometry defined" << std::endl << std::flush;
131 else if(wkbFlatten(poGeometry->getGeometryType()) != wkbPoint)
132 std::cerr <<
"Warning: poGeometry type: " << wkbFlatten(poGeometry->getGeometryType()) << std::endl << std::flush;
134 assert(poGeometry != NULL );
137 if(wkbFlatten(poGeometry->getGeometryType()) == wkbPoint){
139 poPoint = (OGRPoint *) poGeometry;
140 theFeature.push_back(poPoint->getX());
141 theFeature.push_back(poPoint->getY());
143 else if(wkbFlatten(poGeometry->getGeometryType()) == wkbPolygon){
145 OGRPolygon * poPolygon = (OGRPolygon *) poGeometry;
146 poPolygon->Centroid(&thePoint);
147 theFeature.push_back(thePoint.getX());
148 theFeature.push_back(thePoint.getY());
153 poGeometry->Centroid(&thePoint);
154 theFeature.push_back(thePoint.getX());
155 theFeature.push_back(thePoint.getY());
159 std::string featurename;
160 for(
int iField=0;iField<poFDefn->GetFieldCount();++iField){
161 OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);
162 std::string fieldname=poFieldDefn->GetNameRef();
164 theClass=poFeature->GetFieldAsInteger(iField);
168 if(fields.size()<poFDefn->GetFieldCount()){
169 if(find(fields.begin(),fields.end(),fieldname)!=fields.end())
170 theFeature.push_back(poFeature->GetFieldAsDouble(iField));
173 fields[iField]=fieldname;
174 theFeature.push_back(poFeature->GetFieldAsDouble(iField));
178 if(fields.size()<poFDefn->GetFieldCount()){
179 if(find(fields.begin(),fields.end(),fieldname)!=fields.end())
180 theFeature.push_back(poFeature->GetFieldAsDouble(iField));
183 fields[iField]=fieldname;
184 theFeature.push_back(poFeature->GetFieldAsDouble(iField));
189 std::string errorstring=
"field type not supported in ImgReaderOgr::ReadData";
196 data[theClass].push_back(theFeature);
201 std::cout <<
"number of features read: " << ifeature << std::endl << std::flush;
202 typename std::map<int,Vector2d<T> >::const_iterator mit=data.begin();
205 std::cout <<
"read classes: " << std::flush;
206 while(mit!=data.end()){
208 std::cout << mit->first <<
" " << std::flush;
212 assert((mit->second)[0].size()==nband+2);
214 assert((mit->second)[0].size()==nband);
218 std::cout << std::endl << std::flush;
222 std::ostringstream ess;
223 ess <<
"no layer in " << m_filename;
229 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)
231 assert(m_datasource->GetLayerCount()>layer);
234 std::cout <<
"number of layers: " << m_datasource->GetLayerCount() << std::endl;
235 poLayer = m_datasource->GetLayer(layer);
237 OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
238 assert(poFDefn!=NULL);
241 fields.resize(poFDefn->GetFieldCount());
243 std::cout <<
"resized fields to " << fields.size() << std::endl;
247 OGRFeature *poFeature;
249 std::cout <<
"reset reading" << std::endl;
250 poLayer->ResetReading();
251 unsigned long int ifeature=0;
252 int posOffset=(pos)?2:0;
254 std::cout <<
"going through features to fill in string map" << std::endl << std::flush;
255 std::string theClass;
256 while( (poFeature = poLayer->GetNextFeature()) != NULL ){
257 std::vector<T> theFeature;
259 std::cout <<
"reading feature " << ifeature << std::endl << std::flush;
260 OGRGeometry *poGeometry;
261 poGeometry = poFeature->GetGeometryRef();
263 if(poGeometry == NULL)
264 std::cerr <<
"no geometry defined" << std::endl << std::flush;
265 else if(wkbFlatten(poGeometry->getGeometryType()) != wkbPoint)
266 std::cerr <<
"Warning: poGeometry type: " << wkbFlatten(poGeometry->getGeometryType()) << std::endl << std::flush;
268 assert(poGeometry != NULL );
271 if(wkbFlatten(poGeometry->getGeometryType()) == wkbPoint){
273 poPoint = (OGRPoint *) poGeometry;
274 theFeature.push_back(poPoint->getX());
275 theFeature.push_back(poPoint->getY());
277 else if(wkbFlatten(poGeometry->getGeometryType()) == wkbPolygon){
279 poGeometry->Centroid(&thePoint);
280 theFeature.push_back(thePoint.getX());
281 theFeature.push_back(thePoint.getY());
286 poGeometry->Centroid(&thePoint);
287 theFeature.push_back(thePoint.getX());
288 theFeature.push_back(thePoint.getY());
292 std::string featurename;
293 for(
int iField=0;iField<poFDefn->GetFieldCount();++iField){
294 OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);
295 std::string fieldname=poFieldDefn->GetNameRef();
296 if(fieldname==label){
297 theClass=poFeature->GetFieldAsString(iField);
299 std::cout <<
"read feature for " << theClass << std::endl;
304 if(fields.size()<poFDefn->GetFieldCount()){
305 if(find(fields.begin(),fields.end(),fieldname)!=fields.end())
306 theFeature.push_back(poFeature->GetFieldAsDouble(iField));
309 fields[iField]=fieldname;
310 theFeature.push_back(poFeature->GetFieldAsDouble(iField));
314 if(fields.size()<poFDefn->GetFieldCount()){
315 if(find(fields.begin(),fields.end(),fieldname)!=fields.end())
316 theFeature.push_back(poFeature->GetFieldAsDouble(iField));
319 fields[iField]=fieldname;
320 theFeature.push_back(poFeature->GetFieldAsDouble(iField));
325 std::string errorstring=
"field type not supported in ImgReaderOgr::ReadData";
331 assert(poFDefn!=NULL);
333 data[theClass].push_back(theFeature);
337 std::cout <<
"number of features read: " << ifeature << std::endl << std::flush;
338 typename std::map<std::string,Vector2d<T> >::const_iterator mit=data.begin();
341 std::cout <<
"read classes: " << std::flush;
342 while(mit!=data.end()){
344 std::cout << mit->first <<
" " << std::flush;
348 assert((mit->second)[0].size()==nband+2);
350 assert((mit->second)[0].size()==nband);
354 std::cout << std::endl << std::flush;
358 std::ostringstream ess;
359 ess <<
"no layer in " << m_filename;
365 template <
typename T>
int ImgReaderOgr::readXY(std::vector<T>& xVector, std::vector<T>& yVector,
int layer,
bool verbose){
366 assert(m_datasource->GetLayerCount()>layer);
369 std::cout <<
"number of layers: " << m_datasource->GetLayerCount() << std::endl;
370 poLayer = m_datasource->GetLayer(layer);
371 OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
373 OGRFeature *poFeature;
375 std::cout <<
"reset reading" << std::endl;
376 poLayer->ResetReading();
377 unsigned long int ifeature=0;
379 std::cout <<
"going through features" << std::endl << std::flush;
380 while( (poFeature = poLayer->GetNextFeature()) != NULL ){
382 std::cout <<
"reading feature " << ifeature << std::endl << std::flush;
383 OGRGeometry *poGeometry;
384 poGeometry = poFeature->GetGeometryRef();
386 if(poGeometry == NULL)
387 std::cerr <<
"no geometry defined" << std::endl << std::flush;
389 std::cout <<
"poGeometry type: " << wkbFlatten(poGeometry->getGeometryType()) << std::endl;
393 OGRPoint *poPoint = (OGRPoint *) poGeometry;
394 xVector.push_back(poPoint->getX());
395 yVector.push_back(poPoint->getY());
398 assert(xVector.size()==yVector.size());
400 return xVector.size();
403 std::ostringstream ess;
404 ess <<
"no layer in " << m_filename;
410 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)
412 assert(m_datasource->GetLayerCount()>layer);
415 std::cout <<
"number of layers: " << m_datasource->GetLayerCount() << std::endl;
416 poLayer = m_datasource->GetLayer(layer);
417 OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
419 fields.resize(poFDefn->GetFieldCount());
421 std::cout <<
"resized fields to " << fields.size() << std::endl;
423 OGRGeometry *poGeometry;
424 poGeometry = poFeature->GetGeometryRef();
426 if(poGeometry == NULL)
427 std::cerr <<
"no geometry defined" << std::endl << std::flush;
428 else if(wkbFlatten(poGeometry->getGeometryType()) != wkbPoint)
429 std::cerr <<
"poGeometry type: " << wkbFlatten(poGeometry->getGeometryType()) << std::endl << std::flush;
431 assert(poGeometry != NULL);
433 OGRPoint *poPoint = (OGRPoint *) poGeometry;
435 if(wkbFlatten(poGeometry->getGeometryType()) == wkbPoint){
437 poPoint = (OGRPoint *) poGeometry;
438 data.push_back(poPoint->getX());
439 data.push_back(poPoint->getY());
441 else if(wkbFlatten(poGeometry->getGeometryType()) == wkbPolygon){
443 poGeometry->Centroid(&thePoint);
444 data.push_back(thePoint.getX());
445 data.push_back(thePoint.getY());
450 poGeometry->Centroid(&thePoint);
451 data.push_back(thePoint.getX());
452 data.push_back(thePoint.getY());
456 std::string featurename;
457 for(
int iField=0;iField<poFDefn->GetFieldCount();++iField){
458 OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);
459 std::string fieldname=poFieldDefn->GetNameRef();
462 if(fields.size()<poFDefn->GetFieldCount()){
463 if(find(fields.begin(),fields.end(),fieldname)!=fields.end())
464 data.push_back(poFeature->GetFieldAsDouble(iField));
467 fields[iField]=fieldname;
468 data.push_back(poFeature->GetFieldAsDouble(iField));
472 if(fields.size()<poFDefn->GetFieldCount()){
473 if(find(fields.begin(),fields.end(),fieldname)!=fields.end())
474 data.push_back(poFeature->GetFieldAsDouble(iField));
477 fields[iField]=fieldname;
478 data.push_back(poFeature->GetFieldAsDouble(iField));
483 std::string errorstring=
"field type not supported in ImgReaderOgr::ReadData";
492 assert(data.size()==fields.size()+2);
494 assert(data.size()==fields.size());
495 return fields.size();
498 std::ostringstream ess;
499 ess <<
"no layer in " << m_filename;
505 template <
typename T>
inline int ImgReaderOgr::readData(std::vector<T>& data,
const OGRFieldType& fieldType,
const std::string& theField,
int layer,
bool verbose)
507 assert(m_datasource->GetLayerCount()>layer);
510 std::cout <<
"number of layers: " << m_datasource->GetLayerCount() << std::endl;
511 poLayer = m_datasource->GetLayer(layer);
512 OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
513 int nfield=(theField!=
"")? poFDefn->GetFieldCount() : 1;
517 std::cout <<
"read first field from total of " << nfield << std::endl;
521 OGRFeature *poFeature;
523 std::cout <<
"reset reading" << std::endl;
524 poLayer->ResetReading();
525 unsigned long int ifeature=0;
527 std::cout <<
"going through features" << std::endl << std::flush;
528 while( (poFeature = poLayer->GetNextFeature()) != NULL ){
532 std::cout <<
"reading feature " << ifeature << std::endl << std::flush;
533 OGRGeometry *poGeometry;
534 poGeometry = poFeature->GetGeometryRef();
536 if(poGeometry == NULL)
537 std::cerr <<
"no geometry defined" << std::endl << std::flush;
539 std::cout <<
"poGeometry type: " << wkbFlatten(poGeometry->getGeometryType()) << std::endl;
543 OGRPoint *poPoint = (OGRPoint *) poGeometry;
545 for(
int iField=0;iField<nfield;++iField){
546 OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);
547 std::string fieldname=poFieldDefn->GetNameRef();
548 if(fieldname!=theField)
553 theFeature=poFeature->GetFieldAsDouble(iField);
557 std::string errorstring=
"field type not supported in ImgReaderOgr::ReadData";
563 data.push_back(theFeature);
565 std::cout <<
"feature is: " << theFeature << std::endl;
572 std::ostringstream ess;
573 ess <<
"no layer in " << m_filename;
579 template <>
inline int ImgReaderOgr::readData(std::vector<std::string>& data,
const OGRFieldType& fieldType,
const std::string& theField,
int layer,
bool verbose)
581 assert(m_datasource->GetLayerCount()>layer);
584 std::cout <<
"number of layers: " << m_datasource->GetLayerCount() << std::endl;
585 poLayer = m_datasource->GetLayer(layer);
586 OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
587 int nfield=(theField!=
"")? poFDefn->GetFieldCount() : 1;
591 std::cout <<
"read first field from total of " << nfield << std::endl;
595 OGRFeature *poFeature;
597 std::cout <<
"reset reading" << std::endl;
598 poLayer->ResetReading();
599 unsigned long int ifeature=0;
601 std::cout <<
"going through features" << std::endl << std::flush;
602 while( (poFeature = poLayer->GetNextFeature()) != NULL ){
603 std::string theFeature;
605 std::cout <<
"reading feature " << ifeature << std::endl << std::flush;
606 OGRGeometry *poGeometry;
607 poGeometry = poFeature->GetGeometryRef();
609 if(poGeometry == NULL)
610 std::cerr <<
"no geometry defined" << std::endl << std::flush;
612 std::cout <<
"poGeometry type: " << wkbFlatten(poGeometry->getGeometryType()) << std::endl;
616 OGRPoint *poPoint = (OGRPoint *) poGeometry;
618 for(
int iField=0;iField<nfield;++iField){
619 OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);
620 std::string fieldname=poFieldDefn->GetNameRef();
621 if(fieldname!=theField)
627 theFeature=poFeature->GetFieldAsString(iField);
631 std::string errorstring=
"field type not supported in ImgReaderOgr::ReadData";
637 data.push_back(theFeature);
639 std::cout <<
"feature is: " << theFeature << std::endl;
646 std::ostringstream ess;
647 ess <<
"no layer in " << m_filename;
653 template <
typename T>
int ImgReaderOgr::readData(
Vector2d<T>& data,
const OGRFieldType& fieldType, std::vector<std::string>& fields,
int layer,
bool pos,
bool verbose)
655 assert(m_datasource->GetLayerCount()>layer);
658 std::cout <<
"number of layers: " << m_datasource->GetLayerCount() << std::endl;
659 poLayer = m_datasource->GetLayer(layer);
660 OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
662 fields.resize(poFDefn->GetFieldCount());
664 std::cout <<
"resized fields to " << fields.size() << std::endl;
667 OGRFeature *poFeature;
669 std::cout <<
"reset reading" << std::endl;
670 poLayer->ResetReading();
671 unsigned long int ifeature=0;
672 int posOffset=(pos)?2:0;
674 std::cout <<
"going through features" << std::endl << std::flush;
675 while( (poFeature = poLayer->GetNextFeature()) != NULL ){
676 std::vector<T> theFeature;
678 std::cout <<
"reading feature " << ifeature << std::endl << std::flush;
679 OGRGeometry *poGeometry;
680 poGeometry = poFeature->GetGeometryRef();
682 if(poGeometry == NULL)
683 std::cerr <<
"no geometry defined" << std::endl << std::flush;
684 else if(wkbFlatten(poGeometry->getGeometryType()) != wkbPoint)
685 std::cerr <<
"poGeometry type: " << wkbFlatten(poGeometry->getGeometryType()) << std::endl << std::flush;
687 assert(poGeometry != NULL
688 && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint);
689 OGRPoint *poPoint = (OGRPoint *) poGeometry;
691 theFeature.push_back(poPoint->getX());
692 theFeature.push_back(poPoint->getY());
694 OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
695 std::string featurename;
696 for(
int iField=0;iField<poFDefn->GetFieldCount();++iField){
697 OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);
698 std::string fieldname=poFieldDefn->GetNameRef();
701 if(fields.size()<poFDefn->GetFieldCount()){
702 if(find(fields.begin(),fields.end(),fieldname)!=fields.end())
703 theFeature.push_back(poFeature->GetFieldAsDouble(iField));
706 fields[iField]=fieldname;
707 theFeature.push_back(poFeature->GetFieldAsDouble(iField));
711 if(fields.size()<poFDefn->GetFieldCount()){
712 if(find(fields.begin(),fields.end(),fieldname)!=fields.end())
713 theFeature.push_back(poFeature->GetFieldAsDouble(iField));
716 fields[iField]=fieldname;
717 theFeature.push_back(poFeature->GetFieldAsDouble(iField));
722 std::string errorstring=
"field type not supported in ImgReaderOgr::ReadData";
728 data.push_back(theFeature);
734 assert(data[0].size()==fields.size()+2);
736 assert(data[0].size()==fields.size());
737 return fields.size();
740 std::ostringstream ess;
741 ess <<
"no layer in " << m_filename;
746 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)
748 assert(m_datasource->GetLayerCount()>layer);
750 poLayer = m_datasource->ExecuteSQL(sqlStatement.c_str(), spatialFilter,NULL );
752 OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
754 fields.resize(poFDefn->GetFieldCount());
756 std::cout <<
"resized fields to " << fields.size() << std::endl;
759 OGRFeature *poFeature;
761 std::cout <<
"reset reading" << std::endl;
762 poLayer->ResetReading();
763 unsigned long int ifeature=0;
764 int posOffset=(pos)?2:0;
766 std::cout <<
"going through features" << std::endl << std::flush;
768 while( (poFeature = poLayer->GetNextFeature()) != NULL ){
769 std::vector<T> theFeature;
771 std::cout <<
"reading feature " << ifeature << std::endl << std::flush;
772 OGRGeometry *poGeometry;
773 poGeometry = poFeature->GetGeometryRef();
775 if(poGeometry == NULL)
776 std::cerr <<
"no geometry defined" << std::endl << std::flush;
777 else if(wkbFlatten(poGeometry->getGeometryType()) != wkbPoint)
778 std::cerr <<
"poGeometry type: " << wkbFlatten(poGeometry->getGeometryType()) << std::endl << std::flush;
780 assert(poGeometry != NULL
781 && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint);
782 OGRPoint *poPoint = (OGRPoint *) poGeometry;
784 theFeature.push_back(poPoint->getX());
785 theFeature.push_back(poPoint->getY());
787 OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
788 std::string featurename;
789 for(
int iField=0;iField<poFDefn->GetFieldCount();++iField){
790 OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);
791 std::string fieldname=poFieldDefn->GetNameRef();
793 theClass=poFeature->GetFieldAsInteger(iField);
797 if(fields.size()<poFDefn->GetFieldCount()){
798 if(find(fields.begin(),fields.end(),fieldname)!=fields.end())
799 theFeature.push_back(poFeature->GetFieldAsDouble(iField));
802 fields[iField]=fieldname;
803 theFeature.push_back(poFeature->GetFieldAsDouble(iField));
807 if(fields.size()<poFDefn->GetFieldCount()){
808 if(find(fields.begin(),fields.end(),fieldname)!=fields.end())
809 theFeature.push_back(poFeature->GetFieldAsDouble(iField));
812 fields[iField]=fieldname;
813 theFeature.push_back(poFeature->GetFieldAsDouble(iField));
818 std::string errorstring=
"field type not supported in ImgReaderOgr::ReadData";
825 data[theClass].push_back(theFeature);
829 std::cout <<
"number of features read: " << ifeature << std::endl << std::flush;
830 typename std::map<int,Vector2d<T> >::const_iterator mit=data.begin();
833 std::cout <<
"read classes: " << std::flush;
834 while(mit!=data.end()){
836 std::cout << mit->first <<
" " << std::flush;
840 assert((mit->second)[0].size()==nband+2);
842 assert((mit->second)[0].size()==nband);
846 std::cout << std::endl << std::flush;
850 std::ostringstream ess;
851 ess <<
"no layer in " << m_filename;
856 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)
858 assert(m_datasource->GetLayerCount()>layer);
860 poLayer = m_datasource->ExecuteSQL(sqlStatement.c_str(), spatialFilter,NULL );
862 OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
864 fields.resize(poFDefn->GetFieldCount());
866 std::cout <<
"resized fields to " << fields.size() << std::endl;
869 OGRFeature *poFeature;
871 std::cout <<
"reset reading" << std::endl;
872 poLayer->ResetReading();
873 unsigned long int ifeature=0;
874 int posOffset=(pos)?2:0;
876 std::cout <<
"going through features" << std::endl << std::flush;
877 while( (poFeature = poLayer->GetNextFeature()) != NULL ){
878 std::vector<T> theFeature;
880 std::cout <<
"reading feature " << ifeature << std::endl << std::flush;
881 OGRGeometry *poGeometry;
882 poGeometry = poFeature->GetGeometryRef();
884 if(poGeometry == NULL)
885 std::cerr <<
"no geometry defined" << std::endl << std::flush;
886 else if(wkbFlatten(poGeometry->getGeometryType()) != wkbPoint)
887 std::cerr <<
"poGeometry type: " << wkbFlatten(poGeometry->getGeometryType()) << std::endl << std::flush;
889 assert(poGeometry != NULL
890 && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint);
891 OGRPoint *poPoint = (OGRPoint *) poGeometry;
893 theFeature.push_back(poPoint->getX());
894 theFeature.push_back(poPoint->getY());
896 OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
897 std::string featurename;
898 for(
int iField=0;iField<poFDefn->GetFieldCount();++iField){
899 OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);
900 std::string fieldname=poFieldDefn->GetNameRef();
903 if(fields.size()<poFDefn->GetFieldCount()){
904 if(find(fields.begin(),fields.end(),fieldname)!=fields.end())
905 theFeature.push_back(poFeature->GetFieldAsDouble(iField));
908 fields[iField]=fieldname;
909 theFeature.push_back(poFeature->GetFieldAsDouble(iField));
913 if(fields.size()<poFDefn->GetFieldCount()){
914 if(find(fields.begin(),fields.end(),fieldname)!=fields.end())
915 theFeature.push_back(poFeature->GetFieldAsDouble(iField));
918 fields[iField]=fieldname;
919 theFeature.push_back(poFeature->GetFieldAsDouble(iField));
924 std::string errorstring=
"field type not supported in ImgReaderOgr::ReadData";
930 data.push_back(theFeature);
933 m_datasource->ReleaseResultSet( poLayer );
937 assert(data[0].size()==fields.size()+2);
939 assert(data[0].size()==fields.size());
940 return fields.size();
946 std::ostringstream ess;
947 ess <<
"no layer in " << m_filename;
952 #endif // _IMGREADEROGR_H_