From 345ce734c4578b001a6290cc7c409b2880edc2a7 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Sat, 25 Mar 2017 17:58:48 +1000 Subject: [PATCH] [composer] Correctly draw overview frame when map item CRS differs --- src/core/composer/qgscomposermapoverview.cpp | 20 +++++++++++++++ tests/src/core/testqgscomposermapoverview.cpp | 23 ++++++++++++++++++ ...ected_composermap_overview_reprojected.png | Bin 0 -> 6093 bytes ..._composermap_overview_reprojected_mask.png | Bin 0 -> 3849 bytes 4 files changed, 43 insertions(+) create mode 100644 tests/testdata/control_images/composer_mapoverview/expected_composermap_overview_reprojected/expected_composermap_overview_reprojected.png create mode 100644 tests/testdata/control_images/composer_mapoverview/expected_composermap_overview_reprojected/expected_composermap_overview_reprojected_mask.png diff --git a/src/core/composer/qgscomposermapoverview.cpp b/src/core/composer/qgscomposermapoverview.cpp index b9755967cb0..ff8bbda58ea 100644 --- a/src/core/composer/qgscomposermapoverview.cpp +++ b/src/core/composer/qgscomposermapoverview.cpp @@ -23,6 +23,7 @@ #include "qgsmapsettings.h" #include "qgspainting.h" #include "qgscomposerutils.h" +#include "qgscsexception.h" #include @@ -82,6 +83,25 @@ void QgsComposerMapOverview::draw( QPainter *painter ) //get polygon for other overview frame map's extent (use visibleExtentPolygon as it accounts for map rotation) QPolygonF otherExtent = overviewFrameMap->visibleExtentPolygon(); + if ( overviewFrameMap->crs() != + mComposerMap->crs() ) + { + QgsGeometry g = QgsGeometry::fromQPolygonF( otherExtent ); + + // reproject extent + QgsCoordinateTransform ct( overviewFrameMap->crs(), + mComposerMap->crs() ); + g = g.densifyByCount( 20 ); + try + { + g.transform( ct ); + } + catch ( QgsCsException & ) + { + } + + otherExtent = g.asQPolygonF(); + } //get current map's extent as a QPolygonF QPolygonF thisExtent = mComposerMap->visibleExtentPolygon(); diff --git a/tests/src/core/testqgscomposermapoverview.cpp b/tests/src/core/testqgscomposermapoverview.cpp index 3711da26f12..2e2a59332a5 100644 --- a/tests/src/core/testqgscomposermapoverview.cpp +++ b/tests/src/core/testqgscomposermapoverview.cpp @@ -50,6 +50,7 @@ class TestQgsComposerMapOverview : public QObject void overviewMapBlending(); //test if blend modes with overview map frame works void overviewMapInvert(); //test if invert of overview map frame works void overviewMapCenter(); //test if centering of overview map frame works + void overviewReprojected(); //test that overview frame is reprojected private: QgsComposition *mComposition = nullptr; @@ -217,5 +218,27 @@ void TestQgsComposerMapOverview::overviewMapCenter() QVERIFY( testResult ); } +void TestQgsComposerMapOverview::overviewReprojected() +{ + QgsComposerMap *overviewMap = new QgsComposerMap( mComposition, 20, 130, 70, 70 ); + overviewMap->setFrameEnabled( true ); + //overviewMap->setLayers( QList() << mRasterLayer ); + mComposition->addComposerMap( overviewMap ); + + mComposerMap->setCrs( QgsCoordinateReferenceSystem::fromEpsgId( 4326 ) ); + overviewMap->setCrs( QgsCoordinateReferenceSystem::fromEpsgId( 54030 ) ); + + mComposerMap->setNewExtent( QgsRectangle( 93, -64.245, 120.6, -45 ) ); + overviewMap->setNewExtent( QgsRectangle( 4712502, -7620278, 10872777, -2531356 ) ); + overviewMap->overview()->setFrameMap( mComposerMap->id() ); + + QgsCompositionChecker checker( QStringLiteral( "composermap_overview_reprojected" ), mComposition ); + checker.setControlPathPrefix( QStringLiteral( "composer_mapoverview" ) ); + + bool testResult = checker.testComposition( mReport, 0, 0 ); + mComposition->removeComposerItem( overviewMap ); + QVERIFY( testResult ); +} + QGSTEST_MAIN( TestQgsComposerMapOverview ) #include "testqgscomposermapoverview.moc" diff --git a/tests/testdata/control_images/composer_mapoverview/expected_composermap_overview_reprojected/expected_composermap_overview_reprojected.png b/tests/testdata/control_images/composer_mapoverview/expected_composermap_overview_reprojected/expected_composermap_overview_reprojected.png new file mode 100644 index 0000000000000000000000000000000000000000..c8510ae07a27df35cabd40c8534e6892e23740bb GIT binary patch literal 6093 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 literal 0 HcmV?d00001 diff --git a/tests/testdata/control_images/composer_mapoverview/expected_composermap_overview_reprojected/expected_composermap_overview_reprojected_mask.png b/tests/testdata/control_images/composer_mapoverview/expected_composermap_overview_reprojected/expected_composermap_overview_reprojected_mask.png new file mode 100644 index 0000000000000000000000000000000000000000..0ec8d8e27208682ecddb1f095b445f33a43ae566 GIT binary patch literal 3849 zcmeAS@N?(olHy`uVBq!ia0y~yU`b+NV3y)w0*W}bm%jp1Y)RhkE)4%caKYZ?lYt_f z1s;*b3=DjSL74G){)!Z!AbW|YuPggQW=VD{N&628bwIgko-U3d6}R5r+{oKtAmV(` zBI*BBU(pqUyh`QLN4!3Nxm*U+x4}mkNS;su5;IvC7!*JjqzExEH247BFu@bZGvZ`m za8P3;OA*Be;ByK-IZFLPi@<=pm)y{V8-OoZ@yQWo06sUo0(rh%LU@iZLW6EztA)WhG?Q6Z8>Af>u|oLYMt=QM@`v66BaOk+)z4*}Q$iB}19m5w literal 0 HcmV?d00001