QGIS API Documentation  2.2.0-Valmiera
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
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 : [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 #include "qgis.h"
19 #ifndef QGSVERSION
20 #include "qgsversion.h"
21 #endif
22 #include <QCoreApplication>
23 #include <QDate>
24 #include <QTime>
25 #include <QDateTime>
26 #include "qgsconfig.h"
27 #include "qgslogger.h"
28 
29 #include <ogr_api.h>
30 
31 // Version constants
32 //
33 
34 // Version string
35 const char* QGis::QGIS_VERSION = VERSION;
36 
37 // development version
38 const char* QGis::QGIS_DEV_VERSION = QGSVERSION;
39 
40 // Version number used for comparing versions using the
41 // "Check QGIS Version" function
42 const int QGis::QGIS_VERSION_INT = VERSION_INT;
43 
44 // Release name
45 const char* QGis::QGIS_RELEASE_NAME = RELEASE_NAME;
46 
47 #if GDAL_VERSION_NUM >= 1800
48 const CORE_EXPORT QString GEOPROJ4 = "+proj=longlat +datum=WGS84 +no_defs";
49 #else
50 const CORE_EXPORT QString GEOPROJ4 = "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs";
51 #endif
52 
53 const CORE_EXPORT QString GEOWKT =
54  "GEOGCS[\"WGS 84\", "
55  " DATUM[\"WGS_1984\", "
56  " SPHEROID[\"WGS 84\",6378137,298.257223563, "
57  " AUTHORITY[\"EPSG\",7030]], "
58  " TOWGS84[0,0,0,0,0,0,0], "
59  " AUTHORITY[\"EPSG\",6326]], "
60  " PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",8901]], "
61  " UNIT[\"DMSH\",0.0174532925199433,AUTHORITY[\"EPSG\",9108]], "
62  " AXIS[\"Lat\",NORTH], "
63  " AXIS[\"Long\",EAST], "
64  " AUTHORITY[\"EPSG\",4326]]";
65 
66 const CORE_EXPORT QString PROJECT_SCALES =
67  "1:1000000,1:500000,1:250000,1:100000,1:50000,1:25000,"
68  "1:10000,1:5000,1:2500,1:1000,1:500";
69 
70 const CORE_EXPORT QString GEO_EPSG_CRS_AUTHID = "EPSG:4326";
71 
72 const CORE_EXPORT QString GEO_NONE = "NONE";
73 
74 const double QGis::DEFAULT_IDENTIFY_RADIUS = 0.5;
75 
77 const float QGis::DEFAULT_MAPTOPIXEL_THRESHOLD = 1.0f;
78 
79 // description strings for units
80 // Order must match enum indices
81 const char* QGis::qgisUnitTypes[] =
82 {
83  QT_TRANSLATE_NOOP( "QGis::UnitType", "meters" ),
84  QT_TRANSLATE_NOOP( "QGis::UnitType", "feet" ),
85  QT_TRANSLATE_NOOP( "QGis::UnitType", "degrees" ),
86  QT_TRANSLATE_NOOP( "QGis::UnitType", "<unknown>" ),
87  QT_TRANSLATE_NOOP( "QGis::UnitType", "degrees" ),
88  QT_TRANSLATE_NOOP( "QGis::UnitType", "degrees" ),
89  QT_TRANSLATE_NOOP( "QGis::UnitType", "degrees" ),
90  QT_TRANSLATE_NOOP( "QGis::UnitType", "nautical miles" )
91 };
92 
93 QGis::UnitType QGis::fromLiteral( QString literal, QGis::UnitType defaultType )
94 {
95  for ( unsigned int i = 0; i < ( sizeof( qgisUnitTypes ) / sizeof( qgisUnitTypes[0] ) ); i++ )
96  {
97  if ( literal == qgisUnitTypes[ i ] )
98  {
99  return static_cast<UnitType>( i );
100  }
101  }
102  return defaultType;
103 }
104 
106 {
107  return QString( qgisUnitTypes[ static_cast<int>( unit )] );
108 }
109 
110 QString QGis::tr( QGis::UnitType unit )
111 {
112  return QCoreApplication::translate( "QGis::UnitType", qPrintable( toLiteral( unit ) ) );
113 }
114 
116 {
117 #define DEGREE_TO_METER 111319.49079327358
118 #define FEET_TO_METER 0.3048
119 #define NMILE_TO_METER 1852.0
120 
121  // Unify degree units
122  if ( fromUnit == QGis::DecimalDegrees || fromUnit == QGis::DegreesMinutesSeconds || fromUnit == QGis::DegreesDecimalMinutes )
123  fromUnit = QGis::Degrees;
124  if ( toUnit == QGis::DecimalDegrees || toUnit == QGis::DegreesMinutesSeconds || toUnit == QGis::DegreesDecimalMinutes )
125  toUnit = QGis::Degrees;
126 
127  // Calculate the conversion factor between the specified units
128  if ( fromUnit != toUnit && fromUnit != QGis::UnknownUnit && toUnit != QGis::UnknownUnit )
129  {
130  switch ( fromUnit )
131  {
132  case QGis::Meters:
133  {
134  if ( toUnit == QGis::Feet ) return 1.0 / FEET_TO_METER;
135  if ( toUnit == QGis::Degrees ) return 1.0 / DEGREE_TO_METER;
136  if ( toUnit == QGis::NauticalMiles ) return 1.0 / NMILE_TO_METER;
137  break;
138  }
139  case QGis::Feet:
140  {
141  if ( toUnit == QGis::Meters ) return FEET_TO_METER;
142  if ( toUnit == QGis::Degrees ) return FEET_TO_METER / DEGREE_TO_METER;
143  if ( toUnit == QGis::NauticalMiles ) return FEET_TO_METER / NMILE_TO_METER;
144  break;
145  }
146  case QGis::Degrees:
147  {
148  if ( toUnit == QGis::Meters ) return DEGREE_TO_METER;
149  if ( toUnit == QGis::Feet ) return DEGREE_TO_METER / FEET_TO_METER;
150  if ( toUnit == QGis::NauticalMiles ) return DEGREE_TO_METER / NMILE_TO_METER;
151  break;
152  }
153  case QGis::NauticalMiles:
154  {
155  if ( toUnit == QGis::Meters ) return NMILE_TO_METER;
156  if ( toUnit == QGis::Feet ) return NMILE_TO_METER / FEET_TO_METER;
157  if ( toUnit == QGis::Degrees ) return NMILE_TO_METER / DEGREE_TO_METER;
158  break;
159  }
160  case QGis::UnknownUnit:
161  break;
162  }
163  }
164  return 1.0;
165 }
166 
167 void *qgsMalloc( size_t size )
168 {
169  if ( size == 0 || long( size ) < 0 )
170  {
171  QgsDebugMsg( QString( "Negative or zero size %1." ).arg( size ) );
172  return NULL;
173  }
174  void *p = malloc( size );
175  if ( p == NULL )
176  {
177  QgsDebugMsg( QString( "Allocation of %1 bytes failed." ).arg( size ) );
178  }
179  return p;
180 }
181 
182 void *qgsCalloc( size_t nmemb, size_t size )
183 {
184  if ( nmemb == 0 || long( nmemb ) < 0 || size == 0 || long( size ) < 0 )
185  {
186  QgsDebugMsg( QString( "Negative or zero nmemb %1 or size %2." ).arg( nmemb ).arg( size ) );
187  return NULL;
188  }
189  void *p = qgsMalloc( nmemb * size );
190  if ( p != NULL )
191  {
192  memset( p, 0, nmemb * size );
193  }
194  return p;
195 }
196 
197 void qgsFree( void *ptr )
198 {
199  free( ptr );
200 }
201 
202 bool qgsVariantLessThan( const QVariant& lhs, const QVariant& rhs )
203 {
204  switch ( lhs.type() )
205  {
206  case QVariant::Int:
207  return lhs.toInt() < rhs.toInt();
208  case QVariant::UInt:
209  return lhs.toUInt() < rhs.toUInt();
210  case QVariant::LongLong:
211  return lhs.toLongLong() < rhs.toLongLong();
212  case QVariant::ULongLong:
213  return lhs.toULongLong() < rhs.toULongLong();
214  case QVariant::Double:
215  return lhs.toDouble() < rhs.toDouble();
216  case QVariant::Char:
217  return lhs.toChar() < rhs.toChar();
218  case QVariant::Date:
219  return lhs.toDate() < rhs.toDate();
220  case QVariant::Time:
221  return lhs.toTime() < rhs.toTime();
222  case QVariant::DateTime:
223  return lhs.toDateTime() < rhs.toDateTime();
224  default:
225  return QString::localeAwareCompare( lhs.toString(), rhs.toString() ) < 0;
226  }
227 }
228 
229 bool qgsVariantGreaterThan( const QVariant& lhs, const QVariant& rhs )
230 {
231  return ! qgsVariantLessThan( lhs, rhs );
232 }
233 
234 QString qgsVsiPrefix( QString path )
235 {
236  if ( path.startsWith( "/vsizip/", Qt::CaseInsensitive ) ||
237  path.endsWith( ".zip", Qt::CaseInsensitive ) )
238  return "/vsizip/";
239  else if ( path.startsWith( "/vsitar/", Qt::CaseInsensitive ) ||
240  path.endsWith( ".tar", Qt::CaseInsensitive ) ||
241  path.endsWith( ".tar.gz", Qt::CaseInsensitive ) ||
242  path.endsWith( ".tgz", Qt::CaseInsensitive ) )
243  return "/vsitar/";
244  else if ( path.startsWith( "/vsigzip/", Qt::CaseInsensitive ) ||
245  path.endsWith( ".gz", Qt::CaseInsensitive ) )
246  return "/vsigzip/";
247  else
248  return "";
249 }