1 /***************************************************************************
2  qgsquickcoordinatetransformer.cpp
3   --------------------------------------
4   Date                 : 1.6.2017
5   Copyright            : (C) 2017 by Matthias Kuhn
6   Email                :  matthias (at) opengis.ch
7  ***************************************************************************
8  *                                                                         *
9  *   This program is free software; you can redistribute it and/or modify  *
10  *   it under the terms of the GNU General Public License as published by  *
11  *   the Free Software Foundation; either version 2 of the License, or     *
12  *   (at your option) any later version.                                   *
13  *                                                                         *
14  ***************************************************************************/
15 
16 #include "qgsquickcoordinatetransformer.h"
17 #include "qgslogger.h"
18 
QgsQuickCoordinateTransformer(QObject * parent)19 QgsQuickCoordinateTransformer::QgsQuickCoordinateTransformer( QObject *parent )
20   : QObject( parent )
21 {
22   mCoordinateTransform.setSourceCrs( QgsCoordinateReferenceSystem::fromEpsgId( 4326 ) );
23 }
24 
projectedPosition() const25 QgsPoint QgsQuickCoordinateTransformer::projectedPosition() const
26 {
27   return mProjectedPosition;
28 }
29 
sourcePosition() const30 QgsPoint QgsQuickCoordinateTransformer::sourcePosition() const
31 {
32   return mSourcePosition;
33 }
34 
setSourcePosition(const QgsPoint & sourcePosition)35 void QgsQuickCoordinateTransformer::setSourcePosition( const QgsPoint &sourcePosition )
36 {
37   if ( mSourcePosition == sourcePosition )
38     return;
39 
40   mSourcePosition = sourcePosition;
41 
42   emit sourcePositionChanged();
43   updatePosition();
44 }
45 
destinationCrs() const46 QgsCoordinateReferenceSystem QgsQuickCoordinateTransformer::destinationCrs() const
47 {
48   return mCoordinateTransform.destinationCrs();
49 }
50 
setDestinationCrs(const QgsCoordinateReferenceSystem & destinationCrs)51 void QgsQuickCoordinateTransformer::setDestinationCrs( const QgsCoordinateReferenceSystem &destinationCrs )
52 {
53   if ( destinationCrs == mCoordinateTransform.destinationCrs() )
54     return;
55 
56   mCoordinateTransform.setDestinationCrs( destinationCrs );
57   emit destinationCrsChanged();
58   updatePosition();
59 }
60 
sourceCrs() const61 QgsCoordinateReferenceSystem QgsQuickCoordinateTransformer::sourceCrs() const
62 {
63   return mCoordinateTransform.sourceCrs();
64 }
65 
setSourceCrs(const QgsCoordinateReferenceSystem & sourceCrs)66 void QgsQuickCoordinateTransformer::setSourceCrs( const QgsCoordinateReferenceSystem &sourceCrs )
67 {
68   if ( sourceCrs == mCoordinateTransform.sourceCrs() )
69     return;
70 
71   mCoordinateTransform.setSourceCrs( sourceCrs );
72 
73   emit sourceCrsChanged();
74   updatePosition();
75 }
76 
setTransformContext(const QgsCoordinateTransformContext & context)77 void QgsQuickCoordinateTransformer::setTransformContext( const QgsCoordinateTransformContext &context )
78 {
79   mCoordinateTransform.setContext( context );
80   emit transformContextChanged();
81 }
82 
transformContext() const83 QgsCoordinateTransformContext QgsQuickCoordinateTransformer::transformContext() const
84 {
85   return mCoordinateTransform.context();
86 }
87 
updatePosition()88 void QgsQuickCoordinateTransformer::updatePosition()
89 {
90   double x = mSourcePosition.x();
91   double y = mSourcePosition.y();
92   double z = mSourcePosition.z();
93 
94   // If Z is NaN, coordinate transformation (proj4) will
95   // also set X and Y to NaN. But we also want to get projected
96   // coords if we do not have any Z coordinate.
97   if ( std::isnan( z ) )
98   {
99     z = 0;
100   }
101 
102   try
103   {
104     mCoordinateTransform.transformInPlace( x, y, z );
105   }
106   catch ( const QgsCsException &exp )
107   {
108     QgsDebugMsg( exp.what() );
109   }
110 
111   mProjectedPosition = QgsPoint( x, y );
112   mProjectedPosition.addZValue( mSourcePosition.z() );
113 
114   emit projectedPositionChanged();
115 }
116