QGIS API Documentation 3.41.0-Master (88383c3d16f)
Loading...
Searching...
No Matches
qgscoordinatetransform.h
Go to the documentation of this file.
1/***************************************************************************
2 qgscoordinatetransform.h - Coordinate Transforms
3 ------------------------
4 begin : Dec 2004
5 copyright : (C) 2004 Tim Sutton
6 email : tim at linfiniti.com
7 ***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17#ifndef QGSCOORDINATETRANSFORM_H
18#define QGSCOORDINATETRANSFORM_H
19
20#include <QExplicitlySharedDataPointer>
21
22#include "qgsconfig.h"
23#include "qgis_core.h"
24#include "qgis_sip.h"
27
28class QgsCoordinateTransformPrivate;
29class QgsPointXY;
30class QgsRectangle;
31class QPolygonF;
32class QgsProject;
33class QgsVector3D;
34
57class CORE_EXPORT QgsCoordinateTransform
58{
59
60 public:
61
64
92 const QgsCoordinateReferenceSystem &destination,
93 const QgsCoordinateTransformContext &context,
95
122 const QgsCoordinateReferenceSystem &destination,
123 const QgsProject *project,
125
133 Q_DECL_DEPRECATED explicit QgsCoordinateTransform( const QgsCoordinateReferenceSystem &source,
134 const QgsCoordinateReferenceSystem &destination,
135 int sourceDatumTransformId,
136 int destinationDatumTransformId ) SIP_DEPRECATED;
137
139 QgsCoordinateTransform &operator=( const QgsCoordinateTransform &o );
140
142
143 bool operator==( const QgsCoordinateTransform &other ) const;
144 bool operator!=( const QgsCoordinateTransform &other ) const;
145
158 static bool isTransformationPossible( const QgsCoordinateReferenceSystem &source, const QgsCoordinateReferenceSystem &destination );
159
164 bool isValid() const;
165
172 void setSourceCrs( const QgsCoordinateReferenceSystem &crs );
173
180 void setDestinationCrs( const QgsCoordinateReferenceSystem &crs );
181
187 void setContext( const QgsCoordinateTransformContext &context );
188
195 QgsCoordinateTransformContext context() const;
196
203 QgsCoordinateReferenceSystem sourceCrs() const;
204
211 QgsCoordinateReferenceSystem destinationCrs() const;
212
223
234 QgsPointXY transform( double x, double y, Qgis::TransformDirection direction = Qgis::TransformDirection::Forward ) const SIP_THROW( QgsCsException );
235
247
263 QgsRectangle transformBoundingBox( const QgsRectangle &rectangle, Qgis::TransformDirection direction = Qgis::TransformDirection::Forward, bool handle180Crossover = false ) const SIP_THROW( QgsCsException );
264
277 void transformInPlace( double &x, double &y, double &z, Qgis::TransformDirection direction = Qgis::TransformDirection::Forward ) const SIP_THROW( QgsCsException );
278
292 void transformInPlace( float &x, float &y, double &z, Qgis::TransformDirection direction = Qgis::TransformDirection::Forward ) const SIP_SKIP;
293
307 void transformInPlace( float &x, float &y, float &z, Qgis::TransformDirection direction = Qgis::TransformDirection::Forward ) const SIP_SKIP;
308
322 void transformInPlace( QVector<float> &x, QVector<float> &y, QVector<float> &z,
324
338 void transformInPlace( QVector<double> &x, QVector<double> &y, QVector<double> &z,
340
347 void transformPolygon( QPolygonF &polygon, Qgis::TransformDirection direction = Qgis::TransformDirection::Forward ) const SIP_THROW( QgsCsException );
348
359
371 void transformCoords( int numPoint, double *x, double *y, double *z, Qgis::TransformDirection direction = Qgis::TransformDirection::Forward ) const SIP_THROW( QgsCsException );
372
376 bool isShortCircuited() const;
377
384 bool hasVerticalComponent() const;
385
402 QString coordinateOperation() const;
403
417 QgsDatumTransform::TransformDetails instantiatedCoordinateOperationDetails() const;
418
432 void setCoordinateOperation( const QString &operation ) const;
433
448 void setAllowFallbackTransforms( bool allowed );
449
461 bool allowFallbackTransforms() const;
462
494 void setBallparkTransformsAreAppropriate( bool appropriate );
495
510 void disableFallbackOperationHandler( bool disabled );
511
520 bool fallbackOperationOccurred() const;
521
535 Q_DECL_DEPRECATED int sourceDatumTransformId() const SIP_DEPRECATED;
536
550 Q_DECL_DEPRECATED void setSourceDatumTransformId( int datumId ) SIP_DEPRECATED;
551
565 Q_DECL_DEPRECATED int destinationDatumTransformId() const SIP_DEPRECATED;
566
580 Q_DECL_DEPRECATED void setDestinationDatumTransformId( int datumId ) SIP_DEPRECATED;
581
582#ifndef SIP_RUN
583
593 static void invalidateCache( bool disableCache = false );
594#else
595
602 static void invalidateCache( bool disableCache SIP_PYARGREMOVE = false );
603#endif
604
614 double scaleFactor( const QgsRectangle &referenceExtent ) const;
615
616#ifdef SIP_RUN
617 SIP_PYOBJECT __repr__();
618 % MethodCode
619 QString str = QStringLiteral( "<QgsCoordinateTransform: %1 to %2>" ).arg( sipCpp->sourceCrs().isValid() ? sipCpp->sourceCrs().authid() : QStringLiteral( "NULL" ),
620 sipCpp->destinationCrs().isValid() ? sipCpp->destinationCrs().authid() : QStringLiteral( "NULL" ) );
621 sipRes = PyUnicode_FromString( str.toUtf8().constData() );
622 % End
623#endif
624
625#ifndef SIP_RUN
626
639 static void setCustomMissingRequiredGridHandler( const std::function< void( const QgsCoordinateReferenceSystem &sourceCrs,
640 const QgsCoordinateReferenceSystem &destinationCrs,
641 const QgsDatumTransform::GridDetails &grid )> &handler );
642
659 static void setCustomMissingPreferredGridHandler( const std::function< void( const QgsCoordinateReferenceSystem &sourceCrs,
660 const QgsCoordinateReferenceSystem &destinationCrs,
661 const QgsDatumTransform::TransformDetails &preferredOperation,
662 const QgsDatumTransform::TransformDetails &availableOperation )> &handler );
663
676 static void setCustomCoordinateOperationCreationErrorHandler( const std::function< void( const QgsCoordinateReferenceSystem &sourceCrs,
677 const QgsCoordinateReferenceSystem &destinationCrs,
678 const QString &error )> &handler );
679
692 static void setCustomMissingGridUsedByContextHandler( const std::function< void( const QgsCoordinateReferenceSystem &sourceCrs,
693 const QgsCoordinateReferenceSystem &destinationCrs,
694 const QgsDatumTransform::TransformDetails &desiredOperation )> &handler );
695
696
703 static void setFallbackOperationOccurredHandler( const std::function< void( const QgsCoordinateReferenceSystem &sourceCrs,
704 const QgsCoordinateReferenceSystem &destinationCrs,
705 const QString &desiredOperation )> &handler );
706
713 static void setDynamicCrsToDynamicCrsWarningHandler( const std::function< void( const QgsCoordinateReferenceSystem &sourceCrs,
714 const QgsCoordinateReferenceSystem &destinationCrs )> &handler );
715
716#endif
717
718 private:
719
720#ifndef SIP_RUN
721 friend class QgsProjContext;
722
723 // Only meant to be called by QgsProjContext::~QgsProjContext()
724 static void removeFromCacheObjectsBelongingToCurrentThread( void *pj_context );
725#endif
726
727 mutable QExplicitlySharedDataPointer<QgsCoordinateTransformPrivate> d;
728
731
732#ifdef QGISDEBUG
733 bool mHasContext = false;
734#endif
735
736 mutable QString mLastError;
737 bool mIgnoreImpossible = false;
738 bool mBallparkTransformsAreAppropriate = false;
739 bool mDisableFallbackHandler = false;
740 mutable bool mFallbackOperationOccurred = false;
741
742 bool setFromCache( const QgsCoordinateReferenceSystem &src,
744 const QString &coordinateOperationProj, bool allowFallback );
745
746 void addToCache();
747
748 // cache
749 static QReadWriteLock sCacheLock;
750
758 static QMultiHash< QPair< QString, QString >, QgsCoordinateTransform > sTransforms;
759 static bool sDisableCache;
760
761
762 static std::function< void( const QgsCoordinateReferenceSystem &sourceCrs,
763 const QgsCoordinateReferenceSystem &destinationCrs,
764 const QString &desiredOperation )> sFallbackOperationOccurredHandler;
765
766 friend class TestQgsCoordinateTransform;
767
768};
769
771#ifndef SIP_RUN
772inline std::ostream &operator << ( std::ostream &os, const QgsCoordinateTransform &r )
773{
774 QString mySummary( QStringLiteral( "\n%%%%%%%%%%%%%%%%%%%%%%%%\nCoordinate Transform def begins:" ) );
775 mySummary += QLatin1String( "\n\tInitialized? : " );
776 //prevent warnings
777 if ( r.isValid() )
778 {
779 //do nothing this is a dummy
780 }
781
782#if 0
783 if ( r.isValid() )
784 {
785 mySummary += "Yes";
786 }
787 else
788 {
789 mySummary += "No";
790 }
791 mySummary += "\n\tShort Circuit? : ";
792 if ( r.isShortCircuited() )
793 {
794 mySummary += "Yes";
795 }
796 else
797 {
798 mySummary += "No";
799 }
800
801 mySummary += "\n\tSource Spatial Ref Sys : ";
802 if ( r.sourceCrs() )
803 {
804 mySummary << r.sourceCrs();
805 }
806 else
807 {
808 mySummary += "Undefined";
809 }
810
811 mySummary += "\n\tDest Spatial Ref Sys : ";
812 if ( r.destCRS() )
813 {
814 mySummary << r.destCRS();
815 }
816 else
817 {
818 mySummary += "Undefined";
819 }
820#endif
821
822 mySummary += QLatin1String( "\nCoordinate Transform def ends \n%%%%%%%%%%%%%%%%%%%%%%%%\n" );
823 return os << mySummary.toLocal8Bit().data() << std::endl;
824}
825#endif
826
827
828#endif // QGSCOORDINATETRANSFORM_H
QFlags< CoordinateTransformationFlag > CoordinateTransformationFlags
Coordinate transformation flags.
Definition qgis.h:2608
TransformDirection
Indicates the direction (forward or inverse) of a transform.
Definition qgis.h:2585
@ Forward
Forward transform (from source to destination)
This class represents a coordinate reference system (CRS).
Contains information about the context in which a coordinate transform is executed.
Class for doing transforms between two map coordinate systems.
QgsCoordinateReferenceSystem sourceCrs() const
Returns the source coordinate reference system, which the transform will transform coordinates from.
bool isShortCircuited() const
Returns true if the transform short circuits because the source and destination are equivalent.
bool isValid() const
Returns true if the coordinate transform is valid, ie both the source and destination CRS have been s...
Custom exception class for Coordinate Reference System related exceptions.
A class to represent a 2D point.
Definition qgspointxy.h:60
Used to create and store a proj context object, correctly freeing the context upon destruction.
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
Definition qgsproject.h:107
A rectangle specified with double values.
Class for storage of 3D vectors similar to QVector3D, with the difference that it uses double precisi...
Definition qgsvector3d.h:31
#define SIP_DEPRECATED
Definition qgis_sip.h:106
#define SIP_SKIP
Definition qgis_sip.h:126
#define SIP_PYARGREMOVE
Definition qgis_sip.h:151
#define SIP_THROW(name,...)
Definition qgis_sip.h:203
std::ostream & operator<<(std::ostream &os, const QgsCoordinateTransform &r)
Output stream operator.
bool operator==(const QgsFeatureIterator &fi1, const QgsFeatureIterator &fi2)
bool operator!=(const QgsFeatureIterator &fi1, const QgsFeatureIterator &fi2)
const QgsCoordinateReferenceSystem & crs
Contains information about a projection transformation grid file.
Contains information about a coordinate transformation operation.