Skip to content

Commit 5ced04e

Browse files
committedFeb 18, 2019
[ogr] Read Geopackage layer identifier and description into QGIS
layer metadata automatically Fixes #21293
1 parent b711ef0 commit 5ced04e

File tree

3 files changed

+44
-0
lines changed

3 files changed

+44
-0
lines changed
 

‎src/providers/ogr/qgsogrprovider.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -525,6 +525,21 @@ QgsOgrProvider::QgsOgrProvider( QString const &uri, const ProviderOptions &optio
525525

526526
bool supportsBoolean = false;
527527

528+
// layer metadata
529+
mLayerMetadata.setType( QStringLiteral( "dataset" ) );
530+
if ( mOgrOrigLayer )
531+
{
532+
QMutex *mutex = nullptr;
533+
OGRLayerH layer = mOgrOrigLayer->getHandleAndMutex( mutex );
534+
QMutexLocker locker( mutex );
535+
const QString identifier = GDALGetMetadataItem( layer, "IDENTIFIER", nullptr );
536+
if ( !identifier.isEmpty() )
537+
mLayerMetadata.setTitle( identifier ); // see geopackage specs -- "'identifier' is analogous to 'title'"
538+
const QString abstract = GDALGetMetadataItem( layer, "DESCRIPTION", nullptr );
539+
if ( !abstract.isEmpty() )
540+
mLayerMetadata.setAbstract( abstract );
541+
}
542+
528543
#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(2,3,0)
529544
if ( mOgrOrigLayer )
530545
{
@@ -855,6 +870,11 @@ QStringList QgsOgrProvider::subLayers() const
855870
return _subLayers( true );
856871
}
857872

873+
QgsLayerMetadata QgsOgrProvider::layerMetadata() const
874+
{
875+
return mLayerMetadata;
876+
}
877+
858878
QStringList QgsOgrProvider::subLayersWithoutFeatureCount() const
859879
{
860880
return _subLayers( false );
@@ -2617,6 +2637,8 @@ void QgsOgrProvider::computeCapabilities()
26172637
}
26182638
}
26192639

2640+
ability |= ReadLayerMetadata;
2641+
26202642
if ( updateModeActivated )
26212643
leaveUpdateMode();
26222644

‎src/providers/ogr/qgsogrprovider.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ class QgsOgrProvider : public QgsVectorDataProvider
100100

101101
QgsCoordinateReferenceSystem crs() const override;
102102
QStringList subLayers() const override;
103+
QgsLayerMetadata layerMetadata() const override;
103104
QStringList subLayersWithoutFeatureCount() const;
104105
QString storageType() const override;
105106
QgsFeatureIterator getFeatures( const QgsFeatureRequest &request ) const override;
@@ -248,6 +249,8 @@ class QgsOgrProvider : public QgsVectorDataProvider
248249
//! Original layer (not a SQL result layer)
249250
QgsOgrLayerUniquePtr mOgrOrigLayer;
250251

252+
QgsLayerMetadata mLayerMetadata;
253+
251254
//! path to filename
252255
QString mFilePath;
253256

‎tests/src/python/test_provider_ogr_gpkg.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1303,6 +1303,25 @@ def test_quote_identifier(self):
13031303
for i in range(1, len(vl.fields())):
13041304
self.assertEqual(vl.uniqueValues(i), {'a', 'b', 'c'})
13051305

1306+
def testGeopackageLayerMetadata(self):
1307+
"""
1308+
Geopackage layer description and identifier should be read into layer metadata automatically
1309+
"""
1310+
tmpfile = os.path.join(self.basetestpath, 'testGeopackageLayerMetadata.gpkg')
1311+
ds = ogr.GetDriverByName('GPKG').CreateDataSource(tmpfile)
1312+
lyr = ds.CreateLayer('layer1', geom_type=ogr.wkbPoint)
1313+
lyr.SetMetadataItem('DESCRIPTION', "my desc")
1314+
lyr.SetMetadataItem('IDENTIFIER', "my title") # see geopackage specs -- "'identifier' is analogous to 'title'"
1315+
lyr.CreateField(ogr.FieldDefn('attr', ogr.OFTInteger))
1316+
f = ogr.Feature(lyr.GetLayerDefn())
1317+
f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(0 0)'))
1318+
lyr.CreateFeature(f)
1319+
f = None
1320+
vl1 = QgsVectorLayer(u'{}'.format(tmpfile) + "|layername=" + "layer1", 'test', u'ogr')
1321+
self.assertTrue(vl1.isValid())
1322+
self.assertEqual(vl1.metadata().title(), 'my title')
1323+
self.assertEqual(vl1.metadata().abstract(), 'my desc')
1324+
13061325

13071326
if __name__ == '__main__':
13081327
unittest.main()

0 commit comments

Comments
 (0)
Please sign in to comment.