Showing with 39 additions and 0 deletions.
  1. +3 −0 src/app/qgscustomprojectiondialog.cpp
  2. +32 −0 src/core/qgscrscache.cpp
  3. +4 −0 src/core/qgscrscache.h
3 changes: 3 additions & 0 deletions src/app/qgscustomprojectiondialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include "qgsapplication.h"
#include "qgslogger.h"
#include "qgsgenericprojectionselector.h"
#include "qgscrscache.h"

//qt includes
#include <QFileInfo>
Expand Down Expand Up @@ -291,6 +292,8 @@ bool QgsCustomProjectionDialog::saveCRS( QgsCoordinateReferenceSystem myCRS, QSt
existingCRSparameters[myId] = myCRS.toProj4();
existingCRSnames[myId] = myName;

QgsCRSCache::instance()->updateCRSCache( QString( "USER:%1" ).arg( myId ) );

// If we have a projection acronym not in the user db previously, add it.
// This is a must, or else we can't select it from the vw_srs table.
// Actually, add it always and let the SQL PRIMARY KEY remove duplicates.
Expand Down
32 changes: 32 additions & 0 deletions src/core/qgscrscache.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,28 @@ const QgsCoordinateTransform* QgsCoordinateTransformCache::transform( const QStr
}
}

void QgsCoordinateTransformCache::invalidateCrs( const QString& crsAuthId )
{
//get keys to remove first
QHash< QPair< QString, QString >, QgsCoordinateTransform* >::const_iterator it = mTransforms.constBegin();
QList< QPair< QString, QString > > updateList;

for ( ; it != mTransforms.constEnd(); ++it )
{
if ( it.key().first == crsAuthId || it.key().second == crsAuthId )
{
updateList.append( it.key() );
}
}

//and remove after
QList< QPair< QString, QString > >::const_iterator updateIt = updateList.constBegin();
for ( ; updateIt != updateList.constEnd(); ++updateIt )
{
mTransforms.remove( *updateIt );
}
}

QgsCRSCache* QgsCRSCache::mInstance = 0;

QgsCRSCache* QgsCRSCache::instance()
Expand All @@ -77,6 +99,16 @@ QgsCRSCache::~QgsCRSCache()
delete mInstance;
}

void QgsCRSCache::updateCRSCache( const QString& authid )
{
QgsCoordinateReferenceSystem s;
if ( s.createFromOgcWmsCrs( authid ) )
{
mCRS.insert( authid, s );
}
QgsCoordinateTransformCache::instance()->invalidateCrs( authid );
}

const QgsCoordinateReferenceSystem& QgsCRSCache::crsByAuthId( const QString& authid )
{
QHash< QString, QgsCoordinateReferenceSystem >::const_iterator crsIt = mCRS.find( authid );
Expand Down
4 changes: 4 additions & 0 deletions src/core/qgscrscache.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ class CORE_EXPORT QgsCoordinateTransformCache
@param srcAuthId auth id string of source crs
@param destAuthId auth id string of dest crs*/
const QgsCoordinateTransform* transform( const QString& srcAuthId, const QString& destAuthId );
/**Removes transformations where a changed crs is involved from the cache*/
void invalidateCrs( const QString& crsAuthId );

private:
static QgsCoordinateTransformCache* mInstance;
Expand All @@ -49,6 +51,8 @@ class CORE_EXPORT QgsCRSCache
const QgsCoordinateReferenceSystem& crsByAuthId( const QString& authid );
const QgsCoordinateReferenceSystem& crsByEpsgId( long epsg );

void updateCRSCache( const QString &authid );

protected:
QgsCRSCache();

Expand Down