diff --git a/src/core/layout/qgslayoutgeopdfexporter.cpp b/src/core/layout/qgslayoutgeopdfexporter.cpp index b9841c2eb01a..5607e5233a2d 100644 --- a/src/core/layout/qgslayoutgeopdfexporter.cpp +++ b/src/core/layout/qgslayoutgeopdfexporter.cpp @@ -26,6 +26,13 @@ class QgsGeoPdfRenderedFeatureHandler: public QgsRenderedFeatureHandlerInterface { public: + + QgsGeoPdfRenderedFeatureHandler( QgsLayoutItemMap *map ) + : mMap( map ) + , mMapToLayoutTransform( mMap->transform() ) + { + } + void handleRenderedFeature( const QgsFeature &feature, const QgsGeometry &renderedBounds, const QgsRenderedFeatureHandlerInterface::RenderedFeatureContext &context ) override { // is it a hack retrieving the layer ID from an expression context like this? possibly... BUT @@ -33,11 +40,17 @@ class QgsGeoPdfRenderedFeatureHandler: public QgsRenderedFeatureHandlerInterface // and use it to retrieve QgsMapLayers mid-way through a render operation. Lesser of two evils it is! const QString layerId = context.renderContext->expressionContext().variable( QStringLiteral( "layer_id" ) ).toString(); + // transform from pixels to map item coordinates + QTransform pixelToMapItemTransform = QTransform::fromScale( 1.0 / context.renderContext->scaleFactor(), 1.0 / context.renderContext->scaleFactor() ); + QgsGeometry transformed = renderedBounds; + transformed.transform( pixelToMapItemTransform ); + // transform from map item coordinates to page coordinates + transformed.transform( mMapToLayoutTransform ); // we (currently) don't REALLY need a mutex here, because layout maps are always rendered using a single threaded operation. // but we'll play it safe, just in case this changes in future. QMutexLocker locker( &mMutex ); - renderedFeatures[ layerId ].append( QgsLayoutGeoPdfExporter::RenderedFeature( feature, renderedBounds ) ); + renderedFeatures[ layerId ].append( QgsLayoutGeoPdfExporter::RenderedFeature( feature, transformed ) ); } QSet usedAttributes( QgsVectorLayer *, const QgsRenderContext & ) const override @@ -48,6 +61,8 @@ class QgsGeoPdfRenderedFeatureHandler: public QgsRenderedFeatureHandlerInterface QMap< QString, QVector< QgsLayoutGeoPdfExporter::RenderedFeature > > renderedFeatures; private: + QgsLayoutItemMap *mMap = nullptr; + QTransform mMapToLayoutTransform; QMutex mMutex; }; @@ -60,7 +75,7 @@ QgsLayoutGeoPdfExporter::QgsLayoutGeoPdfExporter( QgsLayout *layout ) mLayout->layoutItems( maps ); for ( QgsLayoutItemMap *map : qgis::as_const( maps ) ) { - QgsGeoPdfRenderedFeatureHandler *handler = new QgsGeoPdfRenderedFeatureHandler(); + QgsGeoPdfRenderedFeatureHandler *handler = new QgsGeoPdfRenderedFeatureHandler( map ); mMapHandlers.insert( map, handler ); map->addRenderedFeatureHandler( handler ); } diff --git a/tests/src/core/testqgslayoutgeopdfexport.cpp b/tests/src/core/testqgslayoutgeopdfexport.cpp index d78afacdff4d..73d2f2f72369 100644 --- a/tests/src/core/testqgslayoutgeopdfexport.cpp +++ b/tests/src/core/testqgslayoutgeopdfexport.cpp @@ -124,7 +124,7 @@ void TestQgsLayoutGeoPdfExport::testCollectingFeatures() QCOMPARE( lineFeature1.attribute( 0 ).toString(), QStringLiteral( "Highway" ) ); QCOMPARE( lineFeature1.attribute( 1 ).toDouble(), 1.0 ); QgsDebugMsg( lineGeometry1.asWkt( 1 ) ); - QCOMPARE( lineGeometry1.asWkt( 1 ), QStringLiteral( "MultiLineString ((935.3 4.3, 943.9 25.9, 948.2 34.5, 952.6 40.9, 967.6 53.9, 1010.7 75.4, 1056 94.8, 1068.9 105.6, 1090.5 127.2, 1092.6 131.5, 1097 157.3, 1099.1 170.3, 1105.6 189.6, 1107.7 198.3, 1109.9 219.8, 1114.2 226.3, 1120.7 239.2, 1127.1 252.1, 1142.2 269.4, 1144.4 273.7, 1146.5 286.6, 1146.5 306, 1146.5 314.6, 1150.8 331.9, 1155.1 340.5, 1172.4 353.4, 1187.5 362.1, 1202.6 370.7, 1217.6 377.1, 1219.8 390.1, 1219.8 398.7, 1211.2 413.8, 1206.9 418.1, 1200.4 431, 1193.9 439.6, 1187.5 446.1, 1185.3 450.4, 1183.2 461.2, 1181 469.8, 1181 478.4, 1187.5 493.5, 1191.8 502.1, 1191.8 502.1, 1213.3 549.6, 1202.6 571.1, 1193.9 579.7, 1178.8 605.6, 1178.8 622.8, 1159.4 640.1, 1153 650.8, 1142.2 668.1, 1142.2 676.7, 1142.2 687.5, 1142.2 696.1, 1142.2 706.9, 1148.7 715.5, 1150.8 726.3, 1155.1 734.9, 1163.8 743.5, 1172.4 756.4, 1185.3 771.5, 1206.9 812.5, 1209 814.6, 1224.1 829.7, 1230.6 836.2, 1245.7 857.7, 1256.4 866.4, 1275.8 879.3, 1288.8 890.1, 1303.8 905.1, 1314.6 911.6, 1329.7 924.5, 1349.1 935.3, 1364.2 946.1, 1387.9 963.3, 1396.5 972, 1403 987, 1403 1000, 1403 1012.9, 1400.8 1017.2, 1392.2 1030.1, 1379.3 1049.5, 1370.6 1058.2, 1368.5 1066.8, 1368.5 1077.6, 1370.6 1086.2, 1377.1 1103.4, 1379.3 1112, 1392.2 1127.1, 1398.7 1133.6, 1407.3 1146.5, 1420.2 1165.9, 1454.7 1181))" ) ); + QCOMPARE( lineGeometry1.asWkt( 1 ), QStringLiteral( "MultiLineString ((79.2 0.4, 79.9 2.2, 80.3 2.9, 80.6 3.5, 81.9 4.6, 85.6 6.4, 89.4 8, 90.5 8.9, 92.3 10.8, 92.5 11.1, 92.9 13.3, 93.1 14.4, 93.6 16.1, 93.8 16.8, 94 18.6, 94.3 19.2, 94.9 20.3, 95.4 21.3, 96.7 22.8, 96.9 23.2, 97.1 24.3, 97.1 25.9, 97.1 26.6, 97.4 28.1, 97.8 28.8, 99.3 29.9, 100.5 30.7, 101.8 31.4, 103.1 31.9, 103.3 33, 103.3 33.8, 102.5 35, 102.2 35.4, 101.6 36.5, 101.1 37.2, 100.5 37.8, 100.4 38.1, 100.2 39, 100 39.8, 100 40.5, 100.5 41.8, 100.9 42.5, 100.9 42.5, 102.7 46.5, 101.8 48.4, 101.1 49.1, 99.8 51.3, 99.8 52.7, 98.2 54.2, 97.6 55.1, 96.7 56.6, 96.7 57.3, 96.7 58.2, 96.7 58.9, 96.7 59.8, 97.3 60.6, 97.4 61.5, 97.8 62.2, 98.5 63, 99.3 64, 100.4 65.3, 102.2 68.8, 102.4 69, 103.6 70.2, 104.2 70.8, 105.5 72.6, 106.4 73.4, 108 74.4, 109.1 75.4, 110.4 76.6, 111.3 77.2, 112.6 78.3, 114.2 79.2, 115.5 80.1, 117.5 81.6, 118.2 82.3, 118.8 83.6, 118.8 84.7, 118.8 85.8, 118.6 86.1, 117.9 87.2, 116.8 88.9, 116 89.6, 115.9 90.3, 115.9 91.2, 116 92, 116.6 93.4, 116.8 94.2, 117.9 95.4, 118.4 96, 119.2 97.1, 120.2 98.7, 123.2 100))" ) ); QVector< QgsLayoutGeoPdfExporter::RenderedFeature > pointFeatures = renderedFeatures.value( pointsLayer->id() ); QCOMPARE( pointFeatures.count(), 15 ); @@ -146,7 +146,7 @@ void TestQgsLayoutGeoPdfExport::testCollectingFeatures() QCOMPARE( pointFeature3.attribute( 3 ).toInt(), 1 ); QCOMPARE( pointFeature3.attribute( 4 ).toInt(), 1 ); QCOMPARE( pointFeature3.attribute( 5 ).toInt(), 2 ); - QCOMPARE( pointGeometry3.asWkt( 1 ), QStringLiteral( "Polygon ((1226.4 516.9, 1359.2 516.9, 1359.2 649.7, 1226.4 649.7, 1226.4 516.9))" ) ); + QCOMPARE( pointGeometry3.asWkt( 1 ), QStringLiteral( "Polygon ((103.8 43.8, 115.1 43.8, 115.1 55, 103.8 55, 103.8 43.8))" ) ); } QGSTEST_MAIN( TestQgsLayoutGeoPdfExport )