Skip to content

Commit

Permalink
Add readouts for track length and distance from start of track
Browse files Browse the repository at this point in the history
to GPS information panel
  • Loading branch information
nyalldawson committed Nov 11, 2022
1 parent 32db68b commit 187da08
Show file tree
Hide file tree
Showing 6 changed files with 286 additions and 159 deletions.
6 changes: 6 additions & 0 deletions src/app/gps/qgsappgpsdigitizing.cpp
Expand Up @@ -117,6 +117,11 @@ double QgsAppGpsDigitizing::trackDirectLength() const
return mDa.measureLine( { QgsPointXY( mCaptureListWgs84.constFirst() ), QgsPointXY( mCaptureListWgs84.constLast() )} );
}

const QgsDistanceArea &QgsAppGpsDigitizing::distanceArea() const
{
return mDa;
}

void QgsAppGpsDigitizing::addVertex()
{
if ( !mRubberBand )
Expand Down Expand Up @@ -622,6 +627,7 @@ void QgsAppGpsDigitizing::updateDistanceArea()
{
mDa.setEllipsoid( QgsProject::instance()->ellipsoid() );
mDa.setSourceCrs( mWgs84CRS, QgsProject::instance()->transformContext() );
emit distanceAreaChanged();
}

void QgsAppGpsDigitizing::createRubberBand()
Expand Down
10 changes: 10 additions & 0 deletions src/app/gps/qgsappgpsdigitizing.h
Expand Up @@ -64,6 +64,11 @@ class APP_EXPORT QgsAppGpsDigitizing: public QObject
*/
double trackDirectLength() const;

/**
* Returns the distance area calculator used to calculate track lengths.
*/
const QgsDistanceArea &distanceArea() const;

public slots:
void addVertex();
void resetTrack();
Expand All @@ -83,6 +88,11 @@ class APP_EXPORT QgsAppGpsDigitizing: public QObject
*/
void trackChanged();

/**
* Emitted whenever the distance area used to calculate track distances is changed.
*/
void distanceAreaChanged();

private slots:
void gpsSettingsChanged();
void updateTrackAppearance();
Expand Down
39 changes: 38 additions & 1 deletion src/app/gps/qgsgpsinformationwidget.cpp
Expand Up @@ -27,6 +27,7 @@
#include "qgsgpsconnection.h"
#include "qgscoordinateutils.h"
#include "qgsappgpssettingsmenu.h"
#include "qgsappgpsdigitizing.h"

// QWT Charting widget

Expand All @@ -53,10 +54,11 @@


QgsGpsInformationWidget::QgsGpsInformationWidget( QgsAppGpsConnection *connection,
QgsMapCanvas *mapCanvas, QWidget *parent )
QgsMapCanvas *mapCanvas, QgsAppGpsDigitizing *digitizing, QWidget *parent )
: QgsPanelWidget( parent )
, mConnection( connection )
, mMapCanvas( mapCanvas )
, mDigitizing( digitizing )
{
Q_ASSERT( mMapCanvas ); // precondition
setupUi( this );
Expand Down Expand Up @@ -205,6 +207,9 @@ QgsGpsInformationWidget::QgsGpsInformationWidget( QgsAppGpsConnection *connectio
break;
}
} );

connect( mDigitizing, &QgsAppGpsDigitizing::trackChanged, this, &QgsGpsInformationWidget::updateTrackInformation );
connect( mDigitizing, &QgsAppGpsDigitizing::distanceAreaChanged, this, &QgsGpsInformationWidget::updateTrackInformation );
}

QgsGpsInformationWidget::~QgsGpsInformationWidget()
Expand Down Expand Up @@ -288,6 +293,38 @@ void QgsGpsInformationWidget::gpsConnected()
mGPSPlainTextEdit->appendPlainText( tr( "Connected!" ) );
}

void QgsGpsInformationWidget::updateTrackInformation()
{
const double totalTrackLength = mDigitizing->totalTrackLength();
const double directTrackLength = mDigitizing->trackDirectLength();

const QgsSettings settings;
const bool keepBaseUnit = settings.value( QStringLiteral( "qgis/measure/keepbaseunit" ), true ).toBool();
const int decimalPlaces = settings.value( QStringLiteral( "qgis/measure/decimalplaces" ), 3 ).toInt();

if ( totalTrackLength > 0 )
{
mTxtTotalTrackLength->setEnabled( true );
mTxtTotalTrackLength->setText( mDigitizing->distanceArea().formatDistance( totalTrackLength, decimalPlaces, mDigitizing->distanceArea().lengthUnits(), keepBaseUnit ) );
}
else
{
mTxtTotalTrackLength->setEnabled( false );
mTxtTotalTrackLength->setText( tr( "Not available" ) );
}

if ( directTrackLength > 0 )
{
mTxtDirectTrackLength->setEnabled( true );
mTxtDirectTrackLength->setText( mDigitizing->distanceArea().formatDistance( directTrackLength, decimalPlaces, mDigitizing->distanceArea().lengthUnits(), keepBaseUnit ) );
}
else
{
mTxtDirectTrackLength->setEnabled( false );
mTxtDirectTrackLength->setText( tr( "Not available" ) );
}
}

void QgsGpsInformationWidget::gpsDisconnected()
{
mGPSPlainTextEdit->appendPlainText( tr( "Disconnected…" ) );
Expand Down
5 changes: 4 additions & 1 deletion src/app/gps/qgsgpsinformationwidget.h
Expand Up @@ -36,6 +36,7 @@ class QextSerialPort;
class QgsAppGpsConnection;
class QgsGpsInformation;
class QgsMapCanvas;
class QgsAppGpsDigitizing;

/**
* A dock widget that displays information from a GPS device and
Expand All @@ -47,7 +48,7 @@ class APP_EXPORT QgsGpsInformationWidget: public QgsPanelWidget, private Ui::Qgs
Q_OBJECT
public:

QgsGpsInformationWidget( QgsAppGpsConnection *connection, QgsMapCanvas *mapCanvas, QWidget *parent = nullptr );
QgsGpsInformationWidget( QgsAppGpsConnection *connection, QgsMapCanvas *mapCanvas, QgsAppGpsDigitizing *digitizing = nullptr, QWidget *parent = nullptr );
~QgsGpsInformationWidget() override;

private slots:
Expand All @@ -64,6 +65,7 @@ class APP_EXPORT QgsGpsInformationWidget: public QgsPanelWidget, private Ui::Qgs
void gpsConnecting();
void gpsDisconnected();
void gpsConnected();
void updateTrackInformation();

private:

Expand All @@ -72,6 +74,7 @@ class APP_EXPORT QgsGpsInformationWidget: public QgsPanelWidget, private Ui::Qgs

QgsAppGpsConnection *mConnection = nullptr;
QPointer< QgsMapCanvas > mMapCanvas;
QgsAppGpsDigitizing *mDigitizing = nullptr;

QwtPlot *mPlot = nullptr;
QwtPlotCurve *mCurve = nullptr;
Expand Down
2 changes: 1 addition & 1 deletion src/app/qgisapp.cpp
Expand Up @@ -1421,7 +1421,7 @@ QgisApp::QgisApp( QSplashScreen *splash, bool restorePlugins, bool skipBadLayers
connect( mGpsSettingsMenu, &QgsAppGpsSettingsMenu::nmeaLogFileChanged, mGpsDigitizing, &QgsAppGpsDigitizing::setNmeaLogFile );
connect( mGpsDigitizing, &QgsAppGpsDigitizing::trackIsEmptyChanged, mGpsToolBar, [ = ]( bool isEmpty ) { mGpsToolBar->setResetTrackButtonEnabled( !isEmpty ); } );

mpGpsWidget = new QgsGpsInformationWidget( mGpsConnection, mMapCanvas );
mpGpsWidget = new QgsGpsInformationWidget( mGpsConnection, mMapCanvas, mGpsDigitizing );
QgsPanelWidgetStack *gpsStack = new QgsPanelWidgetStack();
gpsStack->setMainPanel( mpGpsWidget );
mpGpsWidget->setDockMode( true );
Expand Down

0 comments on commit 187da08

Please sign in to comment.