QGIS API Documentation 3.39.0-Master (d85f3c2a281)
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
539 void validate();
540
541 // TODO QGIS 4: seems completely obsolete now (only compares proj4 - already done in createFromProj4)
542
551 Q_DECL_DEPRECATED long findMatchingProj() SIP_DEPRECATED;
552
553 bool operator==( const QgsCoordinateReferenceSystem &srs ) const;
554 bool operator!=( const QgsCoordinateReferenceSystem &srs ) const;
555
562 bool readXml( const QDomNode &node );
563
570 bool writeXml( QDomNode &node, QDomDocument &doc ) const;
571
572
577 static void setCustomCrsValidation( CUSTOM_CRS_VALIDATION f ) SIP_SKIP;
578
583 static CUSTOM_CRS_VALIDATION customCrsValidation() SIP_SKIP;
584
585 // Accessors -----------------------------------
586
591 long srsid() const;
592
593 // TODO QGIS 4: remove unless really necessary - let's use EPSG codes instead
594
599 long postgisSrid() const;
600
613 QString authid() const;
614
622 QString description() const;
623
637 QString userFriendlyIdentifier( Qgis::CrsIdentifierType type = Qgis::CrsIdentifierType::MediumString ) const;
638
645 QString projectionAcronym() const;
646
653 QString ellipsoidAcronym() const;
654
666 QString toWkt( Qgis::CrsWktVariant variant = Qgis::CrsWktVariant::Wkt1Gdal, bool multiline = false, int indentationWidth = 4 ) const;
667
680 Q_DECL_DEPRECATED QString toProj4() const SIP_DEPRECATED;
681
694 QString toProj() const;
695
701 Qgis::CrsType type() const;
702
708 bool isDeprecated() const;
709
714 bool isGeographic() const;
715
724 bool isDynamic() const;
725
740 QgsDatumEnsemble datumEnsemble() const SIP_THROW( QgsNotSupportedException );
741
751 QString celestialBodyName() const SIP_THROW( QgsNotSupportedException );
752
776 void setCoordinateEpoch( double epoch );
777
801 double coordinateEpoch() const;
802
814 QgsProjectionFactors factors( const QgsPoint &point ) const;
815
822 QgsProjOperation operation() const;
823
831 bool hasAxisInverted() const;
832
838#ifndef SIP_RUN
839 QList< Qgis::CrsAxisDirection > axisOrdering() const;
840#else
841 SIP_PYOBJECT axisOrdering() const SIP_TYPEHINT( List[Qgis.CrsAxisDirection] );
842 % MethodCode
843 // adapted from the qpymultimedia_qlist.sip file from the PyQt6 sources
844
845 const QList< Qgis::CrsAxisDirection > cppRes = sipCpp->axisOrdering();
846
847 PyObject *l = PyList_New( cppRes.size() );
848
849 if ( !l )
850 sipIsErr = 1;
851 else
852 {
853 for ( int i = 0; i < cppRes.size(); ++i )
854 {
855 PyObject *eobj = sipConvertFromEnum( static_cast<int>( cppRes.at( i ) ),
856 sipType_Qgis_CrsAxisDirection );
857
858 if ( !eobj )
859 {
860 sipIsErr = 1;
861 }
862
863 PyList_SetItem( l, i, eobj );
864 }
865
866 if ( !sipIsErr )
867 {
868 sipRes = l;
869 }
870 else
871 {
872 Py_DECREF( l );
873 }
874 }
875 % End
876#endif
877
883 Qgis::DistanceUnit mapUnits() const;
884
892 QgsRectangle bounds() const;
893
900 QString toOgcUri() const;
901
908 QString toOgcUrn() const;
909
910 // Mutators -----------------------------------
911
928 void updateDefinition();
929
933 void setValidationHint( const QString &html );
934
938 QString validationHint() const;
939
946 static int syncDatabase();
947
961 long saveAsUserCrs( const QString &name, Qgis::CrsDefinitionFormat nativeFormat = Qgis::CrsDefinitionFormat::Wkt );
962
972 void setNativeFormat( Qgis::CrsDefinitionFormat format );
973
983 Qgis::CrsDefinitionFormat nativeFormat() const;
984
994 QgsCoordinateReferenceSystem toGeographicCrs() const;
995
1006 QgsCoordinateReferenceSystem horizontalCrs() const;
1007
1020 QgsCoordinateReferenceSystem verticalCrs() const;
1021
1028 bool hasVerticalAxis() const;
1029
1031 QString geographicCrsAuthId() const;
1032
1033#ifdef SIP_RUN
1034 SIP_PYOBJECT __repr__();
1035 % MethodCode
1036 const QString str = sipCpp->isValid() ? QStringLiteral( "<QgsCoordinateReferenceSystem: %1%2>" ).arg( !sipCpp->authid().isEmpty() ? sipCpp->authid() : sipCpp->toWkt( Qgis::CrsWktVariant::Preferred ),
1037 std::isfinite( sipCpp->coordinateEpoch() ) ? QStringLiteral( " @ %1" ).arg( sipCpp->coordinateEpoch() ) : QString() )
1038 : QStringLiteral( "<QgsCoordinateReferenceSystem: invalid>" );
1039 sipRes = PyUnicode_FromString( str.toUtf8().constData() );
1040 % End
1041#endif
1042
1043#ifndef SIP_RUN
1044
1054 PJ *projObject() const;
1055
1066 static QgsCoordinateReferenceSystem fromProjObject( PJ *object );
1067
1076 bool createFromProjObject( PJ *object );
1077#endif
1078
1085 Q_DECL_DEPRECATED static QStringList recentProjections() SIP_DEPRECATED;
1086
1092 Q_DECL_DEPRECATED static QList< QgsCoordinateReferenceSystem > recentCoordinateReferenceSystems() SIP_DEPRECATED;
1093
1099 Q_DECL_DEPRECATED static void pushRecentCoordinateReferenceSystem( const QgsCoordinateReferenceSystem &crs ) SIP_DEPRECATED;
1100
1106 Q_DECL_DEPRECATED static void removeRecentCoordinateReferenceSystem( const QgsCoordinateReferenceSystem &crs ) SIP_DEPRECATED;
1107
1113 Q_DECL_DEPRECATED static void clearRecentCoordinateReferenceSystems() SIP_DEPRECATED;
1114
1115#ifndef SIP_RUN
1116
1126 static void invalidateCache( bool disableCache = false );
1127#else
1128
1135 static void invalidateCache( bool disableCache SIP_PYARGREMOVE = false );
1136#endif
1137
1138 // Mutators -----------------------------------
1139 // We don't want to expose these to the public api since they won't create
1140 // a fully valid crs. Programmers should use the createFrom* methods rather
1141 private:
1142
1148 static QString projFromSrsId( int srsId );
1149
1155 void setProjString( const QString &projString );
1156
1160 bool setWktString( const QString &wkt );
1161
1165 void debugPrint();
1166
1168 typedef QMap<QString, QString> RecordMap;
1169
1177 RecordMap getRecord( const QString &sql );
1178
1183 static int openDatabase( const QString &path, sqlite3_database_unique_ptr &database, bool readonly = true );
1184
1186 void setMapUnits();
1187
1189 static long getRecordCount();
1190
1191 bool loadFromAuthCode( const QString &auth, const QString &code );
1192
1196 static QList< long > userSrsIds();
1197
1205 long matchToUserCrs() const;
1206
1211 bool loadFromDatabase( const QString &db, const QString &expression, const QString &value );
1212
1213 bool createFromWktInternal( const QString &wkt, const QString &description );
1214
1215 QExplicitlySharedDataPointer<QgsCoordinateReferenceSystemPrivate> d;
1216
1217 QString mValidationHint;
1218
1220
1221 friend class QgsProjContext;
1222
1223 // Only meant to be called by QgsProjContext::~QgsProjContext()
1224 static void removeFromCacheObjectsBelongingToCurrentThread( PJ_CONTEXT *pj_context );
1225
1227 static CUSTOM_CRS_VALIDATION sCustomSrsValidation;
1228
1229 // cache
1230
1231 static bool sDisableSrIdCache;
1232 static bool sDisableOgcCache;
1233 static bool sDisableProjCache;
1234 static bool sDisableWktCache;
1235 static bool sDisableSrsIdCache;
1236 static bool sDisableStringCache;
1237
1238 // for tests
1239 static const QHash< QString, QgsCoordinateReferenceSystem > &stringCache();
1240 static const QHash< QString, QgsCoordinateReferenceSystem > &projCache();
1241 static const QHash< QString, QgsCoordinateReferenceSystem > &ogcCache();
1242 static const QHash< QString, QgsCoordinateReferenceSystem > &wktCache();
1243 static const QHash< long, QgsCoordinateReferenceSystem > &srsIdCache();
1244 static const QHash< long, QgsCoordinateReferenceSystem > &srIdCache();
1245
1246 friend class TestQgsCoordinateReferenceSystem;
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 friend bool CORE_EXPORT operator<= ( const QgsCoordinateReferenceSystem &c1, const QgsCoordinateReferenceSystem &c2 );
1252
1253 bool createFromPostgisSrid( const long id );
1254};
1255
1257
1258
1259#ifndef SIP_RUN
1260inline std::ostream &operator << ( std::ostream &os, const QgsCoordinateReferenceSystem &r )
1261{
1262 QString mySummary( QStringLiteral( "\n\tSpatial Reference System:" ) );
1263 mySummary += QLatin1String( "\n\t\tDescription : " );
1264 if ( !r.description().isNull() )
1265 {
1266 mySummary += r.description();
1267 }
1268 else
1269 {
1270 mySummary += QLatin1String( "Undefined" );
1271 }
1272 mySummary += QLatin1String( "\n\t\tProjection : " );
1273 if ( !r.projectionAcronym().isNull() )
1274 {
1275 mySummary += r.projectionAcronym();
1276 }
1277 else
1278 {
1279 mySummary += QLatin1String( "Undefined" );
1280 }
1281
1282 mySummary += QLatin1String( "\n\t\tEllipsoid : " );
1283 if ( !r.ellipsoidAcronym().isNull() )
1284 {
1285 mySummary += r.ellipsoidAcronym();
1286 }
1287 else
1288 {
1289 mySummary += QLatin1String( "Undefined" );
1290 }
1291
1292 mySummary += QLatin1String( "\n\t\tProjString : " );
1293 if ( !r.toProj().isNull() )
1294 {
1295 mySummary += r.toProj();
1296 }
1297 else
1298 {
1299 mySummary += QLatin1String( "Undefined" );
1300 }
1301 // Using streams we need to use local 8 Bit
1302 return os << mySummary.toLocal8Bit().data() << std::endl;
1303}
1304
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 );
1308bool CORE_EXPORT operator<= ( const QgsCoordinateReferenceSystem &c1, const QgsCoordinateReferenceSystem &c2 );
1309#endif
1310
1311#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:4625
CrsDefinitionFormat
CRS definition formats.
Definition qgis.h:3583
@ 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:6244
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:6258
#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