Skip to content

Commit

Permalink
follow up 9a9b53b:
Browse files Browse the repository at this point in the history
- enable transform caching (comparing before each use disables its point)
- invalidate the render transform cache only when the layer crs changes by
  connecting to the QgsMapLayer::layerCrsChanged() signal.
- make CRS of map layer private so that setCrs has to be used on each change
  • Loading branch information
jef-n committed Jan 15, 2012
1 parent 872e3c9 commit 84dc1ba
Show file tree
Hide file tree
Showing 6 changed files with 52 additions and 54 deletions.
7 changes: 7 additions & 0 deletions src/core/qgsmaplayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -513,6 +513,13 @@ const QgsCoordinateReferenceSystem& QgsMapLayer::srs()
void QgsMapLayer::setCrs( const QgsCoordinateReferenceSystem& srs, bool emitSignal )
{
*mCRS = srs;

if ( !mCRS->isValid() )
{
mCRS->setValidationHint( tr( "Specify CRS for layer %1" ).arg( name() ) );
mCRS->validate();
}

if ( emitSignal )
emit layerCrsChanged();
}
Expand Down
7 changes: 3 additions & 4 deletions src/core/qgsmaplayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,6 @@ class CORE_EXPORT QgsMapLayer : public QObject
@note emitSignal added in 1.4 */
void setCrs( const QgsCoordinateReferenceSystem& srs, bool emitSignal = true );


/** A convenience function to capitalise the layer name */
static QString capitaliseLayerName( const QString name );

Expand Down Expand Up @@ -418,15 +417,15 @@ class CORE_EXPORT QgsMapLayer : public QObject
/** Name of the layer - used for display */
QString mLayerName;

/** layer's Spatial reference system */
QgsCoordinateReferenceSystem* mCRS;

QString mTitle;

/**Description of the layer*/
QString mAbstract;

private:
/** layer's spatial reference system.
private to make sure setCrs must be used and layerCrsChanged() is emitted */
QgsCoordinateReferenceSystem* mCRS;

/** private copy constructor - QgsMapLayer not copyable */
QgsMapLayer( QgsMapLayer const & );
Expand Down
17 changes: 14 additions & 3 deletions src/core/qgsmaprenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -680,7 +680,7 @@ void QgsMapRenderer::setDestinationCrs( const QgsCoordinateReferenceSystem& crs
QgsDebugMsg( "* DestCRS.srsid() = " + QString::number( crs.srsid() ) );
if ( *mDestCRS != crs )
{
mCachedTrForLayer = 0;
invalidateCachedLayerCrs();
QgsDebugMsg( "Setting DistArea CRS to " + QString::number( crs.srsid() ) );
mDistArea->setSourceCrs( crs.srsid() );
*mDestCRS = crs;
Expand Down Expand Up @@ -1107,15 +1107,26 @@ void QgsMapRenderer::setLabelingEngine( QgsLabelingEngineInterface* iface )

QgsCoordinateTransform *QgsMapRenderer::tr( QgsMapLayer *layer )
{
// mCachedTrForLayer is unset by setDestinationCrs(), but layer->crs may also be changed after CRS was cached -> check it - the question is, how efficient now the caching is, because crs == operator is not cheap
if ( mCachedTrForLayer != layer || layer->crs() != mCachedTr->sourceCrs() )
if ( mCachedTrForLayer != layer )
{
invalidateCachedLayerCrs();

delete mCachedTr;
mCachedTr = new QgsCoordinateTransform( layer->crs(), *mDestCRS );
mCachedTrForLayer = layer;

connect( layer, SIGNAL( layerCrsChanged() ), this, SLOT( invalidateCachedLayerCrs() ) );
}

return mCachedTr;
}

void QgsMapRenderer::invalidateCachedLayerCrs()
{
if ( mCachedTrForLayer )
disconnect( mCachedTrForLayer, SIGNAL( layerCrsChanged() ), this, SLOT( invalidateCachedLayerCrs() ) );

mCachedTrForLayer = 0;
}

bool QgsMapRenderer::mDrawing = false;
3 changes: 3 additions & 0 deletions src/core/qgsmaprenderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,9 @@ class CORE_EXPORT QgsMapRenderer : public QObject
//! called by signal from layer current being drawn
void onDrawingProgress( int current, int total );

//! invalidate cached layer CRS
void invalidateCachedLayerCrs();

protected:

//! adjust extent to fit the pixmap size
Expand Down
37 changes: 9 additions & 28 deletions src/core/qgsvectorlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,7 @@
* *
***************************************************************************/

#include <cfloat>
#include <cstring>
#include <climits>
#include <cmath>
#include <iosfwd>
#include <limits>
#include <memory>
#include <set>
#include <sstream>
#include <utility>

#include <QImage>
#include <QPainter>
Expand Down Expand Up @@ -2588,11 +2579,11 @@ int QgsVectorLayer::addTopologicalPoints( const QgsPoint& p )

//work with a tolerance because coordinate projection may introduce some rounding
double threshold = 0.0000001;
if ( mCRS && mCRS->mapUnits() == QGis::Meters )
if ( crs().mapUnits() == QGis::Meters )
{
threshold = 0.001;
}
else if ( mCRS && mCRS->mapUnits() == QGis::Feet )
else if ( crs().mapUnits() == QGis::Feet )
{
threshold = 0.0001;
}
Expand Down Expand Up @@ -4478,24 +4469,14 @@ void QgsVectorLayer::setCoordinateSystem()
// for this layer
//

// get CRS directly from provider
*mCRS = mDataProvider->crs();

//QgsCoordinateReferenceSystem provides a mechanism for FORCE a srs to be valid
//which is inolves falling back to system, project or user selected
//defaults if the srs is not properly intialised.
//we only nee to do that if the srs is not alreay valid
if ( !mCRS->isValid() )
if ( hasGeometryType() )
{
if ( hasGeometryType() )
{
mCRS->setValidationHint( tr( "Specify CRS for layer %1" ).arg( name() ) );
mCRS->validate();
}
else
{
mCRS->createFromOgcWmsCrs( GEO_EPSG_CRS_AUTHID );
}
// get CRS directly from provider
setCrs( mDataProvider->crs() );
}
else
{
setCrs( QgsCoordinateReferenceSystem( GEO_EPSG_CRS_AUTHID ) );
}
}

Expand Down
35 changes: 16 additions & 19 deletions src/core/raster/qgsrasterlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1797,7 +1797,7 @@ QString QgsRasterLayer::metadata()
myMetadata += tr( "Layer Spatial Reference System: " );
myMetadata += "</p>\n";
myMetadata += "<p>";
myMetadata += mCRS->toProj4();
myMetadata += crs().toProj4();
myMetadata += "</p>\n";

myMetadata += "<p class=\"glossy\">";
Expand Down Expand Up @@ -2224,7 +2224,7 @@ void QgsRasterLayer::setDataProvider( QString const & provider,
QStringList const & layers,
QStringList const & styles,
QString const & format,
QString const & crs,
QString const & theCrs,
bool loadDefaultStyleFlag )
{
Q_UNUSED( loadDefaultStyleFlag );
Expand All @@ -2251,13 +2251,15 @@ void QgsRasterLayer::setDataProvider( QString const & provider,
}


QgsDebugMsg( "Instantiated the data provider plugin"
+ QString( " with layer list of " ) + layers.join( ", " )
+ " and style list of " + styles.join( ", " )
+ " and format of " + format + " and CRS of " + crs );
QgsDebugMsg( QString( "Instantiated the data provider plugin with layer list of %1 and style list of %2 and format of %3 and CRS of %4" )
.arg( layers.join( ", " ) )
.arg( styles.join( ", " ) )
.arg( format )
.arg( theCrs )
);
if ( !mDataProvider->isValid() )
{
if ( provider != "gdal" || !layers.isEmpty() || !styles.isEmpty() || !format.isNull() || !crs.isNull() )
if ( provider != "gdal" || !layers.isEmpty() || !styles.isEmpty() || !format.isNull() || !theCrs.isNull() )
{
QgsMessageLog::logMessage( tr( "Data provider is invalid (layers %1, styles %2, formats: %3)" )
.arg( layers.join( ", " ) )
Expand All @@ -2270,7 +2272,7 @@ void QgsRasterLayer::setDataProvider( QString const & provider,

mDataProvider->addLayers( layers, styles );
mDataProvider->setImageEncoding( format );
mDataProvider->setImageCrs( crs );
mDataProvider->setImageCrs( theCrs );

setNoDataValue( mDataProvider->noDataValue() );

Expand Down Expand Up @@ -2299,21 +2301,16 @@ void QgsRasterLayer::setDataProvider( QString const & provider,
// Setup source CRS
if ( mProviderKey == "wms" )
{
*mCRS = QgsCoordinateReferenceSystem();
mCRS->createFromOgcWmsCrs( crs );
QgsCoordinateReferenceSystem crs;
crs.createFromOgcWmsCrs( theCrs );
setCrs( crs );
}
else
{
*mCRS = QgsCoordinateReferenceSystem( mDataProvider->crs() );
setCrs( QgsCoordinateReferenceSystem( mDataProvider->crs() ) );
}
//get the project projection, defaulting to this layer's projection
//if none exists....
if ( !mCRS->isValid() )
{
mCRS->setValidationHint( tr( "Specify CRS for layer %1" ).arg( name() ) );
mCRS->validate();
}
QString mySourceWkt = mCRS->toWkt();

QString mySourceWkt = crs().toWkt();

QgsDebugMsg( "using wkt:\n" + mySourceWkt );

Expand Down

0 comments on commit 84dc1ba

Please sign in to comment.