|
Quantum GIS API Documentation
master-693a1fe
|
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 }