Skip to content

Commit

Permalink
Merge pull request #58285 from nyalldawson/metadata_cleanup
Browse files Browse the repository at this point in the history
Layer metadata report cleanup, add vertical CRS information
  • Loading branch information
alexbruy authored Aug 6, 2024
2 parents aa2c2c9 + b143d73 commit ad8c0aa
Show file tree
Hide file tree
Showing 9 changed files with 117 additions and 69 deletions.
2 changes: 2 additions & 0 deletions src/core/mesh/qgsmeshlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2084,6 +2084,8 @@ QString QgsMeshLayer::htmlMetadata() const
myMetadata += htmlFormatter.historySectionHtml( );
myMetadata += QLatin1String( "<br><br>\n" );

myMetadata += customPropertyHtmlMetadata();

myMetadata += QLatin1String( "\n</body>\n</html>\n" );
return myMetadata;
}
Expand Down
3 changes: 3 additions & 0 deletions src/core/metadata/qgslayermetadataformatter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,9 @@ QString QgsLayerMetadataFormatter::extentSectionHtml( const bool showSpatialExte
const QList< QgsLayerMetadata::SpatialExtent > spatialExtents = extent.spatialExtents();
for ( const QgsLayerMetadata::SpatialExtent &spatialExtent : spatialExtents )
{
if ( spatialExtent.bounds.isNull() || spatialExtent.bounds.toRectangle().isNull() )
continue;

if ( notFirstRow )
{
myMetadata += QLatin1String( "<br />\n" );
Expand Down
2 changes: 2 additions & 0 deletions src/core/pointcloud/qgspointcloudlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -728,6 +728,8 @@ QString QgsPointCloudLayer::htmlMetadata() const
myMetadata += htmlFormatter.historySectionHtml( );
myMetadata += QLatin1String( "<br><br>\n" );

myMetadata += customPropertyHtmlMetadata();

myMetadata += QLatin1String( "\n</body>\n</html>\n" );
return myMetadata;
}
Expand Down
159 changes: 92 additions & 67 deletions src/core/qgsmaplayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3269,10 +3269,16 @@ QString QgsMapLayer::generalHtmlMetadata() const

metadata += QLatin1String( "</table>\n<br><br>" );

return metadata;
}

QString QgsMapLayer::customPropertyHtmlMetadata() const
{
QString metadata;
// custom properties
if ( const auto keys = customPropertyKeys(); !keys.isEmpty() )
{
metadata += QStringLiteral( "<h1>" ) + tr( "Custom Properties" ) + QStringLiteral( "</h1>\n<hr>\n" );
metadata += QStringLiteral( "<h1>" ) + tr( "Custom properties" ) + QStringLiteral( "</h1>\n<hr>\n" );
metadata += QLatin1String( "<table class=\"list-view\">\n<tbody>" );
for ( const QString &key : keys )
{
Expand Down Expand Up @@ -3303,99 +3309,118 @@ QString QgsMapLayer::generalHtmlMetadata() const
metadata += QLatin1String( "</tbody></table>\n" );
metadata += QLatin1String( "<br><br>\n" );
}

return metadata;
}

QString QgsMapLayer::crsHtmlMetadata() const
{
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
QString metadata;

QString metadata = QStringLiteral( "<h1>" ) + tr( "Coordinate Reference System (CRS)" ) + QStringLiteral( "</h1>\n<hr>\n" );
metadata += QLatin1String( "<table class=\"list-view\">\n" );

// Identifier
const QgsCoordinateReferenceSystem c = crs();
if ( !c.isValid() )
metadata += QStringLiteral( "<tr><td colspan=\"2\" class=\"highlight\">" ) + tr( "Unknown" ) + QStringLiteral( "</td></tr>\n" );
else
auto addCrsInfo = [&metadata]( const QgsCoordinateReferenceSystem & c, bool includeType, bool includeOperation, bool includeCelestialBody )
{
metadata += QStringLiteral( "<tr><td class=\"highlight\">" ) + tr( "Name" ) + QStringLiteral( "</td><td>" ) + c.userFriendlyIdentifier( Qgis::CrsIdentifierType::FullString ) + QStringLiteral( "</td></tr>\n" );

// map units
metadata += QStringLiteral( "<tr><td class=\"highlight\">" ) + tr( "Units" ) + QStringLiteral( "</td><td>" )
+ ( c.isGeographic() ? tr( "Geographic (uses latitude and longitude for coordinates)" ) : QgsUnitTypes::toString( c.mapUnits() ) )
+ QStringLiteral( "</td></tr>\n" );
if ( !c.isValid() )
metadata += QStringLiteral( "<tr><td colspan=\"2\" class=\"highlight\">" ) + tr( "Unknown" ) + QStringLiteral( "</td></tr>\n" );
else
{
metadata += QStringLiteral( "<tr><td class=\"highlight\">" ) + tr( "Name" ) + QStringLiteral( "</td><td>" ) + c.userFriendlyIdentifier( Qgis::CrsIdentifierType::FullString ) + QStringLiteral( "</td></tr>\n" );

metadata += QStringLiteral( "<tr><td class=\"highlight\">" ) + tr( "Type" ) + QStringLiteral( "</td><td>" ) + QgsCoordinateReferenceSystemUtils::crsTypeToString( c.type() ) + QStringLiteral( "</td></tr>\n" );
// map units
metadata += QStringLiteral( "<tr><td class=\"highlight\">" ) + tr( "Units" ) + QStringLiteral( "</td><td>" )
+ ( c.isGeographic() ? tr( "Geographic (uses latitude and longitude for coordinates)" ) : QgsUnitTypes::toString( c.mapUnits() ) )
+ QStringLiteral( "</td></tr>\n" );

// operation
const QgsProjOperation operation = c.operation();
metadata += QStringLiteral( "<tr><td class=\"highlight\">" ) + tr( "Method" ) + QStringLiteral( "</td><td>" ) + operation.description() + QStringLiteral( "</td></tr>\n" );
if ( includeType )
{
metadata += QStringLiteral( "<tr><td class=\"highlight\">" ) + tr( "Type" ) + QStringLiteral( "</td><td>" ) + QgsCoordinateReferenceSystemUtils::crsTypeToString( c.type() ) + QStringLiteral( "</td></tr>\n" );
}

// celestial body
try
{
const QString celestialBody = c.celestialBodyName();
if ( !celestialBody.isEmpty() )
if ( includeOperation )
{
metadata += QStringLiteral( "<tr><td class=\"highlight\">" ) + tr( "Celestial Body" ) + QStringLiteral( "</td><td>" ) + celestialBody + QStringLiteral( "</td></tr>\n" );
// operation
const QgsProjOperation operation = c.operation();
metadata += QStringLiteral( "<tr><td class=\"highlight\">" ) + tr( "Method" ) + QStringLiteral( "</td><td>" ) + operation.description() + QStringLiteral( "</td></tr>\n" );
}
}
catch ( QgsNotSupportedException & )
{

}
if ( includeCelestialBody )
{
// celestial body
try
{
const QString celestialBody = c.celestialBodyName();
if ( !celestialBody.isEmpty() )
{
metadata += QStringLiteral( "<tr><td class=\"highlight\">" ) + tr( "Celestial Body" ) + QStringLiteral( "</td><td>" ) + celestialBody + QStringLiteral( "</td></tr>\n" );
}
}
catch ( QgsNotSupportedException & )
{

QString accuracyString;
// dynamic crs with no epoch?
if ( c.isDynamic() && std::isnan( c.coordinateEpoch() ) )
{
accuracyString = tr( "Based on a dynamic CRS, but no coordinate epoch is set. Coordinates are ambiguous and of limited accuracy." );
}
}
}

// based on datum ensemble?
try
{
const QgsDatumEnsemble ensemble = c.datumEnsemble();
if ( ensemble.isValid() )
QString accuracyString;
// dynamic crs with no epoch?
if ( c.isDynamic() && std::isnan( c.coordinateEpoch() ) )
{
QString id;
if ( !ensemble.code().isEmpty() )
id = QStringLiteral( "<i>%1</i> (%2:%3)" ).arg( ensemble.name(), ensemble.authority(), ensemble.code() );
else
id = QStringLiteral( "<i>%</i>”" ).arg( ensemble.name() );
accuracyString = tr( "Based on a dynamic CRS, but no coordinate epoch is set. Coordinates are ambiguous and of limited accuracy." );
}

if ( ensemble.accuracy() > 0 )
{
accuracyString = tr( "Based on %1, which has a limited accuracy of <b>at best %2 meters</b>." ).arg( id ).arg( ensemble.accuracy() );
}
else
// based on datum ensemble?
try
{
const QgsDatumEnsemble ensemble = c.datumEnsemble();
if ( ensemble.isValid() )
{
accuracyString = tr( "Based on %1, which has a limited accuracy." ).arg( id );
QString id;
if ( !ensemble.code().isEmpty() )
id = QStringLiteral( "<i>%1</i> (%2:%3)" ).arg( ensemble.name(), ensemble.authority(), ensemble.code() );
else
id = QStringLiteral( "<i>%</i>”" ).arg( ensemble.name() );

if ( ensemble.accuracy() > 0 )
{
accuracyString = tr( "Based on %1, which has a limited accuracy of <b>at best %2 meters</b>." ).arg( id ).arg( ensemble.accuracy() );
}
else
{
accuracyString = tr( "Based on %1, which has a limited accuracy." ).arg( id );
}
}
}
}
catch ( QgsNotSupportedException & )
{
catch ( QgsNotSupportedException & )
{

}
}

if ( !accuracyString.isEmpty() )
{
metadata += QStringLiteral( "<tr><td class=\"highlight\">" ) + tr( "Accuracy" ) + QStringLiteral( "</td><td>" ) + accuracyString + QStringLiteral( "</td></tr>\n" );
}
if ( !accuracyString.isEmpty() )
{
metadata += QStringLiteral( "<tr><td class=\"highlight\">" ) + tr( "Accuracy" ) + QStringLiteral( "</td><td>" ) + accuracyString + QStringLiteral( "</td></tr>\n" );
}

// static/dynamic
metadata += QStringLiteral( "<tr><td class=\"highlight\">" ) + tr( "Reference" ) + QStringLiteral( "</td><td>%1</td></tr>\n" ).arg( c.isDynamic() ? tr( "Dynamic (relies on a datum which is not plate-fixed)" ) : tr( "Static (relies on a datum which is plate-fixed)" ) );
// static/dynamic
metadata += QStringLiteral( "<tr><td class=\"highlight\">" ) + tr( "Reference" ) + QStringLiteral( "</td><td>%1</td></tr>\n" ).arg( c.isDynamic() ? tr( "Dynamic (relies on a datum which is not plate-fixed)" ) : tr( "Static (relies on a datum which is plate-fixed)" ) );

// coordinate epoch
if ( !std::isnan( c.coordinateEpoch() ) )
{
metadata += QStringLiteral( "<tr><td class=\"highlight\">" ) + tr( "Coordinate Epoch" ) + QStringLiteral( "</td><td>%1</td></tr>\n" ).arg( qgsDoubleToString( c.coordinateEpoch(), 3 ) );
// coordinate epoch
if ( !std::isnan( c.coordinateEpoch() ) )
{
metadata += QStringLiteral( "<tr><td class=\"highlight\">" ) + tr( "Coordinate Epoch" ) + QStringLiteral( "</td><td>%1</td></tr>\n" ).arg( qgsDoubleToString( c.coordinateEpoch(), 3 ) );
}
}
}
};

metadata += QStringLiteral( "<h1>" ) + tr( "Coordinate Reference System (CRS)" ) + QStringLiteral( "</h1>\n<hr>\n" );
metadata += QLatin1String( "<table class=\"list-view\">\n" );
addCrsInfo( crs(), true, true, true );
metadata += QLatin1String( "</table>\n<br><br>\n" );

if ( verticalCrs().isValid() )
{
metadata += QStringLiteral( "<h1>" ) + tr( "Vertical Coordinate Reference System (CRS)" ) + QStringLiteral( "</h1>\n<hr>\n" );
metadata += QLatin1String( "<table class=\"list-view\">\n" );
addCrsInfo( verticalCrs(), false, false, false );
metadata += QLatin1String( "</table>\n<br><br>\n" );
}

return metadata;
}
12 changes: 11 additions & 1 deletion src/core/qgsmaplayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -2333,14 +2333,24 @@ class CORE_EXPORT QgsMapLayer : public QObject
#ifndef SIP_RUN

/**
* Returns an HTML fragment containing general metadata information, for use
* Returns an HTML fragment containing general metadata information, for use
* in the htmlMetadata() method.
*
* \note Not available in Python bindings.
*
* \since QGIS 3.22
*/
QString generalHtmlMetadata() const;

/**
* Returns an HTML fragment containing custom property information, for use
* in the htmlMetadata() method.
*
* \note Not available in Python bindings.
*
* \since QGIS 3.40
*/
QString customPropertyHtmlMetadata() const;
#endif

#ifndef SIP_RUN
Expand Down
2 changes: 1 addition & 1 deletion src/core/raster/qgsrasterlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -562,7 +562,7 @@ QString QgsRasterLayer::htmlMetadata() const
QStringLiteral( "<h1>" ) % tr( "History" ) % QStringLiteral( "</h1>\n<hr>\n" ) %
htmlFormatter.historySectionHtml( ) %
QStringLiteral( "<br><br>\n" ) %

customPropertyHtmlMetadata() %
QStringLiteral( "\n</body>\n</html>\n" );
return myMetadata;
}
Expand Down
2 changes: 2 additions & 0 deletions src/core/tiledscene/qgstiledscenelayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -512,6 +512,8 @@ QString QgsTiledSceneLayer::htmlMetadata() const
myMetadata += htmlFormatter.historySectionHtml( );
myMetadata += QLatin1String( "<br><br>\n" );

myMetadata += customPropertyHtmlMetadata();

myMetadata += QLatin1String( "\n</body>\n</html>\n" );
return myMetadata;
}
Expand Down
2 changes: 2 additions & 0 deletions src/core/vector/qgsvectorlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5914,6 +5914,8 @@ QString QgsVectorLayer::htmlMetadata() const
myMetadata += htmlFormatter.historySectionHtml( );
myMetadata += QLatin1String( "<br><br>\n" );

myMetadata += customPropertyHtmlMetadata();

myMetadata += QLatin1String( "\n</body>\n</html>\n" );
return myMetadata;
}
Expand Down
2 changes: 2 additions & 0 deletions src/core/vectortile/qgsvectortilelayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -572,6 +572,8 @@ QString QgsVectorTileLayer::htmlMetadata() const
htmlFormatter.historySectionHtml( ) %
QStringLiteral( "<br>\n" ) %

customPropertyHtmlMetadata() %

QStringLiteral( "\n</body>\n</html>\n" );

return info;
Expand Down

0 comments on commit ad8c0aa

Please sign in to comment.