QGIS API Documentation  3.24.2-Tisler (13c1a02865)
qgscoordinatereferencesystem.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgscoordinatereferencesystem.h
3 
4  -------------------
5  begin : 2007
6  copyright : (C) 2007 by Gary E. Sherman
7  email : [email protected]
8 ***************************************************************************/
9 
10 /***************************************************************************
11  * *
12  * This program is free software; you can redistribute it and/or modify *
13  * it under the terms of the GNU General Public License as published by *
14  * the Free Software Foundation; either version 2 of the License, or *
15  * (at your option) any later version. *
16  * *
17  ***************************************************************************/
18 #ifndef QGSCOORDINATEREFERENCESYSTEM_H
19 #define QGSCOORDINATEREFERENCESYSTEM_H
20 
21 //Standard includes
22 #include "qgis_core.h"
23 #include <ostream>
24 
25 //qt includes
26 #include <QString>
27 #include <QMap>
28 #include <QHash>
29 #include <QReadWriteLock>
30 #include <QExplicitlySharedDataPointer>
31 #include <QObject>
32 
33 //qgis includes
34 #include "qgis_sip.h"
35 #include "qgsconfig.h"
36 #include "qgsunittypes.h"
37 #include "qgsrectangle.h"
38 #include "qgssqliteutils.h"
39 
40 class QDomNode;
41 class QDomDocument;
42 class QgsCoordinateReferenceSystemPrivate;
43 class QgsDatumEnsemble;
45 class QgsProjOperation;
46 
47 #ifndef SIP_RUN
48 struct PJconsts;
49 typedef struct PJconsts PJ;
50 
51 #if PROJ_VERSION_MAJOR>=8
52 struct pj_ctx;
53 typedef struct pj_ctx PJ_CONTEXT;
54 #else
55 struct projCtx_t;
56 typedef struct projCtx_t PJ_CONTEXT;
57 #endif
58 #endif
59 
60 // forward declaration for sqlite3
61 typedef struct sqlite3 sqlite3 SIP_SKIP;
62 
63 #ifdef DEBUG
64 typedef struct OGRSpatialReferenceHS *OGRSpatialReferenceH SIP_SKIP;
65 #else
67 #endif
68 
71 
212 {
213  Q_GADGET
214 
215  Q_PROPERTY( QgsUnitTypes::DistanceUnit mapUnits READ mapUnits )
216  Q_PROPERTY( bool isGeographic READ isGeographic )
217  Q_PROPERTY( QString authid READ authid )
218  Q_PROPERTY( QString description READ description )
219 
220  public:
221 
223  enum CrsType
224  {
227  EpsgCrsId
228  };
229 
232 
234 
235  // TODO QGIS 4: remove "POSTGIS" and "INTERNAL"
236 
252  explicit QgsCoordinateReferenceSystem( const QString &definition );
253 
254  // TODO QGIS 4: remove type and always use EPSG code
255 
267  Q_DECL_DEPRECATED explicit QgsCoordinateReferenceSystem( long id, CrsType type = PostgisCrsId ) SIP_DEPRECATED;
268 
271 
274 
276  operator QVariant() const
277  {
278  return QVariant::fromValue( *this );
279  }
280 
288  static QList< long > validSrsIds();
289 
290  // static creators
291 
299  static QgsCoordinateReferenceSystem fromOgcWmsCrs( const QString &ogcCrs );
300 
307  Q_INVOKABLE static QgsCoordinateReferenceSystem fromEpsgId( long epsg );
308 
315  Q_DECL_DEPRECATED static QgsCoordinateReferenceSystem fromProj4( const QString &proj4 ) SIP_DEPRECATED;
316 
324  static QgsCoordinateReferenceSystem fromProj( const QString &proj );
325 
333  static QgsCoordinateReferenceSystem fromWkt( const QString &wkt );
334 
343  static QgsCoordinateReferenceSystem fromSrsId( long srsId );
344 
345  // Misc helper functions -----------------------
346 
347  // TODO QGIS 4: remove type and always use EPSG code, rename to createFromEpsg
348 
354  Q_DECL_DEPRECATED bool createFromId( long id, CrsType type = PostgisCrsId ) SIP_DEPRECATED;
355 
356  // TODO QGIS 4: remove "QGIS" and "CUSTOM", only support "USER" (also returned by authid())
357 
368  bool createFromOgcWmsCrs( const QString &crs );
369 
370  // TODO QGIS 4: remove unless really necessary - let's use EPSG codes instead
371 
379  Q_DECL_DEPRECATED bool createFromSrid( long srid ) SIP_DEPRECATED;
380 
393  bool createFromWkt( const QString &wkt );
394 
407  bool createFromSrsId( long srsId );
408 
432  Q_DECL_DEPRECATED bool createFromProj4( const QString &projString ) SIP_DEPRECATED;
433 
461 #ifndef SIP_RUN
462  bool createFromProj( const QString &projString, bool identify = true );
463 #else
464  bool createFromProj( const QString &projString );
465 #endif
466 
482  bool createFromString( const QString &definition );
483 
484  // TODO QGIS 4: rename to createFromStringOGR so it is clear it's similar to createFromString, just different backend
485 
501  bool createFromUserInput( const QString &definition );
502 
513  Q_DECL_DEPRECATED static void setupESRIWktFix() SIP_DEPRECATED;
514 
516  bool isValid() const;
517 
529  void validate();
530 
531  // TODO QGIS 4: seems completely obsolete now (only compares proj4 - already done in createFromProj4)
532 
541  Q_DECL_DEPRECATED long findMatchingProj() SIP_DEPRECATED;
542 
548  bool operator==( const QgsCoordinateReferenceSystem &srs ) const;
549 
555  bool operator!=( const QgsCoordinateReferenceSystem &srs ) const;
556 
563  bool readXml( const QDomNode &node );
564 
571  bool writeXml( QDomNode &node, QDomDocument &doc ) const;
572 
573 
578  static void setCustomCrsValidation( CUSTOM_CRS_VALIDATION f ) SIP_SKIP;
579 
584  static CUSTOM_CRS_VALIDATION customCrsValidation() SIP_SKIP;
585 
586  // Accessors -----------------------------------
587 
592  long srsid() const;
593 
594  // TODO QGIS 4: remove unless really necessary - let's use EPSG codes instead
595 
600  long postgisSrid() const;
601 
614  QString authid() const;
615 
623  QString description() const;
624 
631  {
635  };
636 
650  QString userFriendlyIdentifier( IdentifierType type = MediumString ) const;
651 
658  QString projectionAcronym() const;
659 
666  QString ellipsoidAcronym() const;
667 
670  {
677  WKT2_2019 = WKT2_2018,
678  WKT2_2019_SIMPLIFIED = WKT2_2018_SIMPLIFIED,
679 
680  WKT_PREFERRED = WKT2_2019,
681  WKT_PREFERRED_SIMPLIFIED = WKT2_2019_SIMPLIFIED,
682  WKT_PREFERRED_GDAL = WKT2_2019,
683  };
684 
696  QString toWkt( WktVariant variant = WKT1_GDAL, bool multiline = false, int indentationWidth = 4 ) const;
697 
710  Q_DECL_DEPRECATED QString toProj4() const SIP_DEPRECATED;
711 
724  QString toProj() const;
725 
730  bool isGeographic() const;
731 
740  bool isDynamic() const;
741 
754  QgsDatumEnsemble datumEnsemble() const SIP_THROW( QgsNotSupportedException );
755 
765  QString celestialBodyName() const SIP_THROW( QgsNotSupportedException );
766 
790  void setCoordinateEpoch( double epoch );
791 
815  double coordinateEpoch() const;
816 
828  QgsProjectionFactors factors( const QgsPoint &point ) const;
829 
836  QgsProjOperation operation() const;
837 
842  bool hasAxisInverted() const;
843 
847  QgsUnitTypes::DistanceUnit mapUnits() const;
848 
857  QgsRectangle bounds() const;
858 
859  // Mutators -----------------------------------
860 
877  void updateDefinition();
878 
882  void setValidationHint( const QString &html );
883 
887  QString validationHint();
888 
895  static int syncDatabase();
896 
910  long saveAsUserCrs( const QString &name, Qgis::CrsDefinitionFormat nativeFormat = Qgis::CrsDefinitionFormat::Wkt );
911 
921  void setNativeFormat( Qgis::CrsDefinitionFormat format );
922 
932  Qgis::CrsDefinitionFormat nativeFormat() const;
933 
943  QgsCoordinateReferenceSystem toGeographicCrs() const;
944 
946  QString geographicCrsAuthId() const;
947 
948 #ifdef SIP_RUN
949  SIP_PYOBJECT __repr__();
950  % MethodCode
951  const QString str = sipCpp->isValid() ? QStringLiteral( "<QgsCoordinateReferenceSystem: %1%2>" ).arg( !sipCpp->authid().isEmpty() ? sipCpp->authid() : sipCpp->toWkt( QgsCoordinateReferenceSystem::WKT_PREFERRED ),
952  std::isfinite( sipCpp->coordinateEpoch() ) ? QStringLiteral( " @ %1" ).arg( sipCpp->coordinateEpoch() ) : QString() )
953  : QStringLiteral( "<QgsCoordinateReferenceSystem: invalid>" );
954  sipRes = PyUnicode_FromString( str.toUtf8().constData() );
955  % End
956 #endif
957 
958 #ifndef SIP_RUN
959 
969  PJ *projObject() const;
970 
981  static QgsCoordinateReferenceSystem fromProjObject( PJ *object );
982 
991  bool createFromProjObject( PJ *object );
992 #endif
993 
999  Q_DECL_DEPRECATED static QStringList recentProjections() SIP_DEPRECATED;
1000 
1005  static QList< QgsCoordinateReferenceSystem > recentCoordinateReferenceSystems();
1006 
1011  static void pushRecentCoordinateReferenceSystem( const QgsCoordinateReferenceSystem &crs );
1012 
1013 #ifndef SIP_RUN
1014 
1025  static void invalidateCache( bool disableCache = false );
1026 #else
1027 
1035  static void invalidateCache( bool disableCache SIP_PYARGREMOVE = false );
1036 #endif
1037 
1038  // Mutators -----------------------------------
1039  // We don't want to expose these to the public api since they won't create
1040  // a fully valid crs. Programmers should use the createFrom* methods rather
1041  private:
1042 
1048  static QString projFromSrsId( int srsId );
1049 
1055  void setProjString( const QString &projString );
1056 
1060  bool setWktString( const QString &wkt );
1061 
1065  void debugPrint();
1066 
1068  typedef QMap<QString, QString> RecordMap;
1069 
1077  RecordMap getRecord( const QString &sql );
1078 
1083  static int openDatabase( const QString &path, sqlite3_database_unique_ptr &database, bool readonly = true );
1084 
1086  void setMapUnits();
1087 
1089  static long getRecordCount();
1090 
1091  bool loadFromAuthCode( const QString &auth, const QString &code );
1092 
1096  static QList< long > userSrsIds();
1097 
1105  long matchToUserCrs() const;
1106 
1111  bool loadFromDatabase( const QString &db, const QString &expression, const QString &value );
1112 
1113  bool createFromWktInternal( const QString &wkt, const QString &description );
1114 
1115  QExplicitlySharedDataPointer<QgsCoordinateReferenceSystemPrivate> d;
1116 
1117  QString mValidationHint;
1118 
1119  Qgis::CrsDefinitionFormat mNativeFormat = Qgis::CrsDefinitionFormat::Wkt;
1120 
1121  friend class QgsProjContext;
1122 
1123  // Only meant to be called by QgsProjContext::~QgsProjContext()
1124  static void removeFromCacheObjectsBelongingToCurrentThread( PJ_CONTEXT *pj_context );
1125 
1127  static CUSTOM_CRS_VALIDATION sCustomSrsValidation;
1128 
1129  // cache
1130 
1131  static bool sDisableSrIdCache;
1132  static bool sDisableOgcCache;
1133  static bool sDisableProjCache;
1134  static bool sDisableWktCache;
1135  static bool sDisableSrsIdCache;
1136  static bool sDisableStringCache;
1137 
1138  // for tests
1139  static const QHash< QString, QgsCoordinateReferenceSystem > &stringCache();
1140  static const QHash< QString, QgsCoordinateReferenceSystem > &projCache();
1141  static const QHash< QString, QgsCoordinateReferenceSystem > &ogcCache();
1142  static const QHash< QString, QgsCoordinateReferenceSystem > &wktCache();
1143  static const QHash< long, QgsCoordinateReferenceSystem > &srsIdCache();
1144  static const QHash< long, QgsCoordinateReferenceSystem > &srIdCache();
1145 
1146  friend class TestQgsCoordinateReferenceSystem;
1148  friend bool CORE_EXPORT operator> ( const QgsCoordinateReferenceSystem &c1, const QgsCoordinateReferenceSystem &c2 );
1149  friend bool CORE_EXPORT operator< ( const QgsCoordinateReferenceSystem &c1, const QgsCoordinateReferenceSystem &c2 );
1150  friend bool CORE_EXPORT operator>= ( const QgsCoordinateReferenceSystem &c1, const QgsCoordinateReferenceSystem &c2 );
1151  friend bool CORE_EXPORT operator<= ( const QgsCoordinateReferenceSystem &c1, const QgsCoordinateReferenceSystem &c2 );
1152 
1153  bool createFromPostgisSrid( const long id );
1154 };
1155 
1157 
1158 #ifndef SIP_RUN
1160 inline std::ostream &operator << ( std::ostream &os, const QgsCoordinateReferenceSystem &r )
1161 {
1162  QString mySummary( QStringLiteral( "\n\tSpatial Reference System:" ) );
1163  mySummary += QLatin1String( "\n\t\tDescription : " );
1164  if ( !r.description().isNull() )
1165  {
1166  mySummary += r.description();
1167  }
1168  else
1169  {
1170  mySummary += QLatin1String( "Undefined" );
1171  }
1172  mySummary += QLatin1String( "\n\t\tProjection : " );
1173  if ( !r.projectionAcronym().isNull() )
1174  {
1175  mySummary += r.projectionAcronym();
1176  }
1177  else
1178  {
1179  mySummary += QLatin1String( "Undefined" );
1180  }
1181 
1182  mySummary += QLatin1String( "\n\t\tEllipsoid : " );
1183  if ( !r.ellipsoidAcronym().isNull() )
1184  {
1185  mySummary += r.ellipsoidAcronym();
1186  }
1187  else
1188  {
1189  mySummary += QLatin1String( "Undefined" );
1190  }
1191 
1192  mySummary += QLatin1String( "\n\t\tProjString : " );
1193  if ( !r.toProj().isNull() )
1194  {
1195  mySummary += r.toProj();
1196  }
1197  else
1198  {
1199  mySummary += QLatin1String( "Undefined" );
1200  }
1201  // Using streams we need to use local 8 Bit
1202  return os << mySummary.toLocal8Bit().data() << std::endl;
1203 }
1204 
1205 bool CORE_EXPORT operator> ( const QgsCoordinateReferenceSystem &c1, const QgsCoordinateReferenceSystem &c2 );
1206 bool CORE_EXPORT operator< ( const QgsCoordinateReferenceSystem &c1, const QgsCoordinateReferenceSystem &c2 );
1207 bool CORE_EXPORT operator>= ( const QgsCoordinateReferenceSystem &c1, const QgsCoordinateReferenceSystem &c2 );
1208 bool CORE_EXPORT operator<= ( const QgsCoordinateReferenceSystem &c1, const QgsCoordinateReferenceSystem &c2 );
1209 #endif
1210 
1211 #endif // QGSCOORDINATEREFERENCESYSTEM_H
The Qgis class provides global constants for use throughout the application.
Definition: qgis.h:64
CrsDefinitionFormat
CRS definition formats.
Definition: qgis.h:1318
A registry for known coordinate reference system (CRS) definitions, including any user-defined CRSes.
This class represents a coordinate reference system (CRS).
QString toProj() const
Returns a Proj string representation of this CRS.
QString ellipsoidAcronym() const
Returns the ellipsoid acronym for the ellipsoid used by the CRS.
QString projectionAcronym() const
Returns the projection acronym for the projection used by the CRS.
CrsType
Enumeration of types of IDs accepted in createFromId() method.
@ InternalCrsId
Internal ID used by QGIS in the local SQLite database.
@ PostgisCrsId
SRID used in PostGIS. DEPRECATED – DO NOT USE.
IdentifierType
Type of identifier string to create.
@ MediumString
A medium-length string, recommended for general purpose use.
@ FullString
Full definition – possibly a very lengthy string, e.g. with no truncation of custom WKT definitions.
@ ShortString
A heavily abbreviated string, for use when a compact representation is required.
WktVariant
WKT formatting variants, only used for builds based on Proj >= 6.
@ WKT1_GDAL
WKT1 as traditionally output by GDAL, deriving from OGC 01-009. A notable departure from WKT1_GDAL wi...
@ WKT2_2018_SIMPLIFIED
Alias for WKT2_2019_SIMPLIFIED.
@ WKT_PREFERRED
Preferred format, matching the most recent WKT ISO standard. Currently an alias to WKT2_2019,...
@ WKT2_2015
Full WKT2 string, conforming to ISO 19162:2015(E) / OGC 12-063r5 with all possible nodes and new keyw...
@ WKT1_ESRI
WKT1 as traditionally output by ESRI software, deriving from OGC 99-049.
@ WKT2_2015_SIMPLIFIED
Same as WKT2_2015 with the following exceptions: UNIT keyword used. ID node only on top element....
Contains information about a datum ensemble.
Definition: qgsdatums.h:95
Custom exception class which is raised when an operation is not supported.
Definition: qgsexception.h:118
Point geometry type, with support for z-dimension and m-values.
Definition: qgspoint.h:49
Used to create and store a proj context object, correctly freeing the context upon destruction.
Definition: qgsprojutils.h:231
Contains information about a PROJ operation.
contains various cartographic properties, such as scale factors, angular distortion and meridian conv...
A rectangle specified with double values.
Definition: qgsrectangle.h:42
Helper functions for various unit types.
Definition: qgsunittypes.h:39
DistanceUnit
Units of distance.
Definition: qgsunittypes.h:68
Unique pointer for sqlite3 databases, which automatically closes the database when the pointer goes o...
#define str(x)
Definition: qgis.cpp:37
#define SIP_THROW(name)
Definition: qgis_sip.h:189
#define SIP_DEPRECATED
Definition: qgis_sip.h:106
#define SIP_SKIP
Definition: qgis_sip.h:126
#define SIP_PYARGREMOVE
Definition: qgis_sip.h:146
struct sqlite3 sqlite3
void * OGRSpatialReferenceH
bool CORE_EXPORT operator<(const QgsCoordinateReferenceSystem &c1, const QgsCoordinateReferenceSystem &c2)
bool CORE_EXPORT operator>(const QgsCoordinateReferenceSystem &c1, const QgsCoordinateReferenceSystem &c2)
bool CORE_EXPORT operator<=(const QgsCoordinateReferenceSystem &c1, const QgsCoordinateReferenceSystem &c2)
struct PJconsts PJ
std::ostream & operator<<(std::ostream &os, const QgsCoordinateReferenceSystem &r)
Output stream operator.
struct projCtx_t PJ_CONTEXT
bool CORE_EXPORT operator>=(const QgsCoordinateReferenceSystem &c1, const QgsCoordinateReferenceSystem &c2)
void(* CUSTOM_CRS_VALIDATION)(QgsCoordinateReferenceSystem &)
Q_DECLARE_METATYPE(QgsMeshTimeSettings)
const QgsCoordinateReferenceSystem & crs
bool hasAxisInverted