@@ -544,32 +544,33 @@ QStringList QgsOgrProvider::subLayers() const
544
544
QMap<OGRwkbGeometryType, int > fCount ;
545
545
// TODO: avoid reading attributes, setRelevantFields cannot be called here because it is not constant
546
546
// setRelevantFields( true, QgsAttributeList() );
547
- OGR_L_ResetReading ( ogrLayer );
547
+ OGR_L_ResetReading ( layer );
548
548
OGRFeatureH fet;
549
- while (( fet = OGR_L_GetNextFeature ( ogrLayer ) ) )
549
+ while (( fet = OGR_L_GetNextFeature ( layer ) ) )
550
550
{
551
551
if ( !fet ) continue ;
552
552
OGRGeometryH geom = OGR_F_GetGeometryRef ( fet );
553
553
if ( geom )
554
554
{
555
- OGRwkbGeometryType gType = wkbFlatten ( OGR_G_GetGeometryType ( geom ) );
555
+ OGRwkbGeometryType gType = ogrWkbSingleFlatten ( OGR_G_GetGeometryType ( geom ) );
556
556
fCount [gType ] = fCount .value ( gType ) + 1 ;
557
557
}
558
558
OGR_F_Destroy ( fet );
559
559
}
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 )
563
564
{
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 );
567
570
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;
573
574
}
574
575
}
575
576
}
@@ -2308,6 +2309,18 @@ void QgsOgrProvider::recalculateFeatureCount()
2308
2309
}
2309
2310
}
2310
2311
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
+
2311
2324
// ---------------------------------------------------------------------------
2312
2325
2313
2326
QGISEXTERN QgsVectorLayerImport::ImportError createEmptyLayer (
@@ -2325,3 +2338,4 @@ QGISEXTERN QgsVectorLayerImport::ImportError createEmptyLayer(
2325
2338
oldToNewAttrIdxMap, errorMessage, options
2326
2339
);
2327
2340
}
2341
+
0 commit comments