Skip to content

Commit 65f32bc

Browse files
committed
reproject canvas extent on crs change with OTFR enabled
1 parent 33ab487 commit 65f32bc

File tree

5 files changed

+36
-8
lines changed

5 files changed

+36
-8
lines changed

src/core/qgscoordinatetransform.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -494,11 +494,11 @@ QgsRectangle QgsCoordinateTransform::transformBoundingBox( const QgsRectangle re
494494
bb_rect.combineExtentWith( x[i], y[i] );
495495
}
496496

497-
QgsDebugMsg( "Projected extent: " + QString(( bb_rect.toString() ).toLocal8Bit().data() ) );
497+
QgsDebugMsg( "Projected extent: " + bb_rect.toString() );
498498

499499
if ( bb_rect.isEmpty() )
500500
{
501-
QgsMessageLog::logMessage( tr( "Reprojected extent is empty. Original extent: %1" ).arg( rect.toString() ), tr( "CRS" ) );
501+
QgsDebugMsg( "Original extent: " + rect.toString() );
502502
}
503503

504504
return bb_rect;

src/core/qgsmaprenderer.cpp

+14
Original file line numberDiff line numberDiff line change
@@ -666,6 +666,7 @@ void QgsMapRenderer::setProjectionsEnabled( bool enabled )
666666
QgsDebugMsg( "Adjusting DistArea projection on/off" );
667667
mDistArea->setProjectionsEnabled( enabled );
668668
updateFullExtent();
669+
mLastExtent.setMinimal();
669670
emit hasCrsTransformEnabled( enabled );
670671
}
671672
}
@@ -681,11 +682,24 @@ void QgsMapRenderer::setDestinationCrs( const QgsCoordinateReferenceSystem& crs
681682
QgsDebugMsg( "* DestCRS.srsid() = " + QString::number( crs.srsid() ) );
682683
if ( *mDestCRS != crs )
683684
{
685+
QgsRectangle rect;
686+
if ( hasCrsTransformEnabled() && !mExtent.isEmpty() )
687+
{
688+
QgsCoordinateTransform transform( *mDestCRS, crs );
689+
rect = transform.transformBoundingBox( mExtent );
690+
}
691+
684692
invalidateCachedLayerCrs();
685693
QgsDebugMsg( "Setting DistArea CRS to " + QString::number( crs.srsid() ) );
686694
mDistArea->setSourceCrs( crs.srsid() );
687695
*mDestCRS = crs;
688696
updateFullExtent();
697+
698+
if ( !rect.isEmpty() )
699+
{
700+
setExtent( rect );
701+
}
702+
689703
emit destinationSrsChanged();
690704
}
691705
}

src/core/raster/qgsrasterlayer.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -656,7 +656,7 @@ bool QgsRasterLayer::draw( QgsRenderContext& rendererContext )
656656
catch ( QgsCsException &cs )
657657
{
658658
QgsMessageLog::logMessage( tr( "Could not reproject view extent: %1" ).arg( cs.what() ), tr( "Raster" ) );
659-
myProjectedViewExtent = rendererContext.extent();
659+
myProjectedViewExtent.setMinimal();
660660
}
661661

662662
try
@@ -666,7 +666,7 @@ bool QgsRasterLayer::draw( QgsRenderContext& rendererContext )
666666
catch ( QgsCsException &cs )
667667
{
668668
QgsMessageLog::logMessage( tr( "Could not reproject layer extent: %1" ).arg( cs.what() ), tr( "Raster" ) );
669-
myProjectedLayerExtent = mLayerExtent;
669+
myProjectedViewExtent.setMinimal();
670670
}
671671
}
672672
else

src/gui/qgsmapcanvas.cpp

+15-4
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,10 @@ QgsMapCanvas::QgsMapCanvas( QWidget * parent, const char *name )
123123

124124
moveCanvasContents( true );
125125

126-
//connect(mMapRenderer, SIGNAL(updateMap()), this, SLOT(updateMap()));
127126
connect( mMapRenderer, SIGNAL( drawError( QgsMapLayer* ) ), this, SLOT( showError( QgsMapLayer* ) ) );
127+
connect( mMapRenderer, SIGNAL( hasCrsTransformEnabled( bool ) ), this, SLOT( crsTransformEnabled( bool ) ) );
128+
129+
crsTransformEnabled( hasCrsTransformEnabled() );
128130

129131
// project handling
130132
connect( QgsProject::instance(), SIGNAL( readProject( const QDomDocument & ) ),
@@ -1491,7 +1493,6 @@ void QgsMapCanvas::readProject( const QDomDocument & doc )
14911493
{
14921494
QgsDebugMsg( "Couldn't read mapcanvas information from project" );
14931495
}
1494-
14951496
}
14961497

14971498
void QgsMapCanvas::writeProject( QDomDocument & doc )
@@ -1509,8 +1510,6 @@ void QgsMapCanvas::writeProject( QDomDocument & doc )
15091510
QDomElement mapcanvasNode = doc.createElement( "mapcanvas" );
15101511
qgisNode.appendChild( mapcanvasNode );
15111512
mMapRenderer->writeXML( mapcanvasNode, doc );
1512-
1513-
15141513
}
15151514

15161515
void QgsMapCanvas::zoomByFactor( double scaleFactor )
@@ -1541,3 +1540,15 @@ void QgsMapCanvas::dragEnterEvent( QDragEnterEvent * e )
15411540
// parent (e.g. QgisApp) to handle drops of map layers etc.
15421541
e->ignore();
15431542
}
1543+
1544+
void QgsMapCanvas::crsTransformEnabled( bool enabled )
1545+
{
1546+
if ( enabled )
1547+
{
1548+
QgsDebugMsg( "refreshing after reprojection was enabled" );
1549+
refresh();
1550+
connect( mMapRenderer, SIGNAL( destinationSrsChanged() ), this, SLOT( refresh() ) );
1551+
}
1552+
else
1553+
disconnect( mMapRenderer, SIGNAL( destinationSrsChanged() ), this, SLOT( refresh() ) );
1554+
}

src/gui/qgsmapcanvas.h

+3
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,9 @@ class GUI_EXPORT QgsMapCanvas : public QGraphicsView
395395
/// Handle pattern for implementation object
396396
std::auto_ptr<CanvasProperties> mCanvasProperties;
397397

398+
private slots:
399+
void crsTransformEnabled( bool );
400+
398401
private:
399402
/// this class is non-copyable
400403
/**

0 commit comments

Comments
 (0)