Skip to content

Commit

Permalink
preserve MDAL mesh metadata when editing mesh layers
Browse files Browse the repository at this point in the history
  • Loading branch information
uclaros committed May 8, 2024
1 parent 9e0a676 commit 7ce7d5e
Show file tree
Hide file tree
Showing 6 changed files with 46 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -470,19 +470,23 @@ 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<QString, QString> &metadata = QMap<QString, QString>() ) 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

virtual bool createMeshData(
const QgsMesh &mesh,
const QString &uri,
const QgsCoordinateReferenceSystem &crs ) const;
const QgsCoordinateReferenceSystem &crs,
const QMap<QString, QString> &metadata = QMap<QString, QString>() ) 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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -470,19 +470,23 @@ 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<QString, QString> &metadata = QMap<QString, QString>() ) 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

virtual bool createMeshData(
const QgsMesh &mesh,
const QString &uri,
const QgsCoordinateReferenceSystem &crs ) const;
const QgsCoordinateReferenceSystem &crs,
const QMap<QString, QString> &metadata = QMap<QString, QString>() ) 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
Expand Down
6 changes: 4 additions & 2 deletions src/core/providers/qgsprovidermetadata.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -225,14 +225,16 @@ QgsRasterDataProvider *QgsProviderMetadata::createRasterDataProvider(
bool QgsProviderMetadata::createMeshData( const QgsMesh &,
const QString &,
const QString &,
const QgsCoordinateReferenceSystem & ) const
const QgsCoordinateReferenceSystem &,
const QMap<QString, QString> & ) const
{
return false;
}

bool QgsProviderMetadata::createMeshData( const QgsMesh &,
const QString &,
const QgsCoordinateReferenceSystem & ) const
const QgsCoordinateReferenceSystem &,
const QMap<QString, QString> & ) const
{
return false;
}
Expand Down
8 changes: 6 additions & 2 deletions src/core/providers/qgsprovidermetadata.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<QString, QString> &metadata = QMap<QString, QString>() ) 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<QString, QString> &metadata = QMap<QString, QString>() ) const;

/**
* Returns pyramid resampling methods available for provider
Expand Down
23 changes: 19 additions & 4 deletions src/providers/mdal/qgsmdalprovider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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 );
Expand Down Expand Up @@ -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<QString, QString> &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 )
Expand All @@ -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<QString, QString> &metadata ) const
{
QVariantMap uriComponents = decodeUri( uri );

Expand All @@ -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 )
Expand Down
7 changes: 5 additions & 2 deletions src/providers/mdal/qgsmdalprovider.h
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ class QgsMdalProvider : public QgsMeshDataProvider
QgsCoordinateReferenceSystem mCrs;
QStringList mSubLayersUris;
QString mDriverName;
QMap<QString, QString> mMeshMetadata;

/**
* Closes and reloads dataset
Expand All @@ -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<QString, QString> &metadata = QMap<QString, QString>() ) const override;
bool createMeshData( const QgsMesh &mesh,
const QString &uri,
const QgsCoordinateReferenceSystem &crs ) const override;
const QgsCoordinateReferenceSystem &crs,
const QMap<QString, QString> &metadata = QMap<QString, QString>() ) 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;
Expand Down

0 comments on commit 7ce7d5e

Please sign in to comment.