Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

preserve MDAL mesh metadata when editing mesh layers #57378

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading