|
18 | 18 | #include "qgslogger.h"
|
19 | 19 | #include "qgsmessagelog.h"
|
20 | 20 | #include <sqlite3.h>
|
| 21 | +#include <QCollator> |
| 22 | + |
| 23 | +#if PROJ_VERSION_MAJOR>=6 |
| 24 | +#include <proj.h> |
| 25 | +#endif |
21 | 26 |
|
22 | 27 | QReadWriteLock QgsEllipsoidUtils::sEllipsoidCacheLock;
|
23 | 28 | QHash< QString, QgsEllipsoidUtils::EllipsoidParameters > QgsEllipsoidUtils::sEllipsoidCache;
|
@@ -186,12 +191,47 @@ QList<QgsEllipsoidUtils::EllipsoidDefinition> QgsEllipsoidUtils::definitions()
|
186 | 191 | sDefinitionCacheLock.unlock();
|
187 | 192 |
|
188 | 193 | sDefinitionCacheLock.lockForWrite();
|
| 194 | + QList<QgsEllipsoidUtils::EllipsoidDefinition> defs; |
| 195 | + |
| 196 | +#if PROJ_VERSION_MAJOR>=6 |
| 197 | + // use proj to get ellipsoids |
| 198 | + const PJ_ELLPS *ellipsoid = proj_list_ellps(); |
| 199 | + while ( ellipsoid->name ) |
| 200 | + { |
| 201 | + EllipsoidDefinition def; |
| 202 | + def.acronym = ellipsoid->id ; |
| 203 | + def.description = ellipsoid->name; |
| 204 | + const QString majorString( ellipsoid->major ); |
| 205 | + def.parameters.semiMajor = majorString.midRef( 2 ).toDouble(); |
| 206 | + const QString minorString( ellipsoid->ell ); |
| 207 | + if ( minorString.startsWith( 'b' ) ) |
| 208 | + { |
| 209 | + // b= style |
| 210 | + def.parameters.semiMinor = minorString.midRef( 2 ).toDouble(); |
| 211 | + def.parameters.inverseFlattening = def.parameters.semiMajor / ( def.parameters.semiMajor - def.parameters.semiMinor ); |
| 212 | + } |
| 213 | + else |
| 214 | + { |
| 215 | + // rf= style |
| 216 | + def.parameters.inverseFlattening = minorString.midRef( 2 ).toDouble(); |
| 217 | + def.parameters.semiMinor = def.parameters.semiMajor * ( 1 - def.parameters.inverseFlattening ); |
| 218 | + } |
| 219 | + |
| 220 | + QgsCoordinateReferenceSystem crs = QgsCoordinateReferenceSystem::fromProj4( QStringLiteral( "+proj=longlat +ellps=%1 +no_defs" ).arg( def.acronym ) ); |
| 221 | + if ( crs.isValid() ) |
| 222 | + def.parameters.crs = crs; |
| 223 | + |
| 224 | + defs << def; |
| 225 | + |
| 226 | + ellipsoid++; |
| 227 | + } |
| 228 | + |
| 229 | + |
| 230 | +#else |
189 | 231 | sqlite3_database_unique_ptr database;
|
190 | 232 | sqlite3_statement_unique_ptr statement;
|
191 | 233 | int result;
|
192 | 234 |
|
193 |
| - QList<QgsEllipsoidUtils::EllipsoidDefinition> defs; |
194 |
| - |
195 | 235 | //check the db is available
|
196 | 236 | result = database.open_v2( QgsApplication::srsDatabaseFilePath(), SQLITE_OPEN_READONLY, nullptr );
|
197 | 237 | if ( result )
|
@@ -221,6 +261,8 @@ QList<QgsEllipsoidUtils::EllipsoidDefinition> QgsEllipsoidUtils::definitions()
|
221 | 261 | }
|
222 | 262 | }
|
223 | 263 |
|
| 264 | +#endif |
| 265 | + |
224 | 266 | sDefinitionCache = defs;
|
225 | 267 | sDefinitionCacheLock.unlock();
|
226 | 268 |
|
|
0 commit comments