Skip to content

Commit

Permalink
Show more details about layer CRSes in the layer properties information
Browse files Browse the repository at this point in the history
screen
  • Loading branch information
nyalldawson committed May 11, 2021
1 parent 5a785e6 commit 21edff4
Show file tree
Hide file tree
Showing 8 changed files with 132 additions and 62 deletions.
1 change: 1 addition & 0 deletions python/core/auto_generated/qgsmaplayer.sip.in
Expand Up @@ -1881,6 +1881,7 @@ this method is now deprecated and always return ``False``, because circular depe




};

QFlags<QgsMapLayer::LayerFlag> operator|(QgsMapLayer::LayerFlag f1, QFlags<QgsMapLayer::LayerFlag> f2);
Expand Down
18 changes: 3 additions & 15 deletions src/core/mesh/qgsmeshlayer.cpp
Expand Up @@ -1331,24 +1331,9 @@ QString QgsMeshLayer::htmlMetadata() const
if ( publicSource() != path )
myMetadata += QStringLiteral( "<tr><td class=\"highlight\">" ) + tr( "Source" ) + QStringLiteral( "</td><td>%1" ).arg( publicSource() ) + QStringLiteral( "</td></tr>\n" );

// EPSG
myMetadata += QStringLiteral( "<tr><td class=\"highlight\">" ) + tr( "CRS" ) + QStringLiteral( "</td><td>" );
if ( crs().isValid() )
{
myMetadata += crs().userFriendlyIdentifier( QgsCoordinateReferenceSystem::FullString ) + QStringLiteral( " - " );
if ( crs().isGeographic() )
myMetadata += tr( "Geographic" );
else
myMetadata += tr( "Projected" );
}
myMetadata += QLatin1String( "</td></tr>\n" );

// Extent
myMetadata += QStringLiteral( "<tr><td class=\"highlight\">" ) + tr( "Extent" ) + QStringLiteral( "</td><td>" ) + extent().toString() + QStringLiteral( "</td></tr>\n" );

// unit
myMetadata += QStringLiteral( "<tr><td class=\"highlight\">" ) + tr( "Unit" ) + QStringLiteral( "</td><td>" ) + QgsUnitTypes::toString( crs().mapUnits() ) + QStringLiteral( "</td></tr>\n" );

// feature count
QLocale locale = QLocale();
locale.setNumberOptions( locale.numberOptions() &= ~QLocale::NumberOption::OmitGroupSeparator );
Expand Down Expand Up @@ -1376,6 +1361,9 @@ QString QgsMeshLayer::htmlMetadata() const
// End Provider section
myMetadata += QLatin1String( "</table>\n<br><br>" );

// CRS
myMetadata += crsHtmlMetadata();

// identification section
myMetadata += QStringLiteral( "<h1>" ) + tr( "Identification" ) + QStringLiteral( "</h1>\n<hr>\n" );
myMetadata += htmlFormatter.identificationSectionHtml( );
Expand Down
21 changes: 6 additions & 15 deletions src/core/pointcloud/qgspointcloudlayer.cpp
Expand Up @@ -453,24 +453,9 @@ QString QgsPointCloudLayer::htmlMetadata() const
if ( publicSource() != path )
myMetadata += QStringLiteral( "<tr><td class=\"highlight\">" ) + tr( "Source" ) + QStringLiteral( "</td><td>%1" ).arg( publicSource() ) + QStringLiteral( "</td></tr>\n" );

// EPSG
myMetadata += QStringLiteral( "<tr><td class=\"highlight\">" ) + tr( "CRS" ) + QStringLiteral( "</td><td>" );
if ( crs().isValid() )
{
myMetadata += crs().userFriendlyIdentifier( QgsCoordinateReferenceSystem::FullString ) + QStringLiteral( " - " );
if ( crs().isGeographic() )
myMetadata += tr( "Geographic" );
else
myMetadata += tr( "Projected" );
}
myMetadata += QLatin1String( "</td></tr>\n" );

// Extent
myMetadata += QStringLiteral( "<tr><td class=\"highlight\">" ) + tr( "Extent" ) + QStringLiteral( "</td><td>" ) + extent().toString() + QStringLiteral( "</td></tr>\n" );

// unit
myMetadata += QStringLiteral( "<tr><td class=\"highlight\">" ) + tr( "Unit" ) + QStringLiteral( "</td><td>" ) + QgsUnitTypes::toString( crs().mapUnits() ) + QStringLiteral( "</td></tr>\n" );

// feature count
QLocale locale = QLocale();
locale.setNumberOptions( locale.numberOptions() &= ~QLocale::NumberOption::OmitGroupSeparator );
Expand All @@ -479,7 +464,13 @@ QString QgsPointCloudLayer::htmlMetadata() const
+ tr( "Point count" ) + QStringLiteral( "</td><td>" )
+ ( pointCount < 0 ? tr( "unknown" ) : locale.toString( static_cast<qlonglong>( pointCount ) ) )
+ QStringLiteral( "</td></tr>\n" );
myMetadata += QLatin1String( "</table>\n<br><br>" );

// CRS
myMetadata += crsHtmlMetadata();

// provider metadata section
myMetadata += QStringLiteral( "<h1>" ) + tr( "Metadata" ) + QStringLiteral( "</h1>\n<hr>\n" ) + QStringLiteral( "<table class=\"list-view\">\n" );
const QVariantMap originalMetadata = mDataProvider ? mDataProvider->originalMetadata() : QVariantMap();

if ( originalMetadata.value( QStringLiteral( "creation_year" ) ).toInt() > 0 && originalMetadata.contains( QStringLiteral( "creation_doy" ) ) )
Expand Down
92 changes: 92 additions & 0 deletions src/core/qgsmaplayer.cpp
Expand Up @@ -61,6 +61,8 @@
#include "qgsmaplayerelevationproperties.h"
#include "qgsprovidermetadata.h"
#include "qgslayernotesutils.h"
#include "qgsdatums.h"
#include "qgsprojoperation.h"

QString QgsMapLayer::extensionPropertyType( QgsMapLayer::PropertyType type )
{
Expand Down Expand Up @@ -2152,3 +2154,93 @@ void QgsMapLayer::invalidateWgs84Extent()

mWgs84Extent = QgsRectangle();
}

QString QgsMapLayer::crsHtmlMetadata() const
{
QString metadata = QStringLiteral( "<h1>" ) + tr( "Coordinate Reference System (CRS)" ) + QStringLiteral( "</h1>\n<hr>\n" );
metadata += QStringLiteral( "<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
{
metadata += QStringLiteral( "<tr><td class=\"highlight\">" ) + tr( "Name" ) + QStringLiteral( "</td><td>" ) + c.userFriendlyIdentifier( QgsCoordinateReferenceSystem::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" );


// operation
const QgsProjOperation operation = c.operation();
metadata += QStringLiteral( "<tr><td class=\"highlight\">" ) + tr( "Method" ) + QStringLiteral( "</td><td>" ) + operation.description() + QStringLiteral( "</td></tr>\n" );

// 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 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 & )
{

}

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)" ) );

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

metadata += QLatin1String( "</table>\n<br><br>\n" );
return metadata;
}
13 changes: 13 additions & 0 deletions src/core/qgsmaplayer.h
Expand Up @@ -1739,6 +1739,19 @@ class CORE_EXPORT QgsMapLayer : public QObject
*/
double mLayerOpacity = 1.0;

#ifndef SIP_RUN

/**
* Returns a HTML fragment containing the layer's CRS metadata, for use
* in the htmlMetadata() method.
*
* \note Not available in Python bindings.
*
* \since QGIS 3.20
*/
QString crsHtmlMetadata() const;
#endif

private:

virtual QString baseURI( PropertyType type ) const;
Expand Down
22 changes: 8 additions & 14 deletions src/core/raster/qgsrasterlayer.cpp
Expand Up @@ -351,24 +351,18 @@ QString QgsRasterLayer::htmlMetadata() const
if ( publicSource() != path || !isLocalPath )
myMetadata += QStringLiteral( "<tr><td class=\"highlight\">" ) + tr( "Source" ) + QStringLiteral( "</td><td>%1" ).arg( publicSource() != path ? publicSource() : path ) + QStringLiteral( "</td></tr>\n" );

// EPSG
myMetadata += QStringLiteral( "<tr><td class=\"highlight\">" ) % tr( "CRS" ) + QStringLiteral( "</td><td>" );
if ( crs().isValid() )
{
myMetadata += crs().userFriendlyIdentifier( QgsCoordinateReferenceSystem::FullString ) % QStringLiteral( " - " );
if ( crs().isGeographic() )
myMetadata += tr( "Geographic" );
else
myMetadata += tr( "Projected" );
}
myMetadata += QStringLiteral( "</td></tr>\n" ) %
myMetadata += QLatin1String( "</table>\n<br><br>" );

// CRS
myMetadata += crsHtmlMetadata();

myMetadata += QStringLiteral( "<h1>" ) + tr( "Properties" ) + QStringLiteral( "</h1>\n<hr>\n" ) + QStringLiteral( "<table class=\"list-view\">\n" );

myMetadata += QStringLiteral( "\n" ) %

// Extent
QStringLiteral( "<tr><td class=\"highlight\">" ) % tr( "Extent" ) % QStringLiteral( "</td><td>" ) % extent().toString() % QStringLiteral( "</td></tr>\n" ) %

// unit
QStringLiteral( "<tr><td class=\"highlight\">" ) % tr( "Unit" ) % QStringLiteral( "</td><td>" ) % QgsUnitTypes::toString( crs().mapUnits() ) % QStringLiteral( "</td></tr>\n" ) %

// Raster Width
QStringLiteral( "<tr><td class=\"highlight\">" ) % tr( "Width" ) % QStringLiteral( "</td><td>" );
if ( dataProvider()->capabilities() & QgsRasterDataProvider::Size )
Expand Down
22 changes: 6 additions & 16 deletions src/core/vector/qgsvectorlayer.cpp
Expand Up @@ -5116,24 +5116,8 @@ QString QgsVectorLayer::htmlMetadata() const
myMetadata += QStringLiteral( "<tr><td class=\"highlight\">" ) + tr( "Geometry" ) + QStringLiteral( "</td><td>" ) + typeString + QStringLiteral( "</td></tr>\n" );
}

// EPSG
myMetadata += QStringLiteral( "<tr><td class=\"highlight\">" ) + tr( "CRS" ) + QStringLiteral( "</td><td>" );
if ( crs().isValid() )
{
myMetadata += crs().userFriendlyIdentifier( QgsCoordinateReferenceSystem::FullString ) + QStringLiteral( " - " );
if ( crs().isGeographic() )
myMetadata += tr( "Geographic" );
else
myMetadata += tr( "Projected" );
}
myMetadata += QLatin1String( "</td></tr>\n" );

// Extent
myMetadata += QStringLiteral( "<tr><td class=\"highlight\">" ) + tr( "Extent" ) + QStringLiteral( "</td><td>" ) + extent().toString() + QStringLiteral( "</td></tr>\n" );

// unit
myMetadata += QStringLiteral( "<tr><td class=\"highlight\">" ) + tr( "Unit" ) + QStringLiteral( "</td><td>" ) + QgsUnitTypes::toString( crs().mapUnits() ) + QStringLiteral( "</td></tr>\n" );

}

// feature count
Expand All @@ -5147,6 +5131,12 @@ QString QgsVectorLayer::htmlMetadata() const
// End Provider section
myMetadata += QLatin1String( "</table>\n<br><br>" );

if ( isSpatial() )
{
// CRS
myMetadata += crsHtmlMetadata();
}

// identification section
myMetadata += QStringLiteral( "<h1>" ) + tr( "Identification" ) + QStringLiteral( "</h1>\n<hr>\n" );
myMetadata += htmlFormatter.identificationSectionHtml( );
Expand Down
5 changes: 3 additions & 2 deletions src/core/vectortile/qgsvectortilelayer.cpp
Expand Up @@ -605,11 +605,12 @@ QString QgsVectorTileLayer::htmlMetadata() const
info += QStringLiteral( "<tr><td class=\"highlight\">" ) % tr( "Source path" ) % QStringLiteral( "</td><td>%1" ).arg( QStringLiteral( "<a href=\"%1\">%2</a>" ).arg( QUrl( url ).toString(), sourcePath() ) ) + QStringLiteral( "</td></tr>\n" );

info += QStringLiteral( "<tr><td class=\"highlight\">" ) % tr( "Zoom levels" ) % QStringLiteral( "</td><td>" ) % QStringLiteral( "%1 - %2" ).arg( sourceMinZoom() ).arg( sourceMaxZoom() ) % QStringLiteral( "</td></tr>\n" );
info += QLatin1String( "</table>" );

// End Provider section
info += QLatin1String( "</table>\n<br><br>" );

// CRS
info += crsHtmlMetadata();

// Identification section
info += QStringLiteral( "<h1>" ) % tr( "Identification" ) % QStringLiteral( "</h1>\n<hr>\n" ) %
htmlFormatter.identificationSectionHtml() %
Expand Down

0 comments on commit 21edff4

Please sign in to comment.