Merge pull request #4005 from nyalldawson/comp_mapsettings

Remove some more QgsComposition::mapSettings use, also support different CRS in composer map items
This commit is contained in:
Nyall Dawson 2017-01-18 12:57:46 +10:00 committed by GitHub
commit df3fdf52a8
41 changed files with 412 additions and 128 deletions

View File

@ -127,6 +127,10 @@ class QgsComposerMap : QgsComposerItem
//! @note not available in python bindings
// QgsRectangle* currentMapExtent();
QgsCoordinateReferenceSystem crs() const;
QgsCoordinateReferenceSystem presetCrs() const;
void setCrs( const QgsCoordinateReferenceSystem& crs );
PreviewMode previewMode() const;
void setPreviewMode( PreviewMode m );

View File

@ -249,5 +249,5 @@ class QgsComposerUtils
* QgsComposition::referenceMap().
* @note added in QGIS 3.0
*/
static QgsRenderContext createRenderContext( QgsComposition* composition, QPainter& painter );
static QgsRenderContext createRenderContext( QgsComposition* composition, QPainter* painter );
};

View File

@ -133,6 +133,9 @@ class QgsComposerView : QGraphicsView
*/
void setPreviewMode( QgsPreviewEffect::PreviewMode mode );
void setMapCanvas( QgsMapCanvas* canvas );
QgsMapCanvas* mapCanvas() const;
protected:
void mousePressEvent( QMouseEvent* );
void mouseReleaseEvent( QMouseEvent* );

View File

@ -4027,6 +4027,7 @@ void QgsComposer::createComposerView()
delete mView;
mView = new QgsComposerView();
mView->setMapCanvas( mQgis->mapCanvas() );
mView->setContentsMargins( 0, 0, 0, 0 );
mView->setHorizontalRuler( mHorizontalRuler );
mView->setVerticalRuler( mVerticalRuler );

View File

@ -1035,7 +1035,7 @@ void QgsComposerMapGridWidget::on_mMapGridCRSButton_clicked()
QgsGenericProjectionSelector crsDialog( this );
QgsCoordinateReferenceSystem crs = mComposerMapGrid->crs();
QString currentAuthId = crs.isValid() ? crs.authid() : mComposerMap->composition()->mapSettings().destinationCrs().authid();
QString currentAuthId = crs.isValid() ? crs.authid() : mComposerMap->crs().authid();
crsDialog.setSelectedAuthId( currentAuthId );
if ( crsDialog.exec() == QDialog::Accepted )

View File

@ -37,6 +37,7 @@
#include "qgsmapthemecollection.h"
#include "qgsmapthemes.h"
#include "qgisgui.h"
#include "qgscsexception.h"
#include <QMessageBox>
@ -63,6 +64,9 @@ QgsComposerMapWidget::QgsComposerMapWidget( QgsComposerMap* composerMap )
mPreviewModeComboBox->insertItem( 1, tr( "Render" ) );
mPreviewModeComboBox->insertItem( 2, tr( "Rectangle" ) );
mCrsSelector->setOptionVisible( QgsProjectionSelectionWidget::CrsNotSet, true );
mCrsSelector->setNotSetText( tr( "Use project CRS" ) );
// follow preset combo
mFollowVisibilityPresetCombo->setModel( new QStringListModel( mFollowVisibilityPresetCombo ) );
connect( mFollowVisibilityPresetCombo, SIGNAL( currentIndexChanged( int ) ), this, SLOT( followVisibilityPresetSelected( int ) ) );
@ -99,6 +103,8 @@ QgsComposerMapWidget::QgsComposerMapWidget( QgsComposerMap* composerMap )
connect( mOverviewFrameMapComboBox, SIGNAL( itemChanged( QgsComposerItem* ) ), this, SLOT( overviewMapChanged( QgsComposerItem* ) ) );
}
connect( mCrsSelector, &QgsProjectionSelectionWidget::crsChanged, this, &QgsComposerMapWidget::mapCrsChanged );
updateGuiElements();
loadGridEntries();
loadOverviewEntries();
@ -260,6 +266,42 @@ void QgsComposerMapWidget::cleanUpOverviewFrameStyleSelector( QgsPanelWidget* co
mComposerMap->endCommand();
}
void QgsComposerMapWidget::mapCrsChanged( const QgsCoordinateReferenceSystem& crs )
{
if ( !mComposerMap )
{
return;
}
if ( mComposerMap->presetCrs() == crs )
return;
// try to reproject to maintain extent
QgsCoordinateReferenceSystem oldCrs = mComposerMap->crs();
bool updateExtent = false;
QgsRectangle newExtent;
try
{
QgsCoordinateTransform xForm( oldCrs, crs.isValid() ? crs : QgsProject::instance()->crs() );
QgsRectangle prevExtent = *mComposerMap->currentMapExtent();
newExtent = xForm.transformBoundingBox( prevExtent );
updateExtent = true;
}
catch ( QgsCsException & )
{
//transform failed, don't update extent
}
mComposerMap->beginCommand( tr( "Map CRS changed" ) );
mComposerMap->setCrs( crs );
if ( updateExtent )
mComposerMap->zoomToExtent( newExtent );
mComposerMap->endCommand();
mComposerMap->cache();
mComposerMap->update();
}
void QgsComposerMapWidget::on_mAtlasCheckBox_toggled( bool checked )
{
if ( !mComposerMap )
@ -471,6 +513,23 @@ void QgsComposerMapWidget::on_mSetToMapCanvasExtentButton_clicked()
QgsRectangle newExtent = QgisApp::instance()->mapCanvas()->mapSettings().visibleExtent();
//transform?
if ( QgisApp::instance()->mapCanvas()->mapSettings().destinationCrs()
!= mComposerMap->crs() )
{
try
{
QgsCoordinateTransform xForm( QgisApp::instance()->mapCanvas()->mapSettings().destinationCrs(),
mComposerMap->crs() );
newExtent = xForm.transformBoundingBox( newExtent );
}
catch ( QgsCsException & )
{
//transform failed, better not proceed
return;
}
}
mComposerMap->beginCommand( tr( "Map extent changed" ) );
mComposerMap->zoomToExtent( newExtent );
mComposerMap->endCommand();
@ -487,6 +546,23 @@ void QgsComposerMapWidget::on_mViewExtentInCanvasButton_clicked()
if ( !currentMapExtent.isEmpty() )
{
//transform?
if ( QgisApp::instance()->mapCanvas()->mapSettings().destinationCrs()
!= mComposerMap->crs() )
{
try
{
QgsCoordinateTransform xForm( mComposerMap->crs(),
QgisApp::instance()->mapCanvas()->mapSettings().destinationCrs() );
currentMapExtent = xForm.transformBoundingBox( currentMapExtent );
}
catch ( QgsCsException & )
{
//transform failed, better not proceed
return;
}
}
QgisApp::instance()->mapCanvas()->setExtent( currentMapExtent );
QgisApp::instance()->mapCanvas()->refresh();
}
@ -532,6 +608,8 @@ void QgsComposerMapWidget::updateGuiElements()
blockAllSignals( true );
whileBlocking( mCrsSelector )->setCrs( mComposerMap->presetCrs() );
//width, height, scale
double scale = mComposerMap->scale();

View File

@ -121,6 +121,8 @@ class QgsComposerMapWidget: public QgsComposerItemBaseWidget, private Ui::QgsCom
void updateOverviewFrameStyleFromWidget();
void cleanUpOverviewFrameStyleSelector( QgsPanelWidget* container );
void mapCrsChanged( const QgsCoordinateReferenceSystem& crs );
private:
QgsComposerMap* mComposerMap;

View File

@ -439,7 +439,7 @@ void QgsAtlasComposition::computeExtent( QgsComposerMap* map )
// QgsGeometry::boundingBox is expressed in the geometry"s native CRS
// We have to transform the grometry to the destination CRS and ask for the bounding box
// Note: we cannot directly take the transformation of the bounding box, since transformations are not linear
mTransformedFeatureBounds = currentGeometry( map->composition()->mapSettings().destinationCrs() ).boundingBox();
mTransformedFeatureBounds = currentGeometry( map->crs() ).boundingBox();
}
void QgsAtlasComposition::prepareMap( QgsComposerMap* map )
@ -481,7 +481,7 @@ void QgsAtlasComposition::prepareMap( QgsComposerMap* map )
if ( map->atlasScalingMode() == QgsComposerMap::Fixed || map->atlasScalingMode() == QgsComposerMap::Predefined || isPointLayer )
{
QgsScaleCalculator calc;
calc.setMapUnits( composition()->mapSettings().mapUnits() );
calc.setMapUnits( map->crs().mapUnits() );
calc.setDpi( 25.4 );
double originalScale = calc.calculate( mOrigExtent, map->rect().width() );
double geomCenterX = ( xa1 + xa2 ) / 2.0;

View File

@ -182,7 +182,7 @@ void QgsComposerArrow::drawLine( QPainter *painter )
painter->scale( 1 / dotsPerMM, 1 / dotsPerMM ); //scale painter from mm to dots
//setup render context
QgsRenderContext context = QgsComposerUtils::createRenderContext( mComposition, *painter );
QgsRenderContext context = QgsComposerUtils::createRenderContext( mComposition, painter );
context.setForceVectorOutput( true );
QgsExpressionContext expressionContext = createExpressionContext();

View File

@ -422,7 +422,7 @@ bool QgsComposerAttributeTableV2::getTableContents( QgsComposerTableContents &co
if ( layer )
{
//transform back to layer CRS
QgsCoordinateTransform coordTransform( layer->crs(), mComposition->mapSettings().destinationCrs() );
QgsCoordinateTransform coordTransform( layer->crs(), mComposerMap->crs() );
try
{
selectionRect = coordTransform.transformBoundingBox( selectionRect, QgsCoordinateTransform::ReverseTransform );

View File

@ -27,6 +27,7 @@
#include "qgsdistancearea.h"
#include "qgsjsonutils.h"
#include "qgsmapsettings.h"
#include "qgscomposermap.h"
#include "qgswebpage.h"
#include "qgswebframe.h"
@ -542,7 +543,9 @@ void QgsComposerHtml::setExpressionContext( const QgsFeature &feature, QgsVector
else if ( mComposition )
{
//set to composition's mapsettings' crs
mDistanceArea->setSourceCrs( mComposition->mapSettings().destinationCrs().srsid() );
QgsComposerMap* referenceMap = mComposition->referenceMap();
if ( referenceMap )
mDistanceArea->setSourceCrs( referenceMap->crs().srsid() );
}
if ( mComposition )
{

View File

@ -27,6 +27,7 @@
#include "qgsfontutils.h"
#include "qgsexpressioncontext.h"
#include "qgsmapsettings.h"
#include "qgscomposermap.h"
#include "qgswebview.h"
#include "qgswebframe.h"
@ -261,8 +262,10 @@ void QgsComposerLabel::refreshExpressionContext()
}
else
{
//set to composition's mapsettings' crs
mDistanceArea->setSourceCrs( mComposition->mapSettings().destinationCrs().srsid() );
//set to composition's reference map's crs
QgsComposerMap* referenceMap = mComposition->referenceMap();
if ( referenceMap )
mDistanceArea->setSourceCrs( referenceMap->crs().srsid() );
}
mDistanceArea->setEllipsoidalMode( true );
mDistanceArea->setEllipsoid( mComposition->project()->ellipsoid() );

View File

@ -111,10 +111,10 @@ void QgsComposerLegend::paint( QPainter* painter, const QStyleOptionGraphicsItem
mSettings.setMmPerMapUnit( mComposerMap->mapUnitsToMM() );
// use a temporary QgsMapSettings to find out real map scale
QgsMapSettings ms = mComposerMap->composition()->mapSettings();
ms.setOutputSize( QSizeF( mComposerMap->rect().width() * dotsPerMM, mComposerMap->rect().height() * dotsPerMM ).toSize() );
ms.setExtent( *mComposerMap->currentMapExtent() );
ms.setOutputDpi( dpi );
QSizeF mapSizePixels = QSizeF( mComposerMap->rect().width() * dotsPerMM, mComposerMap->rect().height() * dotsPerMM );
QgsRectangle mapExtent = *mComposerMap->currentMapExtent();
QgsMapSettings ms = mComposerMap->mapSettings( mapExtent, mapSizePixels, dpi );
mSettings.setMapScale( ms.scale() );
}
mInitialMapScaleCalculated = true;
@ -704,7 +704,7 @@ void QgsComposerLegend::doUpdateFilterByMap()
QgsGeometry filterPolygon;
if ( mInAtlas )
{
filterPolygon = composition()->atlasComposition().currentGeometry( composition()->mapSettings().destinationCrs() );
filterPolygon = composition()->atlasComposition().currentGeometry( mComposerMap->crs() );
}
mLegendModel->setLegendFilter( &ms, /* useExtent */ mInAtlas || mLegendFilterByMap, filterPolygon, /* useExpressions */ true );
}

View File

@ -85,9 +85,6 @@ QgsComposerMap::QgsComposerMap( QgsComposition *composition, int x, int y, int w
int bgBlueInt = project->readNumEntry( QStringLiteral( "Gui" ), QStringLiteral( "/CanvasColorBluePart" ), 255 );
setBackgroundColor( QColor( bgRedInt, bgGreenInt, bgBlueInt ) );
//calculate mExtent based on width/height ratio and map canvas extent
mExtent = mComposition->mapSettings().visibleExtent();
init();
setSceneRect( QRectF( x, y, width, height ) );
@ -200,17 +197,17 @@ void QgsComposerMap::draw( QPainter *painter, const QgsRectangle& extent, QSizeF
QgsMapSettings QgsComposerMap::mapSettings( const QgsRectangle& extent, QSizeF size, int dpi ) const
{
const QgsMapSettings &ms = mComposition->mapSettings();
QgsExpressionContext expressionContext = createExpressionContext();
QgsCoordinateReferenceSystem renderCrs = crs();
QgsMapSettings jobMapSettings;
jobMapSettings.setDestinationCrs( renderCrs );
jobMapSettings.setCrsTransformEnabled( true );
jobMapSettings.setExtent( extent );
jobMapSettings.setOutputSize( size.toSize() );
jobMapSettings.setOutputDpi( dpi );
jobMapSettings.setMapUnits( ms.mapUnits() );
jobMapSettings.setMapUnits( renderCrs.mapUnits() );
jobMapSettings.setBackgroundColor( Qt::transparent );
jobMapSettings.setOutputImageFormat( ms.outputImageFormat() );
jobMapSettings.setRotation( mEvaluatedMapRotation );
//set layers to render
@ -233,10 +230,6 @@ QgsMapSettings QgsComposerMap::mapSettings( const QgsRectangle& extent, QSizeF s
}
jobMapSettings.setLayers( layers );
jobMapSettings.setLayerStyleOverrides( layerStyleOverridesToRender( expressionContext ) );
jobMapSettings.setDestinationCrs( ms.destinationCrs() );
jobMapSettings.setCrsTransformEnabled( ms.hasCrsTransformEnabled() );
jobMapSettings.setFlags( ms.flags() );
jobMapSettings.setFlag( QgsMapSettings::DrawSelection, false );
if ( mComposition->plotStyle() == QgsComposition::Print ||
mComposition->plotStyle() == QgsComposition::Postscript )
@ -249,11 +242,13 @@ QgsMapSettings QgsComposerMap::mapSettings( const QgsRectangle& extent, QSizeF s
jobMapSettings.setExpressionContext( context );
// composer-specific overrides of flags
jobMapSettings.setFlag( QgsMapSettings::ForceVectorOutput ); // force vector output (no caching of marker images etc.)
jobMapSettings.setFlag( QgsMapSettings::ForceVectorOutput, true ); // force vector output (no caching of marker images etc.)
jobMapSettings.setFlag( QgsMapSettings::Antialiasing, true );
jobMapSettings.setFlag( QgsMapSettings::DrawEditingInfo, false );
jobMapSettings.setFlag( QgsMapSettings::DrawSelection, false );
jobMapSettings.setFlag( QgsMapSettings::UseAdvancedEffects, mComposition->useAdvancedEffects() ); // respect the composition's useAdvancedEffects flag
jobMapSettings.datumTransformStore() = ms.datumTransformStore();
jobMapSettings.datumTransformStore().setDestinationCrs( renderCrs );
return jobMapSettings;
}
@ -625,7 +620,7 @@ QMap<QString, QString> QgsComposerMap::layerStyleOverridesToRender( const QgsExp
double QgsComposerMap::scale() const
{
QgsScaleCalculator calculator;
calculator.setMapUnits( mComposition->mapSettings().mapUnits() );
calculator.setMapUnits( crs().mapUnits() );
calculator.setDpi( 25.4 ); //QGraphicsView units are mm
return calculator.calculate( *currentMapExtent(), rect().width() );
}
@ -717,7 +712,7 @@ void QgsComposerMap::zoomContent( const double factor, const QPointF point, cons
//and also apply to the map's original extent (see #9602)
//we can't use the scaleRatio calculated earlier, as the scale can vary depending on extent for geographic coordinate systems
QgsScaleCalculator calculator;
calculator.setMapUnits( mComposition->mapSettings().mapUnits() );
calculator.setMapUnits( crs().mapUnits() );
calculator.setDpi( 25.4 ); //QGraphicsView units are mm
double scaleRatio = scale() / calculator.calculate( mExtent, rect().width() );
mExtent.scale( scaleRatio );
@ -777,9 +772,14 @@ void QgsComposerMap::setNewExtent( const QgsRectangle& extent )
void QgsComposerMap::zoomToExtent( const QgsRectangle &extent )
{
QgsRectangle newExtent = extent;
QgsRectangle currentExtent = *currentMapExtent();
//Make sure the width/height ratio is the same as the current composer map extent.
//This is to keep the map item frame size fixed
double currentWidthHeightRatio = currentMapExtent()->width() / currentMapExtent()->height();
double currentWidthHeightRatio = 1.0;
if ( !currentExtent.isNull() )
currentWidthHeightRatio = currentExtent.width() / currentExtent.height();
else
currentWidthHeightRatio = rect().width() / rect().height();
double newWidthHeightRatio = newExtent.width() / newExtent.height();
if ( currentWidthHeightRatio < newWidthHeightRatio )
@ -871,6 +871,20 @@ QgsRectangle* QgsComposerMap::currentMapExtent()
}
}
QgsCoordinateReferenceSystem QgsComposerMap::crs() const
{
if ( mCrs.isValid() )
return mCrs;
else if ( mComposition && mComposition->project() )
return mComposition->project()->crs();
return QgsCoordinateReferenceSystem();
}
void QgsComposerMap::setCrs( const QgsCoordinateReferenceSystem& crs )
{
mCrs = crs;
}
const QgsRectangle* QgsComposerMap::currentMapExtent() const
{
//const version
@ -905,7 +919,7 @@ void QgsComposerMap::setNewScale( double scaleDenominator, bool forceUpdate )
//and also apply to the map's original extent (see #9602)
//we can't use the scaleRatio calculated earlier, as the scale can vary depending on extent for geographic coordinate systems
QgsScaleCalculator calculator;
calculator.setMapUnits( mComposition->mapSettings().mapUnits() );
calculator.setMapUnits( crs().mapUnits() );
calculator.setDpi( 25.4 ); //QGraphicsView units are mm
scaleRatio = scaleDenominator / calculator.calculate( mExtent, rect().width() );
mExtent.scale( scaleRatio );
@ -1261,6 +1275,13 @@ bool QgsComposerMap::writeXml( QDomElement& elem, QDomDocument & doc ) const
extentElem.setAttribute( QStringLiteral( "ymax" ), qgsDoubleToString( mExtent.yMaximum() ) );
composerMapElem.appendChild( extentElem );
if ( mCrs.isValid() )
{
QDomElement crsElem = doc.createElement( QStringLiteral( "crs" ) );
mCrs.writeXml( crsElem, doc );
composerMapElem.appendChild( crsElem );
}
// follow map theme
composerMapElem.setAttribute( QStringLiteral( "followPreset" ), mFollowVisibilityPreset ? "true" : "false" );
composerMapElem.setAttribute( QStringLiteral( "followPresetName" ), mFollowVisibilityPresetName );
@ -1362,6 +1383,17 @@ bool QgsComposerMap::readXml( const QDomElement& itemElem, const QDomDocument& d
setNewExtent( QgsRectangle( xmin, ymin, xmax, ymax ) );
}
QDomNodeList crsNodeList = itemElem.elementsByTagName( QStringLiteral( "crs" ) );
if ( !crsNodeList.isEmpty() )
{
QDomElement crsElem = crsNodeList.at( 0 ).toElement();
mCrs.readXml( crsElem );
}
else
{
mCrs = QgsCoordinateReferenceSystem();
}
//map rotation
if ( !qgsDoubleNear( itemElem.attribute( QStringLiteral( "mapRotation" ), QStringLiteral( "0" ) ).toDouble(), 0.0 ) )
{
@ -1826,9 +1858,10 @@ QgsExpressionContext QgsComposerMap::createExpressionContext() const
if ( mComposition )
{
scope->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "map_crs" ), mComposition->mapSettings().destinationCrs().authid(), true ) );
scope->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "map_crs_definition" ), mComposition->mapSettings().destinationCrs().toProj4(), true ) );
scope->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "map_units" ), QgsUnitTypes::toString( mComposition->mapSettings().mapUnits() ), true ) );
QgsCoordinateReferenceSystem mapCrs = crs();
scope->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "map_crs" ), mapCrs.authid(), true ) );
scope->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "map_crs_definition" ), mapCrs.toProj4(), true ) );
scope->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "map_units" ), QgsUnitTypes::toString( mapCrs.mapUnits() ), true ) );
}
context.appendScope( scope );
@ -1979,12 +2012,12 @@ QPointF QgsComposerMap::composerMapPosForItem( const QgsAnnotation* annotation )
mapX = annotation->mapPosition().x();
mapY = annotation->mapPosition().y();
QgsCoordinateReferenceSystem crs = annotation->mapPositionCrs();
QgsCoordinateReferenceSystem annotationCrs = annotation->mapPositionCrs();
if ( crs != mComposition->mapSettings().destinationCrs() )
if ( annotationCrs != crs() )
{
//need to reproject
QgsCoordinateTransform t( crs, mComposition->mapSettings().destinationCrs() );
QgsCoordinateTransform t( annotationCrs, crs() );
double z = 0.0;
t.transformInPlace( mapX, mapY, z );
}

View File

@ -21,6 +21,7 @@
#include "qgis_core.h"
#include "qgscomposeritem.h"
#include "qgsrectangle.h"
#include "qgscoordinatereferencesystem.h"
#include <QFont>
#include <QGraphicsRectItem>
@ -166,6 +167,38 @@ class CORE_EXPORT QgsComposerMap : public QgsComposerItem
//! @note not available in python bindings
QgsRectangle* currentMapExtent();
/**
* Returns coordinate reference system used for rendering the map.
* This will match the presetCrs() if that is set, or if a preset
* CRS is not set then the map's CRS will follow the composition's
* project's CRS.
* @note added in QGIS 3.0
* @see presetCrs()
* @see setCrs()
*/
QgsCoordinateReferenceSystem crs() const;
/**
* Returns the map's preset coordinate reference system. If set, this
* CRS will be used to render the map regardless of any project CRS
* setting. If the returned CRS is not valid then the project CRS
* will be used to render the map.
* @note added in QGIS 3.0
* @see crs()
* @see setCrs()
*/
QgsCoordinateReferenceSystem presetCrs() const { return mCrs; }
/**
* Sets the map's preset coordinate reference system. If a valid CRS is
* set, this CRS will be used to render the map regardless of any project CRS
* setting. If the CRS is not valid then the project CRS will be used to render the map.
* @see crs()
* @see presetCrs()
* @note added in QGIS 3.0
*/
void setCrs( const QgsCoordinateReferenceSystem& crs );
PreviewMode previewMode() const {return mPreviewMode;}
void setPreviewMode( PreviewMode m );
@ -447,6 +480,9 @@ class CORE_EXPORT QgsComposerMap : public QgsComposerItem
// so that full rectangle in paper is used.
QgsRectangle mExtent;
//! Map CRS
QgsCoordinateReferenceSystem mCrs;
// Current temporary map region in map units. This is overwritten when atlas feature changes. It's also
// used when the user changes the map extent and an atlas preview is enabled. This allows the user
// to manually tweak each atlas preview page without affecting the actual original map extent.

View File

@ -636,14 +636,8 @@ void QgsComposerMapGrid::draw( QPainter* p )
p->scale( 1 / dotsPerMM, 1 / dotsPerMM ); //scale painter from mm to dots
//setup render context
QgsMapSettings ms = mComposerMap->composition()->mapSettings();
//context units should be in dots
ms.setOutputSize( QSizeF( mComposerMap->rect().width() * dotsPerMM, mComposerMap->rect().height() * dotsPerMM ).toSize() );
ms.setExtent( *mComposerMap->currentMapExtent() );
ms.setOutputDpi( p->device()->logicalDpiX() );
QgsRenderContext context = QgsRenderContext::fromMapSettings( ms );
QgsRenderContext context = QgsComposerUtils::createRenderContext( mComposition, p );
context.setForceVectorOutput( true );
context.setPainter( p );
QgsExpressionContext expressionContext = createExpressionContext();
context.setExpressionContext( expressionContext );
@ -651,7 +645,7 @@ void QgsComposerMapGrid::draw( QPainter* p )
QList< QPair< double, QLineF > > horizontalLines;
//is grid in a different crs than map?
if ( mGridUnit == MapUnit && mCRS.isValid() && mCRS != ms.destinationCrs() )
if ( mGridUnit == MapUnit && mCRS.isValid() && mCRS != mComposerMap->crs() )
{
drawGridCrsTransform( context, dotsPerMM, horizontalLines, verticalLines );
}
@ -1416,7 +1410,7 @@ QString QgsComposerMapGrid::gridAnnotationString( double value, QgsComposerMapGr
}
else if ( mComposerMap && mComposerMap->composition() )
{
geographic = mComposerMap->composition()->mapSettings().destinationCrs().isGeographic();
geographic = mComposerMap->crs().isGeographic();
}
if ( geographic && coord == QgsComposerMapGrid::Longitude &&
@ -2062,8 +2056,7 @@ void QgsComposerMapGrid::calculateMaxExtension( double& top, double& right, doub
}
//setup render context
QgsMapSettings ms = mComposerMap->composition()->mapSettings();
QgsRenderContext context = QgsRenderContext::fromMapSettings( ms );
QgsRenderContext context = QgsComposerUtils::createRenderContext( mComposition, nullptr );
QgsExpressionContext expressionContext = createExpressionContext();
context.setExpressionContext( expressionContext );
@ -2072,7 +2065,7 @@ void QgsComposerMapGrid::calculateMaxExtension( double& top, double& right, doub
//collect grid lines
QList< QPair< double, QLineF > > verticalLines;
QList< QPair< double, QLineF > > horizontalLines;
if ( mGridUnit == MapUnit && mCRS.isValid() && mCRS != ms.destinationCrs() )
if ( mGridUnit == MapUnit && mCRS.isValid() && mCRS != mComposerMap->crs() )
{
drawGridCrsTransform( context, 0, horizontalLines, verticalLines, false );
}
@ -2340,7 +2333,7 @@ int QgsComposerMapGrid::crsGridParams( QgsRectangle& crsRect, QgsCoordinateTrans
try
{
QgsCoordinateTransform tr( mComposerMap->composition()->mapSettings().destinationCrs(), mCRS );
QgsCoordinateTransform tr( mComposerMap->crs(), mCRS );
QPolygonF mapPolygon = mComposerMap->transformedMapPolygon();
QRectF mbr = mapPolygon.boundingRect();
QgsRectangle mapBoundingRect( mbr.left(), mbr.bottom(), mbr.right(), mbr.top() );
@ -2372,7 +2365,7 @@ int QgsComposerMapGrid::crsGridParams( QgsRectangle& crsRect, QgsCoordinateTrans
}
inverseTransform.setSourceCrs( mCRS );
inverseTransform.setDestinationCrs( mComposerMap->composition()->mapSettings().destinationCrs() );
inverseTransform.setDestinationCrs( mComposerMap->crs() );
}
catch ( QgsCsException & cse )
{

View File

@ -22,6 +22,7 @@
#include "qgssymbol.h"
#include "qgsmapsettings.h"
#include "qgspainting.h"
#include "qgscomposerutils.h"
#include <QPainter>
@ -91,14 +92,8 @@ void QgsComposerMapOverview::draw( QPainter *painter )
double dotsPerMM = painter->device()->logicalDpiX() / 25.4;
//setup render context
QgsMapSettings ms = mComposerMap->composition()->mapSettings();
//context units should be in dots
ms.setOutputSize( QSizeF( mComposerMap->rect().width() * dotsPerMM, mComposerMap->rect().height() * dotsPerMM ).toSize() );
ms.setExtent( *mComposerMap->currentMapExtent() );
ms.setOutputDpi( painter->device()->logicalDpiX() );
QgsRenderContext context = QgsRenderContext::fromMapSettings( ms );
QgsRenderContext context = QgsComposerUtils::createRenderContext( mComposition, painter );
context.setForceVectorOutput( true );
context.setPainter( painter );
QgsExpressionContext expressionContext = createExpressionContext();
context.setExpressionContext( expressionContext );

View File

@ -137,7 +137,7 @@ void QgsComposerNodesItem::drawNodes( QPainter *painter ) const
symbol.data()->setSize( rectSize );
symbol.data()->setAngle( 45 );
QgsRenderContext context = QgsComposerUtils::createRenderContext( mComposition, *painter );
QgsRenderContext context = QgsComposerUtils::createRenderContext( mComposition, painter );
context.setForceVectorOutput( true );
QgsExpressionContext expressionContext = createExpressionContext();
@ -168,7 +168,7 @@ void QgsComposerNodesItem::drawSelectedNode( QPainter *painter ) const
symbol.reset( QgsMarkerSymbol::createSimple( properties ) );
symbol.data()->setSize( rectSize );
QgsRenderContext context = QgsComposerUtils::createRenderContext( mComposition, *painter );
QgsRenderContext context = QgsComposerUtils::createRenderContext( mComposition, painter );
context.setForceVectorOutput( true );
QgsExpressionContext expressionContext = createExpressionContext();

View File

@ -426,7 +426,7 @@ void QgsComposerPicture::updateMapRotation()
case TrueNorth:
{
QgsPoint center = mRotationMap->currentMapExtent()->center();
QgsCoordinateReferenceSystem crs = mComposition->mapSettings().destinationCrs();
QgsCoordinateReferenceSystem crs = mRotationMap->crs();
try
{

View File

@ -73,7 +73,7 @@ void QgsComposerPolygon::_draw( QPainter *painter )
//setup painter scaling to dots so that raster symbology is drawn to scale
const double dotsPerMM = painter->device()->logicalDpiX() / 25.4;
QgsRenderContext context = QgsComposerUtils::createRenderContext( mComposition, *painter );
QgsRenderContext context = QgsComposerUtils::createRenderContext( mComposition, painter );
context.setForceVectorOutput( true );
context.setExpressionContext( createExpressionContext() );

View File

@ -100,7 +100,7 @@ void QgsComposerPolyline::_draw( QPainter *painter )
{
double dotsPerMM = painter->device()->logicalDpiX() / 25.4;
QgsRenderContext context = QgsComposerUtils::createRenderContext( mComposition, *painter );
QgsRenderContext context = QgsComposerUtils::createRenderContext( mComposition, painter );
context.setForceVectorOutput( true );
QgsExpressionContext expressionContext = createExpressionContext();

View File

@ -303,7 +303,7 @@ double QgsComposerScaleBar::mapWidth() const
{
QgsDistanceArea da;
da.setEllipsoidalMode( true );
da.setSourceCrs( mComposition->mapSettings().destinationCrs().srsid() );
da.setSourceCrs( mComposerMap->crs().srsid() );
da.setEllipsoid( mComposition->project()->ellipsoid() );
QgsUnitTypes::DistanceUnit units = QgsUnitTypes::DistanceMeters;

View File

@ -179,7 +179,7 @@ void QgsComposerShape::drawShapeUsingSymbol( QPainter* p )
double dotsPerMM = p->device()->logicalDpiX() / 25.4;
//setup render context
QgsRenderContext context = QgsComposerUtils::createRenderContext( mComposition, *p );
QgsRenderContext context = QgsComposerUtils::createRenderContext( mComposition, p );
context.setForceVectorOutput( true );
QgsExpressionContext expressionContext = createExpressionContext();
context.setExpressionContext( expressionContext );

View File

@ -548,15 +548,16 @@ void QgsComposerUtils::drawText( QPainter *painter, const QRectF &rect, const QS
painter->restore();
}
QgsRenderContext QgsComposerUtils::createRenderContext( QgsComposition* composition, QPainter &painter )
QgsRenderContext QgsComposerUtils::createRenderContext( QgsComposition* composition, QPainter* painter )
{
QgsComposerMap* referenceMap = composition ? composition->referenceMap() : nullptr;
if ( !referenceMap )
{
return QgsRenderContext::fromQPainter( &painter );
return QgsRenderContext::fromQPainter( painter );
}
int dpi = painter.device()->logicalDpiX();
// default to 88 dpi if no painter specified
int dpi = ( painter && painter->device() ) ? painter->device()->logicalDpiX() : 88;
double dotsPerMM = dpi / 25.4;
// get map settings from reference map
@ -565,6 +566,7 @@ QgsRenderContext QgsComposerUtils::createRenderContext( QgsComposition* composit
QgsMapSettings ms = referenceMap->mapSettings( extent, mapSizeMM * dotsPerMM, dpi );
QgsRenderContext context = QgsRenderContext::fromMapSettings( ms );
context.setPainter( &painter );
if ( painter )
context.setPainter( painter );
return context;
}

View File

@ -272,7 +272,7 @@ class CORE_EXPORT QgsComposerUtils
* QgsComposition::referenceMap().
* @note added in QGIS 3.0
*/
static QgsRenderContext createRenderContext( QgsComposition* composition, QPainter& painter );
static QgsRenderContext createRenderContext( QgsComposition* composition, QPainter* painter );
};

View File

@ -2832,6 +2832,12 @@ bool QgsComposition::exportAsPDF( const QString& file )
void QgsComposition::georeferenceOutput( const QString& file, QgsComposerMap* map,
const QRectF& exportRegion, double dpi ) const
{
if ( !map )
map = referenceMap();
if ( !map )
return; // no reference map
if ( dpi < 0 )
dpi = printResolution();
@ -2850,7 +2856,7 @@ void QgsComposition::georeferenceOutput( const QString& file, QgsComposerMap* ma
//TODO - metadata can be set here, e.g.:
GDALSetMetadataItem( outputDS, "AUTHOR", "me", nullptr );
#endif
GDALSetProjection( outputDS, mMapSettings.destinationCrs().toWkt().toLocal8Bit().constData() );
GDALSetProjection( outputDS, map->crs().toWkt().toLocal8Bit().constData() );
GDALClose( outputDS );
}
CPLSetConfigOption( "GDAL_PDF_DPI", nullptr );

View File

@ -156,7 +156,7 @@ void QgsPaperItem::paint( QPainter* painter, const QStyleOptionGraphicsItem* ite
double dotsPerMM = painter->device()->logicalDpiX() / 25.4;
//setup render context
QgsRenderContext context = QgsComposerUtils::createRenderContext( mComposition, *painter );
QgsRenderContext context = QgsComposerUtils::createRenderContext( mComposition, painter );
context.setForceVectorOutput( true );
QgsExpressionContext expressionContext = createExpressionContext();

View File

@ -44,7 +44,7 @@
#include "qgscomposerattributetablev2.h"
#include "qgsaddremovemultiframecommand.h"
#include "qgspaperitem.h"
#include "qgsmapcanvas.h" //for QgsMapCanvas::WheelAction
#include "qgsmapcanvas.h"
#include "qgscursors.h"
#include "qgscomposerutils.h"
@ -997,6 +997,9 @@ void QgsComposerView::mouseReleaseEvent( QMouseEvent* e )
else
{
QgsComposerMap* composerMap = new QgsComposerMap( composition(), mRubberBandItem->transform().dx(), mRubberBandItem->transform().dy(), mRubberBandItem->rect().width(), mRubberBandItem->rect().height() );
if ( mCanvas )
composerMap->zoomToExtent( mCanvas->mapSettings().visibleExtent() );
composition()->addComposerMap( composerMap );
composition()->setAllDeselected();
@ -2103,6 +2106,16 @@ void QgsComposerView::setPreviewMode( QgsPreviewEffect::PreviewMode mode )
mPreviewEffect->setMode( mode );
}
void QgsComposerView::setMapCanvas( QgsMapCanvas* canvas )
{
mCanvas = canvas;
}
QgsMapCanvas*QgsComposerView::mapCanvas() const
{
return mCanvas;
}
void QgsComposerView::paintEvent( QPaintEvent* event )
{
if ( mPaintingEnabled )

View File

@ -39,6 +39,7 @@ class QgsComposerScaleBar;
class QgsComposerShape;
class QgsComposerNodesItem;
class QgsComposerAttributeTableV2;
class QgsMapCanvas;
/** \ingroup gui
* Widget to display the composer items. Manages the composer tools and the
@ -170,6 +171,20 @@ class GUI_EXPORT QgsComposerView: public QGraphicsView
*/
void setPreviewMode( QgsPreviewEffect::PreviewMode mode );
/** Sets the map canvas associated with the view. This allows the
* view to retrieve map settings from the canvas.
* @note added in QGIS 3.0
* @see mapCanvas()
*/
void setMapCanvas( QgsMapCanvas* canvas );
/**
* Returns the map canvas associated with the view.
* @see setMapCanvas()
* @note added in QGIS 3.0
*/
QgsMapCanvas* mapCanvas() const;
protected:
void mousePressEvent( QMouseEvent* ) override;
void mouseReleaseEvent( QMouseEvent* ) override;
@ -218,6 +233,8 @@ class GUI_EXPORT QgsComposerView: public QGraphicsView
QgsComposerRuler* mHorizontalRuler;
QgsComposerRuler* mVerticalRuler;
QgsMapCanvas* mCanvas = nullptr;
//! Draw a shape on the canvas
void addShape( Tool currentTool );

View File

@ -223,6 +223,7 @@ void QgsProjectionSelectionWidget::comboIndexChanged( int idx )
}
case QgsProjectionSelectionWidget::CrsNotSet:
emit cleared();
emit crsChanged( QgsCoordinateReferenceSystem() );
return;
}
}

View File

@ -79,6 +79,12 @@ QgsComposition* QgsWmsConfigParser::createPrintComposition( const QString& compo
continue;
}
// Change CRS of map set to "project CRS" to match requested CRS
// (if map has a valid preset crs then we keep this crs and don't use the
// requested crs for this map item)
if ( mapSettings.destinationCrs().isValid() && !currentMap->presetCrs().isValid() )
currentMap->setCrs( mapSettings.destinationCrs() );
QStringList coordList = extent.split( QStringLiteral( "," ) );
if ( coordList.size() < 4 )
{

View File

@ -64,8 +64,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>364</width>
<height>1248</height>
<width>366</width>
<height>1241</height>
</rect>
</property>
<property name="sizePolicy">
@ -90,37 +90,6 @@
<bool>false</bool>
</property>
<layout class="QGridLayout" name="gridLayout_5">
<item row="0" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QComboBox" name="mPreviewModeComboBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="mUpdatePreviewButton">
<property name="text">
<string>Update preview</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Scale</string>
</property>
<property name="buddy">
<cstring>mScaleLineEdit</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
@ -167,13 +136,58 @@
</item>
</layout>
</item>
<item row="3" column="0" colspan="2">
<item row="5" column="0" colspan="2">
<widget class="QCheckBox" name="mDrawCanvasItemsCheckBox">
<property name="text">
<string>Draw map canvas items</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QComboBox" name="mPreviewModeComboBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="mUpdatePreviewButton">
<property name="text">
<string>Update preview</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Scale</string>
</property>
<property name="buddy">
<cstring>mScaleLineEdit</cstring>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="mMapRotationLabel_2">
<property name="text">
<string>CRS</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QgsProjectionSelectionWidget" name="mCrsSelector" native="true">
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
</widget>
</item>
</layout>
</widget>
</item>
@ -805,6 +819,12 @@
<extends>QComboBox</extends>
<header>qgscomposeritemcombobox.h</header>
</customwidget>
<customwidget>
<class>QgsProjectionSelectionWidget</class>
<extends>QWidget</extends>
<header>qgsprojectionselectionwidget.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>groupBox</tabstop>
@ -815,6 +835,7 @@
<tabstop>mScaleDDBtn</tabstop>
<tabstop>mMapRotationSpinBox</tabstop>
<tabstop>mMapRotationDDBtn</tabstop>
<tabstop>mCrsSelector</tabstop>
<tabstop>mDrawCanvasItemsCheckBox</tabstop>
<tabstop>mFollowVisibilityPresetCheckBox</tabstop>
<tabstop>mFollowVisibilityPresetCombo</tabstop>
@ -858,6 +879,8 @@
<tabstop>mOverviewBlendModeComboBox</tabstop>
<tabstop>mOverviewInvertCheckbox</tabstop>
<tabstop>mOverviewCenterCheckbox</tabstop>
<tabstop>mDrawGridCheckBox</tabstop>
<tabstop>mGridPropertiesButton</tabstop>
</tabstops>
<resources>
<include location="../../../images/images.qrc"/>

View File

@ -146,7 +146,7 @@ void TestQgsAtlasComposition::init()
// select epsg:2154
QgsCoordinateReferenceSystem crs;
crs.createFromSrid( 2154 );
mMapSettings->setDestinationCrs( crs );
QgsProject::instance()->setCrs( crs );
mComposition = new QgsComposition( *mMapSettings, QgsProject::instance() );
mComposition->setPaperSize( 297, 210 ); //A4 landscape

View File

@ -75,6 +75,10 @@ void TestQgsComposerScaleBar::initTestCase()
// so we enforce C locale to make sure we get expected result
QLocale::setDefault( QLocale::c() );
//reproject to WGS84
QgsCoordinateReferenceSystem destCRS;
destCRS.createFromId( 4326, QgsCoordinateReferenceSystem::EpsgCrsId );
QgsProject::instance()->setCrs( destCRS );
QgsProject::instance()->setEllipsoid( QStringLiteral( "WGS84" ) );
mMapSettings = new QgsMapSettings();
@ -89,12 +93,6 @@ void TestQgsComposerScaleBar::initTestCase()
//create composition with composer map
mMapSettings->setLayers( QList<QgsMapLayer*>() << mRasterLayer );
//reproject to WGS84
QgsCoordinateReferenceSystem destCRS;
destCRS.createFromId( 4326, QgsCoordinateReferenceSystem::EpsgCrsId );
mMapSettings->setDestinationCrs( destCRS );
mMapSettings->setCrsTransformEnabled( true );
mComposition = new QgsComposition( *mMapSettings, QgsProject::instance() );
mComposition->setPaperSize( 297, 210 ); //A4 landscape
mComposerMap = new QgsComposerMap( mComposition, 20, 20, 150, 150 );

View File

@ -712,19 +712,29 @@ void TestQgsComposerUtils::createRenderContext()
QPainter p( &testImage );
// no composition
QgsRenderContext rc = QgsComposerUtils::createRenderContext( nullptr, p );
QgsRenderContext rc = QgsComposerUtils::createRenderContext( nullptr, &p );
QGSCOMPARENEAR( rc.scaleFactor(), 150 / 25.4, 0.001 );
QCOMPARE( rc.painter(), &p );
// no composition, no painter
rc = QgsComposerUtils::createRenderContext( nullptr, nullptr );
QGSCOMPARENEAR( rc.scaleFactor(), 88 / 25.4, 0.001 );
QVERIFY( !rc.painter() );
//create composition with no reference map
QgsRectangle extent( 2000, 2800, 2500, 2900 );
QgsMapSettings ms;
ms.setExtent( extent );
QgsComposition* composition = new QgsComposition( ms, QgsProject::instance() );
rc = QgsComposerUtils::createRenderContext( composition, p );
rc = QgsComposerUtils::createRenderContext( composition, &p );
QGSCOMPARENEAR( rc.scaleFactor(), 150 / 25.4, 0.001 );
QCOMPARE( rc.painter(), &p );
// composition, no map, no painter
rc = QgsComposerUtils::createRenderContext( composition, nullptr );
QGSCOMPARENEAR( rc.scaleFactor(), 88 / 25.4, 0.001 );
QVERIFY( !rc.painter() );
// add a reference map
QgsComposerMap* map = new QgsComposerMap( composition );
map->setNewExtent( extent );
@ -732,11 +742,17 @@ void TestQgsComposerUtils::createRenderContext()
composition->addComposerMap( map );
composition->setReferenceMap( map );
rc = QgsComposerUtils::createRenderContext( composition, p );
rc = QgsComposerUtils::createRenderContext( composition, &p );
QGSCOMPARENEAR( rc.scaleFactor(), 150 / 25.4, 0.001 );
QGSCOMPARENEAR( rc.rendererScale(), map->scale(), 100000 );
QGSCOMPARENEAR( rc.rendererScale(), map->scale(), 1000000 );
QCOMPARE( rc.painter(), &p );
// composition, reference map, no painter
rc = QgsComposerUtils::createRenderContext( composition, nullptr );
QGSCOMPARENEAR( rc.scaleFactor(), 88 / 25.4, 0.001 );
QGSCOMPARENEAR( rc.rendererScale(), map->scale(), 1000000 );
QVERIFY( !rc.painter() );
p.end();
}

View File

@ -618,6 +618,7 @@ void TestQgsComposition::itemVariablesFunction()
QgsComposerMap* map = new QgsComposerMap( composition );
map->setNewExtent( extent );
map->setSceneRect( QRectF( 30, 60, 200, 100 ) );
map->setCrs( QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:4326" ) ) );
composition->addComposerMap( map );
map->setId( "map_id" );

View File

@ -46,13 +46,11 @@ class TestQgsAtlasComposition(unittest.TestCase):
self.mapSettings = QgsMapSettings()
layerStringList = [mVectorLayer]
self.mapSettings.setLayers(layerStringList)
self.mapSettings.setCrsTransformEnabled(True)
self.mapSettings.setMapUnits(QgsUnitTypes.DistanceMeters)
# select epsg:2154
crs = QgsCoordinateReferenceSystem()
crs.createFromSrid(2154)
self.mapSettings.setDestinationCrs(crs)
QgsProject.instance().setCrs(crs)
self.mComposition = QgsComposition(self.mapSettings, QgsProject.instance())
self.mComposition.setPaperSize(297, 210)

View File

@ -23,10 +23,12 @@ from qgis.PyQt.QtGui import QPainter
from qgis.core import (QgsComposerMap,
QgsRectangle,
QgsRasterLayer,
QgsVectorLayer,
QgsComposition,
QgsMapSettings,
QgsProject,
QgsMultiBandColorRenderer,
QgsCoordinateReferenceSystem
)
from qgis.testing import start_app, unittest
@ -44,18 +46,25 @@ class TestQgsComposerMap(unittest.TestCase):
unittest.TestCase.__init__(self, methodName)
myPath = os.path.join(TEST_DATA_DIR, 'rgb256x256.png')
rasterFileInfo = QFileInfo(myPath)
mRasterLayer = QgsRasterLayer(rasterFileInfo.filePath(),
rasterFileInfo.completeBaseName())
self.raster_layer = QgsRasterLayer(rasterFileInfo.filePath(),
rasterFileInfo.completeBaseName())
rasterRenderer = QgsMultiBandColorRenderer(
mRasterLayer.dataProvider(), 1, 2, 3)
mRasterLayer.setRenderer(rasterRenderer)
self.raster_layer.dataProvider(), 1, 2, 3)
self.raster_layer.setRenderer(rasterRenderer)
myPath = os.path.join(TEST_DATA_DIR, 'points.shp')
vector_file_info = QFileInfo(myPath)
self.vector_layer = QgsVectorLayer(vector_file_info.filePath(),
vector_file_info.completeBaseName(), 'ogr')
assert self.vector_layer.isValid()
#pipe = mRasterLayer.pipe()
#assert pipe.set(rasterRenderer), 'Cannot set pipe renderer'
QgsProject.instance().addMapLayers([mRasterLayer])
QgsProject.instance().addMapLayers([self.raster_layer, self.vector_layer])
# create composition with composer map
self.mMapSettings = QgsMapSettings()
self.mMapSettings.setLayers([mRasterLayer])
self.mMapSettings.setLayers([self.raster_layer])
self.mMapSettings.setCrsTransformEnabled(False)
self.mComposition = QgsComposition(self.mMapSettings, QgsProject.instance())
self.mComposition.setPaperSize(297, 210)
@ -131,6 +140,49 @@ class TestQgsComposerMap(unittest.TestCase):
self.mComposition.removeComposerItem(overviewMap)
assert myTestResult, myMessage
def testMapCrs(self):
# create composition with composer map
map_settings = QgsMapSettings()
map_settings.setLayers([self.vector_layer])
composition = QgsComposition(map_settings, QgsProject.instance())
composition.setPaperSize(297, 210)
# check that new maps inherit project CRS
QgsProject.instance().setCrs(QgsCoordinateReferenceSystem('EPSG:4326'))
map = QgsComposerMap(composition, 20, 20, 200, 100)
map.setFrameEnabled(True)
rectangle = QgsRectangle(-13838977, 2369660, -8672298, 6250909)
map.setNewExtent(rectangle)
composition.addComposerMap(map)
self.assertEqual(map.crs().authid(), 'EPSG:4326')
self.assertFalse(map.presetCrs().isValid())
# overwrite CRS
map.setCrs(QgsCoordinateReferenceSystem('EPSG:3857'))
self.assertEqual(map.crs().authid(), 'EPSG:3857')
self.assertEqual(map.presetCrs().authid(), 'EPSG:3857')
checker = QgsCompositionChecker('composermap_crs3857', composition)
checker.setControlPathPrefix("composer_map")
result, message = checker.testComposition()
self.assertTrue(result, message)
# overwrite CRS
map.setCrs(QgsCoordinateReferenceSystem('EPSG:4326'))
self.assertEqual(map.presetCrs().authid(), 'EPSG:4326')
self.assertEqual(map.crs().authid(), 'EPSG:4326')
rectangle = QgsRectangle(-124, 17, -78, 52)
map.zoomToExtent(rectangle)
checker = QgsCompositionChecker('composermap_crs4326', composition)
checker.setControlPathPrefix("composer_map")
result, message = checker.testComposition()
self.assertTrue(result, message)
# change back to project CRS
map.setCrs(QgsCoordinateReferenceSystem())
self.assertEqual(map.crs().authid(), 'EPSG:4326')
self.assertFalse(map.presetCrs().isValid())
# Fails because addItemsFromXml has been commented out in sip
@unittest.expectedFailure
def testuniqueId(self):

View File

@ -119,10 +119,10 @@ class TestQgsComposerPicture(unittest.TestCase):
"""Test syncing picture to true north"""
mapSettings = QgsMapSettings()
mapSettings.setDestinationCrs(QgsCoordinateReferenceSystem.fromEpsgId(3575))
composition = QgsComposition(mapSettings, QgsProject.instance())
composerMap = QgsComposerMap(composition)
composerMap.setCrs(QgsCoordinateReferenceSystem.fromEpsgId(3575))
composerMap.setNewExtent(QgsRectangle(-2126029.962, -2200807.749, -119078.102, -757031.156))
composition.addComposerMap(composerMap)

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB