Skip to content

Commit

Permalink
Refactor QgsCoordinateUtils to expose precision from crs method
Browse files Browse the repository at this point in the history
(cherry picked from commit fccb273)
  • Loading branch information
nyalldawson committed Mar 2, 2023
1 parent e626419 commit 68ade5e
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 1 deletion.
5 changes: 5 additions & 0 deletions src/core/qgscoordinateutils.cpp
Expand Up @@ -96,6 +96,11 @@ int QgsCoordinateUtils::calculateCoordinatePrecisionForCrs( const QgsCoordinateR
return prj->readNumEntry( QStringLiteral( "PositionPrecision" ), QStringLiteral( "/DecimalPlaces" ), 6 );
}

return calculateCoordinatePrecision( crs );
}

int QgsCoordinateUtils::calculateCoordinatePrecision( const QgsCoordinateReferenceSystem &crs )
{
const QgsUnitTypes::DistanceUnit unit = crs.mapUnits();
if ( unit == QgsUnitTypes::DistanceDegrees )
{
Expand Down
16 changes: 15 additions & 1 deletion src/core/qgscoordinateutils.h
Expand Up @@ -62,14 +62,28 @@ class CORE_EXPORT QgsCoordinateUtils
Q_INVOKABLE static int calculateCoordinatePrecision( double mapUnitsPerPixel, const QgsCoordinateReferenceSystem &mapCrs, QgsProject *project = nullptr );

/**
* Calculates coordinate precision for a CRS / Project. Considers CRS units and project settings
* Calculates coordinate precision for a \a crs and \a project.
*
* This method checks whether the \a project has explicit precision settings, and if not
* calculates a precision based on CRS units.
*
* \param crs Coordinate system
* \param project QGIS project. Takes QgsProject::instance() if NULL
*
* \returns number of decimal places behind the dot
* \since QGIS 3.18
*/
Q_INVOKABLE static int calculateCoordinatePrecisionForCrs( const QgsCoordinateReferenceSystem &crs, QgsProject *project = nullptr );

/**
* Calculates a reasonable coordinate precision for a \a crs.
*
* This method considers the CRS units only.
*
* \since QGIS 3.30
*/
Q_INVOKABLE static int calculateCoordinatePrecision( const QgsCoordinateReferenceSystem &crs );

/**
* Formats a \a point coordinate for use with the specified \a project, respecting the project's
* coordinate display settings.
Expand Down
11 changes: 11 additions & 0 deletions tests/src/core/testqgscoordinateutils.cpp
Expand Up @@ -24,6 +24,7 @@ class TestQgsCoordinateUtils : public QObject
Q_OBJECT
private slots:

void testPrecisionForCrs();
void testDegreeWithSuffix();
void testLocale();
void initTestCase();
Expand All @@ -42,6 +43,16 @@ void TestQgsCoordinateUtils::cleanupTestCase()
QgsApplication::exitQgis();
}

void TestQgsCoordinateUtils::testPrecisionForCrs()
{
// 8 decimal places for degrees based crs
QCOMPARE( QgsCoordinateUtils::calculateCoordinatePrecision( QgsCoordinateReferenceSystem( "EPSG:4326" ) ), 8 );
// 3 decimal places for others
QCOMPARE( QgsCoordinateUtils::calculateCoordinatePrecision( QgsCoordinateReferenceSystem( "EPSG:3857" ) ), 3 );
QCOMPARE( QgsCoordinateUtils::calculateCoordinatePrecision( QgsCoordinateReferenceSystem( "EPSG:3111" ) ), 3 );
QCOMPARE( QgsCoordinateUtils::calculateCoordinatePrecision( QgsCoordinateReferenceSystem() ), 3 );
}

void TestQgsCoordinateUtils::testDegreeWithSuffix()
{
bool ok = false ;
Expand Down

0 comments on commit 68ade5e

Please sign in to comment.