Skip to content

Commit

Permalink
Insure that our compass points to true north, not the grid north
Browse files Browse the repository at this point in the history
  • Loading branch information
nirvn committed Jun 24, 2023
1 parent f56282e commit 3dfc6f5
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 7 deletions.
22 changes: 22 additions & 0 deletions src/core/utils/positioningutils.cpp
Expand Up @@ -17,6 +17,10 @@
#include "gnsspositioninformation.h"
#include "positioningutils.h"

#include <qgsbearingutils.h>
#include <qgscoordinatetransformcontext.h>
#include <qgsproject.h>

PositioningUtils::PositioningUtils( QObject *parent )
: QObject( parent )
{
Expand Down Expand Up @@ -111,3 +115,21 @@ GnssPositionInformation PositioningUtils::averagedPositionInformation( const QLi
fixMode, fixType, quality, satellitesUsed, status, satPrn, satInfoComplete,
verticalSpeed / positionsInformationCount, magneticVariation / positionsInformationCount, positionsInformationCount, sourceName );
}

double PositioningUtils::bearingTrueNorth( const QgsPoint &position, const QgsCoordinateReferenceSystem &crs )
{
const QgsCoordinateTransformContext transformContext = QgsProject::instance()->transformContext();

double bearing = 0.0;
try
{
bearing = QgsBearingUtils::bearingTrueNorth( crs, transformContext, position );
}
catch ( QgsException &e )
{
Q_UNUSED( e )
QgsDebugMsgLevel( QStringLiteral( "Caught exception %1" ).arg( e.what() ), 2 );
}

return bearing;
}
7 changes: 7 additions & 0 deletions src/core/utils/positioningutils.h
Expand Up @@ -19,6 +19,8 @@
#include "qfield_core_export.h"

#include <QObject>
#include <qgscoordinatereferencesystem.h>
#include <qgspoint.h>

class GnssPositionInformation;

Expand All @@ -44,6 +46,11 @@ class QFIELD_CORE_EXPORT PositioningUtils : public QObject
* Returns an average GnssPositionInformation from a list of position information
*/
static Q_INVOKABLE GnssPositionInformation averagedPositionInformation( const QList<QVariant> &positionsInformation );

/**
* Returns the true north bearing from a given position and CRS
*/
static Q_INVOKABLE double bearingTrueNorth( const QgsPoint &position, const QgsCoordinateReferenceSystem &crs );
};

#endif // POSITIONINGUTILS_H
2 changes: 1 addition & 1 deletion src/qml/PositioningPreciseView.qml
Expand Up @@ -54,7 +54,7 @@ Item {
width: Math.min(positioningPreciseView.height - 10,
positioningPreciseView.width - preciseElevation.width - labelTarget.contentWidth - labelElevation.width - 20)
height: width
rotation: magnetometer.hasValue ? -magnetometer.orientation : 0
rotation: magnetometer.hasValue ? -magnetometer.orientation + positionSource.bearingTrueNorth : 0

ShapePath {
strokeWidth: 1
Expand Down
16 changes: 10 additions & 6 deletions src/qml/qgismobileapp.qml
Expand Up @@ -202,6 +202,7 @@ ApplicationWindow {

property bool currentness: false;
property alias destinationCrs: positionSource.coordinateTransformer.destinationCrs
property real bearingTrueNorth: 0.0

coordinateTransformer: CoordinateTransformer {
destinationCrs: mapCanvas.mapSettings.destinationCrs
Expand All @@ -215,8 +216,11 @@ ApplicationWindow {
logging: positioningSettings.logging

onProjectedPositionChanged: {
if (active && gnssButton.followActive) {
gnssButton.followLocation(false);
if (active) {
bearingTrueNorth = PositioningUtils.bearingTrueNorth(positionSource.projectedPosition, mapCanvas.mapSettings.destinationCrs)
if (gnssButton.followActive) {
gnssButton.followLocation(false);
}
}
}

Expand Down Expand Up @@ -248,8 +252,8 @@ ApplicationWindow {
returnGeoValues: false

property bool hasValue: false
property real orientation: 0
property real lastAcceptedReading: 0
property real orientation: 0

Screen.onOrientationChanged: {
switch (Screen.orientation) {
Expand Down Expand Up @@ -691,9 +695,9 @@ ApplicationWindow {
? positionSource.positionInformation.speed
: -1
orientation: magnetometer.hasValue
? magnetometer.orientation < 0
? 360 + magnetometer.orientation
: magnetometer.orientation
? magnetometer.orientation + positionSource.bearingTrueNorth < 0
? 360 + magnetometer.orientation + positionSource.bearingTrueNorth
: magnetometer.orientation + positionSource.bearingTrueNorth
: -1
}

Expand Down

1 comment on commit 3dfc6f5

@qfield-fairy
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.