From f6a3b3b278f72f187fb41230f35b732804392d63 Mon Sep 17 00:00:00 2001 From: Matej Bagar Date: Tue, 3 Mar 2026 16:10:12 +0100 Subject: [PATCH 1/4] Fix minor position issues on iOS --- app/position/positionkit.cpp | 2 +- app/position/positiontransformer.cpp | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/app/position/positionkit.cpp b/app/position/positionkit.cpp index addd834f5..99b9e3cb6 100644 --- a/app/position/positionkit.cpp +++ b/app/position/positionkit.cpp @@ -51,7 +51,7 @@ QString PositionKit::positionCrs3DGeoidModelName() } // for internal providers return EGM96 model - if ( mPositionProvider->type() == QStringLiteral( "internal" ) && !mPosition.isMock ) + 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..c66f5548e 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, From 902a8d9f57a842d31423809bd6ece8a0fa741592 Mon Sep 17 00:00:00 2001 From: Matej Bagar Date: Tue, 3 Mar 2026 16:50:29 +0100 Subject: [PATCH 2/4] Fix tests --- app/test/testposition.cpp | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/app/test/testposition.cpp b/app/test/testposition.cpp index 2a4a8213f..1e053de34 100644 --- a/app/test/testposition.cpp +++ b/app/test/testposition.cpp @@ -702,27 +702,12 @@ 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, 127.53574931171875 ); QCOMPARE( newPosition.elevation_diff, std::numeric_limits::quiet_NaN() ); QVERIFY( newPosition.isMock ); QVERIFY( !geoPosition.hasAttribute( QGeoPositionInfo::VerticalSpeed ) ); From 530834992dc1e7fd56b9d9c3e829163d9de1ba51 Mon Sep 17 00:00:00 2001 From: Matej Bagar Date: Tue, 3 Mar 2026 17:13:00 +0100 Subject: [PATCH 3/4] Fix tests again --- app/position/positiontransformer.cpp | 2 +- app/test/testposition.cpp | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/app/position/positiontransformer.cpp b/app/position/positiontransformer.cpp index c66f5548e..3d5dd559c 100644 --- a/app/position/positiontransformer.cpp +++ b/app/position/positiontransformer.cpp @@ -152,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 1e053de34..6c0bdba26 100644 --- a/app/test/testposition.cpp +++ b/app/test/testposition.cpp @@ -708,9 +708,8 @@ void TestPosition::testPositionTransformerInternalIosPosition() newPosition = positionTransformer.processInternalIosPosition( geoPosition ); QCOMPARE( newPosition.elevation, 127.53574931171875 ); - QCOMPARE( newPosition.elevation_diff, std::numeric_limits::quiet_NaN() ); + QCOMPARE( newPosition.elevation_diff, 43.764250688281265 ); QVERIFY( newPosition.isMock ); - QVERIFY( !geoPosition.hasAttribute( QGeoPositionInfo::VerticalSpeed ) ); QVERIFY( !geoPosition.hasAttribute( QGeoPositionInfo::MagneticVariation ) ); From 44e063ed56224c52bbbf882d027acb42b7732d29 Mon Sep 17 00:00:00 2001 From: Matej Bagar Date: Tue, 3 Mar 2026 17:52:18 +0100 Subject: [PATCH 4/4] Update commnent --- app/position/positionkit.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/position/positionkit.cpp b/app/position/positionkit.cpp index 99b9e3cb6..85c6677a5 100644 --- a/app/position/positionkit.cpp +++ b/app/position/positionkit.cpp @@ -50,7 +50,7 @@ QString PositionKit::positionCrs3DGeoidModelName() return mVerticalCrs.description(); } - // for internal providers return EGM96 model + // 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();