Skip to content

Commit

Permalink
[FEATURE][gps] Show distance from GPS lock position to current cursor
Browse files Browse the repository at this point in the history
position in status bar

When a GPS device is connected, whenever the user moves the cursor
over the canvas a live status bar message displays the distance
and bearing from the cursor to the GPS fix position.

Project distance and bearing settings are respected in this display.
  • Loading branch information
nyalldawson committed Jan 15, 2020
1 parent cb6fe01 commit 1461ae8
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 1 deletion.
47 changes: 46 additions & 1 deletion src/app/gps/qgsgpsinformationwidget.cpp
Expand Up @@ -43,6 +43,9 @@
#include "qgsbearingutils.h"
#include "qgsgpsbearingitem.h"
#include "qgssymbollayerutils.h"
#include "qgslocaldefaultsettings.h"
#include "qgsprojectdisplaysettings.h"
#include "qgsbearingnumericformat.h"

// QWT Charting widget

Expand Down Expand Up @@ -90,6 +93,14 @@ QgsGpsInformationWidget::QgsGpsInformationWidget( QgsMapCanvas *mapCanvas, QWidg
connect( mBtnCloseFeature, &QPushButton::clicked, this, &QgsGpsInformationWidget::mBtnCloseFeature_clicked );
connect( mBtnResetFeature, &QToolButton::clicked, this, &QgsGpsInformationWidget::mBtnResetFeature_clicked );
connect( mBtnLogFile, &QPushButton::clicked, this, &QgsGpsInformationWidget::mBtnLogFile_clicked );
connect( mMapCanvas, &QgsMapCanvas::xyCoordinates, this, &QgsGpsInformationWidget::cursorCoordinateChanged );

mBearingNumericFormat.reset( QgsLocalDefaultSettings::bearingFormat() );
connect( QgsProject::instance()->displaySettings(), &QgsProjectDisplaySettings::bearingFormatChanged, this, [ = ]
{
mBearingNumericFormat.reset( QgsProject::instance()->displaySettings()->bearingFormat()->clone() );
updateGpsDistanceStatusMessage();
} );

mCanvasToWgs84Transform = QgsCoordinateTransform( mMapCanvas->mapSettings().destinationCrs(), mWgs84CRS, QgsProject::instance() );
connect( mMapCanvas, &QgsMapCanvas::destinationCrsChanged, this, [ = ]
Expand Down Expand Up @@ -921,7 +932,9 @@ void QgsGpsInformationWidget::displayGPSInformation( const QgsGpsInformation &in
{
addVertex();
}
} // mLastGpsPosition != myNewCenter

updateGpsDistanceStatusMessage();
}

if ( !std::isnan( info.direction ) )
{
Expand Down Expand Up @@ -1474,6 +1487,38 @@ void QgsGpsInformationWidget::timestampFormatChanged( int )
mLblTimeZone->setEnabled( enabled );
}

void QgsGpsInformationWidget::cursorCoordinateChanged( const QgsPointXY &point )
{
try
{
mLastCursorPosWgs84 = mCanvasToWgs84Transform.transform( point );
updateGpsDistanceStatusMessage();
}
catch ( QgsCsException & )
{

}
}

void QgsGpsInformationWidget::updateGpsDistanceStatusMessage()
{
if ( !mNmea )
return;

QgsDistanceArea da;
da.setEllipsoid( QgsProject::instance()->ellipsoid() );
da.setSourceCrs( mWgs84CRS, QgsProject::instance()->transformContext() );

const double distance = da.convertLengthMeasurement( da.measureLine( QVector< QgsPointXY >() << mLastCursorPosWgs84 << mLastGpsPosition ),
QgsProject::instance()->distanceUnits() );
const double bearing = 180 * da.bearing( mLastCursorPosWgs84, mLastGpsPosition ) / M_PI;
const int distanceDecimalPlaces = QgsSettings().value( QStringLiteral( "qgis/measure/decimalplaces" ), "3" ).toInt();
const QString distanceString = QgsDistanceArea::formatDistance( distance, distanceDecimalPlaces, QgsProject::instance()->distanceUnits() );
const QString bearingString = mBearingNumericFormat->formatDouble( bearing, QgsNumericFormatContext() );

QgisApp::instance()->statusBarIface()->showMessage( tr( "Distance to GPS location %1 (%2)" ).arg( distanceString, bearingString ), 2000 );
}

void QgsGpsInformationWidget::updateTimestampDestinationFields( QgsMapLayer *mapLayer )
{
mPopulatingFields = true;
Expand Down
7 changes: 7 additions & 0 deletions src/app/gps/qgsgpsinformationwidget.h
Expand Up @@ -39,6 +39,7 @@ class QgsGpsInformation;
class QgsMapCanvas;
class QgsFeature;
class QgsGpsBearingItem;
class QgsBearingNumericFormat;

class QFile;
class QColor;
Expand Down Expand Up @@ -80,6 +81,7 @@ class APP_EXPORT QgsGpsInformationWidget: public QgsPanelWidget, private Ui::Qgs
void cboAcquisitionIntervalEdited();
void cboDistanceThresholdEdited();
void timestampFormatChanged( int index );
void cursorCoordinateChanged( const QgsPointXY &point );

/**
* Updates compatible fields for timestamp recording
Expand Down Expand Up @@ -115,6 +117,8 @@ class APP_EXPORT QgsGpsInformationWidget: public QgsPanelWidget, private Ui::Qgs
#endif
void createRubberBand();

void updateGpsDistanceStatusMessage();

QgsCoordinateReferenceSystem mWgs84CRS;
QgsCoordinateTransform mCanvasToWgs84Transform;

Expand All @@ -140,6 +144,9 @@ class APP_EXPORT QgsGpsInformationWidget: public QgsPanelWidget, private Ui::Qgs
//! Flag when updating fields
bool mPopulatingFields = false;

QgsPointXY mLastCursorPosWgs84;
std::unique_ptr< QgsBearingNumericFormat > mBearingNumericFormat;

QElapsedTimer mLastRotateTimer;

friend class TestQgsGpsInformationWidget;
Expand Down

0 comments on commit 1461ae8

Please sign in to comment.