diff --git a/src/core/qgsvectordataprovider.cpp b/src/core/qgsvectordataprovider.cpp index 4c955ea94e3..cc076d01a2b 100644 --- a/src/core/qgsvectordataprovider.cpp +++ b/src/core/qgsvectordataprovider.cpp @@ -28,7 +28,7 @@ QgsVectorDataProvider::QgsVectorDataProvider( QString uri ) : QgsDataProvider( uri ), mCacheMinMaxDirty( TRUE ), - mFetchFeaturesWithoutGeom( FALSE ) + mFetchFeaturesWithoutGeom( TRUE ) { QSettings settings; setEncoding( settings.value( "/UI/encoding", QString( "System" ) ).toString() ); diff --git a/src/providers/ogr/qgsogrprovider.cpp b/src/providers/ogr/qgsogrprovider.cpp index ff2520f2e2a..6619813db83 100644 --- a/src/providers/ogr/qgsogrprovider.cpp +++ b/src/providers/ogr/qgsogrprovider.cpp @@ -318,11 +318,19 @@ bool QgsOgrProvider::featureAtId( int featureId, return false; feature.setFeatureId( OGR_F_GetFID( fet ) ); + // skip features without geometry + if ( OGR_F_GetGeometryRef( fet ) == NULL && !mFetchFeaturesWithoutGeom ) + { + OGR_F_Destroy( fet ); + return false; + } + /* fetch geometry */ if ( fetchGeometry ) { OGRGeometryH geom = OGR_F_GetGeometryRef( fet ); + // skip features without geometry // get the wkb representation unsigned char *wkb = new unsigned char[OGR_G_WkbSize( geom )]; @@ -337,8 +345,15 @@ bool QgsOgrProvider::featureAtId( int featureId, getFeatureAttribute( fet, feature, *it ); } + if ( OGR_F_GetGeometryRef( fet ) != NULL ) + { + feature.setValid( true ); + } + else + { + feature.setValid( false ); + } OGR_F_Destroy( fet ); - feature.setValid( true ); return true; } @@ -414,8 +429,15 @@ bool QgsOgrProvider::nextFeature( QgsFeature& feature ) if ( fet ) { + if ( OGR_F_GetGeometryRef( fet ) != NULL ) + { + feature.setValid( true ); + } + else + { + feature.setValid( false ); + } OGR_F_Destroy( fet ); - feature.setValid( true ); return true; } else