diff --git a/app/position/positionkit.cpp b/app/position/positionkit.cpp index addd834f5..85c6677a5 100644 --- a/app/position/positionkit.cpp +++ b/app/position/positionkit.cpp @@ -50,8 +50,8 @@ QString PositionKit::positionCrs3DGeoidModelName() return mVerticalCrs.description(); } - // for internal providers return EGM96 model - if ( mPositionProvider->type() == QStringLiteral( "internal" ) && !mPosition.isMock ) + // for internal providers return EGM96 model if it's not mock, and we haven't got orthometric height + if ( mPositionProvider->type() == QStringLiteral( "internal" ) && !mPosition.isMock && !std::isnan( mPosition.elevation_diff ) ) { return QgsCoordinateReferenceSystem::fromEpsgId( 5773 ).description(); } diff --git a/app/position/positiontransformer.cpp b/app/position/positiontransformer.cpp index 7709ff136..3d5dd559c 100644 --- a/app/position/positiontransformer.cpp +++ b/app/position/positiontransformer.cpp @@ -122,9 +122,8 @@ GeoPosition PositionTransformer::processInternalIosPosition( QGeoPositionInfo &g QgsPoint geoidPosition; const bool isInternalProviderEllipsoidAltitude = !isMockedLocation && isEllipsoidalAltitude; - const bool isMockedProviderEllipsoidAltitude = isMockedLocation && isEllipsoidalAltitude; - - if ( isInternalProviderEllipsoidAltitude || ( isMockedProviderEllipsoidAltitude && !mSkipElevationTransformation ) ) + // with mocked position we expect ellipsoid elevation + if ( isInternalProviderEllipsoidAltitude || ( isMockedLocation && !mSkipElevationTransformation ) ) { geoidPosition = InputUtils::transformPoint( mSourceCrs, @@ -153,7 +152,7 @@ GeoPosition PositionTransformer::processInternalIosPosition( QGeoPositionInfo &g // - on iOS - it would return MSL altitude, but we have a custom patch in vcpkg to return // ellipsoid altitude, if it's available (so we do not rely on geoid model of unknown quality/resolution), // or we get orthometric altitude from mocked location, but the altitude separation is unknown - if ( isEllipsoidalAltitude && !mSkipElevationTransformation ) + if ( isInternalProviderEllipsoidAltitude || ( isMockedLocation && !mSkipElevationTransformation ) ) { const double ellipsoidAltitude = geoPosition.coordinate().altitude(); const double geoidSeparation = ellipsoidAltitude - geoidPosition.z(); diff --git a/app/test/testposition.cpp b/app/test/testposition.cpp index 2a4a8213f..6c0bdba26 100644 --- a/app/test/testposition.cpp +++ b/app/test/testposition.cpp @@ -702,30 +702,14 @@ void TestPosition::testPositionTransformerInternalIosPosition() QVERIFY( !geoPosition.hasAttribute( QGeoPositionInfo::VerticalSpeed ) ); QVERIFY( !geoPosition.hasAttribute( QGeoPositionInfo::MagneticVariation ) ); - - // ellipsoid elevation - geoPosition.setAttribute( QGeoPositionInfo::VerticalSpeed, 1 ); - // mocked - geoPosition.setAttribute( QGeoPositionInfo::MagneticVariation, 1 ); - // transform with pass through disabled, position is mocked and ellipsoid - newPosition = positionTransformer.processInternalIosPosition( geoPosition ); - - QVERIFY( qgsDoubleNear( newPosition.elevation, 127.53574931171875 ) ); - QVERIFY( qgsDoubleNear( newPosition.elevation_diff, 43.764250688281265 ) ); - QVERIFY( newPosition.isMock ); - QVERIFY( !geoPosition.hasAttribute( QGeoPositionInfo::VerticalSpeed ) ); - QVERIFY( !geoPosition.hasAttribute( QGeoPositionInfo::MagneticVariation ) ); - - // mocked geoPosition.setAttribute( QGeoPositionInfo::MagneticVariation, 1 ); // transform with pass through disabled, position is mocked and orthometric newPosition = positionTransformer.processInternalIosPosition( geoPosition ); - QCOMPARE( newPosition.elevation, 171.3 ); - QCOMPARE( newPosition.elevation_diff, std::numeric_limits::quiet_NaN() ); + QCOMPARE( newPosition.elevation, 127.53574931171875 ); + QCOMPARE( newPosition.elevation_diff, 43.764250688281265 ); QVERIFY( newPosition.isMock ); - QVERIFY( !geoPosition.hasAttribute( QGeoPositionInfo::VerticalSpeed ) ); QVERIFY( !geoPosition.hasAttribute( QGeoPositionInfo::MagneticVariation ) );