From 66a83bd205989e4ebd74a9a5c80acf19e7fa58eb Mon Sep 17 00:00:00 2001 From: Sebastian Dietrich Date: Tue, 1 Dec 2015 23:48:58 +0100 Subject: [PATCH] make annotations aware of crs (fixes #3618) --- python/gui/qgsannotationitem.sip | 6 ++++++ src/app/qgisapp.cpp | 11 +++++++++++ src/app/qgisapp.h | 1 + src/gui/qgsannotationitem.cpp | 14 +++++++++++++- src/gui/qgsannotationitem.h | 10 ++++++++++ 5 files changed, 41 insertions(+), 1 deletion(-) diff --git a/python/gui/qgsannotationitem.sip b/python/gui/qgsannotationitem.sip index 02d72760160..0394fa28a20 100644 --- a/python/gui/qgsannotationitem.sip +++ b/python/gui/qgsannotationitem.sip @@ -44,6 +44,12 @@ class QgsAnnotationItem: QgsMapCanvasItem virtual void setMapPosition( const QgsPoint& pos ); QgsPoint mapPosition() const; + /** Sets the CRS of the map position. + @param crs the CRS to set */ + virtual void setMapPositionCrs( const QgsCoordinateReferenceSystem& crs ); + /** Returns the CRS of the map position.*/ + QgsCoordinateReferenceSystem mapPositionCrs() const; + void setFrameSize( const QSizeF& size ); QSizeF frameSize() const; diff --git a/src/app/qgisapp.cpp b/src/app/qgisapp.cpp index e1123071013..38c76872261 100644 --- a/src/app/qgisapp.cpp +++ b/src/app/qgisapp.cpp @@ -2316,6 +2316,9 @@ void QgisApp::setupConnections() connect( mRenderSuppressionCBox, SIGNAL( toggled( bool ) ), mMapCanvas, SLOT( setRenderFlag( bool ) ) ); + connect( mMapCanvas, SIGNAL( destinationCrsChanged() ), + this, SLOT( reprojectAnnotations() ) ); + // connect MapCanvas keyPress event so we can check if selected feature collection must be deleted connect( mMapCanvas, SIGNAL( keyPressed( QKeyEvent * ) ), this, SLOT( mapCanvas_keyPressed( QKeyEvent * ) ) ); @@ -5161,6 +5164,14 @@ void QgisApp::modifyAnnotation() mMapCanvas->setMapTool( mMapTools.mAnnotation ); } +void QgisApp::reprojectAnnotations() +{ + Q_FOREACH ( QgsAnnotationItem * annotation, annotationItems() ) + { + annotation->updatePosition(); + } +} + void QgisApp::labelingFontNotFound( QgsVectorLayer* vlayer, const QString& fontfamily ) { // TODO: update when pref for how to resolve missing family (use matching algorithm or just default font) is implemented diff --git a/src/app/qgisapp.h b/src/app/qgisapp.h index a2c3cc87b38..b44b7652dbd 100644 --- a/src/app/qgisapp.h +++ b/src/app/qgisapp.h @@ -1128,6 +1128,7 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow void addHtmlAnnotation(); void addSvgAnnotation(); void modifyAnnotation(); + void reprojectAnnotations(); /** Alerts user when labeling font for layer has not been found on system */ void labelingFontNotFound( QgsVectorLayer *vlayer, const QString& fontfamily ); diff --git a/src/gui/qgsannotationitem.cpp b/src/gui/qgsannotationitem.cpp index da6e149ba90..e65b39383b4 100644 --- a/src/gui/qgsannotationitem.cpp +++ b/src/gui/qgsannotationitem.cpp @@ -26,6 +26,7 @@ QgsAnnotationItem::QgsAnnotationItem( QgsMapCanvas* mapCanvas ) : QgsMapCanvasItem( mapCanvas ) , mMapPositionFixed( true ) + , mMapPositionCrs( QgsCoordinateReferenceSystem() ) , mOffsetFromReferencePoint( QPointF( 50, -50 ) ) , mBalloonSegment( -1 ) { @@ -53,6 +54,12 @@ void QgsAnnotationItem::setMapPosition( const QgsPoint& pos ) { mMapPosition = pos; setPos( toCanvasCoordinates( mMapPosition ) ); + mMapPositionCrs = mMapCanvas->mapSettings().destinationCrs(); +} + +void QgsAnnotationItem::setMapPositionCrs( const QgsCoordinateReferenceSystem& crs ) +{ + mMapPositionCrs = crs; } void QgsAnnotationItem::setOffsetFromReferencePoint( const QPointF& offset ) @@ -85,7 +92,8 @@ void QgsAnnotationItem::updatePosition() { if ( mMapPositionFixed ) { - setPos( toCanvasCoordinates( mMapPosition ) ); + QgsCoordinateTransform t( mMapPositionCrs, mMapCanvas->mapSettings().destinationCrs() ); + setPos( toCanvasCoordinates( t.transform( mMapPosition ) ) ); } else { @@ -392,6 +400,8 @@ void QgsAnnotationItem::_writeXML( QDomDocument& doc, QDomElement& itemElem ) co annotationElem.setAttribute( "mapPositionFixed", mMapPositionFixed ); annotationElem.setAttribute( "mapPosX", qgsDoubleToString( mMapPosition.x() ) ); annotationElem.setAttribute( "mapPosY", qgsDoubleToString( mMapPosition.y() ) ); + if ( mMapPositionCrs.isValid() ) + mMapPositionCrs.writeXML( annotationElem, doc ); annotationElem.setAttribute( "offsetX", qgsDoubleToString( mOffsetFromReferencePoint.x() ) ); annotationElem.setAttribute( "offsetY", qgsDoubleToString( mOffsetFromReferencePoint.y() ) ); annotationElem.setAttribute( "frameWidth", QString::number( mFrameSize.width() ) ); @@ -431,6 +441,8 @@ void QgsAnnotationItem::_readXML( const QDomDocument& doc, const QDomElement& an mapPos.setX( annotationElem.attribute( "mapPosX", "0" ).toDouble() ); mapPos.setY( annotationElem.attribute( "mapPosY", "0" ).toDouble() ); mMapPosition = mapPos; + if ( !mMapPositionCrs.readXML( annotationElem ) ) + mMapPositionCrs = mMapCanvas->mapSettings().destinationCrs(); mFrameBorderWidth = annotationElem.attribute( "frameBorderWidth", "0.5" ).toDouble(); mFrameColor.setNamedColor( annotationElem.attribute( "frameColor", "#000000" ) ); mFrameColor.setAlpha( annotationElem.attribute( "frameColorAlpha", "255" ).toInt() ); diff --git a/src/gui/qgsannotationitem.h b/src/gui/qgsannotationitem.h index 3d90976f6d3..17d720121ac 100644 --- a/src/gui/qgsannotationitem.h +++ b/src/gui/qgsannotationitem.h @@ -19,6 +19,7 @@ #define QGSANNOTATIONITEM_H #include "qgsmapcanvasitem.h" +#include "qgscoordinatereferencesystem.h" class QDomDocument; class QDomElement; @@ -68,6 +69,12 @@ class GUI_EXPORT QgsAnnotationItem: public QgsMapCanvasItem virtual void setMapPosition( const QgsPoint& pos ); QgsPoint mapPosition() const { return mMapPosition; } + /** Sets the CRS of the map position. + @param crs the CRS to set */ + virtual void setMapPositionCrs( const QgsCoordinateReferenceSystem& crs ); + /** Returns the CRS of the map position.*/ + QgsCoordinateReferenceSystem mapPositionCrs() const { return mMapPositionCrs; } + void setFrameSize( const QSizeF& size ); QSizeF frameSize() const { return mFrameSize; } @@ -98,6 +105,9 @@ class GUI_EXPORT QgsAnnotationItem: public QgsMapCanvasItem bool mMapPositionFixed; /** Map position (in case mMapPositionFixed is true)*/ QgsPoint mMapPosition; + /** CRS of the map position */ + QgsCoordinateReferenceSystem mMapPositionCrs; + /** Describes the shift of the item content box to the reference point*/ QPointF mOffsetFromReferencePoint;