diff --git a/scripts/wordlist.txt b/scripts/wordlist.txt
index 0b551828..21c8556d 100644
--- a/scripts/wordlist.txt
+++ b/scripts/wordlist.txt
@@ -29,6 +29,7 @@ DOP
ECW
ECR
EE
+EGM
Emlid
EPSG
Esri
diff --git a/src/.vitepress/sidebar/en.js b/src/.vitepress/sidebar/en.js
index 8abb5fb3..884ae9f1 100644
--- a/src/.vitepress/sidebar/en.js
+++ b/src/.vitepress/sidebar/en.js
@@ -55,6 +55,7 @@ export default {
{ text: 'How to Set Up Snapping for Mergin Maps Mobile App', link: '/gis/snapping/' },
{ text: 'How to Avoid Polygons Overlap', link: '/gis/avoid-overlap/' },
{ text: 'Custom Projections', link: '/gis/proj/' },
+ { text: 'Elevations', link: '/gis/elevations/' },
{ text: 'Supported Formats', link: '/gis/supported_formats/' }
] },
{
diff --git a/src/field/external_gps/index.md b/src/field/external_gps/index.md
index 04ea10be..15e4019e 100644
--- a/src/field/external_gps/index.md
+++ b/src/field/external_gps/index.md
@@ -74,7 +74,7 @@ Mock location should be only used if you are unable to connect the external GPS
When setting up external GPS receiver on Android via mock location, we recommend using the *Internal (fused)* receiver option in [GPS Settings](../mobile-app-ui/#gps-settings) as this will show if mocked location is detected in the [GPS info](../mobile-app-ui/#current-position-and-gps-info) panel.
:::
-External GPS can be connected and configured in Android to provide mock location using GPS apps (e.g. [Bluetooth GPS](https://play.google.com/store/apps/details?id=de.pilablu.gpsconnector) or apps from specific GPS manufacturers) as a source of GPS signal. the and other apps in your device will get the GPS position from the external GPS.
+External GPS can be connected and configured in Android to provide mock location using GPS apps (e.g. [Bluetooth GPS](https://play.google.com/store/apps/details?id=de.pilablu.gpsconnector) or apps from specific GPS manufacturers) as a source of GPS signal. The and other apps in your device will get the GPS position from the external GPS.
:::tip
GPS manufacturer's apps often provide a setup for a NTRIP client, through which you are able to receive GPS corrections and achieve centimetre level accuracy.
@@ -111,24 +111,24 @@ External GPS functionality depends on the manufacturer and on the specific model
| | RTK Calibrated Surveyor Kit9 | yes | no |
| | RTK Handheld Surveyor Kit9 | yes | no |
| | RTK Portable Bluetooth Kit9 | yes | no |
-| Bad Elf | GPS Pro | yes | yes |
-| Bad Elf | GPS Pro+ | yes | yes |
-| Bad Elf | GNSS Surveyor | yes | yes |
-| Bad Elf | Flex Mini (standard or extreme) | yes | yes |
-| Bad Elf | Flex (standard or extreme) | yes | yes |
+| Bad Elf | GPS Pro | yes | yes (mock location) |
+| Bad Elf | GPS Pro+ | yes | yes (mock location) |
+| Bad Elf | GNSS Surveyor | yes | yes (mock location) |
+| Bad Elf | Flex Mini (standard or extreme) | yes | yes (mock location) |
+| Bad Elf | Flex (standard or extreme) | yes | yes (mock location) |
| Carlson | Carlson 1 | yes (mock location) | unknown |
| Carlson | Carlson 1| yes (mock location) | unknown |
-| Emlid | Emlid Reach RX2 | yes | yes |
+| Emlid | Emlid Reach RX2 | yes | yes (mock location) |
| Emlid | Emlid Reach RS+2 | yes | no |
| Emlid | Emlid Reach RS2/RS2+2 | yes | no |
| Emlid | Emlid Reach RS32 | yes | no |
-| Garmin | GLO 2 | yes | yes |
+| Garmin | GLO 2 | yes | yes (mock location) |
| Geomax | 8 | yes (mock location) | unknown |
| Geomax | 8 | yes (mock location) | unknown |
-| Juniper Systems | Geode GNS33 | yes | yes |
+| Juniper Systems | Geode GNS33 | yes | yes (mock location) |
| Leica | Leica FLX1004 | yes (mock location) | no |
-| Leica | Leica FLX100 plus4 | yes (mock location) | yes**|
-| Leica | Leica Zeno GG04plus4 | yes (mock location) | yes** |
+| Leica | Leica FLX100 plus4 | yes (mock location) | yes (mock location)**|
+| Leica | Leica Zeno GG04plus4 | yes (mock location) | yes (mock location)** |
| | UNI-GR1| yes | no |
| | UNI-GR2| yes | no |
| | 6 | yes (mock location)| no |
@@ -138,15 +138,15 @@ External GPS functionality depends on the manufacturer and on the specific model
| Trimble | Trimble R25 | yes (mock location) | unknown |
-- 1: **Carlson **, **Carlson ** - through [Carlson Layout](https://www.carlsonsw.com/product/carlson-layout) which will set a mock location in Android.
-- 2: **Emlid Reach RX**, **Emlid Reach RS+**, **Emlid Reach RS2/RS2+**, **Emlid Reach RS3** - directly via Bluetooth connection, has an internal NTRIP client to receive corrections. Possible to set a mock location and connect the receiver via Bluetooth using [GPS Connector](https://play.google.com/store/apps/details?id=de.pilablu.gpsconnector) or WiFi using [Lebefure NTRIP Client](https://play.google.com/store/apps/details?id=com.lefebure.ntripclient).
-- 3: **Geode GNS3** - through *Geode Connect* app on [Android](https://play.google.com/store/apps/details?id=com.juniper.geode2a&hl=en_NZ&gl=US) or [iOS](https://apps.apple.com/us/app/geode-connect/id1446098695), which also acts as an NTRIP client and sends corrections to the device.
-- 4: **Leica FLX100**, **Leica FLX100 plus**, **Leica Zeno GG04plus** - through *Leica Zeno Connect* app on [Android](https://play.google.com/store/apps/details?id=com.leica.zenoconnect&hl=en&gl=US) which also acts as a NTRIP client and sends the corrections to the device. The app will set a mock location in Android. It is also possible to connect directly via Bluetooth (even multiple phones can be connected at once), but if no phone has Zeno app running, there will be no corrections available.
- ** *Leica Zeno Connect* is also available on [iOS](https://apps.apple.com/us/app/zeno-connect/id1310344749). It is known to support **Leica FLX100 plus** and **Leica Zeno GG04plus**. However, on iOS, the vertical accuracy information is not transferred to through *Leica Zeno Connect*. The will not display the correct value of the vertical accuracy.
-- 5: **Trimble R1**, **Trimble R2**, **Trimble Catalyst** - through [*Trimble Mobile Manager* app](https://play.google.com/store/apps/details?id=com.trimble.trimblemobilemanager) which also acts as a NTRIP client and sends the corrections to the device. The app will set a mock location in Android.
-- 6: ** ** - through * Connector* app on [Android](https://play.google.com/store/apps/details?id=eu.apglos.attenbergerapp1&hl=en&gl=US).
-- 7: ** ** - the device uses a SIM Card that can be configured for NTRIP. It can be connected to the via Bluetooth (without using a mock location).
-- 8: **Geomax Zenith06, Zenith60** - through *Geomax X-PAD* app on Android, using a GNSS Mock licence from Geomax and the *Mock GNSS* option in the app.
-- 9: **** - through [*GNSS Master* app](https://play.google.com/store/apps/details?id=com.gnssmaster&hl=en&gl=US&pli=1) which also acts as a NTRIP client and sends the corrections to the device. Detailed steps can be found in the tutorial [How to connect kit to Mergin Maps for centimetre-accurate mapping](https://www.ardusimple.com/how-to-connect-ardusimple-kit-to-mergin-maps-for-centimeter-accuracte-mapping/).
+- 1: **Carlson **, **Carlson ** - through [Carlson Layout](https://www.carlsonsw.com/product/carlson-layout) which will set a mock location in Android.
+- 2: **Emlid Reach RX**, **Emlid Reach RS+**, **Emlid Reach RS2/RS2+**, **Emlid Reach RS3** - directly via Bluetooth connection, has an internal NTRIP client to receive corrections. Possible to set a mock location and connect the receiver via Bluetooth using [GPS Connector](https://play.google.com/store/apps/details?id=de.pilablu.gpsconnector) or WiFi using [Lebefure NTRIP Client](https://play.google.com/store/apps/details?id=com.lefebure.ntripclient).
+- 3: **Geode GNS3** - through *Geode Connect* app on [Android](https://play.google.com/store/apps/details?id=com.juniper.geode2a&hl=en_NZ&gl=US) or [iOS](https://apps.apple.com/us/app/geode-connect/id1446098695), which also acts as an NTRIP client and sends corrections to the device.
+- 4: **Leica FLX100**, **Leica FLX100 plus**, **Leica Zeno GG04plus** - through *Leica Zeno Connect* app on [Android](https://play.google.com/store/apps/details?id=com.leica.zenoconnect&hl=en&gl=US) which also acts as a NTRIP client and sends the corrections to the device. The app will set a mock location in Android. It is also possible to connect directly via Bluetooth (even multiple phones can be connected at once), but if no phone has Zeno app running, there will be no corrections available.
+ ** *Leica Zeno Connect* is also available on [iOS](https://apps.apple.com/us/app/zeno-connect/id1310344749). It is known to support **Leica FLX100 plus** and **Leica Zeno GG04plus**. However, on iOS, the vertical accuracy information is not transferred to through *Leica Zeno Connect*. The will not display the correct value of the vertical accuracy.
+- 5: **Trimble R1**, **Trimble R2**, **Trimble Catalyst** - through [*Trimble Mobile Manager* app](https://play.google.com/store/apps/details?id=com.trimble.trimblemobilemanager) which also acts as a NTRIP client and sends the corrections to the device. The app will set a mock location in Android.
+- 6: ** ** - through * Connector* app on [Android](https://play.google.com/store/apps/details?id=eu.apglos.attenbergerapp1&hl=en&gl=US).
+- 7: ** ** - the device uses a SIM Card that can be configured for NTRIP. It can be connected to the via Bluetooth (without using a mock location).
+- 8: **Geomax Zenith06, Zenith60** - through *Geomax X-PAD* app on Android, using a GNSS Mock licence from Geomax and the *Mock GNSS* option in the app.
+- 9: **** - through [*GNSS Master* app](https://play.google.com/store/apps/details?id=com.gnssmaster&hl=en&gl=US&pli=1) which also acts as a NTRIP client and sends the corrections to the device. Detailed steps can be found in the tutorial [How to connect kit to Mergin Maps for centimetre-accurate mapping](https://www.ardusimple.com/how-to-connect-ardusimple-kit-to-mergin-maps-for-centimeter-accuracte-mapping/).
**Did you use a GPS that is not in this list?**
diff --git a/src/field/mobile-app-ui/index.md b/src/field/mobile-app-ui/index.md
index 139bfeaa..3686ae2e 100644
--- a/src/field/mobile-app-ui/index.md
+++ b/src/field/mobile-app-ui/index.md
@@ -104,19 +104,16 @@ Tapping the GPS accuracy button opens the GPS info panel:
- **Source**
- *Internal* or *Internal (fused)* for the GPS of the mobile device
- the name of the receiver for [external GPS](../external_gps/) receiver connected via Bluetooth
+ - *External (Mock)* for [external GPS](../external_gps/) receiver if mock location is detected
- **Longitude, Latitude**: current position
- **X, Y**: current position in the project's coordinate reference system
- **Horizontal** and **Vertical accuracy** of the GPS position
-- **Altitude**: orthometric height
- - for *Internal* or *Internal (fused)* GPS, it is calculated from the ellipsoidal height using the geoid model by adding the geoid height (undulation)
- - for *[external GPS](../external_gps/)*, it is the orthometric height as reported by the external GPS
+- **Altitude**: orthometric height, see [Elevations](../../gis/elevations/) for more details
- **Satellites (in use/view)**: number of satellites
- **Speed**
- **Last fix**: time of the last received GPS position
- **GPS antenna height** that can be set in [GPS settings](#gps-settings)
-- **Geoid separation**: geoid height (undulation)
- - calculated from the geoid model for *Internal* or *Internal (fused)* GPS
- - as reported by the *[external GPS](../external_gps/)*
+- **Geoid separation**: geoid height (undulation), see [Elevations](../../gis/elevations/) for more details
### Sync
The **Sync** button can be used to synchronise changes during the field survey.
diff --git a/src/gis/elevations/index.md b/src/gis/elevations/index.md
new file mode 100644
index 00000000..2827a405
--- /dev/null
+++ b/src/gis/elevations/index.md
@@ -0,0 +1,100 @@
+---
+description: See how Mergin Maps handles elevations, vertical transformations and data reported by GPS providers.
+---
+
+# Elevations
+
+[[toc]]
+
+When collecting data in the field, provides information your position and also elevation. By default, GPS receivers provide an *ellipsoidal height* that is related to the reference ellipsoid. However, for most applications, a *physical height* (also known as height above the sea level) is more appropriate.
+
+An *orthometric* height is a physical height referred to a *geoid*, a special surface that is resembles the mean sea level. The difference between ellipsoidal and orthometric height is called the *geoid separation* (also known as geoid height or undulation) and it can be applied to transform these heights.
+
+When transforming elevations from ellipsoidal to orthometric, uses the EGM96 geoid model by default. However, it is also possible to use another geoid model as described in the [Using custom geoid](#using-custom-geoid) section. This may be especially useful when conducting more precise surveys or when a specific vertical reference system is required.
+
+:::warning Learn more
+Height systems and elevations are complex topics. If you want to get more insight, we recommend going through some explanatory resources, such as [Height Systems](https://geodesy.science/item/height-systems/) by the International Association of Geodesy.
+:::
+
+::: tip Terminology
+The terms *geoid*, *geoid separation* and *orthometric heights* are used in the and this documentation for simplicity.
+
+The same functionalities apply also if the used vertical reference system is defined by a *quasi-geoid*, another type of reference surface. Physical heights referred to a quasi-geoid are called *normal* heights.
+:::
+
+Information about the altitude and geoid separation (if available) are displayed in the [GPS info panel](../../field/mobile-app-ui/#current-position-and-gps-info).
+
+
+
+There are some differences in the functionality and available details depending on the GPS provider, the OS of the mobile device and the connection setup, namely the type of elevation provided, available [position variables](../../layer/variables/#position-variables) and whether it is possible to use [custom geoid](#using-custom-geoid).
+
+## Internal provider (no external device)
+
+### Android
+In Android, the [internal (fused)](../../field/mobile-app-ui/#gps-settings) GPS provider is used by default. It reports ellipsoidal heights that transforms to **orthometric heights using the EGM96 geoid model** by default and displays them in the [GPS info panel](../../field/mobile-app-ui/#current-position-and-gps-info).
+
+**Position variables**: :white_check_mark: ellipsoidal elevation, :white_check_mark: orthometric elevation, :white_check_mark: geoid separation values are available and can be stored using [position variables](../../layer/variables/#position-variables).
+
+**Custom geoid**: :white_check_mark: It is possible to use the to [set up a different geoid model](#using-custom-geoid) and transform the elevations to a different vertical reference system.
+
+### iOS
+In iOS, the GPS provider can provide orthometric and ellipsoidal heights.
+
+#### Ellipsoidal height not available
+If ellipsoidal height **is not** available, does not transform the elevations in any way. iOS reports *above the sea level* heights by default, so this information is displayed in the [GPS info panel](../../field/mobile-app-ui/#current-position-and-gps-info) in the .
+
+**Position variables**:
+- :white_check_mark: orthometric elevation is available,
+- :no_entry_sign: ellipsoidal elevation and :no_entry_sign: geoid separation values are **not** available and **can not** be stored using [position variables](../../layer/variables/#position-variables).
+
+**Custom geoid**: :no_entry_sign: It is not possible to use custom geoid model.
+
+#### Ellipsoidal height available
+If iOS provides also the ellipsoidal heights, transforms them to **orthometric elevations using the EGM96 geoid model** by default and displays them in the [GPS info panel](../../field/mobile-app-ui/#current-position-and-gps-info).
+
+**Position variables**: :white_check_mark: ellipsoidal elevation, :white_check_mark: orthometric elevation, :white_check_mark: geoid separation values are available and can be stored using [position variables](../../layer/variables/#position-variables).
+
+**Custom geoid**: :white_check_mark: It is possible to use the to [set up a different geoid model](#using-custom-geoid) and transform the elevations to a different vertical reference system.
+
+
+## External provider - Bluetooth
+
+On Android, external GPS can be connected [using Bluetooth](../../field/external_gps/#how-to-connect-external-gps-receiver-in-android-via-mergin-maps-mobile-app-recommended). If possible, we recommend to use this option.
+
+If there is no [user-defined transformation](#using-custom-geoid), the uses data reported by the GPS provider as-is, including the ellipsoidal height and geoid separation. does not receive information about the geoid model used; this information should be supplied by the GPS provider.
+
+**Position variables**: :white_check_mark: ellipsoidal elevation, :white_check_mark: orthometric elevation, :white_check_mark: geoid separation values are available and can be stored using [position variables](../../layer/variables/#position-variables).
+
+**Custom geoid**: :white_check_mark: It is possible to use the to [set up a different geoid model](#using-custom-geoid) and transform the elevations to a different vertical reference system. The defined geoid model is displayed in the .
+
+## External provider - Network
+External GPS can be connected using network connection on both iOS and Android. We recommend to use this option.
+
+The functionality is the same as described above in [External provider - Bluetooth ](#external-provider-bluetooth).
+
+## External provider - Mock location
+
+Mock location should be only used if you are unable to connect the external GPS directly in the . Because of system limitations, both Android and iOS send only a subset of available data.
+
+### Android
+If there is no [user-defined transformation](#using-custom-geoid), the uses data reported by the GPS provider as-is.
+
+**Position variables**:
+- :white_check_mark: orthometric elevation is available,
+- :no_entry_sign: ellipsoidal elevation and :no_entry_sign: geoid separation values are **not** available and **can not** be stored using [position variables](../../layer/variables/#position-variables).
+
+**Custom geoid**: :warning: It is possible to use the to [set up a different geoid model](#using-custom-geoid) and transform the elevations to a different vertical reference system. However, it is necessary to set up **the mock app to report ellipsoidal heights**, otherwise the geoid separation would be applied twice leading to incorrect elevation values.
+
+### iOS
+The uses data reported by the GPS provider as-is.
+
+**Position variables**: :warning: When using the mock location, iOS only sends a minimal subset of available GPS data, namely the coordinates X, Y, and elevation. It is not possible to obtain or display any other [position variables](../../layer/variables/#position-variables), including accuracy.
+
+**Custom geoid**: :no_entry_sign: It is not possible to use custom geoid model.
+
+## Using custom geoid
+
+The geoid model can be specified in [ Project Properties](../../manage/plugin/#mergin-maps-project-properties) in QGIS. The grid shift file then needs to be packages with the project.
+
+In the , the info about the custom geoid model is displayed in [GPS info panel](../../field/mobile-app-ui/#current-position-and-gps-info).
+
diff --git a/src/index.md b/src/index.md
index 0e487103..983a491c 100644
--- a/src/index.md
+++ b/src/index.md
@@ -66,6 +66,7 @@ The ecosystem consist of various components:
- [How to Set Up Snapping for ](./gis/snapping/)
- [How to Avoid Polygons Overlap](./gis/snapping/)
- [Custom Projections](./gis/proj/)
+- [Elevations](./gis/elevations/)
- [Supported Formats](./gis/supported_formats/)
## Configure Forms
diff --git a/src/layer/variables/index.md b/src/layer/variables/index.md
index 63cff238..c8c28a74 100644
--- a/src/layer/variables/index.md
+++ b/src/layer/variables/index.md
@@ -42,10 +42,10 @@ Extra position variables can be used as [default values in feature forms](../def
Following variables are supported:
- `@position_coordinate` - A point with the coordinates in WGS84.
- `@position_latitude` - Latitude
- - `@position_longitude` - Longitude
- - `@position_elevation` - Orthometric or normal height
- - `@position_elevation_ellipsoid` - Ellipsoidal height
- - `@position_geoid_separation` - Geoid or quasi-geoid height (undulation)
+ - `@position_longitude` - Longitude
+ - `@position_elevation` - Orthometric or normal height. *May not be available for some providers, see [Elevations](../../gis/elevations/) for more detail.*
+ - `@position_elevation_ellipsoid` - Ellipsoidal height. *May not be available for some providers, see [Elevations](../../gis/elevations/) for more detail.*
+ - `@position_geoid_separation` - Geoid or quasi-geoid height (undulation). *May not be available for some providers, see [Elevations](../../gis/elevations/) for more detail.*
- `@position_direction` - The bearing measured in degrees clockwise from true north to the direction of travel.
- `@position_ground_speed` - The ground speed, in meters/sec.
- `@position_vertical_speed` - The vertical speed, in meters/sec.
@@ -59,13 +59,14 @@ Following variables are supported:
- `@position_gps_antenna_height` - Antenna height as defined in [GPS settings](../../field/mobile-app-ui/#gps-settings)
- `@position_provider_type` - GPS device type.
- for internal GPS, returns "internal"
- - for external GPS, returns "external"
+ - for [external GPS](../../field/external_gps/), returns "external"
- `@position_provider_name` - GPS device name.
- for internal GPS, returns "Internal"
- - for external GPS, returns the name of the external device
+ - for [external GPS](../../field/external_gps/), returns the name of the external device
- `@position_provider_address` - GPS device address.
- for internal GPS, returns ""
- - for external GPS, returns the MAC address
+ - for [external GPS](../../field/external_gps/), returns the MAC address
+ - for [external GPS](../../field/external_gps/) if mock location is detected, returns "External (Mock)"
- `@position_hdop` - Horizontal dilution of precision (HDOP)
- `@position_vdop` - Vertical dilution of precision (VDOP)
- `@position_pdop` - Position (3D) dilution of precision (PDOP)