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)19QgsQuickCoordinateTransformer::QgsQuickCoordinateTransformer( QObject *parent ) 20 : QObject( parent ) 21 { 22 mCoordinateTransform.setSourceCrs( QgsCoordinateReferenceSystem::fromEpsgId( 4326 ) ); 23 } 24 projectedPosition() const25QgsPoint QgsQuickCoordinateTransformer::projectedPosition() const 26 { 27 return mProjectedPosition; 28 } 29 sourcePosition() const30QgsPoint QgsQuickCoordinateTransformer::sourcePosition() const 31 { 32 return mSourcePosition; 33 } 34 setSourcePosition(const QgsPoint & sourcePosition)35void 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() const46QgsCoordinateReferenceSystem QgsQuickCoordinateTransformer::destinationCrs() const 47 { 48 return mCoordinateTransform.destinationCrs(); 49 } 50 setDestinationCrs(const QgsCoordinateReferenceSystem & destinationCrs)51void 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() const61QgsCoordinateReferenceSystem QgsQuickCoordinateTransformer::sourceCrs() const 62 { 63 return mCoordinateTransform.sourceCrs(); 64 } 65 setSourceCrs(const QgsCoordinateReferenceSystem & sourceCrs)66void 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)77void QgsQuickCoordinateTransformer::setTransformContext( const QgsCoordinateTransformContext &context ) 78 { 79 mCoordinateTransform.setContext( context ); 80 emit transformContextChanged(); 81 } 82 transformContext() const83QgsCoordinateTransformContext QgsQuickCoordinateTransformer::transformContext() const 84 { 85 return mCoordinateTransform.context(); 86 } 87 updatePosition()88void 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