QGIS API Documentation 3.43.0-Master (b60ef06885e)
qgis.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgis.cpp
3
4 -------------------
5 begin : 2007
6 copyright : (C) 2007 by Gary E. Sherman
7 email : sherman@mrcc.com
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#include "qgis.h"
19#include "moc_qgis.cpp"
20#ifndef QGSVERSION
21#include "qgsversion.h"
22#endif
23#include <QCoreApplication>
24#include <QColor>
25#include <QDate>
26#include <QTime>
27#include <QLocale>
28#include <QDateTime>
29#include "qgsconfig.h"
30#include "qgslogger.h"
31#include "qgsgdalutils.h"
32#include "qgswkbtypes.h"
33
34#include <gdal.h>
35#include <geos_c.h>
36#include <ogr_api.h>
37
38#define qgis_xstr(x) qgis_str(x)
39#define qgis_str(x) #x
40
41// Version constants
42//
43
44// development version
45const char *Qgis::QGIS_DEV_VERSION = QGSVERSION;
46
47const double Qgis::DEFAULT_SEARCH_RADIUS_MM = 2.;
48
49const float Qgis::DEFAULT_MAPTOPIXEL_THRESHOLD = 1.0f;
50
51const QColor Qgis::DEFAULT_HIGHLIGHT_COLOR = QColor( 255, 0, 0, 128 );
52
53const double Qgis::DEFAULT_HIGHLIGHT_BUFFER_MM = 0.5;
54
56
57const double Qgis::SCALE_PRECISION = 0.9999999999;
58
59const double Qgis::DEFAULT_Z_COORDINATE = 0.0;
60
61const double Qgis::DEFAULT_M_COORDINATE = 0.0;
62
63const double Qgis::DEFAULT_SNAP_TOLERANCE = 12.0;
64
66
67const int Qgis::USER_CRS_START_ID = 100000;
68const double Qgis::DEFAULT_POINT_SIZE = 2.0;
69const double Qgis::DEFAULT_LINE_WIDTH = 0.26;
70const double Qgis::DEFAULT_SEGMENT_EPSILON = 1e-8;
71
72const int Qgis::PREVIEW_JOB_DELAY_MS = 250;
74
75#ifdef Q_OS_WIN
76const double Qgis::UI_SCALE_FACTOR = 1.5;
77#else
78const double Qgis::UI_SCALE_FACTOR = 1;
79#endif
80
81double qgsPermissiveToDouble( QString string, bool &ok )
82{
83 //remove any thousands separators
84 string.remove( QLocale().groupSeparator() );
85 return QLocale().toDouble( string, &ok );
86}
87
88int qgsPermissiveToInt( QString string, bool &ok )
89{
90 //remove any thousands separators
91 string.remove( QLocale().groupSeparator() );
92 return QLocale().toInt( string, &ok );
93}
94
95qlonglong qgsPermissiveToLongLong( QString string, bool &ok )
96{
97 //remove any thousands separators
98 string.remove( QLocale().groupSeparator() );
99 return QLocale().toLongLong( string, &ok );
100}
101
102void *qgsMalloc( size_t size )
103{
104 if ( size == 0 )
105 {
106 QgsDebugError( QStringLiteral( "Zero size requested" ) );
107 return nullptr;
108 }
109
110 if ( ( size >> ( 8 * sizeof( size ) - 1 ) ) != 0 )
111 {
112 QgsDebugError( QStringLiteral( "qgsMalloc - bad size requested: %1" ).arg( size ) );
113 return nullptr;
114 }
115
116 void *p = malloc( size );
117 if ( !p )
118 {
119 QgsDebugError( QStringLiteral( "Allocation of %1 bytes failed." ).arg( size ) );
120 }
121 return p;
122}
123
124void qgsFree( void *ptr )
125{
126 free( ptr );
127}
128
129bool qgsVariantLessThan( const QVariant &lhs, const QVariant &rhs )
130{
131 // invalid < NULL < any value
132 if ( !lhs.isValid() )
133 return rhs.isValid();
134 else if ( lhs.isNull() )
135 return rhs.isValid() && !rhs.isNull();
136 else if ( !rhs.isValid() || rhs.isNull() )
137 return false;
138
139 switch ( lhs.userType() )
140 {
141 case QMetaType::Type::Int:
142 return lhs.toInt() < rhs.toInt();
143 case QMetaType::Type::UInt:
144 return lhs.toUInt() < rhs.toUInt();
145 case QMetaType::Type::LongLong:
146 return lhs.toLongLong() < rhs.toLongLong();
147 case QMetaType::Type::ULongLong:
148 return lhs.toULongLong() < rhs.toULongLong();
149 case QMetaType::Type::Double:
150 return lhs.toDouble() < rhs.toDouble();
151 case QMetaType::Type::QChar:
152 return lhs.toChar() < rhs.toChar();
153 case QMetaType::Type::QDate:
154 return lhs.toDate() < rhs.toDate();
155 case QMetaType::Type::QTime:
156 return lhs.toTime() < rhs.toTime();
157 case QMetaType::Type::QDateTime:
158 return lhs.toDateTime() < rhs.toDateTime();
159 case QMetaType::Type::Bool:
160 return lhs.toBool() < rhs.toBool();
161
162 case QMetaType::Type::QVariantList:
163 {
164 const QList<QVariant> &lhsl = lhs.toList();
165 const QList<QVariant> &rhsl = rhs.toList();
166
167 int i, n = std::min( lhsl.size(), rhsl.size() );
168 for ( i = 0; i < n && lhsl[i].userType() == rhsl[i].userType() && qgsVariantEqual( lhsl[i], rhsl[i] ); i++ )
169 ;
170
171 if ( i == n )
172 return lhsl.size() < rhsl.size();
173 else
174 return qgsVariantLessThan( lhsl[i], rhsl[i] );
175 }
176
177 case QMetaType::Type::QStringList:
178 {
179 const QStringList &lhsl = lhs.toStringList();
180 const QStringList &rhsl = rhs.toStringList();
181
182 int i, n = std::min( lhsl.size(), rhsl.size() );
183 for ( i = 0; i < n && lhsl[i] == rhsl[i]; i++ )
184 ;
185
186 if ( i == n )
187 return lhsl.size() < rhsl.size();
188 else
189 return lhsl[i] < rhsl[i];
190 }
191
192 default:
193 return QString::localeAwareCompare( lhs.toString(), rhs.toString() ) < 0;
194 }
195}
196
197bool qgsVariantGreaterThan( const QVariant &lhs, const QVariant &rhs )
198{
199 return ! qgsVariantLessThan( lhs, rhs );
200}
201
202QString qgsVsiPrefix( const QString &path )
203{
204 return QgsGdalUtils::vsiPrefixForPath( path );
205}
206
207uint qHash( const QVariant &variant )
208{
209 if ( !variant.isValid() || variant.isNull() )
210 return std::numeric_limits<uint>::max();
211
212 switch ( variant.userType() )
213 {
214 case QMetaType::Type::Int:
215 return qHash( variant.toInt() );
216 case QMetaType::Type::UInt:
217 return qHash( variant.toUInt() );
218 case QMetaType::Type::Bool:
219 return qHash( variant.toBool() );
220 case QMetaType::Type::Double:
221 return qHash( variant.toDouble() );
222 case QMetaType::Type::LongLong:
223 return qHash( variant.toLongLong() );
224 case QMetaType::Type::ULongLong:
225 return qHash( variant.toULongLong() );
226 case QMetaType::Type::QString:
227 return qHash( variant.toString() );
228 case QMetaType::Type::QChar:
229 return qHash( variant.toChar() );
230 case QMetaType::Type::QVariantList:
231 return qHash( variant.toList() );
232 case QMetaType::Type::QStringList:
233 return qHash( variant.toStringList() );
234 case QMetaType::Type::QByteArray:
235 return qHash( variant.toByteArray() );
236 case QMetaType::Type::QDate:
237 return qHash( variant.toDate() );
238 case QMetaType::Type::QTime:
239 return qHash( variant.toTime() );
240 case QMetaType::Type::QDateTime:
241 return qHash( variant.toDateTime() );
242 case QMetaType::Type::QUrl:
243 case QMetaType::Type::QLocale:
244 case QMetaType::Type::QRegularExpression:
245#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
246 case QMetaType::Type::QRegExp:
247#endif
248 return qHash( variant.toString() );
249 default:
250 break;
251 }
252
253 return std::numeric_limits<uint>::max();
254}
255
256bool qgsVariantEqual( const QVariant &lhs, const QVariant &rhs )
257{
258 return ( lhs.isNull() == rhs.isNull() && lhs == rhs ) || ( lhs.isNull() && rhs.isNull() && lhs.isValid() && rhs.isValid() );
259}
260
262{
263 return QStringLiteral( "1:1000000,1:500000,1:250000,1:100000,1:50000,1:25000,"
264 "1:10000,1:5000,1:2500,1:1000,1:500" );
265}
266
268{
269 return QString::fromUtf8( VERSION );
270}
271
273{
274 // Version number used for comparing versions using the
275 // "Check QGIS Version" function
276 return VERSION_INT;
277}
278
280{
281 return QString::fromUtf8( RELEASE_NAME );
282}
283
285{
286 return QString::fromUtf8( QGIS_DEV_VERSION );
287}
288
290{
291 return GEOSversion();
292}
293
295{
296 static const int version = QStringLiteral( "%1%2%3" )
297 .arg( GEOS_VERSION_MAJOR, 2, 10, QChar( '0' ) )
298 .arg( GEOS_VERSION_MINOR, 2, 10, QChar( '0' ) )
299 .arg( geosVersionPatch(), 2, 10, QChar( '0' ) ).toInt()
300 ;
301 return version;
302}
303
305{
306 return GEOS_VERSION_MAJOR;
307}
308
310{
311 return GEOS_VERSION_MINOR;
312}
313
315{
316 static const int version = atoi( qgis_xstr( GEOS_VERSION_PATCH ) );
317 return version;
318}
319
320#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
321template<>
322bool qMapLessThanKey<QVariantList>( const QVariantList &key1, const QVariantList &key2 )
323{
324 // qt's built in qMapLessThanKey for QVariantList is broken and does a case-insensitive operation.
325 // this breaks QMap< QVariantList, ... >, where key matching incorrectly becomes case-insensitive..!!?!
326 return qgsVariantGreaterThan( key1, key2 ) && key1 != key2;
327}
328#endif
329
static const Qgis::MapToolUnit DEFAULT_SNAP_UNITS
Default snapping distance units.
Definition qgis.h:5942
MapToolUnit
Type of unit of tolerance value from settings.
Definition qgis.h:4811
@ Pixels
Pixels unit of tolerance.
static const double DEFAULT_LINE_WIDTH
The default width (in millimeters) for line symbols.
Definition qgis.h:5953
static const double DEFAULT_HIGHLIGHT_MIN_WIDTH_MM
Default highlight line/stroke minimum width in mm.
Definition qgis.h:5904
static QString version()
Version string.
Definition qgis.cpp:267
static const int PREVIEW_JOB_DELAY_MS
Delay between the scheduling of 2 preview jobs.
Definition qgis.h:5959
static const double DEFAULT_Z_COORDINATE
Default Z coordinate value.
Definition qgis.h:5919
static const char * QGIS_DEV_VERSION
The development version.
Definition qgis.h:82
static QString geosVersion()
GEOS string version linked.
Definition qgis.cpp:289
static const double DEFAULT_SNAP_TOLERANCE
Default snapping distance tolerance.
Definition qgis.h:5937
static const double DEFAULT_M_COORDINATE
Default M coordinate value.
Definition qgis.h:5926
static const double DEFAULT_HIGHLIGHT_BUFFER_MM
Default highlight buffer in mm.
Definition qgis.h:5899
static int geosVersionPatch()
GEOS Patch version number linked.
Definition qgis.cpp:314
static const QColor DEFAULT_HIGHLIGHT_COLOR
Default highlight color.
Definition qgis.h:5894
static Q_DECL_DEPRECATED const double SCALE_PRECISION
Fudge factor used to compare two scales.
Definition qgis.h:5913
static const int MAXIMUM_LAYER_PREVIEW_TIME_MS
Maximum rendering time for a layer of a preview job.
Definition qgis.h:5962
static QString devVersion()
The development version.
Definition qgis.cpp:284
static QString releaseName()
Release name.
Definition qgis.cpp:279
static QString defaultProjectScales()
A string with default project scales.
Definition qgis.cpp:261
static const float DEFAULT_MAPTOPIXEL_THRESHOLD
Default threshold between map coordinates and device coordinates for map2pixel simplification.
Definition qgis.h:5887
static int geosVersionMajor()
GEOS Major version number linked.
Definition qgis.cpp:304
static const double DEFAULT_SEARCH_RADIUS_MM
Identify search radius in mm.
Definition qgis.h:5884
static const double DEFAULT_SEGMENT_EPSILON
Default snapping tolerance for segments.
Definition qgis.h:5956
static int versionInt()
Version number used for comparing versions using the "Check QGIS Version" function.
Definition qgis.cpp:272
static const int USER_CRS_START_ID
Minimum ID number for a user-defined projection.
Definition qgis.h:5947
static int geosVersionMinor()
GEOS Minor version number linked.
Definition qgis.cpp:309
static int geosVersionInt()
GEOS version number linked.
Definition qgis.cpp:294
static const double UI_SCALE_FACTOR
UI scaling factor.
Definition qgis.h:5932
static const double DEFAULT_POINT_SIZE
The default size (in millimeters) for point marker symbols.
Definition qgis.h:5950
static QString vsiPrefixForPath(const QString &path)
Returns a the vsi prefix which corresponds to a file path, or an empty string if the path is not asso...
#define qgis_xstr(x)
Definition qgis.cpp:38
void * qgsMalloc(size_t size)
Allocates size bytes and returns a pointer to the allocated memory.
Definition qgis.cpp:102
qlonglong qgsPermissiveToLongLong(QString string, bool &ok)
Converts a string to an qlonglong in a permissive way, e.g., allowing for incorrect numbers of digits...
Definition qgis.cpp:95
bool qgsVariantEqual(const QVariant &lhs, const QVariant &rhs)
Compares two QVariant values and returns whether they are equal, two NULL values are always treated a...
Definition qgis.cpp:256
uint qHash(const QVariant &variant)
Hash for QVariant.
Definition qgis.cpp:207
double qgsPermissiveToDouble(QString string, bool &ok)
Converts a string to a double in a permissive way, e.g., allowing for incorrect numbers of digits bet...
Definition qgis.cpp:81
int qgsPermissiveToInt(QString string, bool &ok)
Converts a string to an integer in a permissive way, e.g., allowing for incorrect numbers of digits b...
Definition qgis.cpp:88
void qgsFree(void *ptr)
Frees the memory space pointed to by ptr.
Definition qgis.cpp:124
QString qgsVsiPrefix(const QString &path)
Returns a the vsi prefix which corresponds to a file path, or an empty string if the path is not asso...
Definition qgis.cpp:202
bool qgsVariantLessThan(const QVariant &lhs, const QVariant &rhs)
Compares two QVariant values and returns whether the first is less than the second.
Definition qgis.cpp:129
bool qgsVariantGreaterThan(const QVariant &lhs, const QVariant &rhs)
Compares two QVariant values and returns whether the first is greater than the second.
Definition qgis.cpp:197
#define QgsDebugError(str)
Definition qgslogger.h:40