Skip to content

Commit c8ff386

Browse files
committed
ogr virtual layers mix single and multi types in sublayers, fixed feature count, fixes #8001
1 parent bdb2a4f commit c8ff386

File tree

3 files changed

+34
-16
lines changed

3 files changed

+34
-16
lines changed

src/providers/ogr/qgsogrfeatureiterator.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ bool QgsOgrFeatureIterator::readFeature( OGRFeatureH fet, QgsFeature& feature )
218218
feature.setGeometryAndOwnership( wkb, OGR_G_WkbSize( geom ) );
219219
}
220220
if (( useIntersect && ( !feature.geometry() || !feature.geometry()->intersects( mRequest.filterRect() ) ) )
221-
|| ( geometryTypeFilter && ( !feature.geometry() || wkbFlatten(( OGRwkbGeometryType )feature.geometry()->wkbType() ) != wkbFlatten( P->mOgrGeometryTypeFilter ) ) ) )
221+
|| ( geometryTypeFilter && ( !feature.geometry() || QgsOgrProvider::ogrWkbSingleFlatten(( OGRwkbGeometryType )feature.geometry()->wkbType() ) != P->mOgrGeometryTypeFilter ) ) )
222222
{
223223
OGR_F_Destroy( fet );
224224
return false;

src/providers/ogr/qgsogrprovider.cpp

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -544,32 +544,33 @@ QStringList QgsOgrProvider::subLayers() const
544544
QMap<OGRwkbGeometryType, int> fCount;
545545
// TODO: avoid reading attributes, setRelevantFields cannot be called here because it is not constant
546546
//setRelevantFields( true, QgsAttributeList() );
547-
OGR_L_ResetReading( ogrLayer );
547+
OGR_L_ResetReading( layer );
548548
OGRFeatureH fet;
549-
while (( fet = OGR_L_GetNextFeature( ogrLayer ) ) )
549+
while (( fet = OGR_L_GetNextFeature( layer ) ) )
550550
{
551551
if ( !fet ) continue;
552552
OGRGeometryH geom = OGR_F_GetGeometryRef( fet );
553553
if ( geom )
554554
{
555-
OGRwkbGeometryType gType = wkbFlatten( OGR_G_GetGeometryType( geom ) );
555+
OGRwkbGeometryType gType = ogrWkbSingleFlatten( OGR_G_GetGeometryType( geom ) );
556556
fCount[gType] = fCount.value( gType ) + 1;
557557
}
558558
OGR_F_Destroy( fet );
559559
}
560-
OGR_L_ResetReading( ogrLayer );
561-
int i = 0;
562-
if ( fCount.size() > 1 )
560+
OGR_L_ResetReading( layer );
561+
// it may happen that there are no features in the layer, in that case add unknown type
562+
// to show to user that the layer exists but it is empty
563+
if ( fCount.size() == 0 )
563564
{
564-
foreach ( OGRwkbGeometryType gType, fCount.keys() )
565-
{
566-
QString geom = ogrWkbGeometryTypeName( gType );
565+
fCount[wkbUnknown] = 0;
566+
}
567+
foreach ( OGRwkbGeometryType gType, fCount.keys() )
568+
{
569+
QString geom = ogrWkbGeometryTypeName( gType );
567570

568-
QString sl = QString( "%1:%2:%3:%4" ).arg( i ).arg( theLayerName ).arg( fCount.value( gType ) ).arg( geom );
569-
QgsDebugMsg( "sub layer: " + sl );
570-
mSubLayerList << sl;
571-
i++;
572-
}
571+
QString sl = QString( "%1:%2:%3:%4" ).arg( i ).arg( theLayerName ).arg( fCount.value( gType ) ).arg( geom );
572+
QgsDebugMsg( "sub layer: " + sl );
573+
mSubLayerList << sl;
573574
}
574575
}
575576
}
@@ -2308,6 +2309,18 @@ void QgsOgrProvider::recalculateFeatureCount()
23082309
}
23092310
}
23102311

2312+
OGRwkbGeometryType QgsOgrProvider::ogrWkbSingleFlatten( OGRwkbGeometryType type )
2313+
{
2314+
type = wkbFlatten( type );
2315+
switch ( type )
2316+
{
2317+
case wkbMultiPoint: return wkbPoint;
2318+
case wkbMultiLineString: return wkbLineString;
2319+
case wkbMultiPolygon: return wkbPolygon;
2320+
default: return type;
2321+
}
2322+
}
2323+
23112324
// ---------------------------------------------------------------------------
23122325

23132326
QGISEXTERN QgsVectorLayerImport::ImportError createEmptyLayer(
@@ -2325,3 +2338,4 @@ QGISEXTERN QgsVectorLayerImport::ImportError createEmptyLayer(
23252338
oldToNewAttrIdxMap, errorMessage, options
23262339
);
23272340
}
2341+

src/providers/ogr/qgsogrprovider.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,9 @@ class QgsOgrProvider : public QgsVectorDataProvider
247247
/** return OGR geometry type */
248248
static int getOgrGeomType( OGRLayerH ogrLayer );
249249

250+
/** Get single flatten geometry type */
251+
static OGRwkbGeometryType ogrWkbSingleFlatten( OGRwkbGeometryType type );
252+
250253
protected:
251254
/** loads fields from input file to member attributeFields */
252255
void loadFields();
@@ -284,7 +287,8 @@ class QgsOgrProvider : public QgsVectorDataProvider
284287
int mLayerIndex;
285288

286289
/** Optional geometry type for layers with multiple geometries,
287-
* otherwise wkbUnknown */
290+
* otherwise wkbUnknown. This type is always flatten (2D) and single, it means
291+
* that 2D, 25D, single and multi types are mixed in one sublayer */
288292
OGRwkbGeometryType mOgrGeometryTypeFilter;
289293

290294
//! current spatial filter

0 commit comments

Comments
 (0)