Skip to content

Commit

Permalink
Transform rendered feature bounds to layout item coordinate space
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Aug 17, 2019
1 parent e66135b commit c54af27
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 4 deletions.
19 changes: 17 additions & 2 deletions src/core/layout/qgslayoutgeopdfexporter.cpp
Expand Up @@ -26,18 +26,31 @@
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
// the alternative is adding a layer ID member to QgsRenderContext, and that's just asking for people to abuse it
// 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<QString> usedAttributes( QgsVectorLayer *, const QgsRenderContext & ) const override
Expand All @@ -48,6 +61,8 @@ class QgsGeoPdfRenderedFeatureHandler: public QgsRenderedFeatureHandlerInterface
QMap< QString, QVector< QgsLayoutGeoPdfExporter::RenderedFeature > > renderedFeatures;

private:
QgsLayoutItemMap *mMap = nullptr;
QTransform mMapToLayoutTransform;
QMutex mMutex;
};

Expand All @@ -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 );
}
Expand Down
4 changes: 2 additions & 2 deletions tests/src/core/testqgslayoutgeopdfexport.cpp
Expand Up @@ -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 );
Expand All @@ -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 )
Expand Down

0 comments on commit c54af27

Please sign in to comment.