From 65f32bc137993485cf6d1c88a4df6d5ad0c04908 Mon Sep 17 00:00:00 2001 From: "Juergen E. Fischer" Date: Sat, 28 Jan 2012 14:28:58 +0100 Subject: [PATCH] reproject canvas extent on crs change with OTFR enabled --- src/core/qgscoordinatetransform.cpp | 4 ++-- src/core/qgsmaprenderer.cpp | 14 ++++++++++++++ src/core/raster/qgsrasterlayer.cpp | 4 ++-- src/gui/qgsmapcanvas.cpp | 19 +++++++++++++++---- src/gui/qgsmapcanvas.h | 3 +++ 5 files changed, 36 insertions(+), 8 deletions(-) diff --git a/src/core/qgscoordinatetransform.cpp b/src/core/qgscoordinatetransform.cpp index 45ed92f8cc03..1bed402aa0ef 100644 --- a/src/core/qgscoordinatetransform.cpp +++ b/src/core/qgscoordinatetransform.cpp @@ -494,11 +494,11 @@ QgsRectangle QgsCoordinateTransform::transformBoundingBox( const QgsRectangle re bb_rect.combineExtentWith( x[i], y[i] ); } - QgsDebugMsg( "Projected extent: " + QString(( bb_rect.toString() ).toLocal8Bit().data() ) ); + QgsDebugMsg( "Projected extent: " + bb_rect.toString() ); if ( bb_rect.isEmpty() ) { - QgsMessageLog::logMessage( tr( "Reprojected extent is empty. Original extent: %1" ).arg( rect.toString() ), tr( "CRS" ) ); + QgsDebugMsg( "Original extent: " + rect.toString() ); } return bb_rect; diff --git a/src/core/qgsmaprenderer.cpp b/src/core/qgsmaprenderer.cpp index eaaae6387fe3..34b21128a1f8 100644 --- a/src/core/qgsmaprenderer.cpp +++ b/src/core/qgsmaprenderer.cpp @@ -666,6 +666,7 @@ void QgsMapRenderer::setProjectionsEnabled( bool enabled ) QgsDebugMsg( "Adjusting DistArea projection on/off" ); mDistArea->setProjectionsEnabled( enabled ); updateFullExtent(); + mLastExtent.setMinimal(); emit hasCrsTransformEnabled( enabled ); } } @@ -681,11 +682,24 @@ void QgsMapRenderer::setDestinationCrs( const QgsCoordinateReferenceSystem& crs QgsDebugMsg( "* DestCRS.srsid() = " + QString::number( crs.srsid() ) ); if ( *mDestCRS != crs ) { + QgsRectangle rect; + if ( hasCrsTransformEnabled() && !mExtent.isEmpty() ) + { + QgsCoordinateTransform transform( *mDestCRS, crs ); + rect = transform.transformBoundingBox( mExtent ); + } + invalidateCachedLayerCrs(); QgsDebugMsg( "Setting DistArea CRS to " + QString::number( crs.srsid() ) ); mDistArea->setSourceCrs( crs.srsid() ); *mDestCRS = crs; updateFullExtent(); + + if ( !rect.isEmpty() ) + { + setExtent( rect ); + } + emit destinationSrsChanged(); } } diff --git a/src/core/raster/qgsrasterlayer.cpp b/src/core/raster/qgsrasterlayer.cpp index 0e28e1a2a28a..78c24130dccd 100644 --- a/src/core/raster/qgsrasterlayer.cpp +++ b/src/core/raster/qgsrasterlayer.cpp @@ -656,7 +656,7 @@ bool QgsRasterLayer::draw( QgsRenderContext& rendererContext ) catch ( QgsCsException &cs ) { QgsMessageLog::logMessage( tr( "Could not reproject view extent: %1" ).arg( cs.what() ), tr( "Raster" ) ); - myProjectedViewExtent = rendererContext.extent(); + myProjectedViewExtent.setMinimal(); } try @@ -666,7 +666,7 @@ bool QgsRasterLayer::draw( QgsRenderContext& rendererContext ) catch ( QgsCsException &cs ) { QgsMessageLog::logMessage( tr( "Could not reproject layer extent: %1" ).arg( cs.what() ), tr( "Raster" ) ); - myProjectedLayerExtent = mLayerExtent; + myProjectedViewExtent.setMinimal(); } } else diff --git a/src/gui/qgsmapcanvas.cpp b/src/gui/qgsmapcanvas.cpp index 894afc7aa7ed..6e3676896279 100644 --- a/src/gui/qgsmapcanvas.cpp +++ b/src/gui/qgsmapcanvas.cpp @@ -123,8 +123,10 @@ QgsMapCanvas::QgsMapCanvas( QWidget * parent, const char *name ) moveCanvasContents( true ); - //connect(mMapRenderer, SIGNAL(updateMap()), this, SLOT(updateMap())); connect( mMapRenderer, SIGNAL( drawError( QgsMapLayer* ) ), this, SLOT( showError( QgsMapLayer* ) ) ); + connect( mMapRenderer, SIGNAL( hasCrsTransformEnabled( bool ) ), this, SLOT( crsTransformEnabled( bool ) ) ); + + crsTransformEnabled( hasCrsTransformEnabled() ); // project handling connect( QgsProject::instance(), SIGNAL( readProject( const QDomDocument & ) ), @@ -1491,7 +1493,6 @@ void QgsMapCanvas::readProject( const QDomDocument & doc ) { QgsDebugMsg( "Couldn't read mapcanvas information from project" ); } - } void QgsMapCanvas::writeProject( QDomDocument & doc ) @@ -1509,8 +1510,6 @@ void QgsMapCanvas::writeProject( QDomDocument & doc ) QDomElement mapcanvasNode = doc.createElement( "mapcanvas" ); qgisNode.appendChild( mapcanvasNode ); mMapRenderer->writeXML( mapcanvasNode, doc ); - - } void QgsMapCanvas::zoomByFactor( double scaleFactor ) @@ -1541,3 +1540,15 @@ void QgsMapCanvas::dragEnterEvent( QDragEnterEvent * e ) // parent (e.g. QgisApp) to handle drops of map layers etc. e->ignore(); } + +void QgsMapCanvas::crsTransformEnabled( bool enabled ) +{ + if ( enabled ) + { + QgsDebugMsg( "refreshing after reprojection was enabled" ); + refresh(); + connect( mMapRenderer, SIGNAL( destinationSrsChanged() ), this, SLOT( refresh() ) ); + } + else + disconnect( mMapRenderer, SIGNAL( destinationSrsChanged() ), this, SLOT( refresh() ) ); +} diff --git a/src/gui/qgsmapcanvas.h b/src/gui/qgsmapcanvas.h index aa8a3896a55c..465ebc379ca8 100644 --- a/src/gui/qgsmapcanvas.h +++ b/src/gui/qgsmapcanvas.h @@ -395,6 +395,9 @@ class GUI_EXPORT QgsMapCanvas : public QGraphicsView /// Handle pattern for implementation object std::auto_ptr mCanvasProperties; + private slots: + void crsTransformEnabled( bool ); + private: /// this class is non-copyable /**