Skip to content

Commit 163f046

Browse files
committedMar 27, 2019
Avoid loss of precision when reading ellipsoids from proj
1 parent 583f3d3 commit 163f046

File tree

2 files changed

+34
-20
lines changed

2 files changed

+34
-20
lines changed
 

‎src/core/qgsellipsoidutils.cpp

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -357,22 +357,18 @@ QList<QgsEllipsoidUtils::EllipsoidDefinition> QgsEllipsoidUtils::definitions()
357357
def.description = QStringLiteral( "%1 (%2:%3)" ).arg( name, authority, code );
358358

359359
double semiMajor, semiMinor, invFlattening;
360-
int semiMinorComputed;
360+
int semiMinorComputed = 0;
361361
if ( proj_ellipsoid_get_parameters( context, ellipsoid, &semiMajor, &semiMinor, &semiMinorComputed, &invFlattening ) )
362362
{
363363
def.parameters.semiMajor = semiMajor;
364-
if ( semiMinor > 0 )
365-
{
366-
def.parameters.semiMinor = semiMinor;
367-
def.parameters.inverseFlattening = def.parameters.semiMajor / ( def.parameters.semiMajor - def.parameters.semiMinor );
364+
def.parameters.semiMinor = semiMinor;
365+
def.parameters.inverseFlattening = invFlattening;
366+
if ( !semiMinorComputed )
368367
def.parameters.crs = QgsCoordinateReferenceSystem::fromProj4( QStringLiteral( "+proj=longlat +a=%1 +b=%2 +no_defs" ).arg( def.parameters.semiMajor, 0, 'g', 17 ).arg( def.parameters.semiMinor, 0, 'g', 17 ) );
369-
}
370-
else
371-
{
372-
def.parameters.inverseFlattening = invFlattening;
373-
def.parameters.semiMinor = def.parameters.semiMajor * ( 1 - def.parameters.inverseFlattening );
368+
else if ( !qgsDoubleNear( def.parameters.inverseFlattening, 0.0 ) )
374369
def.parameters.crs = QgsCoordinateReferenceSystem::fromProj4( QStringLiteral( "+proj=longlat +a=%1 +rf=%2 +no_defs" ).arg( def.parameters.semiMajor, 0, 'g', 17 ).arg( def.parameters.inverseFlattening, 0, 'g', 17 ) );
375-
}
370+
else
371+
def.parameters.crs = QgsCoordinateReferenceSystem::fromProj4( QStringLiteral( "+proj=longlat +a=%1 +no_defs" ).arg( def.parameters.semiMajor, 0, 'g', 17 ) );
376372
}
377373
else
378374
{

‎tests/src/python/test_qgsellipsoidutils.py

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
__revision__ = '$Format:%H$'
1414

1515
import qgis # NOQA
16-
import math
1716
from qgis.core import (QgsEllipsoidUtils,
1817
QgsProjUtils)
1918
from qgis.testing import start_app, unittest
@@ -40,25 +39,44 @@ def testParams(self):
4039
if QgsProjUtils.projVersionMajor() < 6:
4140
self.assertEqual(params.crs.authid(), 'EPSG:4030')
4241
else:
43-
self.assertEqual(params.crs.toProj4(), '+proj=longlat +a=6378137 +b=6356752.3142451793 +no_defs')
42+
self.assertEqual(params.crs.toProj4(), '+proj=longlat +a=6378137 +rf=298.25722356300003 +no_defs')
4443

4544
for i in range(2):
4645
params = QgsEllipsoidUtils.ellipsoidParameters("Ganymede2000")
4746
self.assertTrue(params.valid)
4847
self.assertEqual(params.semiMajor, 2632400.0 if QgsProjUtils.projVersionMajor() < 6 else 2632345.0)
4948
self.assertEqual(params.semiMinor, 2632350.0 if QgsProjUtils.projVersionMajor() < 6 else 2632345.0)
50-
self.assertEqual(params.inverseFlattening, 52648.0 if QgsProjUtils.projVersionMajor() < 6 else math.inf)
49+
self.assertEqual(params.inverseFlattening, 52648.0 if QgsProjUtils.projVersionMajor() < 6 else 0)
5150
self.assertFalse(params.useCustomParameters)
52-
self.assertEqual(params.crs.authid(), '')
51+
if QgsProjUtils.projVersionMajor() < 6:
52+
self.assertEqual(params.crs.authid(), '')
53+
else:
54+
self.assertEqual(params.crs.toProj4(), '+proj=longlat +a=2632345 +no_defs')
5355

5456
if QgsProjUtils.projVersionMajor() >= 6:
5557
params = QgsEllipsoidUtils.ellipsoidParameters("ESRI:107916")
5658
self.assertTrue(params.valid)
57-
self.assertEqual(params.semiMajor, 2632400.0 if QgsProjUtils.projVersionMajor() < 6 else 2632345.0)
58-
self.assertEqual(params.semiMinor, 2632350.0 if QgsProjUtils.projVersionMajor() < 6 else 2632345.0)
59-
self.assertEqual(params.inverseFlattening, 52648.0 if QgsProjUtils.projVersionMajor() < 6 else math.inf)
59+
self.assertEqual(params.semiMajor, 2632345.0)
60+
self.assertEqual(params.semiMinor, 2632345.0)
61+
self.assertEqual(params.inverseFlattening, 0)
6062
self.assertFalse(params.useCustomParameters)
61-
self.assertEqual(params.crs.authid(), '')
63+
self.assertEqual(params.crs.toProj4(), '+proj=longlat +a=2632345 +no_defs')
64+
65+
params = QgsEllipsoidUtils.ellipsoidParameters("EPSG:7001")
66+
self.assertTrue(params.valid)
67+
self.assertEqual(params.semiMajor, 6377563.396)
68+
self.assertEqual(params.semiMinor, 6356256.909237285)
69+
self.assertEqual(params.inverseFlattening, 299.3249646)
70+
self.assertFalse(params.useCustomParameters)
71+
self.assertEqual(params.crs.toProj4(), '+proj=longlat +a=6377563.3959999997 +rf=299.32496459999999 +no_defs')
72+
73+
params = QgsEllipsoidUtils.ellipsoidParameters("EPSG:7008")
74+
self.assertTrue(params.valid)
75+
self.assertEqual(params.semiMajor, 6378206.4)
76+
self.assertEqual(params.semiMinor, 6356583.8)
77+
self.assertEqual(params.inverseFlattening, 294.9786982138982)
78+
self.assertFalse(params.useCustomParameters)
79+
self.assertEqual(params.crs.toProj4(), '+proj=longlat +a=6378206.4000000004 +b=6356583.7999999998 +no_defs')
6280

6381
# using parameters
6482
for i in range(2):
@@ -89,7 +107,7 @@ def testDefinitions(self):
89107
self.assertTrue(gany_defs.parameters.valid)
90108
self.assertEqual(gany_defs.parameters.semiMajor, 2632400.0 if QgsProjUtils.projVersionMajor() < 6 else 2632345.0)
91109
self.assertEqual(gany_defs.parameters.semiMinor, 2632350.0 if QgsProjUtils.projVersionMajor() < 6 else 2632345.0)
92-
self.assertEqual(gany_defs.parameters.inverseFlattening, 52648.0 if QgsProjUtils.projVersionMajor() < 6 else math.inf)
110+
self.assertEqual(gany_defs.parameters.inverseFlattening, 52648.0 if QgsProjUtils.projVersionMajor() < 6 else 0.0)
93111
self.assertFalse(gany_defs.parameters.useCustomParameters)
94112
self.assertEqual(gany_defs.parameters.crs.authid(), '')
95113

0 commit comments

Comments
 (0)
Please sign in to comment.