Show authority:code identifiers on transform selection dialog

Many scopes/remark cross reference these, so by showing them in the
table of available operations we give users more clues how to pick
the correct one.
This commit is contained in:
Nyall Dawson 2019-07-05 07:26:59 +10:00
parent f74bd3454d
commit dd9dfb0d08
4 changed files with 53 additions and 2 deletions

View File

@ -89,6 +89,10 @@ and ``destinationTransformId`` transforms.
QString remarks; QString remarks;
QString areaOfUse; QString areaOfUse;
QString authority;
QString code;
}; };
struct TransformDetails struct TransformDetails
@ -97,6 +101,10 @@ and ``destinationTransformId`` transforms.
QString name; QString name;
double accuracy; double accuracy;
QString authority;
QString code;
QString scope; QString scope;
QString remarks; QString remarks;

View File

@ -323,6 +323,9 @@ QgsDatumTransform::TransformDetails QgsDatumTransform::transformDetailsFromPj( P
details.accuracy = proj_coordoperation_get_accuracy( pjContext, op ); details.accuracy = proj_coordoperation_get_accuracy( pjContext, op );
details.isAvailable = proj_coordoperation_is_instantiable( pjContext, op ); details.isAvailable = proj_coordoperation_is_instantiable( pjContext, op );
details.authority = QString( proj_get_id_auth_name( op, 0 ) );
details.code = QString( proj_get_id_code( op, 0 ) );
const char *areaOfUseName = nullptr; const char *areaOfUseName = nullptr;
if ( proj_get_area_of_use( pjContext, op, nullptr, nullptr, nullptr, nullptr, &areaOfUseName ) ) if ( proj_get_area_of_use( pjContext, op, nullptr, nullptr, nullptr, nullptr, &areaOfUseName ) )
{ {
@ -365,6 +368,8 @@ QgsDatumTransform::TransformDetails QgsDatumTransform::transformDetailsFromPj( P
SingleOperationDetails singleOpDetails; SingleOperationDetails singleOpDetails;
singleOpDetails.remarks = QString( proj_get_remarks( step.get() ) ); singleOpDetails.remarks = QString( proj_get_remarks( step.get() ) );
singleOpDetails.scope = QString( proj_get_scope( step.get() ) ); singleOpDetails.scope = QString( proj_get_scope( step.get() ) );
singleOpDetails.authority = QString( proj_get_id_auth_name( step.get(), 0 ) );
singleOpDetails.code = QString( proj_get_id_code( step.get(), 0 ) );
const char *areaOfUseName = nullptr; const char *areaOfUseName = nullptr;
if ( proj_get_area_of_use( pjContext, step.get(), nullptr, nullptr, nullptr, nullptr, &areaOfUseName ) ) if ( proj_get_area_of_use( pjContext, step.get(), nullptr, nullptr, nullptr, nullptr, &areaOfUseName ) )

View File

@ -163,6 +163,12 @@ class CORE_EXPORT QgsDatumTransform
//! Area of use, from EPSG registry database //! Area of use, from EPSG registry database
QString areaOfUse; QString areaOfUse;
//! Authority name, e.g. EPSG.
QString authority;
//! Authority code, e.g. "8447" (for EPSG:8447).
QString code;
}; };
/** /**
@ -180,6 +186,22 @@ class CORE_EXPORT QgsDatumTransform
//! Transformation accuracy (in meters) //! Transformation accuracy (in meters)
double accuracy = 0; double accuracy = 0;
/**
* Authority name, e.g. EPSG.
*
* This is only available for single step coordinate operations. For multi-step operations, check
* \a operationDetails instead.
*/
QString authority;
/**
* Identification code, e.g. "8447" (For EPSG:8447).
*
* This is only available for single step coordinate operations. For multi-step operations, check
* \a operationDetails instead.
*/
QString code;
/** /**
* Scope of operation, from EPSG registry database. * Scope of operation, from EPSG registry database.
* *

View File

@ -172,7 +172,10 @@ void QgsDatumTransformDialog::load( QPair<int, int> selectedDatumTransforms, con
item->setData( AvailableRole, transform.isAvailable ); item->setData( AvailableRole, transform.isAvailable );
item->setFlags( item->flags() & ~Qt::ItemIsEditable ); item->setFlags( item->flags() & ~Qt::ItemIsEditable );
item->setText( transform.name ); QString name = transform.name;
if ( !transform.authority.isEmpty() && !transform.code.isEmpty() )
name += QStringLiteral( " — %1:%2" ).arg( transform.authority, transform.code );
item->setText( name );
if ( row == 0 ) // highlight first (preferred) operation if ( row == 0 ) // highlight first (preferred) operation
{ {
@ -231,6 +234,7 @@ void QgsDatumTransformDialog::load( QPair<int, int> selectedDatumTransforms, con
} }
QStringList areasOfUse; QStringList areasOfUse;
QStringList authorityCodes;
#if PROJ_VERSION_MAJOR > 6 or PROJ_VERSION_MINOR >= 2 #if PROJ_VERSION_MAJOR > 6 or PROJ_VERSION_MINOR >= 2
QStringList opText; QStringList opText;
@ -252,6 +256,12 @@ void QgsDatumTransformDialog::load( QPair<int, int> selectedDatumTransforms, con
if ( !areasOfUse.contains( singleOpDetails.areaOfUse ) ) if ( !areasOfUse.contains( singleOpDetails.areaOfUse ) )
areasOfUse << singleOpDetails.areaOfUse; areasOfUse << singleOpDetails.areaOfUse;
} }
if ( !singleOpDetails.authority.isEmpty() && !singleOpDetails.code.isEmpty() )
{
const QString identifier = QStringLiteral( "%1:%2" ).arg( singleOpDetails.authority, singleOpDetails.code );
if ( !authorityCodes.contains( identifier ) )
authorityCodes << identifier;
}
if ( !text.isEmpty() ) if ( !text.isEmpty() )
{ {
@ -285,6 +295,10 @@ void QgsDatumTransformDialog::load( QPair<int, int> selectedDatumTransforms, con
if ( !transform.areaOfUse.isEmpty() && !areasOfUse.contains( transform.areaOfUse ) ) if ( !transform.areaOfUse.isEmpty() && !areasOfUse.contains( transform.areaOfUse ) )
areasOfUse << transform.areaOfUse; areasOfUse << transform.areaOfUse;
const QString id = QStringLiteral( "%1:%2" ).arg( transform.authority, transform.code );
if ( !transform.authority.isEmpty() && !transform.code.isEmpty() && !authorityCodes.contains( id ) )
authorityCodes << id;
#if PROJ_VERSION_MAJOR > 6 or PROJ_VERSION_MINOR >= 2 #if PROJ_VERSION_MAJOR > 6 or PROJ_VERSION_MINOR >= 2
const QColor disabled = palette().color( QPalette::Disabled, QPalette::Text ); const QColor disabled = palette().color( QPalette::Disabled, QPalette::Text );
const QColor active = palette().color( QPalette::Active, QPalette::Text ); const QColor active = palette().color( QPalette::Active, QPalette::Text );
@ -295,11 +309,13 @@ void QgsDatumTransformDialog::load( QPair<int, int> selectedDatumTransforms, con
const QString toolTipString = QStringLiteral( "<b>%1</b>" ).arg( transform.name ) const QString toolTipString = QStringLiteral( "<b>%1</b>" ).arg( transform.name )
+ ( !opText.empty() ? ( opText.count() == 1 ? QStringLiteral( "<p>%1</p>" ).arg( opText.at( 0 ) ) : QStringLiteral( "<ul>%1</ul>" ).arg( opText.join( QString() ) ) ) : QString() ) + ( !opText.empty() ? ( opText.count() == 1 ? QStringLiteral( "<p>%1</p>" ).arg( opText.at( 0 ) ) : QStringLiteral( "<ul>%1</ul>" ).arg( opText.join( QString() ) ) ) : QString() )
+ ( !areasOfUse.empty() ? QStringLiteral( "<p><b>%1</b>: %2</p>" ).arg( tr( "Area of use" ), areasOfUse.join( QStringLiteral( ", " ) ) ) : QString() ) + ( !areasOfUse.empty() ? QStringLiteral( "<p><b>%1</b>: %2</p>" ).arg( tr( "Area of use" ), areasOfUse.join( QStringLiteral( ", " ) ) ) : QString() )
+ ( !authorityCodes.empty() ? QStringLiteral( "<p><b>%1</b>: %2</p>" ).arg( tr( "Identifiers" ), authorityCodes.join( QStringLiteral( ", " ) ) ) : QString() )
+ ( !missingMessage.isEmpty() ? QStringLiteral( "<p><b style=\"color: red\">%1</b></p>" ).arg( missingMessage ) : QString() ) + ( !missingMessage.isEmpty() ? QStringLiteral( "<p><b style=\"color: red\">%1</b></p>" ).arg( missingMessage ) : QString() )
+ QStringLiteral( "<p><code style=\"color: %1\">%2</code></p>" ).arg( codeColor.name(), transform.proj ); + QStringLiteral( "<p><code style=\"color: %1\">%2</code></p>" ).arg( codeColor.name(), transform.proj );
#else #else
const QString toolTipString = QStringLiteral( "<b>%1</b>%2%3<p><code>%4</code></p>" ).arg( transform.name, const QString toolTipString = QStringLiteral( "<b>%1</b>%2%3%4<p><code>%5</code></p>" ).arg( transform.name,
( !transform.areaOfUse.isEmpty() ? QStringLiteral( "<p><b>%1</b>: %2</p>" ).arg( tr( "Area of use" ), transform.areaOfUse ) : QString() ), ( !transform.areaOfUse.isEmpty() ? QStringLiteral( "<p><b>%1</b>: %2</p>" ).arg( tr( "Area of use" ), transform.areaOfUse ) : QString() ),
( !id.isEmpty() ? QStringLiteral( "<p><b>%1</b>: %2</p>" ).arg( tr( "Identifier" ), id ) : QString() ),
( !missingMessage.isEmpty() ? QStringLiteral( "<p><b style=\"color: red\">%1</b></p>" ).arg( missingMessage ) : QString() ), ( !missingMessage.isEmpty() ? QStringLiteral( "<p><b style=\"color: red\">%1</b></p>" ).arg( missingMessage ) : QString() ),
transform.proj ); transform.proj );
#endif #endif