Cache for coordinate transformations

This commit is contained in:
Marco Hugentobler 2012-12-17 08:10:57 +01:00
parent d4aa0ed62a
commit 496355b367
2 changed files with 59 additions and 0 deletions

View File

@ -16,6 +16,46 @@
***************************************************************************/ ***************************************************************************/
#include "qgscrscache.h" #include "qgscrscache.h"
#include "qgscoordinatetransform.h"
QgsCoordinateTransformCache* QgsCoordinateTransformCache::mInstance = 0;
QgsCoordinateTransformCache* QgsCoordinateTransformCache::instance()
{
if ( !mInstance )
{
mInstance = new QgsCoordinateTransformCache();
}
return mInstance;
}
QgsCoordinateTransformCache::~QgsCoordinateTransformCache()
{
QHash< QPair< QString, QString >, QgsCoordinateTransform* >::const_iterator tIt = mTransforms.constBegin();
for ( ; tIt != mTransforms.constEnd(); ++tIt )
{
delete tIt.value();
}
delete mInstance;
}
const QgsCoordinateTransform* QgsCoordinateTransformCache::transform( const QString& srcAuthId, const QString& destAuthId )
{
QHash< QPair< QString, QString >, QgsCoordinateTransform* >::const_iterator ctIt =
mTransforms.find( qMakePair( srcAuthId, destAuthId ) );
if ( ctIt == mTransforms.constEnd() )
{
const QgsCoordinateReferenceSystem& srcCrs = QgsCRSCache::instance()->crsByAuthId( srcAuthId );
const QgsCoordinateReferenceSystem& destCrs = QgsCRSCache::instance()->crsByAuthId( destAuthId );
QgsCoordinateTransform* ct = new QgsCoordinateTransform( srcCrs, destCrs );
mTransforms.insert( qMakePair( srcAuthId, destAuthId ), ct );
return ct;
}
else
{
return ctIt.value();
}
}
QgsCRSCache* QgsCRSCache::mInstance = 0; QgsCRSCache* QgsCRSCache::mInstance = 0;

View File

@ -21,6 +21,25 @@
#include "qgscoordinatereferencesystem.h" #include "qgscoordinatereferencesystem.h"
#include <QHash> #include <QHash>
class QgsCoordinateTransform;
/**Cache coordinate transform by authid of source/dest transformation to avoid the
overhead of initialisation for each redraw*/
class CORE_EXPORT QgsCoordinateTransformCache
{
public:
static QgsCoordinateTransformCache* instance();
~QgsCoordinateTransformCache();
/**Returns coordinate transformation. Cache keeps ownership
@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 );
private:
static QgsCoordinateTransformCache* mInstance;
QHash< QPair< QString, QString >, QgsCoordinateTransform* > mTransforms;
};
class CORE_EXPORT QgsCRSCache class CORE_EXPORT QgsCRSCache
{ {
public: public: