Skip to content

Commit

Permalink
Fix geometry transform for output GeoPDF features, clean up UI
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Aug 19, 2019
1 parent 5f3f443 commit f5b90f5
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 28 deletions.
21 changes: 13 additions & 8 deletions src/core/qgsmaprenderertask.cpp
Expand Up @@ -72,9 +72,14 @@ class QgsMapRendererTaskRenderedFeatureHandler : public QgsRenderedFeatureHandle
{
public:

QgsMapRendererTaskRenderedFeatureHandler( QgsMapRendererTaskGeoPdfExporter *exporter )
QgsMapRendererTaskRenderedFeatureHandler( QgsMapRendererTaskGeoPdfExporter *exporter, const QgsMapSettings &settings )
: mExporter( exporter )
{}
, mMapSettings( settings )
{
// PDF coordinate space uses a hardcoded DPI of 72, also vertical dimension is flipped from QGIS dimension
const double pageHeightPdfUnits = settings.outputSize().height() * 72.0 / settings.outputDpi();
mTransform = QTransform::fromTranslate( 0, pageHeightPdfUnits ).scale( 72.0 / mMapSettings.outputDpi(), -72.0 / mMapSettings.outputDpi() );
}

void handleRenderedFeature( const QgsFeature &feature, const QgsGeometry &renderedBounds, const QgsRenderedFeatureHandlerInterface::RenderedFeatureContext &context ) override
{
Expand All @@ -83,11 +88,8 @@ class QgsMapRendererTaskRenderedFeatureHandler : public QgsRenderedFeatureHandle
// 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 PDF coordinates (TODO - check)
// PDF coordinate space uses a hardcoded DPI of 72
QTransform pixelToPdfTransform = QTransform::fromScale( 25.4 / context.renderContext.scaleFactor() / 72.0, 25.4 / context.renderContext.scaleFactor() / 72.0 );
QgsGeometry transformed = renderedBounds;
transformed.transform( pixelToPdfTransform );
transformed.transform( mTransform );

// always convert to multitype, to make things consistent
transformed.convertToMultiType();
Expand All @@ -103,14 +105,17 @@ class QgsMapRendererTaskRenderedFeatureHandler : public QgsRenderedFeatureHandle
private:

QgsMapRendererTaskGeoPdfExporter *mExporter = nullptr;
QgsMapSettings mMapSettings;
//! Transform from output space (pixels) to PDF space (pixels at 72 dpi)
QTransform mTransform;

};

///@endcond

QgsMapRendererTask::QgsMapRendererTask( const QgsMapSettings &ms, const QString &fileName, const QString &fileFormat, const bool forceRaster,
const bool geoPDF, const QgsAbstractGeoPdfExporter::ExportDetails &geoPdfExportDetails )
: QgsTask( tr( "Saving as image" ) )
: QgsTask( fileFormat == QStringLiteral( "PDF" ) ? tr( "Saving as PDF" ) : tr( "Saving as image" ) )
, mMapSettings( ms )
, mFileName( fileName )
, mFileFormat( fileFormat )
Expand Down Expand Up @@ -370,7 +375,7 @@ void QgsMapRendererTask::prepare()
mGeoPdfExporter = qgis::make_unique< QgsMapRendererTaskGeoPdfExporter >( mMapSettings );
if ( mGeoPdfExportDetails.includeFeatures )
{
mRenderedFeatureHandler = qgis::make_unique< QgsMapRendererTaskRenderedFeatureHandler >( static_cast< QgsMapRendererTaskGeoPdfExporter * >( mGeoPdfExporter.get() ) );
mRenderedFeatureHandler = qgis::make_unique< QgsMapRendererTaskRenderedFeatureHandler >( static_cast< QgsMapRendererTaskGeoPdfExporter * >( mGeoPdfExporter.get() ), mMapSettings );
mMapSettings.addRenderedFeatureHandler( mRenderedFeatureHandler.get() );
}
mJob.reset( new QgsMapRendererStagedRenderJob( mMapSettings, QgsMapRendererStagedRenderJob::RenderLabelsByMapLayer ) );
Expand Down
41 changes: 21 additions & 20 deletions src/ui/qgsmapsavedialog.ui
Expand Up @@ -100,6 +100,16 @@
<property name="bottomMargin">
<number>0</number>
</property>
<item row="2" column="0" colspan="2">
<widget class="QCheckBox" name="mExportMetadataCheckBox">
<property name="text">
<string>Export RDF metadata (title, author, etc.)</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="mGeoPdfFormatComboBox"/>
</item>
Expand All @@ -110,30 +120,20 @@
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
<widget class="QCheckBox" name="mExportGeoPdfFeaturesCheckBox">
<property name="text">
<string>Include vector feature information</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
<item>
<widget class="QCheckBox" name="mExportMetadataCheckBox">
<property name="text">
<string>Export RDF metadata (title, author, etc.)</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="mExportGeoPdfFeaturesCheckBox">
<property name="text">
<string>Include vector feature information</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
Expand Down Expand Up @@ -405,6 +405,7 @@ Rasterizing the map is recommended when such effects are used.</string>
<tabstop>mGeoPDFGroupBox</tabstop>
<tabstop>mGeoPdfFormatComboBox</tabstop>
<tabstop>mExportMetadataCheckBox</tabstop>
<tabstop>mExportGeoPdfFeaturesCheckBox</tabstop>
<tabstop>mSaveAsRaster</tabstop>
<tabstop>mSimplifyGeometriesCheckbox</tabstop>
<tabstop>mTextRenderFormatComboBox</tabstop>
Expand Down

0 comments on commit f5b90f5

Please sign in to comment.