QGIS API Documentation 3.39.0-Master (3aed037ce22)
Loading...
Searching...
No Matches
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
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 "qgis.h"
36#include "qgsconfig.h"
37#include "qgsrectangle.h"
38#include "qgssqliteutils.h"
39
40class QDomNode;
41class QDomDocument;
42class QgsCoordinateReferenceSystemPrivate;
46
47#ifndef SIP_RUN
48struct PJconsts;
49typedef struct PJconsts PJ;
50
51#if PROJ_VERSION_MAJOR>=8
52struct pj_ctx;
53typedef struct pj_ctx PJ_CONTEXT;
54#else
55struct projCtx_t;
56typedef struct projCtx_t PJ_CONTEXT;
57#endif
58#endif
59
60// forward declaration for sqlite3
61typedef struct sqlite3 sqlite3 SIP_SKIP;
62
63#ifdef DEBUG
64typedef struct OGRSpatialReferenceHS *OGRSpatialReferenceH SIP_SKIP;
65#else
67#endif
68
71
212{
213 Q_GADGET
214
215 Q_PROPERTY( Qgis::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
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
273 operator QVariant() const
274 {
275 return QVariant::fromValue( *this );
276 }
277
284 static QList< long > validSrsIds();
285
286 // static creators
287
294 static QgsCoordinateReferenceSystem fromOgcWmsCrs( const QString &ogcCrs );
295
301 Q_INVOKABLE static QgsCoordinateReferenceSystem fromEpsgId( long epsg );
302
309 Q_DECL_DEPRECATED static QgsCoordinateReferenceSystem fromProj4( const QString &proj4 ) SIP_DEPRECATED;
310
318 static QgsCoordinateReferenceSystem fromProj( const QString &proj );
319
326 static QgsCoordinateReferenceSystem fromWkt( const QString &wkt );
327
335 static QgsCoordinateReferenceSystem fromSrsId( long srsId );
336
352 static QgsCoordinateReferenceSystem createCompoundCrs( const QgsCoordinateReferenceSystem &horizontalCrs, const QgsCoordinateReferenceSystem &verticalCrs, QString &error SIP_OUT );
353
354 // Misc helper functions -----------------------
355
356 // TODO QGIS 4: remove type and always use EPSG code, rename to createFromEpsg
357
363 Q_DECL_DEPRECATED bool createFromId( long id, CrsType type = PostgisCrsId ) SIP_DEPRECATED;
364
365 // TODO QGIS 4: remove "QGIS" and "CUSTOM", only support "USER" (also returned by authid())
366
377 bool createFromOgcWmsCrs( const QString &crs );
378
379 // TODO QGIS 4: remove unless really necessary - let's use EPSG codes instead
380
388 Q_DECL_DEPRECATED bool createFromSrid( long srid ) SIP_DEPRECATED;
389
402 bool createFromWkt( const QString &wkt );
403
416 bool createFromSrsId( long srsId );
417
441 Q_DECL_DEPRECATED bool createFromProj4( const QString &projString ) SIP_DEPRECATED;
442
470#ifndef SIP_RUN
471 bool createFromProj( const QString &projString, bool identify = true );
472#else
473 bool createFromProj( const QString &projString );
474#endif
475
491 bool createFromString( const QString &definition );
492
493 // TODO QGIS 4: rename to createFromStringOGR so it is clear it's similar to createFromString, just different backend
494
510 bool createFromUserInput( const QString &definition );
511
522 Q_DECL_DEPRECATED static void setupESRIWktFix() SIP_DEPRECATED;
523
525 bool isValid() const;
526
538 void validate();
539
540 // TODO QGIS 4: seems completely obsolete now (only compares proj4 - already done in createFromProj4)
541
550 Q_DECL_DEPRECATED long findMatchingProj() SIP_DEPRECATED;
551
552 bool operator==( const QgsCoordinateReferenceSystem &srs ) const;
553 bool operator!=( const QgsCoordinateReferenceSystem &srs ) const;
554
561 bool readXml( const QDomNode &node );
562
569 bool writeXml( QDomNode &node, QDomDocument &doc ) const;
570
571
576 static void setCustomCrsValidation( CUSTOM_CRS_VALIDATION f ) SIP_SKIP;
577
582 static CUSTOM_CRS_VALIDATION customCrsValidation() SIP_SKIP;
583
584 // Accessors -----------------------------------
585
590 long srsid() const;
591
592 // TODO QGIS 4: remove unless really necessary - let's use EPSG codes instead
593
598 long postgisSrid() const;
599
612 QString authid() const;
613
621 QString description() const;
622
636 QString userFriendlyIdentifier( Qgis::CrsIdentifierType type = Qgis::CrsIdentifierType::MediumString ) const;
637
644 QString projectionAcronym() const;
645
652 QString ellipsoidAcronym() const;
653
665 QString toWkt( Qgis::CrsWktVariant variant = Qgis::CrsWktVariant::Wkt1Gdal, bool multiline = false, int indentationWidth = 4 ) const;
666
679 Q_DECL_DEPRECATED QString toProj4() const SIP_DEPRECATED;
680
693 QString toProj() const;
694
700 Qgis::CrsType type() const;
701
707 bool isDeprecated() const;
708
713 bool isGeographic() const;
714
723 bool isDynamic() const;
724
739 QgsDatumEnsemble datumEnsemble() const SIP_THROW( QgsNotSupportedException );
740
750 QString celestialBodyName() const SIP_THROW( QgsNotSupportedException );
751
775 void setCoordinateEpoch( double epoch );
776
800 double coordinateEpoch() const;
801
813 QgsProjectionFactors factors( const QgsPoint &point ) const;
814
821 QgsProjOperation operation() const;
822
830 bool hasAxisInverted() const;
831
837#ifndef SIP_RUN
838 QList< Qgis::CrsAxisDirection > axisOrdering() const;
839#else
840 SIP_PYOBJECT axisOrdering() const SIP_TYPEHINT( List[Qgis.CrsAxisDirection] );
841 % MethodCode
842 // adapted from the qpymultimedia_qlist.sip file from the PyQt6 sources
843
844 const QList< Qgis::CrsAxisDirection > cppRes = sipCpp->axisOrdering();
845
846 PyObject *l = PyList_New( cppRes.size() );
847
848 if ( !l )
849 sipIsErr = 1;
850 else
851 {
852 for ( int i = 0; i < cppRes.size(); ++i )
853 {
854 PyObject *eobj = sipConvertFromEnum( static_cast<int>( cppRes.at( i ) ),
855 sipType_Qgis_CrsAxisDirection );
856
857 if ( !eobj )
858 {
859 sipIsErr = 1;
860 }
861
862 PyList_SetItem( l, i, eobj );
863 }
864
865 if ( !sipIsErr )
866 {
867 sipRes = l;
868 }
869 else
870 {
871 Py_DECREF( l );
872 }
873 }
874 % End
875#endif
876
882 Qgis::DistanceUnit mapUnits() const;
883
891 QgsRectangle bounds() const;
892
899 QString toOgcUri() const;
900
907 QString toOgcUrn() const;
908
909 // Mutators -----------------------------------
910
927 void updateDefinition();
928
932 void setValidationHint( const QString &html );
933
937 QString validationHint() const;
938
945 static int syncDatabase();
946
960 long saveAsUserCrs( const QString &name, Qgis::CrsDefinitionFormat nativeFormat = Qgis::CrsDefinitionFormat::Wkt );
961
971 void setNativeFormat( Qgis::CrsDefinitionFormat format );
972
982 Qgis::CrsDefinitionFormat nativeFormat() const;
983
993 QgsCoordinateReferenceSystem toGeographicCrs() const;
994
1005 QgsCoordinateReferenceSystem horizontalCrs() const;
1006
1019 QgsCoordinateReferenceSystem verticalCrs() const;
1020
1027 bool hasVerticalAxis() const;
1028
1030 QString geographicCrsAuthId() const;
1031
1032#ifdef SIP_RUN
1033 SIP_PYOBJECT __repr__();
1034 % MethodCode
1035 const QString str = sipCpp->isValid() ? QStringLiteral( "<QgsCoordinateReferenceSystem: %1%2>" ).arg( !sipCpp->authid().isEmpty() ? sipCpp->authid() : sipCpp->toWkt( Qgis::CrsWktVariant::Preferred ),
1036 std::isfinite( sipCpp->coordinateEpoch() ) ? QStringLiteral( " @ %1" ).arg( sipCpp->coordinateEpoch() ) : QString() )
1037 : QStringLiteral( "<QgsCoordinateReferenceSystem: invalid>" );
1038 sipRes = PyUnicode_FromString( str.toUtf8().constData() );
1039 % End
1040#endif
1041
1042#ifndef SIP_RUN
1043
1053 PJ *projObject() const;
1054
1065 static QgsCoordinateReferenceSystem fromProjObject( PJ *object );
1066
1075 bool createFromProjObject( PJ *object );
1076#endif
1077
1084 Q_DECL_DEPRECATED static QStringList recentProjections() SIP_DEPRECATED;
1085
1091 Q_DECL_DEPRECATED static QList< QgsCoordinateReferenceSystem > recentCoordinateReferenceSystems() SIP_DEPRECATED;
1092
1098 Q_DECL_DEPRECATED static void pushRecentCoordinateReferenceSystem( const QgsCoordinateReferenceSystem &crs ) SIP_DEPRECATED;
1099
1105 Q_DECL_DEPRECATED static void removeRecentCoordinateReferenceSystem( const QgsCoordinateReferenceSystem &crs ) SIP_DEPRECATED;
1106
1112 Q_DECL_DEPRECATED static void clearRecentCoordinateReferenceSystems() SIP_DEPRECATED;
1113
1114#ifndef SIP_RUN
1115
1125 static void invalidateCache( bool disableCache = false );
1126#else
1127
1134 static void invalidateCache( bool disableCache SIP_PYARGREMOVE = false );
1135#endif
1136
1137 // Mutators -----------------------------------
1138 // We don't want to expose these to the public api since they won't create
1139 // a fully valid crs. Programmers should use the createFrom* methods rather
1140 private:
1141
1147 static QString projFromSrsId( int srsId );
1148
1154 void setProjString( const QString &projString );
1155
1159 bool setWktString( const QString &wkt );
1160
1164 void debugPrint();
1165
1167 typedef QMap<QString, QString> RecordMap;
1168
1176 RecordMap getRecord( const QString &sql );
1177
1182 static int openDatabase( const QString &path, sqlite3_database_unique_ptr &database, bool readonly = true );
1183
1185 void setMapUnits();
1186
1188 static long getRecordCount();
1189
1190 bool loadFromAuthCode( const QString &auth, const QString &code );
1191
1195 static QList< long > userSrsIds();
1196
1204 long matchToUserCrs() const;
1205
1210 bool loadFromDatabase( const QString &db, const QString &expression, const QString &value );
1211
1212 bool createFromWktInternal( const QString &wkt, const QString &description );
1213
1214 QExplicitlySharedDataPointer<QgsCoordinateReferenceSystemPrivate> d;
1215
1216 QString mValidationHint;
1217
1219
1220 friend class QgsProjContext;
1221
1222 // Only meant to be called by QgsProjContext::~QgsProjContext()
1223 static void removeFromCacheObjectsBelongingToCurrentThread( PJ_CONTEXT *pj_context );
1224
1226 static CUSTOM_CRS_VALIDATION sCustomSrsValidation;
1227
1228 // cache
1229
1230 static bool sDisableSrIdCache;
1231 static bool sDisableOgcCache;
1232 static bool sDisableProjCache;
1233 static bool sDisableWktCache;
1234 static bool sDisableSrsIdCache;
1235 static bool sDisableStringCache;
1236
1237 // for tests
1238 static const QHash< QString, QgsCoordinateReferenceSystem > &stringCache();
1239 static const QHash< QString, QgsCoordinateReferenceSystem > &projCache();
1240 static const QHash< QString, QgsCoordinateReferenceSystem > &ogcCache();
1241 static const QHash< QString, QgsCoordinateReferenceSystem > &wktCache();
1242 static const QHash< long, QgsCoordinateReferenceSystem > &srsIdCache();
1243 static const QHash< long, QgsCoordinateReferenceSystem > &srIdCache();
1244
1245 friend class TestQgsCoordinateReferenceSystem;
1247 friend bool CORE_EXPORT operator> ( const QgsCoordinateReferenceSystem &c1, const QgsCoordinateReferenceSystem &c2 );
1248 friend bool CORE_EXPORT operator< ( const QgsCoordinateReferenceSystem &c1, const QgsCoordinateReferenceSystem &c2 );
1249 friend bool CORE_EXPORT operator>= ( const QgsCoordinateReferenceSystem &c1, const QgsCoordinateReferenceSystem &c2 );
1250 friend bool CORE_EXPORT operator<= ( const QgsCoordinateReferenceSystem &c1, const QgsCoordinateReferenceSystem &c2 );
1251
1252 bool createFromPostgisSrid( const long id );
1253};
1254
1256
1257
1258#ifndef SIP_RUN
1259inline std::ostream &operator << ( std::ostream &os, const QgsCoordinateReferenceSystem &r )
1260{
1261 QString mySummary( QStringLiteral( "\n\tSpatial Reference System:" ) );
1262 mySummary += QLatin1String( "\n\t\tDescription : " );
1263 if ( !r.description().isNull() )
1264 {
1265 mySummary += r.description();
1266 }
1267 else
1268 {
1269 mySummary += QLatin1String( "Undefined" );
1270 }
1271 mySummary += QLatin1String( "\n\t\tProjection : " );
1272 if ( !r.projectionAcronym().isNull() )
1273 {
1274 mySummary += r.projectionAcronym();
1275 }
1276 else
1277 {
1278 mySummary += QLatin1String( "Undefined" );
1279 }
1280
1281 mySummary += QLatin1String( "\n\t\tEllipsoid : " );
1282 if ( !r.ellipsoidAcronym().isNull() )
1283 {
1284 mySummary += r.ellipsoidAcronym();
1285 }
1286 else
1287 {
1288 mySummary += QLatin1String( "Undefined" );
1289 }
1290
1291 mySummary += QLatin1String( "\n\t\tProjString : " );
1292 if ( !r.toProj().isNull() )
1293 {
1294 mySummary += r.toProj();
1295 }
1296 else
1297 {
1298 mySummary += QLatin1String( "Undefined" );
1299 }
1300 // Using streams we need to use local 8 Bit
1301 return os << mySummary.toLocal8Bit().data() << std::endl;
1302}
1303
1304bool CORE_EXPORT operator> ( const QgsCoordinateReferenceSystem &c1, const QgsCoordinateReferenceSystem &c2 );
1305bool CORE_EXPORT operator< ( const QgsCoordinateReferenceSystem &c1, const QgsCoordinateReferenceSystem &c2 );
1306bool CORE_EXPORT operator>= ( const QgsCoordinateReferenceSystem &c1, const QgsCoordinateReferenceSystem &c2 );
1307bool CORE_EXPORT operator<= ( const QgsCoordinateReferenceSystem &c1, const QgsCoordinateReferenceSystem &c2 );
1308#endif
1309
1310#endif // QGSCOORDINATEREFERENCESYSTEM_H
The Qgis class provides global constants for use throughout the application.
Definition qgis.h:54
DistanceUnit
Units of distance.
Definition qgis.h:4463
CrsDefinitionFormat
CRS definition formats.
Definition qgis.h:3422
@ Wkt
WKT format (always recommended over proj string format)
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.
Contains information about a datum ensemble.
Definition qgsdatums.h:95
Custom exception class which is raised when an operation is not supported.
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.
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.
Unique pointer for sqlite3 databases, which automatically closes the database when the pointer goes o...
#define str(x)
Definition qgis.cpp:38
bool operator>(const QVariant &v1, const QVariant &v2)
Compares two QVariant values and returns whether the first is greater than the second.
Definition qgis.h:6039
bool operator<(const QVariant &v1, const QVariant &v2)
Compares two QVariant values and returns whether the first is less than the second.
Definition qgis.h:6053
#define SIP_TYPEHINT(type)
Definition qgis_sip.h:232
#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_OUT
Definition qgis_sip.h:58
#define SIP_THROW(name,...)
Definition qgis_sip.h:203
bool operator>=(const QgsCoordinateReferenceSystem &c1, const QgsCoordinateReferenceSystem &c2)
bool operator<=(const QgsCoordinateReferenceSystem &c1, const QgsCoordinateReferenceSystem &c2)
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
struct projCtx_t PJ_CONTEXT
bool CORE_EXPORT operator>=(const QgsCoordinateReferenceSystem &c1, const QgsCoordinateReferenceSystem &c2)
void(* CUSTOM_CRS_VALIDATION)(QgsCoordinateReferenceSystem &)
std::ostream & operator<<(std::ostream &os, const QgsCoordinateReferenceSystem &r)
Output stream operator.
Q_DECLARE_METATYPE(QgsDatabaseQueryLogEntry)
const QgsCoordinateReferenceSystem & crs
bool hasAxisInverted