47  QList<QgsCoordinateReferenceSystemRegistry::UserCrsDetails> res;
 
   53  if ( result != SQLITE_OK )
 
   59  const QString sql = QStringLiteral( 
"select srs_id,description,parameters, wkt from tbl_srs" );
 
   60  QgsDebugMsgLevel( QStringLiteral( 
"Query to populate existing list:%1" ).arg( sql ), 4 );
 
   62  if ( result == SQLITE_OK )
 
   65    while ( preparedStatement.
step() == SQLITE_ROW )
 
   73      if ( !details.
wkt.isEmpty() )
 
 
   94  QString proj4String = 
crs.d->mProj4;
 
   95  if ( proj4String.isEmpty() )
 
  109  if ( QgsCoordinateReferenceSystem::getRecordCount() == 0 )
 
  111    mySql = 
"insert into tbl_srs (srs_id,description,projection_acronym,ellipsoid_acronym,parameters,is_geo,wkt) values (" 
  115            + 
',' + quotedEllipsoidString
 
  123    mySql = 
"insert into tbl_srs (description,projection_acronym,ellipsoid_acronym,parameters,is_geo,wkt) values (" 
  126            + 
',' + quotedEllipsoidString
 
  136  if ( myResult != SQLITE_OK )
 
  138    QgsDebugError( QStringLiteral( 
"Can't open or create database %1: %2" )
 
  143  statement = database.
prepare( mySql, myResult );
 
  145  qint64 returnId = -1;
 
  146  if ( myResult == SQLITE_OK && statement.
step() == SQLITE_DONE )
 
  150    returnId = sqlite3_last_insert_rowid( database.get() );
 
  151    crs.d->mSrsId = returnId;
 
  152    crs.d->mAuthId = QStringLiteral( 
"USER:%1" ).arg( returnId );
 
  153    crs.d->mDescription = name;
 
  156  if ( returnId != -1 )
 
  167  if ( returnId != -1 )
 
 
  184  const QString sql = 
"update tbl_srs set description=" 
  197  if ( myResult != SQLITE_OK )
 
  199    QgsDebugError( QStringLiteral( 
"Can't open or create database %1: %2" )
 
  206  QString errorMessage;
 
  207  if ( database.
exec( sql, errorMessage ) != SQLITE_OK )
 
  214    const int changed = sqlite3_changes( database.get() );
 
 
  254  if ( result != SQLITE_OK )
 
  256    QgsDebugError( QStringLiteral( 
"Can't open database: %1 \n please notify QGIS developers of this error \n %2 (file name) " ).arg( database.
errorMessage(),
 
  264    if ( result != SQLITE_OK || preparedStatement.
step() != SQLITE_DONE )
 
  266      QgsDebugError( QStringLiteral( 
"failed to remove custom CRS from database: %1 [%2]" ).arg( sql, database.
errorMessage() ) );
 
  271      const int changed = sqlite3_changes( database.get() );
 
  278        QgsMessageLog::logMessage( QObject::tr( 
"Error removing user CRS [%1]: No matching ID found in database" ).arg( 
id ), QObject::tr( 
"CRS" ) );
 
 
  297bool QgsCoordinateReferenceSystemRegistry::insertProjection( 
const QString &projectionAcronym )
 
  304  if ( result != SQLITE_OK )
 
  306    QgsDebugError( QStringLiteral( 
"Can't open database: %1 \n please notify  QGIS developers of this error \n %2 (file name) " ).arg( database.
errorMessage(),
 
  311  if ( result != SQLITE_OK )
 
  319  const QString srsSql = 
"select acronym,name,notes,parameters from tbl_projection where acronym=" + 
QgsSqliteUtils::quotedString( projectionAcronym );
 
  322  if ( srsResult == SQLITE_OK )
 
  324    if ( srsPreparedStatement.
step() == SQLITE_ROW )
 
  328      sql = 
"insert into tbl_projection(acronym,name,notes,parameters) values (" 
  335      if ( result != SQLITE_OK || preparedStatement.
step() != SQLITE_DONE )
 
  337        QgsDebugError( QStringLiteral( 
"Could not insert projection into database: %1 [%2]" ).arg( sql, database.
errorMessage() ) );
 
  353  static std::once_flag initialized;
 
  354  static QMap< QString, QgsProjOperation > sProjOperations;
 
  355  std::call_once( initialized, []
 
  359    const PJ_OPERATIONS *operation = proj_list_operations();
 
  360    while ( operation && operation->id )
 
  364      value.mId = QString( operation->id );
 
  366      const QString description( *operation->descr );
 
  367      const QStringList descriptionParts = description.split( QStringLiteral( 
"\n\t" ) );
 
  368      value.mDescription = descriptionParts.value( 0 );
 
  369      value.mDetails = descriptionParts.mid( 1 ).join( 
'\n' );
 
  371      sProjOperations.insert( value.
id(), value );
 
  377  return sProjOperations;
 
 
  382#if PROJ_VERSION_MAJOR>8 || (PROJ_VERSION_MAJOR==8 && PROJ_VERSION_MINOR>=1) 
  383  static QList< QgsCelestialBody > sCelestialBodies;
 
  384  static std::once_flag initialized;
 
  385  std::call_once( initialized, []
 
  392    PROJ_CELESTIAL_BODY_INFO **list = proj_get_celestial_body_list_from_database( context, 
nullptr, &resultCount );
 
  393    sCelestialBodies.reserve( resultCount );
 
  394    for ( 
int i = 0; i < resultCount; i++ )
 
  396      const PROJ_CELESTIAL_BODY_INFO *info = list[ i ];
 
  402      body.mAuthority = QString( info->auth_name );
 
  403      body.mName = QString( info->name );
 
  405      sCelestialBodies << body;
 
  407    proj_celestial_body_list_destroy( list );
 
  410  return sCelestialBodies;
 
  412  throw QgsNotSupportedException( QObject::tr( 
"Retrieving celestial bodies requires a QGIS build based on PROJ 8.1 or later" ) );
 
 
  418  static QSet< QString > sKnownAuthorities;
 
  419  static std::once_flag initialized;
 
  420  std::call_once( initialized, []
 
  425    PROJ_STRING_LIST 
authorities = proj_get_authorities_from_database( pjContext );
 
  427    for ( 
auto authIter = 
authorities; authIter && *authIter; ++authIter )
 
  429      const QString authority( *authIter );
 
  430      sKnownAuthorities.insert( authority.toLower() );
 
  436  return sKnownAuthorities;
 
 
  442  if ( mCrsDbRecordsPopulated )
 
  443    return mCrsDbRecords;
 
  448  if ( QFileInfo::exists( srsDatabaseFileName ) )
 
  452    int result = database.
open_v2( srsDatabaseFileName, SQLITE_OPEN_READONLY, 
nullptr );
 
  453    if ( result == SQLITE_OK )
 
  455      const QString sql = QStringLiteral( 
"SELECT description, srs_id, auth_name, auth_id, projection_acronym, deprecated, srs_type FROM tbl_srs" );
 
  457      if ( result == SQLITE_OK )
 
  459        while ( preparedStatement.
step() == SQLITE_ROW )
 
  469          mCrsDbRecords.append( record );
 
  475  mCrsDbRecordsPopulated = 
true;
 
  476  return mCrsDbRecords;
 
 
  481  QList<QgsCoordinateReferenceSystem> res;
 
  485  QStringList projectionsProj4  = settings.
value( QStringLiteral( 
"UI/recentProjectionsProj4" ) ).toStringList();
 
  486  QStringList projectionsWkt = settings.
value( QStringLiteral( 
"UI/recentProjectionsWkt" ) ).toStringList();
 
  487  QStringList projectionsAuthId = settings.
value( QStringLiteral( 
"UI/recentProjectionsAuthId" ) ).toStringList();
 
  488  int max = std::max( projectionsAuthId.size(), std::max( projectionsProj4.size(), projectionsWkt.size() ) );
 
  490  for ( 
int i = 0; i < max; ++i )
 
  492    const QString proj = projectionsProj4.value( i );
 
  493    const QString wkt = projectionsWkt.value( i );
 
  494    const QString authid = projectionsAuthId.value( i );
 
  497    if ( !authid.isEmpty() )
 
 
  513  settings.
remove( QStringLiteral( 
"UI/recentProjectionsAuthId" ) );
 
  514  settings.
remove( QStringLiteral( 
"UI/recentProjectionsWkt" ) );
 
  515  settings.
remove( QStringLiteral( 
"UI/recentProjectionsProj4" ) );
 
 
  526  QList<QgsCoordinateReferenceSystem> recent = 
recentCrs();
 
  527  recent.removeAll( 
crs );
 
  528  recent.insert( 0, 
crs );
 
  553  QList<QgsCoordinateReferenceSystem> recentSameType;
 
  556    return hasVertical( it ) == hasVertical( crs );
 
  560  const QList<QgsCoordinateReferenceSystem> toTrim = recentSameType.mid( 30 );
 
  563    recent.removeOne( crsTrimmed );
 
  568  authids.reserve( recent.size() );
 
  570  proj.reserve( recent.size() );
 
  572  wkt.reserve( recent.size() );
 
  575    authids << 
c.authid();
 
  581  settings.
setValue( QStringLiteral( 
"UI/recentProjectionsAuthId" ), authids );
 
  582  settings.
setValue( QStringLiteral( 
"UI/recentProjectionsWkt" ), wkt );
 
  583  settings.
setValue( QStringLiteral( 
"UI/recentProjectionsProj4" ), proj );
 
 
  593  QList<QgsCoordinateReferenceSystem> recent = 
recentCrs();
 
  594  recent.removeAll( 
crs );
 
  596  authids.reserve( recent.size() );
 
  598  proj.reserve( recent.size() );
 
  600  wkt.reserve( recent.size() );
 
  603    authids << 
c.authid();
 
  608  settings.
setValue( QStringLiteral( 
"UI/recentProjectionsAuthId" ), authids );
 
  609  settings.
setValue( QStringLiteral( 
"UI/recentProjectionsWkt" ), wkt );
 
  610  settings.
setValue( QStringLiteral( 
"UI/recentProjectionsProj4" ), proj );
 
 
@ Compound
Compound (horizontal + vertical) CRS.
 
@ Projected
Projected CRS.
 
@ DerivedProjected
Derived projected CRS.
 
@ Engineering
Engineering CRS.
 
@ Geographic3d
3D geopraphic CRS
 
@ Geographic2d
2D geographic CRS
 
@ Geocentric
Geocentric CRS.
 
CrsDefinitionFormat
CRS definition formats.
 
@ Wkt
WKT format (always recommended over proj string format)
 
@ Preferred
Preferred format, matching the most recent WKT ISO standard. Currently an alias to WKT2_2019,...
 
static QString qgisUserDatabaseFilePath()
Returns the path to the user qgis.db file.
 
static QString srsDatabaseFilePath()
Returns the path to the srs.db file.
 
Contains information about a celestial body.
 
Contains details of a custom (user defined) CRS.
 
QgsCoordinateReferenceSystem crs
QgsCoordinateReferenceSystem object representing the user-defined CRS.
 
QString proj
PROJ string definition of CRS.
 
QString wkt
WKT definition of CRS.
 
QString name
CRS name (or description)
 
QList< QgsCrsDbRecord > crsDbRecords() const
Returns the list of records from the QGIS srs db.
 
void userCrsAdded(const QString &id)
Emitted whenever a new user CRS definition is added.
 
void recentCrsRemoved(const QgsCoordinateReferenceSystem &crs)
Emitted when a recently used CRS has been removed from the recent CRS list.
 
void userCrsChanged(const QString &id)
Emitted whenever an existing user CRS definition is changed.
 
void recentCrsCleared()
Emitted when the list of recently used CRS has been cleared.
 
void recentCrsPushed(const QgsCoordinateReferenceSystem &crs)
Emitted when a recently used CRS has been pushed to the top of the recent CRS list.
 
QList< QgsCelestialBody > celestialBodies() const
Returns a list of all known celestial bodies.
 
void userCrsRemoved(long id)
Emitted when the user CRS with matching id is removed from the database.
 
void crsDefinitionsChanged()
Emitted whenever an operation has caused any of the known CRS definitions (including user-defined CRS...
 
bool updateUserCrs(long id, const QgsCoordinateReferenceSystem &crs, const QString &name, Qgis::CrsDefinitionFormat nativeFormat=Qgis::CrsDefinitionFormat::Wkt)
Updates the definition of the existing user CRS with matching id.
 
QgsCoordinateReferenceSystemRegistry(QObject *parent=nullptr)
Constructor for QgsCoordinateReferenceSystemRegistry, with the specified parent object.
 
void removeRecent(const QgsCoordinateReferenceSystem &crs)
Removes a CRS from the list of recently used CRS.
 
~QgsCoordinateReferenceSystemRegistry()
 
long addUserCrs(const QgsCoordinateReferenceSystem &crs, const QString &name, Qgis::CrsDefinitionFormat nativeFormat=Qgis::CrsDefinitionFormat::Wkt)
Adds a new crs definition as a custom ("USER") CRS.
 
QSet< QString > authorities() const
Returns a list of all known authorities.
 
bool removeUserCrs(long id)
Removes the existing user CRS with matching id.
 
void clearRecent()
Cleans the list of recently used CRS.
 
QList< QgsCoordinateReferenceSystemRegistry::UserCrsDetails > userCrsList() const
Returns a list containing the details of all registered custom (user-defined) CRSes.
 
QList< QgsCoordinateReferenceSystem > recentCrs()
Returns a list of recently used CRS.
 
void pushRecent(const QgsCoordinateReferenceSystem &crs)
Pushes a recently used CRS to the top of the recent CRS list.
 
QMap< QString, QgsProjOperation > projOperations() const
Returns a map of all valid PROJ operations.
 
This class represents a coordinate reference system (CRS).
 
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
 
bool createFromWkt(const QString &wkt)
Sets this CRS using a WKT definition.
 
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.
 
bool createFromProj(const QString &projString, bool identify=true)
Sets this CRS by passing it a PROJ style formatted string.
 
static void invalidateCache(bool disableCache=false)
Clears the internal cache used to initialize QgsCoordinateReferenceSystem objects.
 
QString toWkt(Qgis::CrsWktVariant variant=Qgis::CrsWktVariant::Wkt1Gdal, bool multiline=false, int indentationWidth=4) const
Returns a WKT representation of this CRS.
 
long srsid() const
Returns the internal CRS ID, if available.
 
Qgis::CrsType type() const
Returns the type of the CRS.
 
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true)
Adds a message to the log instance (and creates it if necessary).
 
Custom exception class which is raised when an operation is not supported.
 
static PJ_CONTEXT * get()
Returns a thread local instance of a proj context, safe for use in the current thread.
 
Contains information about a PROJ operation.
 
QString id() const
ID of operation.
 
The QgsReadWriteLocker class is a convenience class that simplifies locking and unlocking QReadWriteL...
 
void changeMode(Mode mode)
Change the mode of the lock to mode.
 
Scoped object for logging of the runtime for a single operation or group of operations.
 
This class is a composition of two QSettings instances:
 
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
 
void remove(const QString &key, QgsSettings::Section section=QgsSettings::NoSection)
Removes the setting key and any sub-settings of key in a section.
 
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.
 
static QString quotedString(const QString &value)
Returns a quoted string value, surround by ' characters and with special characters correctly escaped...
 
Unique pointer for sqlite3 databases, which automatically closes the database when the pointer goes o...
 
sqlite3_statement_unique_ptr prepare(const QString &sql, int &resultCode) const
Prepares a sql statement, returning the result.
 
int open(const QString &path)
Opens the database at the specified file path.
 
QString errorMessage() const
Returns the most recent error message encountered by the database.
 
int open_v2(const QString &path, int flags, const char *zVfs)
Opens the database at the specified file path.
 
int exec(const QString &sql, QString &errorMessage) const
Executes the sql command in the database.
 
Unique pointer for sqlite3 prepared statements, which automatically finalizes the statement when the ...
 
QString columnAsText(int column) const
Returns the column value from the current statement row as a string.
 
int step()
Steps to the next record in the statement, returning the sqlite3 result code.
 
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
 
T qgsEnumKeyToValue(const QString &key, const T &defaultValue, bool tryValueAsKey=true, bool *returnOk=nullptr)
Returns the value corresponding to the given key of an enum.
 
#define BUILTIN_UNREACHABLE
 
const int USER_CRS_START_ID
Magick number that determines whether a projection crsid is a system (srs.db) or user (~/....
 
struct projCtx_t PJ_CONTEXT
 
#define QgsDebugMsgLevel(str, level)
 
#define QgsDebugError(str)
 
const QgsCoordinateReferenceSystem & crs
 
QString projectionAcronym