diff --git a/python/PyQt6/core/auto_generated/providers/qgsprovidermetadata.sip.in b/python/PyQt6/core/auto_generated/providers/qgsprovidermetadata.sip.in index 1ecbe4dbaf5a..ea285dc66a5a 100644 --- a/python/PyQt6/core/auto_generated/providers/qgsprovidermetadata.sip.in +++ b/python/PyQt6/core/auto_generated/providers/qgsprovidermetadata.sip.in @@ -470,9 +470,11 @@ Creates a new instance of the raster data provider. const QgsMesh &mesh, const QString &fileName, const QString &driverName, - const QgsCoordinateReferenceSystem &crs ) const; + const QgsCoordinateReferenceSystem &crs, + const QMap &metadata = QMap() ) const; %Docstring Creates mesh data source from a file name ``fileName`` and a driver ``driverName``, that is the mesh frame stored in file, memory or with other way (depending of the provider) +Since QGIS 3.38 the optional ``metadata`` argument can be used to pass metadata to the provider. .. versionadded:: 3.16 %End @@ -480,9 +482,11 @@ Creates mesh data source from a file name ``fileName`` and a driver ``driverName virtual bool createMeshData( const QgsMesh &mesh, const QString &uri, - const QgsCoordinateReferenceSystem &crs ) const; + const QgsCoordinateReferenceSystem &crs, + const QMap &metadata = QMap() ) const; %Docstring Creates mesh data source from an ``uri``, that is the mesh frame stored in file, memory or with other way (depending of the provider) +Since QGIS 3.38 the optional ``metadata`` argument can be used to pass metadata to the provider. .. versionadded:: 3.22 %End diff --git a/python/core/auto_generated/providers/qgsprovidermetadata.sip.in b/python/core/auto_generated/providers/qgsprovidermetadata.sip.in index 6f3202f6ee40..27d89ec6c783 100644 --- a/python/core/auto_generated/providers/qgsprovidermetadata.sip.in +++ b/python/core/auto_generated/providers/qgsprovidermetadata.sip.in @@ -470,9 +470,11 @@ Creates a new instance of the raster data provider. const QgsMesh &mesh, const QString &fileName, const QString &driverName, - const QgsCoordinateReferenceSystem &crs ) const; + const QgsCoordinateReferenceSystem &crs, + const QMap &metadata = QMap() ) const; %Docstring Creates mesh data source from a file name ``fileName`` and a driver ``driverName``, that is the mesh frame stored in file, memory or with other way (depending of the provider) +Since QGIS 3.38 the optional ``metadata`` argument can be used to pass metadata to the provider. .. versionadded:: 3.16 %End @@ -480,9 +482,11 @@ Creates mesh data source from a file name ``fileName`` and a driver ``driverName virtual bool createMeshData( const QgsMesh &mesh, const QString &uri, - const QgsCoordinateReferenceSystem &crs ) const; + const QgsCoordinateReferenceSystem &crs, + const QMap &metadata = QMap() ) const; %Docstring Creates mesh data source from an ``uri``, that is the mesh frame stored in file, memory or with other way (depending of the provider) +Since QGIS 3.38 the optional ``metadata`` argument can be used to pass metadata to the provider. .. versionadded:: 3.22 %End diff --git a/src/core/providers/qgsprovidermetadata.cpp b/src/core/providers/qgsprovidermetadata.cpp index 5f66830e392c..6e13a65b863b 100644 --- a/src/core/providers/qgsprovidermetadata.cpp +++ b/src/core/providers/qgsprovidermetadata.cpp @@ -225,14 +225,16 @@ QgsRasterDataProvider *QgsProviderMetadata::createRasterDataProvider( bool QgsProviderMetadata::createMeshData( const QgsMesh &, const QString &, const QString &, - const QgsCoordinateReferenceSystem & ) const + const QgsCoordinateReferenceSystem &, + const QMap & ) const { return false; } bool QgsProviderMetadata::createMeshData( const QgsMesh &, const QString &, - const QgsCoordinateReferenceSystem & ) const + const QgsCoordinateReferenceSystem &, + const QMap & ) const { return false; } diff --git a/src/core/providers/qgsprovidermetadata.h b/src/core/providers/qgsprovidermetadata.h index 2ef3d3569cf2..933d551e6c83 100644 --- a/src/core/providers/qgsprovidermetadata.h +++ b/src/core/providers/qgsprovidermetadata.h @@ -531,22 +531,26 @@ class CORE_EXPORT QgsProviderMetadata : public QObject /** * Creates mesh data source from a file name \a fileName and a driver \a driverName, that is the mesh frame stored in file, memory or with other way (depending of the provider) + * Since QGIS 3.38 the optional \a metadata argument can be used to pass metadata to the provider. * \since QGIS 3.16 */ virtual bool createMeshData( const QgsMesh &mesh, const QString &fileName, const QString &driverName, - const QgsCoordinateReferenceSystem &crs ) const; + const QgsCoordinateReferenceSystem &crs, + const QMap &metadata = QMap() ) const; /** * Creates mesh data source from an \a uri, that is the mesh frame stored in file, memory or with other way (depending of the provider) + * Since QGIS 3.38 the optional \a metadata argument can be used to pass metadata to the provider. * \since QGIS 3.22 */ virtual bool createMeshData( const QgsMesh &mesh, const QString &uri, - const QgsCoordinateReferenceSystem &crs ) const; + const QgsCoordinateReferenceSystem &crs, + const QMap &metadata = QMap() ) const; /** * Returns pyramid resampling methods available for provider diff --git a/src/providers/mdal/qgsmdalprovider.cpp b/src/providers/mdal/qgsmdalprovider.cpp index 1cf96b9b9ed9..1aa03bf3d882 100644 --- a/src/providers/mdal/qgsmdalprovider.cpp +++ b/src/providers/mdal/qgsmdalprovider.cpp @@ -464,9 +464,9 @@ bool QgsMdalProvider::saveMeshFrame( const QgsMesh &mesh ) QVariantMap uriComponent = mdalProviderMetaData.decodeUri( dataSourceUri() ); if ( uriComponent.contains( QStringLiteral( "driver" ) ) ) - return mdalProviderMetaData.createMeshData( mesh, dataSourceUri(), crs() ); + return mdalProviderMetaData.createMeshData( mesh, dataSourceUri(), crs(), mMeshMetadata ); else if ( uriComponent.contains( QStringLiteral( "path" ) ) ) - return mdalProviderMetaData.createMeshData( mesh, uriComponent.value( QStringLiteral( "path" ) ).toString(), mDriverName, crs() ); + return mdalProviderMetaData.createMeshData( mesh, uriComponent.value( QStringLiteral( "path" ) ).toString(), mDriverName, crs(), mMeshMetadata ); return false; @@ -494,6 +494,11 @@ void QgsMdalProvider::loadData() if ( !proj.isEmpty() ) mCrs.createFromString( proj ); + for ( int i = 0; i < MDAL_M_metadataCount( mMeshH ); ++i ) + { + mMeshMetadata.insert( MDAL_M_metadataKey( mMeshH, i ), MDAL_M_metadataValue( mMeshH, i ) ); + } + int dsGroupCount = MDAL_M_datasetGroupCount( mMeshH ); for ( int i = 0; i < dsGroupCount; ++i ) addGroupToTemporalCapabilities( i ); @@ -1019,13 +1024,18 @@ static MDAL_MeshH createMDALMesh( const QgsMesh &mesh, const QString &driverName } -bool QgsMdalProviderMetadata::createMeshData( const QgsMesh &mesh, const QString &fileName, const QString &driverName, const QgsCoordinateReferenceSystem &crs ) const +bool QgsMdalProviderMetadata::createMeshData( const QgsMesh &mesh, const QString &fileName, const QString &driverName, const QgsCoordinateReferenceSystem &crs, const QMap &metadata ) const { MDAL_MeshH mdalMesh = createMDALMesh( mesh, driverName, crs ); if ( !mdalMesh ) return false; + for ( auto it = metadata.cbegin(); it != metadata.cend(); ++it ) + { + MDAL_M_setMetadata( mdalMesh, it.key().toStdString().c_str(), it.value().toStdString().c_str() ); + } + MDAL_SaveMesh( mdalMesh, fileName.toStdString().c_str(), driverName.toStdString().c_str() ); if ( MDAL_LastStatus() != MDAL_Status::None ) @@ -1038,7 +1048,7 @@ bool QgsMdalProviderMetadata::createMeshData( const QgsMesh &mesh, const QString return true; } -bool QgsMdalProviderMetadata::createMeshData( const QgsMesh &mesh, const QString &uri, const QgsCoordinateReferenceSystem &crs ) const +bool QgsMdalProviderMetadata::createMeshData( const QgsMesh &mesh, const QString &uri, const QgsCoordinateReferenceSystem &crs, const QMap &metadata ) const { QVariantMap uriComponents = decodeUri( uri ); @@ -1052,6 +1062,11 @@ bool QgsMdalProviderMetadata::createMeshData( const QgsMesh &mesh, const QString if ( !mdalMesh ) return false; + for ( auto it = metadata.cbegin(); it != metadata.cend(); ++it ) + { + MDAL_M_setMetadata( mdalMesh, it.key().toStdString().c_str(), it.value().toStdString().c_str() ); + } + MDAL_SaveMeshWithUri( mdalMesh, uri.toStdString().c_str() ); if ( MDAL_LastStatus() != MDAL_Status::None ) diff --git a/src/providers/mdal/qgsmdalprovider.h b/src/providers/mdal/qgsmdalprovider.h index e2860381fdda..99b675fc7bb5 100644 --- a/src/providers/mdal/qgsmdalprovider.h +++ b/src/providers/mdal/qgsmdalprovider.h @@ -132,6 +132,7 @@ class QgsMdalProvider : public QgsMeshDataProvider QgsCoordinateReferenceSystem mCrs; QStringList mSubLayersUris; QString mDriverName; + QMap mMeshMetadata; /** * Closes and reloads dataset @@ -151,10 +152,12 @@ class QgsMdalProviderMetadata: public QgsProviderMetadata bool createMeshData( const QgsMesh &mesh, const QString &fileName, const QString &driverName, - const QgsCoordinateReferenceSystem &crs ) const override; + const QgsCoordinateReferenceSystem &crs, + const QMap &metadata = QMap() ) const override; bool createMeshData( const QgsMesh &mesh, const QString &uri, - const QgsCoordinateReferenceSystem &crs ) const override; + const QgsCoordinateReferenceSystem &crs, + const QMap &metadata = QMap() ) const override; QVariantMap decodeUri( const QString &uri ) const override; QString encodeUri( const QVariantMap &parts ) const override; QString absoluteToRelativeUri( const QString &uri, const QgsReadWriteContext &context ) const override;