Quantum GIS API Documentation  master-693a1fe
src/core/qgscrscache.cpp
Go to the documentation of this file.
00001 /***************************************************************************
00002                               qgscrscache.cpp
00003                               ---------------
00004   begin                : September 6th, 2011
00005   copyright            : (C) 2011 by Marco Hugentobler
00006   email                : marco dot hugentobler at sourcepole dot ch
00007  ***************************************************************************/
00008 
00009 /***************************************************************************
00010  *                                                                         *
00011  *   This program is free software; you can redistribute it and/or modify  *
00012  *   it under the terms of the GNU General Public License as published by  *
00013  *   the Free Software Foundation; either version 2 of the License, or     *
00014  *   (at your option) any later version.                                   *
00015  *                                                                         *
00016  ***************************************************************************/
00017 
00018 #include "qgscrscache.h"
00019 #include "qgscoordinatetransform.h"
00020 
00021 QgsCoordinateTransformCache* QgsCoordinateTransformCache::mInstance = 0;
00022 
00023 QgsCoordinateTransformCache* QgsCoordinateTransformCache::instance()
00024 {
00025   if ( !mInstance )
00026   {
00027     mInstance = new QgsCoordinateTransformCache();
00028   }
00029   return mInstance;
00030 }
00031 
00032 QgsCoordinateTransformCache::~QgsCoordinateTransformCache()
00033 {
00034   QHash< QPair< QString, QString >, QgsCoordinateTransform* >::const_iterator tIt = mTransforms.constBegin();
00035   for ( ; tIt != mTransforms.constEnd(); ++tIt )
00036   {
00037     delete tIt.value();
00038   }
00039   delete mInstance;
00040 }
00041 
00042 const QgsCoordinateTransform* QgsCoordinateTransformCache::transform( const QString& srcAuthId, const QString& destAuthId )
00043 {
00044   QHash< QPair< QString, QString >, QgsCoordinateTransform* >::const_iterator ctIt =
00045     mTransforms.find( qMakePair( srcAuthId, destAuthId ) );
00046   if ( ctIt == mTransforms.constEnd() )
00047   {
00048     const QgsCoordinateReferenceSystem& srcCrs = QgsCRSCache::instance()->crsByAuthId( srcAuthId );
00049     const QgsCoordinateReferenceSystem& destCrs = QgsCRSCache::instance()->crsByAuthId( destAuthId );
00050     QgsCoordinateTransform* ct = new QgsCoordinateTransform( srcCrs, destCrs );
00051     mTransforms.insert( qMakePair( srcAuthId, destAuthId ), ct );
00052     return ct;
00053   }
00054   else
00055   {
00056     return ctIt.value();
00057   }
00058 }
00059 
00060 QgsCRSCache* QgsCRSCache::mInstance = 0;
00061 
00062 QgsCRSCache* QgsCRSCache::instance()
00063 {
00064   if ( !mInstance )
00065   {
00066     mInstance = new QgsCRSCache();
00067   }
00068   return mInstance;
00069 }
00070 
00071 QgsCRSCache::QgsCRSCache()
00072 {
00073 }
00074 
00075 QgsCRSCache::~QgsCRSCache()
00076 {
00077   delete mInstance;
00078 }
00079 
00080 const QgsCoordinateReferenceSystem& QgsCRSCache::crsByAuthId( const QString& authid )
00081 {
00082   QHash< QString, QgsCoordinateReferenceSystem >::const_iterator crsIt = mCRS.find( authid );
00083   if ( crsIt == mCRS.constEnd() )
00084   {
00085     QgsCoordinateReferenceSystem s;
00086     if ( ! s.createFromOgcWmsCrs( authid ) )
00087     {
00088       return mInvalidCRS;
00089     }
00090     return mCRS.insert( authid, s ).value();
00091   }
00092   else
00093   {
00094     return crsIt.value();
00095   }
00096 }
00097 
00098 const QgsCoordinateReferenceSystem& QgsCRSCache::crsByEpsgId( long epsg )
00099 {
00100   return crsByAuthId( "EPSG:" + QString::number( epsg ) );
00101 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines