Show a warning when loading a project with a transform not available locally

This commit is contained in:
Nyall Dawson 2017-12-15 17:32:00 +10:00
parent 6ff744a3b3
commit 96c2ce18bd
7 changed files with 56 additions and 6 deletions

View File

@ -137,10 +137,15 @@ class QgsCoordinateTransformContext
:rtype: QgsCoordinateTransform.TransformPair :rtype: QgsCoordinateTransform.TransformPair
%End %End
void readXml( const QDomElement &element, const QgsReadWriteContext &context ); bool readXml( const QDomElement &element, const QgsReadWriteContext &context, QStringList &missingTransforms /Out/ );
%Docstring %Docstring
Reads the context's state from a DOM ``element``. Reads the context's state from a DOM ``element``.
Returns false if transforms stored in the XML are not available. In this case ``missingTransforms`` will be
filled with missing datum transform strings.
.. seealso:: :py:func:`writeXml()` .. seealso:: :py:func:`writeXml()`
:rtype: bool
%End %End
void writeXml( QDomElement &element, const QgsReadWriteContext &context ) const; void writeXml( QDomElement &element, const QgsReadWriteContext &context ) const;

View File

@ -943,6 +943,12 @@ emitted whenever the configuration for snapping has changed
.. versionadded:: 3.0 .. versionadded:: 3.0
.. seealso:: :py:func:`transformContext()` .. seealso:: :py:func:`transformContext()`
%End
void missingDatumTransforms( const QStringList &missingTransforms );
%Docstring
Emitted when datum transforms stored in the project are not available locally.
.. versionadded:: 3.0
%End %End
void transactionGroupsChanged(); void transactionGroupsChanged();

View File

@ -3186,6 +3186,12 @@ void QgisApp::setupConnections()
// project crs connections // project crs connections
connect( QgsProject::instance(), &QgsProject::crsChanged, this, &QgisApp::projectCrsChanged ); connect( QgsProject::instance(), &QgsProject::crsChanged, this, &QgisApp::projectCrsChanged );
connect( QgsProject::instance(), &QgsProject::missingDatumTransforms, this, [ = ]( const QStringList & transforms )
{
QString message = tr( "Transforms are not installed: %1 " ).arg( transforms.join( QStringLiteral( " ," ) ) );
messageBar()->pushWarning( tr( "Missing datum transforms" ), message );
} );
connect( QgsProject::instance(), &QgsProject::labelingEngineSettingsChanged, connect( QgsProject::instance(), &QgsProject::labelingEngineSettingsChanged,
this, [ = ] this, [ = ]
{ {

View File

@ -161,7 +161,7 @@ QgsCoordinateTransform::TransformPair QgsCoordinateTransformContext::calculateDa
#endif #endif
} }
void QgsCoordinateTransformContext::readXml( const QDomElement &element, const QgsReadWriteContext & ) bool QgsCoordinateTransformContext::readXml( const QDomElement &element, const QgsReadWriteContext &, QStringList &missingTransforms )
{ {
d.detach(); d.detach();
d->mLock.lockForWrite(); d->mLock.lockForWrite();
@ -176,9 +176,12 @@ void QgsCoordinateTransformContext::readXml( const QDomElement &element, const Q
if ( contextNodes.count() < 1 ) if ( contextNodes.count() < 1 )
{ {
d->mLock.unlock(); d->mLock.unlock();
return; return true;
} }
missingTransforms.clear();
bool result = true;
const QDomElement contextElem = contextNodes.at( 0 ).toElement(); const QDomElement contextElem = contextNodes.at( 0 ).toElement();
// src/dest transforms // src/dest transforms
@ -194,11 +197,26 @@ void QgsCoordinateTransformContext::readXml( const QDomElement &element, const Q
int datumId1 = -1; int datumId1 = -1;
int datumId2 = -1; int datumId2 = -1;
//warn if value1 or value2 is non-empty, yet no matching transform was found
if ( !value1.isEmpty() ) if ( !value1.isEmpty() )
{
datumId1 = QgsCoordinateTransform::projStringToDatumTransformId( value1 ); datumId1 = QgsCoordinateTransform::projStringToDatumTransformId( value1 );
if ( datumId1 < 0 )
{
result = false;
missingTransforms << value1;
}
}
if ( !value2.isEmpty() ) if ( !value2.isEmpty() )
{
datumId2 = QgsCoordinateTransform::projStringToDatumTransformId( value2 ); datumId2 = QgsCoordinateTransform::projStringToDatumTransformId( value2 );
//TODO - throw warning if value1 or value2 is non-empty, yet no matching transform was found if ( datumId2 < 0 )
{
result = false;
missingTransforms << value2;
}
}
d->mSourceDestDatumTransforms.insert( qMakePair( key1, key2 ), QgsCoordinateTransform::TransformPair( datumId1, datumId2 ) ); d->mSourceDestDatumTransforms.insert( qMakePair( key1, key2 ), QgsCoordinateTransform::TransformPair( datumId1, datumId2 ) );
} }
@ -235,6 +253,7 @@ void QgsCoordinateTransformContext::readXml( const QDomElement &element, const Q
#endif #endif
d->mLock.unlock(); d->mLock.unlock();
return result;
} }
void QgsCoordinateTransformContext::writeXml( QDomElement &element, const QgsReadWriteContext & ) const void QgsCoordinateTransformContext::writeXml( QDomElement &element, const QgsReadWriteContext & ) const

View File

@ -233,9 +233,13 @@ class CORE_EXPORT QgsCoordinateTransformContext
/** /**
* Reads the context's state from a DOM \a element. * Reads the context's state from a DOM \a element.
*
* Returns false if transforms stored in the XML are not available. In this case \a missingTransforms will be
* filled with missing datum transform strings.
*
* \see writeXml() * \see writeXml()
*/ */
void readXml( const QDomElement &element, const QgsReadWriteContext &context ); bool readXml( const QDomElement &element, const QgsReadWriteContext &context, QStringList &missingTransforms SIP_OUT );
/** /**
* Writes the context's state to a DOM \a element. * Writes the context's state to a DOM \a element.

View File

@ -925,7 +925,11 @@ bool QgsProject::readProjectFile( const QString &filename )
} }
mCrs = projectCrs; mCrs = projectCrs;
mTransformContext.readXml( doc->documentElement(), context ); QStringList datumErrors;
if ( !mTransformContext.readXml( doc->documentElement(), context, datumErrors ) )
{
emit missingDatumTransforms( datumErrors );
}
emit transformContextChanged(); emit transformContextChanged();
QDomNodeList nl = doc->elementsByTagName( QStringLiteral( "autotransaction" ) ); QDomNodeList nl = doc->elementsByTagName( QStringLiteral( "autotransaction" ) );

View File

@ -933,6 +933,12 @@ class CORE_EXPORT QgsProject : public QObject, public QgsExpressionContextGenera
*/ */
void transformContextChanged(); void transformContextChanged();
/**
* Emitted when datum transforms stored in the project are not available locally.
* \since QGIS 3.0
*/
void missingDatumTransforms( const QStringList &missingTransforms );
/** /**
* Emitted whenever a new transaction group has been created or a * Emitted whenever a new transaction group has been created or a
* transaction group has been removed. * transaction group has been removed.