Skip to content

Commit edd84e9

Browse files
committedMar 27, 2019
Create ellipsoid definitions using proj db
Sponsored by ICSM
1 parent ef8d893 commit edd84e9

File tree

1 file changed

+44
-2
lines changed

1 file changed

+44
-2
lines changed
 

‎src/core/qgsellipsoidutils.cpp

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@
1818
#include "qgslogger.h"
1919
#include "qgsmessagelog.h"
2020
#include <sqlite3.h>
21+
#include <QCollator>
22+
23+
#if PROJ_VERSION_MAJOR>=6
24+
#include <proj.h>
25+
#endif
2126

2227
QReadWriteLock QgsEllipsoidUtils::sEllipsoidCacheLock;
2328
QHash< QString, QgsEllipsoidUtils::EllipsoidParameters > QgsEllipsoidUtils::sEllipsoidCache;
@@ -186,12 +191,47 @@ QList<QgsEllipsoidUtils::EllipsoidDefinition> QgsEllipsoidUtils::definitions()
186191
sDefinitionCacheLock.unlock();
187192

188193
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
189231
sqlite3_database_unique_ptr database;
190232
sqlite3_statement_unique_ptr statement;
191233
int result;
192234

193-
QList<QgsEllipsoidUtils::EllipsoidDefinition> defs;
194-
195235
//check the db is available
196236
result = database.open_v2( QgsApplication::srsDatabaseFilePath(), SQLITE_OPEN_READONLY, nullptr );
197237
if ( result )
@@ -221,6 +261,8 @@ QList<QgsEllipsoidUtils::EllipsoidDefinition> QgsEllipsoidUtils::definitions()
221261
}
222262
}
223263

264+
#endif
265+
224266
sDefinitionCache = defs;
225267
sDefinitionCacheLock.unlock();
226268

0 commit comments

Comments
 (0)
Please sign in to comment.