add trandform context to QgsBearingUtils::bearingTrueNorth

This commit is contained in:
Mathieu Pellerin 2018-01-30 13:26:36 +07:00 committed by GitHub
parent 0a9f019f27
commit eb42afed9b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 22 additions and 16 deletions

View File

@ -24,6 +24,7 @@ Utilities for calculating bearings and directions.
public: public:
static double bearingTrueNorth( const QgsCoordinateReferenceSystem &crs, static double bearingTrueNorth( const QgsCoordinateReferenceSystem &crs,
const QgsCoordinateTransformContext &transformContext,
const QgsPointXY &point ); const QgsPointXY &point );
%Docstring %Docstring
Returns the direction to true north from a specified point and for a specified Returns the direction to true north from a specified point and for a specified

View File

@ -125,7 +125,7 @@ void QgsDecorationNorthArrow::render( const QgsMapSettings &mapSettings, QgsRend
{ {
try try
{ {
mRotationInt = QgsBearingUtils:: bearingTrueNorth( mapSettings.destinationCrs(), context.extent().center() ); mRotationInt = QgsBearingUtils:: bearingTrueNorth( mapSettings.destinationCrs(), mapSettings.transformContext(), context.extent().center() );
} }
catch ( QgsException & ) catch ( QgsException & )
{ {

View File

@ -463,10 +463,11 @@ void QgsLayoutItemPicture::updateMapRotation()
{ {
QgsPointXY center = mRotationMap->extent().center(); QgsPointXY center = mRotationMap->extent().center();
QgsCoordinateReferenceSystem crs = mRotationMap->crs(); QgsCoordinateReferenceSystem crs = mRotationMap->crs();
QgsCoordinateTransformContext transformContext = mLayout->project()->transformContext();
try try
{ {
double bearing = QgsBearingUtils::bearingTrueNorth( crs, center ); double bearing = QgsBearingUtils::bearingTrueNorth( crs, transformContext, center );
rotation += bearing; rotation += bearing;
} }
catch ( QgsException &e ) catch ( QgsException &e )

View File

@ -17,16 +17,15 @@
#include "qgsbearingutils.h" #include "qgsbearingutils.h"
#include "qgscoordinatereferencesystem.h" #include "qgscoordinatereferencesystem.h"
#include "qgscoordinatetransformcontext.h"
#include "qgspointxy.h" #include "qgspointxy.h"
#include "qgscoordinatetransform.h" #include "qgscoordinatetransform.h"
#include "qgsexception.h" #include "qgsexception.h"
double QgsBearingUtils::bearingTrueNorth( const QgsCoordinateReferenceSystem &crs, const QgsPointXY &point ) double QgsBearingUtils::bearingTrueNorth( const QgsCoordinateReferenceSystem &crs, const QgsCoordinateTransformContext &transformContext, const QgsPointXY &point )
{ {
// step 1 - transform point into WGS84 geographic crs // step 1 - transform point into WGS84 geographic crs
Q_NOWARN_DEPRECATED_PUSH QgsCoordinateTransform transform( crs, QgsCoordinateReferenceSystem::fromEpsgId( 4326 ), transformContext );
QgsCoordinateTransform transform( crs, QgsCoordinateReferenceSystem::fromEpsgId( 4326 ) );
Q_NOWARN_DEPRECATED_POP
if ( !transform.isValid() ) if ( !transform.isValid() )
{ {

View File

@ -19,6 +19,7 @@
#define QGSBEARINGUTILS_H #define QGSBEARINGUTILS_H
class QgsCoordinateReferenceSystem; class QgsCoordinateReferenceSystem;
class QgsCoordinateTransformContext;
class QgsPointXY; class QgsPointXY;
#include "qgis_core.h" #include "qgis_core.h"
@ -39,6 +40,7 @@ class CORE_EXPORT QgsBearingUtils
* vertical. An exception will be thrown if the bearing could not be calculated. * vertical. An exception will be thrown if the bearing could not be calculated.
*/ */
static double bearingTrueNorth( const QgsCoordinateReferenceSystem &crs, static double bearingTrueNorth( const QgsCoordinateReferenceSystem &crs,
const QgsCoordinateTransformContext &transformContext,
const QgsPointXY &point ); const QgsPointXY &point );
}; };

View File

@ -16,6 +16,7 @@ import qgis # NOQA switch sip api
from qgis.core import (QgsBearingUtils, from qgis.core import (QgsBearingUtils,
QgsCoordinateReferenceSystem, QgsCoordinateReferenceSystem,
QgsCoordinateTransformContext,
QgsPointXY QgsPointXY
) )
@ -32,26 +33,28 @@ class TestQgsBearingUtils(unittest.TestCase):
# short circuit - already a geographic crs # short circuit - already a geographic crs
crs = QgsCoordinateReferenceSystem.fromEpsgId(4326) crs = QgsCoordinateReferenceSystem.fromEpsgId(4326)
self.assertEqual(QgsBearingUtils.bearingTrueNorth(crs, QgsPointXY(0, 0)), 0) transformContext = QgsCoordinateTransformContext()
self.assertEqual(QgsBearingUtils.bearingTrueNorth(crs, QgsPointXY(44, 0)), 0)
self.assertEqual(QgsBearingUtils.bearingTrueNorth(crs, QgsPointXY(44, -43)), 0)
self.assertEqual(QgsBearingUtils.bearingTrueNorth(crs, QgsPointXY(44, 43)), 0)
self.assertEqual(QgsBearingUtils.bearingTrueNorth(crs, QgsPointXY(44, 200)), 0) self.assertEqual(QgsBearingUtils.bearingTrueNorth(crs, transformContext, QgsPointXY(0, 0)), 0)
self.assertEqual(QgsBearingUtils.bearingTrueNorth(crs, QgsPointXY(44, -200)), 0) self.assertEqual(QgsBearingUtils.bearingTrueNorth(crs, transformContext, QgsPointXY(44, 0)), 0)
self.assertEqual(QgsBearingUtils.bearingTrueNorth(crs, transformContext, QgsPointXY(44, -43)), 0)
self.assertEqual(QgsBearingUtils.bearingTrueNorth(crs, transformContext, QgsPointXY(44, 43)), 0)
self.assertEqual(QgsBearingUtils.bearingTrueNorth(crs, transformContext, QgsPointXY(44, 200)), 0)
self.assertEqual(QgsBearingUtils.bearingTrueNorth(crs, transformContext, QgsPointXY(44, -200)), 0)
# no short circuit # no short circuit
crs = QgsCoordinateReferenceSystem.fromEpsgId(3111) crs = QgsCoordinateReferenceSystem.fromEpsgId(3111)
self.assertAlmostEqual(QgsBearingUtils.bearingTrueNorth(crs, QgsPointXY(2508807, 2423425)), 0.06, 2) self.assertAlmostEqual(QgsBearingUtils.bearingTrueNorth(crs, transformContext, QgsPointXY(2508807, 2423425)), 0.06, 2)
# try a south-up crs # try a south-up crs
crs = QgsCoordinateReferenceSystem.fromEpsgId(2053) crs = QgsCoordinateReferenceSystem.fromEpsgId(2053)
self.assertAlmostEqual(QgsBearingUtils.bearingTrueNorth(crs, QgsPointXY(29, -27.55)), -180.0, 1) self.assertAlmostEqual(QgsBearingUtils.bearingTrueNorth(crs, transformContext, QgsPointXY(29, -27.55)), -180.0, 1)
# try a north pole crs # try a north pole crs
crs = QgsCoordinateReferenceSystem.fromEpsgId(3575) crs = QgsCoordinateReferenceSystem.fromEpsgId(3575)
self.assertAlmostEqual(QgsBearingUtils.bearingTrueNorth(crs, QgsPointXY(-780770, 652329)), 129.9, 1) self.assertAlmostEqual(QgsBearingUtils.bearingTrueNorth(crs, transformContext, QgsPointXY(-780770, 652329)), 129.9, 1)
self.assertAlmostEqual(QgsBearingUtils.bearingTrueNorth(crs, QgsPointXY(513480, 873173)), -149.5, 1) self.assertAlmostEqual(QgsBearingUtils.bearingTrueNorth(crs, transformContext, QgsPointXY(513480, 873173)), -149.5, 1)
if __name__ == '__main__': if __name__ == '__main__':