Skip to content

Commit

Permalink
[gps] Make GPS bearing line ellipsoid aware, instead of just a straig…
Browse files Browse the repository at this point in the history
…ht line drawn from the GPS point
  • Loading branch information
nyalldawson committed Sep 15, 2020
1 parent 76cf602 commit 1e71558
Showing 1 changed file with 33 additions and 5 deletions.
38 changes: 33 additions & 5 deletions src/app/gps/qgsgpsbearingitem.cpp
Expand Up @@ -24,7 +24,7 @@
#include "qgsproject.h"
#include "qgsmessagelog.h"
#include "qgssymbol.h"

#include "qgslogger.h"

QgsGpsBearingItem::QgsGpsBearingItem( QgsMapCanvas *mapCanvas )
: QgsMapCanvasLineSymbolItem( mapCanvas )
Expand Down Expand Up @@ -75,9 +75,37 @@ void QgsGpsBearingItem::updatePosition()

void QgsGpsBearingItem::updateLine()
{
QLineF bearingLine;
bearingLine.setP1( toCanvasCoordinates( mCenter ) );
bearingLine.setLength( 5 * std::max( mMapCanvas->width(), mMapCanvas->height() ) );
bearingLine.setAngle( 90 - mBearing - mMapCanvas->rotation() );
QPolygonF bearingLine;

QgsCoordinateTransform wgs84ToCanvas( mWgs84CRS, mMapCanvas->mapSettings().destinationCrs(), QgsProject::instance()->transformContext() );

try
{
bearingLine << mMapCanvas->getCoordinateTransform()->transform( wgs84ToCanvas.transform( mCenterWGS84 ) ).toQPointF();

// project out the bearing line by roughly twice the size of the canvas
QgsDistanceArea da1;
da1.setSourceCrs( mMapCanvas->mapSettings().destinationCrs(), QgsProject::instance()->transformContext() );
da1.setEllipsoid( QgsProject::instance()->ellipsoid() );
const double totalLength = 2 * da1.measureLine( mMapCanvas->mapSettings().extent().center(), QgsPointXY( mMapCanvas->mapSettings().extent().xMaximum(),
mMapCanvas->mapSettings().extent().yMaximum() ) );

QgsDistanceArea da;
da.setSourceCrs( mWgs84CRS, QgsProject::instance()->transformContext() );
da.setEllipsoid( QgsProject::instance()->ellipsoid() );
// use 20 segments, projected from GPS position, in order to render a nice ellipsoid aware bearing line
for ( int i = 1; i < 20; i++ )
{
const double distance = totalLength * i / 20;
const QgsPointXY res = da.computeSpheroidProject( mCenterWGS84, distance, mBearing * M_PI / 180.0 );
bearingLine << mMapCanvas->getCoordinateTransform()->transform( wgs84ToCanvas.transform( res ) ).toQPointF();
}
}
catch ( QgsCsException & )
{
QgsDebugMsg( QStringLiteral( "Coordinate exception encountered while drawing GPS bearing line" ) );
bearingLine.clear();
}

setLine( bearingLine );
}

0 comments on commit 1e71558

Please sign in to comment.