@@ -371,7 +371,10 @@ void QgsOgrLayerItem::deleteLayer()
371
371
372
372
// -------
373
373
374
- static QgsOgrLayerItem *dataItemForLayer ( QgsDataItem *parentItem, QString name, QString path, GDALDatasetH hDataSource, int layerId, bool isSubLayer = false )
374
+ static QgsOgrLayerItem *dataItemForLayer ( QgsDataItem *parentItem, QString name,
375
+ QString path, GDALDatasetH hDataSource,
376
+ int layerId,
377
+ bool isSubLayer, bool uniqueNames )
375
378
{
376
379
OGRLayerH hLayer = GDALDatasetGetLayer ( hDataSource, layerId );
377
380
OGRFeatureDefnH hDef = OGR_L_GetLayerDefn ( hLayer );
@@ -401,16 +404,22 @@ static QgsOgrLayerItem *dataItemForLayer( QgsDataItem *parentItem, QString name,
401
404
402
405
QString layerUri = path;
403
406
404
- if ( name. isEmpty () )
407
+ if ( isSubLayer )
405
408
{
406
409
// we are in a collection
407
410
name = QString::fromUtf8 ( OGR_FD_GetName ( hDef ) );
408
411
QgsDebugMsg ( " OGR layer name : " + name );
409
-
410
- layerUri += " |layerid=" + QString::number ( layerId );
411
-
412
+ if ( !uniqueNames )
413
+ {
414
+ layerUri += " |layerid=" + QString::number ( layerId );
415
+ }
416
+ else
417
+ {
418
+ layerUri += " |layername=" + name;
419
+ }
412
420
path += ' /' + name;
413
421
}
422
+ Q_ASSERT ( !name.isEmpty () );
414
423
415
424
QgsDebugMsgLevel ( " OGR layer uri : " + layerUri, 2 );
416
425
@@ -433,10 +442,26 @@ QVector<QgsDataItem *> QgsOgrDataCollectionItem::createChildren()
433
442
return children;
434
443
int numLayers = GDALDatasetGetLayerCount ( hDataSource.get () );
435
444
445
+ // Check if layer names are unique, so we can use |layername= in URI
446
+ QMap< QString, int > mapLayerNameToCount;
447
+ bool uniqueNames = true ;
448
+ for ( int i = 0 ; i < numLayers; ++i )
449
+ {
450
+ OGRLayerH hLayer = GDALDatasetGetLayer ( hDataSource.get (), i );
451
+ OGRFeatureDefnH hDef = OGR_L_GetLayerDefn ( hLayer );
452
+ QString layerName = QString::fromUtf8 ( OGR_FD_GetName ( hDef ) );
453
+ ++mapLayerNameToCount[layerName];
454
+ if ( mapLayerNameToCount[layerName] > 1 )
455
+ {
456
+ uniqueNames = false ;
457
+ break ;
458
+ }
459
+ }
460
+
436
461
children.reserve ( numLayers );
437
462
for ( int i = 0 ; i < numLayers; ++i )
438
463
{
439
- QgsOgrLayerItem *item = dataItemForLayer ( this , QString (), mPath , hDataSource.get (), i, true );
464
+ QgsOgrLayerItem *item = dataItemForLayer ( this , QString (), mPath , hDataSource.get (), i, true , uniqueNames );
440
465
children.append ( item );
441
466
}
442
467
@@ -477,13 +502,10 @@ bool QgsOgrDataCollectionItem::createConnection( const QString &name, const QStr
477
502
478
503
// ---------------------------------------------------------------------------
479
504
480
- QGISEXTERN int dataCapabilities ()
481
- {
482
- return QgsDataProvider::File | QgsDataProvider::Dir;
483
- }
484
505
485
- QGISEXTERN QgsDataItem *dataItem ( QString path , QgsDataItem *parentItem )
506
+ QgsDataItem *QgsOgrDataItemProvider::createDataItem ( const QString &pathIn , QgsDataItem *parentItem )
486
507
{
508
+ QString path ( pathIn );
487
509
if ( path.isEmpty () )
488
510
return nullptr ;
489
511
@@ -607,7 +629,7 @@ QGISEXTERN QgsDataItem *dataItem( QString path, QgsDataItem *parentItem )
607
629
// class
608
630
// TODO: add more OGR supported multiple layers formats here!
609
631
QStringList ogrSupportedDbLayersExtensions;
610
- ogrSupportedDbLayersExtensions << QStringLiteral ( " gpkg" ) << QStringLiteral ( " sqlite" ) << QStringLiteral ( " db" ) << QStringLiteral ( " gdb" );
632
+ ogrSupportedDbLayersExtensions << QStringLiteral ( " gpkg" ) << QStringLiteral ( " sqlite" ) << QStringLiteral ( " db" ) << QStringLiteral ( " gdb" ) << QStringLiteral ( " kml " ) ;
611
633
QStringList ogrSupportedDbDriverNames;
612
634
ogrSupportedDbDriverNames << QStringLiteral ( " GPKG" ) << QStringLiteral ( " db" ) << QStringLiteral ( " gdb" );
613
635
@@ -688,12 +710,12 @@ QGISEXTERN QgsDataItem *dataItem( QString path, QgsDataItem *parentItem )
688
710
}
689
711
else
690
712
{
691
- item = dataItemForLayer ( parentItem, name, path, hDS.get (), 0 );
713
+ item = dataItemForLayer ( parentItem, name, path, hDS.get (), 0 , false , true );
692
714
}
693
715
return item;
694
716
}
695
717
696
- QGISEXTERN bool handlesDirectoryPath ( const QString &path )
718
+ bool QgsOgrDataItemProvider:: handlesDirectoryPath ( const QString &path )
697
719
{
698
720
QFileInfo info ( path );
699
721
QString suffix = info.suffix ().toLower ();
0 commit comments