diff --git a/.gitignore b/.gitignore
index ccdfa7b9..694f192e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -20,6 +20,6 @@ git-output.txt
.vscode
*-snippet.txt
redirect_test.txt
-
+CLAUDE.md
src/.vitepress/cache
-src/.vitepress/dist
\ No newline at end of file
+src/.vitepress/dist
diff --git a/scripts/broken-link-exceptions.txt b/scripts/broken-link-exceptions.txt
index db7916a8..b7905464 100644
--- a/scripts/broken-link-exceptions.txt
+++ b/scripts/broken-link-exceptions.txt
@@ -1 +1 @@
---exclude=https://de.merginmaps.com/* --exclude=https://es.merginmaps.com/* --exclude=https://fr.merginmaps.com/* --exclude=https://it.merginmaps.com/* --exclude=https://pt.merginmaps.com/* --exclude=.*twitter.com/* --exclude=.*x.com/* --exclude=https://www.fauna-flora.org* --exclude=https://download.geofabrik.de* --exclude=https://www.linkedin.com/* --exclude=https://docs.github.com* --exclude=.*openstreetmap.org.* --exclude=.*sqlite.org.* --exclude=.*gnu.org.* --exclude=.*github.com/merginmaps/docs/edit/.* --exclude=.*libtiff.org.* --exclude=https://gis.stackexchange.com/* --exclude=https://www.stackexchange.com/* --exclude=https://www.stackoverflow.com/* --exclude=https://ocw.un-ihe.org/* --exclude=https://merginmaps.com/case-studies/* --exclude=https://merginmaps.com/support/* --exclude=https://merginmaps.com/glossary/* --exclude=https://merginmaps.com/community/join --exclude=https://merginmaps.com/blog/* --exclude=https://apps.apple.com/us/app/input/* --exclude=https://www.maplango.com* --exclude=https://apps.apple.com/* --exclude=https://www.mobilegis.at/* --exclude=https://fonts.googleapis.com* --exclude=https://fonts.gstatic.com* --exclude=https://gispro.com.au/* --exclude=http://www.mobilegis.at* --exclude=http://linkedin.com/* --exclude=https://www.verticalgeo.com/* --exclude=https://mappinggis.com/* --exclude=https://app.termly.io/* --exclude=https://www.apple.com/* --exclude=https://play.google.com/* --exclude=https://www.nginx.com/* --exclude=https://proj.org/* --exclude=https://www.burdgis.com* --exclude=https://www.docker.com* --exclude=https://www.googletagmanager.com* --exclude=https://assets-global.website-files.com --exclude=https://uploads-ssl.webflow.com --exclude=https://www.institut-agro-montpellier.fr/* --exclude=http://bad-elf.com* --exclude=https://bad-elf.com/* --exclude=https://merginmaps.com/hardware-partners --exclude=https://merginmaps.com/partners --exclude=https://merginmaps.com/use-case/* --exclude=https://www.otter.org/ --exclude=https://docs.sqlalchemy.org* --exclude=https://www.facebook.com/* --exclude=.*gdal.org/* --exclude=.*spatialised.net/* --exclude=https://cdn.prod.website-files.com/* --exclude=https://aws.amazon.com/* --exclude=https://support.apple.com/* --exclude=https://www.ordnancesurvey.co.uk/* --exclude=https://www.ardusimple.com/* --exclude=https://exiftool.org/* --exclude=https://pro.arcgis.com/* --exclude=https://www.esri.com/* --exclude=https://api.merginmaps.com/logs --exclude=https://en.wikipedia.org/wiki/* --exclude=https://www.reddit.com/* --exclude=https://github.com/MerginMaps/python-api-client/blob/634237890afd9f28f03953e5a01376b56f5abf5c/mergin/client.py#L572 --exclude=https://github.com/MerginMaps/python-api-client/blob/634237890afd9f28f03953e5a01376b56f5abf5c/mergin/client.py#L641 --exclude=https://merginmaps.com/ngo-form --exclude=https://merginmaps.com/academia-form --exclude=https://merginmaps.com/eudr-geolocation-data-collection
+--exclude=https://de.merginmaps.com/* --exclude=https://es.merginmaps.com/* --exclude=https://fr.merginmaps.com/* --exclude=https://it.merginmaps.com/* --exclude=https://pt.merginmaps.com/* --exclude=.*twitter.com/* --exclude=.*x.com/* --exclude=https://www.fauna-flora.org* --exclude=https://download.geofabrik.de* --exclude=https://www.linkedin.com/* --exclude=https://docs.github.com* --exclude=.*openstreetmap.org.* --exclude=.*sqlite.org.* --exclude=.*gnu.org.* --exclude=.*github.com/merginmaps/docs/edit/.* --exclude=.*libtiff.org.* --exclude=https://gis.stackexchange.com/* --exclude=https://www.stackexchange.com/* --exclude=https://www.stackoverflow.com/* --exclude=https://ocw.un-ihe.org/* --exclude=https://merginmaps.com/case-studies/* --exclude=https://merginmaps.com/support/* --exclude=https://merginmaps.com/glossary/* --exclude=https://merginmaps.com/community/join --exclude=https://merginmaps.com/blog/* --exclude=https://apps.apple.com/us/app/input/* --exclude=https://www.maplango.com* --exclude=https://apps.apple.com/* --exclude=https://www.mobilegis.at/* --exclude=https://fonts.googleapis.com* --exclude=https://fonts.gstatic.com* --exclude=https://gispro.com.au/* --exclude=http://www.mobilegis.at* --exclude=http://linkedin.com/* --exclude=https://www.verticalgeo.com/* --exclude=https://mappinggis.com/* --exclude=https://app.termly.io/* --exclude=https://www.apple.com/* --exclude=https://play.google.com/* --exclude=https://www.nginx.com/* --exclude=https://proj.org/* --exclude=https://www.burdgis.com* --exclude=https://www.docker.com* --exclude=https://www.googletagmanager.com* --exclude=https://assets-global.website-files.com --exclude=https://uploads-ssl.webflow.com --exclude=https://www.institut-agro-montpellier.fr/* --exclude=http://bad-elf.com* --exclude=https://bad-elf.com/* --exclude=https://merginmaps.com/hardware-partners --exclude=https://merginmaps.com/partners --exclude=https://merginmaps.com/use-case/* --exclude=https://www.otter.org/ --exclude=https://docs.sqlalchemy.org* --exclude=https://www.facebook.com/* --exclude=.*gdal.org/* --exclude=.*spatialised.net/* --exclude=https://cdn.prod.website-files.com/* --exclude=https://aws.amazon.com/* --exclude=https://support.apple.com/* --exclude=https://www.ordnancesurvey.co.uk/* --exclude=https://www.ardusimple.com/* --exclude=https://exiftool.org/* --exclude=https://pro.arcgis.com/* --exclude=https://www.esri.com/* --exclude=https://api.merginmaps.com/logs --exclude=https://en.wikipedia.org/wiki/* --exclude=https://www.reddit.com/* --exclude=https://github.com/MerginMaps/python-api-client/blob/634237890afd9f28f03953e5a01376b56f5abf5c/mergin/client.py#L572 --exclude=https://github.com/MerginMaps/python-api-client/blob/634237890afd9f28f03953e5a01376b56f5abf5c/mergin/client.py#L641 --exclude=https://merginmaps.com/ngo-form --exclude=https://merginmaps.com/academia-form --exclude=https://merginmaps.com/eudr-geolocation-data-collection --exclude=https://exiftool.sourceforge.net/TagNames/EXIF.html
diff --git a/scripts/markdown_style.bash b/scripts/markdown_style.bash
index 6d7370bd..0b37d941 100755
--- a/scripts/markdown_style.bash
+++ b/scripts/markdown_style.bash
@@ -23,7 +23,7 @@ for i in \
do
echo "Checking for $i"
# exclude HTML tags inside QGIS expressions in documentation
- A1=`grep --line-number -r -e "$i" $SCRIPT_DIR/../src/ --include \*.md | grep -v 'expression.evaluate'`
+ A1=`grep --line-number -r -e "$i" $SCRIPT_DIR/../src/ --include \*.md | grep -v 'expression.evaluate' | grep -v 'app.merginmaps.com/maps/'` | grep -v 'app.merginmaps.com/app/ogc'
if [ ! -z "$A1" ]
then
echo $A1
diff --git a/scripts/unreferenced_images.bash b/scripts/unreferenced_images.bash
index 45c8019b..5c563cf2 100755
--- a/scripts/unreferenced_images.bash
+++ b/scripts/unreferenced_images.bash
@@ -7,7 +7,7 @@ USED_XCF=0
NOT_USED_XCF=0
NOT_USED_PICS=0
-PICS=`find src/ | grep -e png -e jpg -e svg -e PNG -e JPG -e SVG -e jpeg -e JPEG`
+PICS=`find src/ | grep -e png -e jpg -e svg -e PNG -e JPG -e SVG -e jpeg -e JPEG -e webp -e WEBP`
stringarray=($PICS)
for i in "${stringarray[@]}"
@@ -49,4 +49,4 @@ echo "number of not used pictures: $NOT_USED_PICS"
echo "number of not used XCF: $NOT_USED_XCF"
echo "number of errors: $ERRORS"
-exit $ERRORS
\ No newline at end of file
+exit $ERRORS
diff --git a/scripts/wordlist.txt b/scripts/wordlist.txt
index 07207d54..5fdfd7c4 100644
--- a/scripts/wordlist.txt
+++ b/scripts/wordlist.txt
@@ -94,15 +94,22 @@ MVT
Mercedes
Mergin
Multiline
+MultiLine
+MultiPoint
+MultiPolygon
NDK
NMEA
NTRIP
+OGC
+OGR
+Ok
OneDrive
OSGB
OSM
OSTN
OGR
Ok
+OpenLayers
OpenMapTiles
OpenStreetMap
onboarding
@@ -207,6 +214,7 @@ hotline
html
http
https
+iframe
interoperable
integration
integrations
@@ -292,6 +300,8 @@ vCPUS
xcf
xyz
yml
+webmap
+WebMap
webmaps
WebMaps
webp
@@ -312,3 +322,8 @@ pre
env
IDP
enum
+OGC
+DOM
+CDN
+submodules
+JavaScript
diff --git a/src/.vitepress/sidebar/en.js b/src/.vitepress/sidebar/en.js
index 3706b815..828a142a 100644
--- a/src/.vitepress/sidebar/en.js
+++ b/src/.vitepress/sidebar/en.js
@@ -31,6 +31,13 @@ export default {
{ text: 'Member Roles and Permissions', link: '/manage/permissions/' },
{ text: 'Synchronisation', link: '/manage/synchronisation/' },
{ text: 'Mergin Maps Project', link: '/manage/project/' },
+ { text: 'Webmaps',
+ items: [
+ { text: 'Overview', link: '/manage/dashboard-maps/' },
+ { text: 'Sharing and Embedding', link: '/manage/webmaps-sharing/' },
+ { text: 'Custom Applications (with AI) 🧪', link: '/manage/webmaps-applications/' },
+ { text: 'Troubleshooting', link: '/manage/webmaps-troubleshooting/' }
+ ] },
{ text: 'How to Create a New Project', link: '/manage/create-project/' },
{ text: 'How to Share, Transfer or Delete Projects', link: '/manage/project-advanced/' },
{ text: 'How to Delete Files', link: '/manage/delete-files/' },
@@ -38,7 +45,6 @@ export default {
{ text: 'How to Recover Missing Data', link: '/manage/missing-data/' },
{ text: 'Mergin Maps QGIS Plugin Overview', link: '/manage/plugin/' },
{ text: 'Mergin Maps Dashboard', link: '/manage/dashboard/' },
- { text: 'Webmaps', link: '/manage/dashboard-maps/' },
{ text: 'Project History and Versions', link: '/manage/project-history/' },
{ text: 'Selective Synchronisation', link: '/manage/selective_sync/' }
] },
@@ -54,6 +60,7 @@ export default {
{ text: 'How to Enable Digitising', link: '/gis/enable_digitising/' },
{ 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: 'Publishing Projects via OGC API (WMS/WMTS, WFS)', link: '/gis/ogc-api/' },
{ text: 'Custom Projections', link: '/gis/proj/' },
{ text: 'Supported Formats', link: '/gis/supported_formats/' }
] },
@@ -62,8 +69,9 @@ export default {
collapsed: true,
items: [
{ text: 'Overview', link: '/layer/overview/' },
- { text: 'Widgets', link: '/layer/form-widgets/',
+ { text: 'Widgets',
items: [
+ { text: 'Available Widgets', link: '/layer/form-widgets/' },
{ text: 'Text', link: '/layer/text/' },
{ text: 'Date and Time', link: '/layer/date-time/' },
{ text: 'Relations', link: '/layer/relations/' },
@@ -74,33 +82,37 @@ export default {
{ text: 'Photos', link: '/layer/photos/' },
{ text: 'Informational Widgets', link: '/layer/info-widgets/' },
] },
- { text: 'Default Values', link: '/layer/default-values/',
+ { text: 'Default Values',
collapsed: true,
items: [
+ { text: 'Default Values Setup', link: '/layer/default-values/' },
{ text: 'Geotagging', link: '/layer/exif/' },
{ text: 'Variables', link: '/layer/variables/' }
] },
{ text: 'Constraints', link: '/layer/constraints/' },
- { text: 'Layout', link: '/layer/form-layout/',
+ { text: 'Layout',
collapsed: true,
items: [
+ { text: 'Form Layout', link: '/layer/form-layout/' },
{ text: 'Tabs and Groups', link: '/layer/tabs-and-groups/' },
{ text: 'Conditional Visibility', link: '/layer/conditional-visibility/' },
] },
- { text: 'Use Cases', link: '/layer/use-cases/',
+ { text: 'Use Cases',
collapsed: true,
items: [
- { text: 'How to Open a File', link: '/layer/open-file/' },
- { text: 'How to Use Hyperlinks', link: '/layer/external-link/' },
+ { text: 'Use Cases Overview', link: '/layer/use-cases/' },
+ { text: 'How to Open a File', link: '/layer/open-file/' },
+ { text: 'How to Use Hyperlinks', link: '/layer/external-link/' },
{ text: 'How to Open a Link to a Navigation App', link: '/layer/link-to-navigation/' },
{ text: 'How to Use a Phone Call Link', link: '/layer/phone-call-link/' },
{ text: 'How to Link Multiple Records to One Feature (1-N Relations)', link: '/layer/one-to-n-relations/' },
{ text: 'How to Embed an Image', link: '/layer/embed-image/' },
{ text: 'How to Use Image Guides in the Form', link: '/layer/image-guide/' },
+ { text: 'How to Display Photo Location and Direction', link: '/layer/photo-direction/' },
] },
] },
{
- text: 'Fieldwork Tips', // required
+ text: 'Fieldwork', // required
collapsed: true,
items: [
{ text: 'Mergin Maps Mobile App Interface', link: '/field/mobile-app-ui/' },
@@ -159,9 +171,10 @@ export default {
items: [
{ text: 'Licensing', link: '/misc/licensing/' },
{ text: 'Get Involved', link: '/misc/get-involved/' },
- { text: 'Troubleshoot', link: '/misc/troubleshoot/',
+ { text: 'Troubleshoot',
collapsed:true,
items: [
+ { text: 'Support and Troubleshooting', link: '/misc/troubleshoot/' },
{ text: 'Project fails to sync', link: '/misc/troubleshoot/not_syncing/' },
] },
{ text: 'Write Documentation', link: '/misc/write-docs/' }
diff --git a/src/field/external_gps/external-gps-ios.jpg b/src/field/external_gps/external-gps-ios.jpg
deleted file mode 100644
index b6314203..00000000
Binary files a/src/field/external_gps/external-gps-ios.jpg and /dev/null differ
diff --git a/src/field/external_gps/external-gps-ios.xcf b/src/field/external_gps/external-gps-ios.xcf
deleted file mode 100644
index 1080c7aa..00000000
Binary files a/src/field/external_gps/external-gps-ios.xcf and /dev/null differ
diff --git a/src/field/external_gps/index.md b/src/field/external_gps/index.md
index 04ea10be..c58af962 100644
--- a/src/field/external_gps/index.md
+++ b/src/field/external_gps/index.md
@@ -1,5 +1,7 @@
---
-description: External GPS receivers can be connected to your mobile device via Bluetooth and used in Mergin Maps mobile app to achieve higher GPS accuracy.
+description: External GPS receivers can be connected to your mobile device and used in the Mergin Maps mobile app to achieve higher GPS accuracy.
+
+outline: deep
---
# External GPS
@@ -8,14 +10,14 @@ description: External GPS receivers can be connected to your mobile device via B
[[toc]]
-External GPS receivers can be connected to your mobile device via Bluetooth and used in to achieve higher [GPS accuracy](../gps_accuracy/).
+Connect external GPS receivers to your mobile device to achieve higher [GPS accuracy](../gps_accuracy/) of your survey with .
-There are several [extra position variables](../../layer/variables/#position-variables) that can be useful to record when doing the survey with external GPS, such as the GPS antenna height, GPS device name as well as metrics like horizontal, vertical or position dilution of precision (HDOP, VDOP, PDOP).
+There are several [extra position variables](../../layer/variables/#position-variables) that can be useful to record during the survey with external GPS, such as the GPS antenna height, GPS device name as well as metrics like horizontal, vertical or position dilution of precision (HDOP, VDOP, PDOP).
Note that external GPS devices usually return orthometric heights (ellipsoid with the geoid separation applied). The altitude and geoid separation in the [GPS info panel](../mobile-app-ui/#current-position-and-gps-info) in the is displayed as reported by the external GPS.
**Before you start**:
-- Set up your device according to the instructions of its manufacturer. You should continue only when you are sure that the device is working and sending data.
+- Follow the manufacturer's setup instructions. You should continue only when you are sure that the device is working and sending data.
- Make sure that your mobile device offers the functionality to pair with an external GPS device and that it communicates through a standard interface.
:::tip GPS and GNSS terminology
@@ -36,47 +38,62 @@ If GPS antenna height is set to a non-zero value, it is also displayed next to t
GPS antenna height can be recorded during the survey by using the [extra position variable](../../layer/variables/#position-variables) `@position_gps_antenna_height` as a [default value](../../layer/default-values/).
:::
-## External GPS on Android
-In Android, there are two ways how to use an external GPS device in the :
-- directly through the app as an external receiver
-- connecting GPS receiver to your mobile device using an app that will provide mock location
+## Connecting external GPS
+External GPS can be connected to the via [Bluetooth](#bluetooth-connection-android-only) or a [Network provider](#network-provider-connection). We recommend using one of these options as they provide more data, such as HDOP and fix quality (see [position variables](../../layer/variables/#position-variables)). Also, the will report which device is used and take care of reconnecting in case of lost connection.
-It is strongly recommended to use the direct connection in the . It is easier, quicker, provides more data, such as HDOP and fix quality. The app will report which device is used and take care of reconnecting in case of lost connection. Using mock location should be used only when it is not possible to connect the GPS receiver directly via the .
+If it is not possible to use these options, you can also set up a [Mock location](#mock-location). However, some of the data reported by GPS may not be available.
-### How to connect external GPS receiver in Android via Mergin Maps mobile app (recommended)
-1. Connect the GPS receiver to your mobile device via Bluetooth
+External GPS receivers report some additional GPS data that are displayed in the **GPS info** panel.
+
+
-2. Open the and navigate to **Settings**
- 
+### Bluetooth connection (Android only)
+Connecting external GPS receivers via Bluetooth is available only on Android devices.
+
+1. Connect the GPS receiver to your mobile device via Bluetooth
-3. Tap on the **Manage GPS receivers** option. Here, you can see the currently used receiver.
+2. Open a project and navigate to the **Manage GPS receivers** option in [**Settings**](../mobile-app-ui/#settings)
- Tap on the **Connect new receiver** button.
+3. Here, you can see the currently used receiver. Tap on the **Connect new receiver** button.

-4. Choose your GPS receiver from the list of Bluetooth devices.
+4. Select the **Bluetooth** connection type.
You might be asked to pair your device during this process.
- 
+ 
-5. The will now use the external GPS receiver to display and record your position.
-
- In **GPS info**, you will see additional data as reported by the external GPS.
+The will now use the external GPS receiver to display and record your position. In **GPS info**, you will see additional data as reported by the external GPS.
+
+
+### Network provider connection
+Connecting external GPS receivers using a network provider is available on both Android and iOS.
+
+1. Open a project and navigate to the **Manage GPS receivers** option in [**Settings**](../mobile-app-ui/#settings)
+
+2. Here, you can see the currently used receiver. Tap on the **Connect new receiver** button.
+ 
+
+3. On Android, select the **Network ()** connection type. On iOS, this is the only direct connection type.
+
+ Fill in the network connection details (IP Address and Port). You can also use a receiver nickname.
- 
+ 
-### How to connect external GPS receiver in Android via mock location
+The will now use the external GPS receiver to display and record your position. In **GPS info**, you will see additional data as reported by the external GPS.
-:::warning Mock location and Internal (fused) GPS provider
-Mock location should be only used if you are unable to connect the external GPS directly in the .
+### Mock location
+It is strongly recommended to use the direct connection via [Bluetooth (Android)](#bluetooth-connection-android-only) or [network provider (Android, iOS)](#network-provider-connection) in the . Mock location should only be used if these options are not available.
+
+#### Android mock location setup
-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.
+:::warning Mock location and Internal (fused) GPS provider
+When using an 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
+:::tip NTRIP client and GPS corrections
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.
:::
@@ -88,13 +105,9 @@ To enable **Allow mock locations** in Android:
The mock location will be used by the automatically as if received from the internal receiver.
-## External GPS on iOS
-
-Direct connection via the is not possible on iOS devices.
-
-External GPS can be connected to your iOS device via Bluetooth. Depending on the GPS manufacturer, there may be a custom app, which then provides position to your iOS device. The sees this as an internal GPS receiver automatically, without additional configuration. will report if external GPS receiver is connected.
+#### iOS mock location setup
-
+External GPS can be connected to your iOS device via Bluetooth. Depending on the GPS manufacturer, there may be a custom app, which then provides position to your iOS device. The sees this as an internal GPS receiver automatically, without additional configuration. The will report if an external GPS receiver is connected.
## External GPS troubleshooting
If you encounter issues with external GPS in the , make sure that:
@@ -111,24 +124,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 |
-| Carlson | Carlson 1 | yes (mock location) | unknown |
-| Carlson | Carlson 1| yes (mock location) | unknown |
-| Emlid | Emlid Reach RX2 | yes | yes |
-| 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 |
+| 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 | 1 | yes (mock location) | unknown |
+| Carlson | 1| yes (mock location) | unknown |
+| Emlid | Reach RX models2 | yes | yes (mock location) |
+| Emlid | Reach RS models3 | yes | yes |
+| EOS | Skadi models11 | yes | yes |
+| EOS | Arrow models11 | 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 GNS310 | 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 +151,17 @@ 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** - directly via Bluetooth connection on Android, mock connection on iOS. [Emlid Flow](https://emlid.com/emlid-flow/) app can set up NTRIP connection to receive corrections.
+- 3: **Emlid Reach RS - series** - directly via Bluetooth or network connection, has an internal NTRIP client to receive corrections set up via [Emlid Flow](https://emlid.com/emlid-flow/).
+- 4: **Leica FLX100**, **Leica FLX100 plus**, **Leica Zeno GG04plus** - through the *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 the 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/).
+- 10: **Geode GNS3** - through the *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.
+- 11: **EOS receivers** - direct connection via network to [EOS Tools Pro](https://eos-gnss.com/products/software/eos-tools-pro) app that configures the receivers and sets up NTRIP corrections. Refer to EOS documentation to see how to set up TCP (network) connection.
**Did you use a GPS that is not in this list?**
diff --git a/src/field/external_gps/mobile-app-connecting-external-gps.jpg b/src/field/external_gps/mobile-app-connecting-external-gps.jpg
deleted file mode 100644
index d17f2110..00000000
Binary files a/src/field/external_gps/mobile-app-connecting-external-gps.jpg and /dev/null differ
diff --git a/src/field/external_gps/mobile-app-connecting-external-gps.webp b/src/field/external_gps/mobile-app-connecting-external-gps.webp
new file mode 100644
index 00000000..b9303c01
Binary files /dev/null and b/src/field/external_gps/mobile-app-connecting-external-gps.webp differ
diff --git a/src/field/external_gps/mobile-app-connecting-external-gps.xcf b/src/field/external_gps/mobile-app-connecting-external-gps.xcf
index 947b9036..c0d87457 100644
Binary files a/src/field/external_gps/mobile-app-connecting-external-gps.xcf and b/src/field/external_gps/mobile-app-connecting-external-gps.xcf differ
diff --git a/src/field/external_gps/mobile-network-provider-connection.webp b/src/field/external_gps/mobile-network-provider-connection.webp
new file mode 100644
index 00000000..b990d9f9
Binary files /dev/null and b/src/field/external_gps/mobile-network-provider-connection.webp differ
diff --git a/src/field/external_gps/mobile-network-provider-connection.xcf b/src/field/external_gps/mobile-network-provider-connection.xcf
new file mode 100644
index 00000000..8115f1f6
Binary files /dev/null and b/src/field/external_gps/mobile-network-provider-connection.xcf differ
diff --git a/src/field/filtering/index.md b/src/field/filtering/index.md
index 5707ddc4..a99f8322 100644
--- a/src/field/filtering/index.md
+++ b/src/field/filtering/index.md
@@ -1,13 +1,20 @@
---
description: Add custom filters to sort and display only those features that you need during your field survey.
+outline: deep
---
# Filtering Features in Mergin Maps Mobile App
[[toc]]
-Custom filters can be added to the to easily filter features displayed on the map as well as in the [survey layers](../layers/#browsing-features).
+Custom filters can be added to the to easily filter features displayed on the map and in the [survey layers](../layers/#browsing-features).
-::: tip Feature filtering blog
+
+
+::: tip Example project available
+You can explore filtering by cloning our public project
+:::
+
+::: warning Feature filtering blog
You can read about this feature also on our blog .
:::
@@ -18,10 +25,10 @@ Filters can be enabled and defined in QGIS in **Project Properties** for GeoPack
If you do not see the **Filtering** option in the **Project properties**, check for [plugin upgrades](../../setup/install-mergin-maps-plugin-for-qgis/#plugin-upgrade).
:::
-Check the :heavy_check_mark: **Enable filtering** option in the tab, click on the **Add filter** button and select a filter type from the list. The list of available [filter types](#filter-types) and their properties can be found below.
+Check the :heavy_check_mark: **Enable filtering** option in the tab, click on the **Add filter** button and select a filter type from the list.
Then, define the filter:
- - **Type** - the filter type (in general, it should match the widget type of the filtered field)
+ - **Type** - choose the filter type (see [Filter types](#filter-types) for more details).
- **Layer** - choose from the project's GeoPackage layers
- **Field** - choose from the fields of the layer. Only fields with data types compatible with the selected filter type are offered.
- **Title** - the name of the filter, which will be displayed in the
@@ -35,27 +42,10 @@ The order of filters can be changed by selecting a filter and using the **Up** a
Don't forget to save your project and synchronise changes so that you can use the filters in the .
-
-### Filter types
-
-**Text** filter uses simple text input. Results are filtered based on the SQL expression `"field" ILIKE '%input%'`. Available for text and number field types.
-
-**Number** filter provides *from* and *to* number inputs. Results are filtered based on SQL expression `"field" >= 'input_from' AND "field" <= 'input_to'`. Available for text and number field types.
-
-**Date** filter provides *from* and *to* date (calendar) inputs. Results are filtered based on SQL expression `"field" >= 'input_from' AND "field" <= 'input_to'`. Available for date field types configured with the [Date and time widget](../../layer/date-time/).
-
-**Boolean** filter provides a toggle between *all*, *true* and *false* values. Results are filtered based on SQL expression `"field" == 'input'`. Available for Boolean, text and integer field types configured with the [Checkbox widget](../../layer/checkbox/).
-
-**Single select** filter provides a drop-down menu of field values. One value can be selected at once. The results are filtered based on SQL expression `"field" == 'input'`. Available for all field types. Note that Value relations with *multiple selections* are currently **not** supported.
-
-**Multi select** filter provides a drop-down menu of field values. Multiple values can be selected at once. The results are filtered based on SQL expression `"field" IN ('input')`. Available for all field types. Note that Value relations with *multiple selections* are currently **not** supported.
-
-In the , the filters look like this:
-
-
-
## Filtering features in the mobile app
-Filters defined in [ project in QGIS](#enable-and-define-filtering-in-qgis) can be used in the . You can filter features across multiple layers by entering or selecting values in corresponding filters. The filtering affects both the map display and the feature browsing list.
+Filters defined in [ project in QGIS](#enable-and-define-filtering-in-qgis) can be used in the .
+
+You can filter features across multiple layers as well as use multiple filters on one layer. The filtering affects both the map display and the feature browsing list.
Filters do not stay saved when the app is restarted.
@@ -64,6 +54,7 @@ Here is an example of how filtering works:
1. Tap the **More** button to open **Filters** defined in the project
Filtering has to be enabled in the [QGIS project](#enable-and-define-filtering-in-qgis), otherwise this option is not displayed.
+

2. Enter or select values in the filters. You can use more filters at once.
@@ -77,3 +68,69 @@ Here is an example of how filtering works:
You can use the active **Filters** button to quickly access filters.

+
+## Filter types
+Here is an overview of available filter types.
+
+In QGIS, you choose from the following filter types: [Text](#text), [Number](#number), [Date](#date), [Checkbox](#checkbox), [Single select](#single-select), [Multi select](#multi-select).
+
+
+
+In the , the respective filters look like this:
+
+
+### Text
+
+The text filter can be used to find all features where the selected field contains the entered text.
+
+Type in a word, a part of the word or a number into the filter and **Apply filters** to see the results.
+
+Available for text and number field types.
+
+
+
+This filter uses the same logic as the SQL expression `"field" ILIKE '%input%'`.
+
+### Number
+The number filter provides *from* and *to* number inputs.
+
+Available for text and number field types.
+
+
+
+This filter uses the same logic as the SQL expression `"field" >= 'input_from' AND "field" <= 'input_to'`.
+
+### Date
+The date filter provides *from* and *to* date calendar inputs.
+
+Available for date field types configured with the [Date and time widget](../../layer/date-time/).
+
+
+
+This filter uses the same logic as the SQL expression `"field" >= 'input_from' AND "field" <= 'input_to'`.
+
+### Checkbox
+The checkbox filter provides a toggle between *all*, *true* and *false* values. Available for Boolean, text and integer field types configured with the [Checkbox widget](../../layer/checkbox/).
+
+
+
+This filter uses the same logic as the SQL expression `"field" == 'input'`.
+
+### Single select
+The single select filter provides a drop-down menu of field values. One value can be selected at once.
+
+Available for all field types. For text, number, date and Boolean field types generates a list of used values.
+
+
+
+This filter uses the same logic as the SQL expression `"field" == 'input'`.
+
+### Multi select
+The multi select filter provides a drop-down menu of field values. Multiple values can be selected at once.
+
+Available for all field types. For text, number, date and Boolean field types generates a list of used values.
+
+
+
+This filter uses the same logic as the SQL expression `"field" IN ('input')`.
+
diff --git a/src/field/filtering/mobile-filter-checkbox.webp b/src/field/filtering/mobile-filter-checkbox.webp
new file mode 100644
index 00000000..d5f7b4dc
Binary files /dev/null and b/src/field/filtering/mobile-filter-checkbox.webp differ
diff --git a/src/field/filtering/mobile-filter-checkbox.xcf b/src/field/filtering/mobile-filter-checkbox.xcf
new file mode 100644
index 00000000..37b7fc11
Binary files /dev/null and b/src/field/filtering/mobile-filter-checkbox.xcf differ
diff --git a/src/field/filtering/mobile-filter-date.webp b/src/field/filtering/mobile-filter-date.webp
new file mode 100644
index 00000000..ad198545
Binary files /dev/null and b/src/field/filtering/mobile-filter-date.webp differ
diff --git a/src/field/filtering/mobile-filter-date.xcf b/src/field/filtering/mobile-filter-date.xcf
new file mode 100644
index 00000000..53cf7baa
Binary files /dev/null and b/src/field/filtering/mobile-filter-date.xcf differ
diff --git a/src/field/filtering/mobile-filter-multi-select.webp b/src/field/filtering/mobile-filter-multi-select.webp
new file mode 100644
index 00000000..dd7dde95
Binary files /dev/null and b/src/field/filtering/mobile-filter-multi-select.webp differ
diff --git a/src/field/filtering/mobile-filter-multi-select.xcf b/src/field/filtering/mobile-filter-multi-select.xcf
new file mode 100644
index 00000000..eccf652e
Binary files /dev/null and b/src/field/filtering/mobile-filter-multi-select.xcf differ
diff --git a/src/field/filtering/mobile-filter-number.webp b/src/field/filtering/mobile-filter-number.webp
new file mode 100644
index 00000000..b745b2ca
Binary files /dev/null and b/src/field/filtering/mobile-filter-number.webp differ
diff --git a/src/field/filtering/mobile-filter-number.xcf b/src/field/filtering/mobile-filter-number.xcf
new file mode 100644
index 00000000..b7ce3577
Binary files /dev/null and b/src/field/filtering/mobile-filter-number.xcf differ
diff --git a/src/field/filtering/mobile-filter-single-select.webp b/src/field/filtering/mobile-filter-single-select.webp
new file mode 100644
index 00000000..b173e0d6
Binary files /dev/null and b/src/field/filtering/mobile-filter-single-select.webp differ
diff --git a/src/field/filtering/mobile-filter-single-select.xcf b/src/field/filtering/mobile-filter-single-select.xcf
new file mode 100644
index 00000000..9f9722ad
Binary files /dev/null and b/src/field/filtering/mobile-filter-single-select.xcf differ
diff --git a/src/field/filtering/mobile-filter-text.webp b/src/field/filtering/mobile-filter-text.webp
new file mode 100644
index 00000000..45f196f4
Binary files /dev/null and b/src/field/filtering/mobile-filter-text.webp differ
diff --git a/src/field/filtering/mobile-filter-text.xcf b/src/field/filtering/mobile-filter-text.xcf
new file mode 100644
index 00000000..eecf2b61
Binary files /dev/null and b/src/field/filtering/mobile-filter-text.xcf differ
diff --git a/src/field/filtering/mobile-filter-types.webp b/src/field/filtering/mobile-filter-types.webp
deleted file mode 100644
index 526b73a5..00000000
Binary files a/src/field/filtering/mobile-filter-types.webp and /dev/null differ
diff --git a/src/field/filtering/mobile-filter-types.xcf b/src/field/filtering/mobile-filter-types.xcf
deleted file mode 100644
index 90358f22..00000000
Binary files a/src/field/filtering/mobile-filter-types.xcf and /dev/null differ
diff --git a/src/field/filtering/mobile-filtered-features.webp b/src/field/filtering/mobile-filtered-features.webp
index 73b7b2b7..942e3fa7 100644
Binary files a/src/field/filtering/mobile-filtered-features.webp and b/src/field/filtering/mobile-filtered-features.webp differ
diff --git a/src/field/filtering/mobile-filtered-features.xcf b/src/field/filtering/mobile-filtered-features.xcf
index 7975955a..9978b212 100644
Binary files a/src/field/filtering/mobile-filtered-features.xcf and b/src/field/filtering/mobile-filtered-features.xcf differ
diff --git a/src/field/filtering/mobile-filtering.gif b/src/field/filtering/mobile-filtering.gif
index f0401448..b26af4b4 100644
Binary files a/src/field/filtering/mobile-filtering.gif and b/src/field/filtering/mobile-filtering.gif differ
diff --git a/src/field/filtering/mobile-filters.webp b/src/field/filtering/mobile-filters.webp
new file mode 100644
index 00000000..3a4bf220
Binary files /dev/null and b/src/field/filtering/mobile-filters.webp differ
diff --git a/src/field/filtering/mobile-filters.xcf b/src/field/filtering/mobile-filters.xcf
new file mode 100644
index 00000000..b9f3058b
Binary files /dev/null and b/src/field/filtering/mobile-filters.xcf differ
diff --git a/src/field/filtering/mobile-open-filters.webp b/src/field/filtering/mobile-open-filters.webp
index 5bda0bc2..13d83323 100644
Binary files a/src/field/filtering/mobile-open-filters.webp and b/src/field/filtering/mobile-open-filters.webp differ
diff --git a/src/field/filtering/mobile-open-filters.xcf b/src/field/filtering/mobile-open-filters.xcf
index fb8b6be9..1ac1e9d4 100644
Binary files a/src/field/filtering/mobile-open-filters.xcf and b/src/field/filtering/mobile-open-filters.xcf differ
diff --git a/src/field/filtering/qgis-filter-types.webp b/src/field/filtering/qgis-filter-types.webp
new file mode 100644
index 00000000..b6a27aa7
Binary files /dev/null and b/src/field/filtering/qgis-filter-types.webp differ
diff --git a/src/field/filtering/qgis-filter-types.xcf b/src/field/filtering/qgis-filter-types.xcf
new file mode 100644
index 00000000..35790422
Binary files /dev/null and b/src/field/filtering/qgis-filter-types.xcf differ
diff --git a/src/field/mobile-app-ui/index.md b/src/field/mobile-app-ui/index.md
index 8e8f991e..131d8cb0 100644
--- a/src/field/mobile-app-ui/index.md
+++ b/src/field/mobile-app-ui/index.md
@@ -175,7 +175,7 @@ To open the **Settings**, tap the **More** button. In Settings, you can find [GP

### Streaming mode settings
-[**Streaming mode**](../mobile-features/#streaming-mode-to-survey-lines-or-areas) can be used when surveying lines or polygons to capture vertices based on the GPS location.
+[**Streaming mode**](../mobile-features/#streaming-mode) can be used when surveying lines or polygons to capture vertices based on the GPS location.
- **Interval threshold type**: the type of interval in streaming mode, can be set to *Time elapsed* or *Distance travelled* .
- **Threshold interval** the interval of recording vertices
diff --git a/src/field/mobile-features/index.md b/src/field/mobile-features/index.md
index b286f1d5..8c70b3b7 100644
--- a/src/field/mobile-features/index.md
+++ b/src/field/mobile-features/index.md
@@ -1,5 +1,6 @@
---
description: With Mergin Maps mobile app, you can capture and edit points, lines, polygons and non-spatial features in the field using comprehensive editing tools.
+outline: deep
---
# How to Add, Edit, Delete Features
@@ -30,7 +31,7 @@ The crosshairs you will see on your map are used as the recorded location. You c
The *active layer* is displayed on the top of the map window. This layer is used for surveying new features. To switch to a different (editable) layer, tap on the active layer and select another one from the list.

-In the recording mode, the bottom panel contains tools to capture geometry. Once the geometry is recorded, you can fill in the attributes form and save the feature.
+In the recording mode, the bottom panel contains tools to capture geometry depending on the geometry type of the active layer. Once the geometry is recorded, you can fill in the attributes form and save the feature.
Below, we describe capturing [point features](#capture-points), [lines and areas](#capture-lines-or-areas) as well as [non-spatial](#add-or-edit-non-spatial-features) records (e.g. adding a new entry to a table).
@@ -39,35 +40,41 @@ Attributes forms can be set up in QGIS to make collecting data more efficient. F
:::
### Capture points
-To record a new point feature, tap the **Record** button (you have to be in the [recording mode](#adding-features)).
+To record a new point, tap the **Record** button (you have to be in the [recording mode](#adding-features)).
-Fill in the form as needed and tap the **Save** :heavy_check_mark: button. A point is added to the survey layer and is displayed on the map.
+Fill in values in the form and tap the **Save** :heavy_check_mark: button. A point is added to the survey layer and is displayed on the map.

-### Capture lines or areas
-There are two methods of capturing lines and areas: [adding vertices](#adding-points-to-survey-vertices-of-lines-or-areas) one by one or using the [*streaming mode*](#streaming-mode-to-survey-lines-or-areas) to capture features based on your position.
+If you are using a layer with the MultiPoint geometry type, you have the option to **Add** parts as well as **Remove** and **Undo** button to modify them while recording the feature. MultiPoint feature can also be recorded by using the [*streaming mode*](#streaming-mode).
+
+
-#### Adding points to survey vertices of lines or areas
-Lines and areas can be captured by adding vertices one by one. When you are in the [**recording**](#adding-features) mode and your active layer is a line or polygon, you will see line and areas editing tools in the bottom panel.
+### Capture lines or areas
+Lines and polygons can be captured by adding vertices one by one or by using the [*streaming mode*](#streaming-mode).
-Tap **Add** to capture vertices of your line or area. If you want to change the position of the last vertex, tap **Remove** and move the vertex to the correct place. **Undo** can be used to revert last changes.
+In the [**recording**](#adding-features) mode tap **Add** to capture vertices of your line or area. If you want to change the position of the last vertex, tap **Remove** and move the vertex to the correct place. **Undo** can be used to revert last changes.
Once the survey of the feature is completed, tap **Record** and fill in the form.

-#### Streaming mode to survey lines or areas
-Lines and areas can be also captured automatically based on your position.
+When using layers with multipart geometry types, parts of features can be added by tapping the **More options** button and selecting the **Add part** option.
+
+
+
+### Streaming mode
+Features can also be captured automatically based on your position. Streaming is not available for layers with *Point* geometry.
Here is a video tutorial:
-Make sure you are in the [**recording**](#adding-features) mode and that your active layer is a line or polygon.
-
-Tap the **streaming** button and then **Start streaming mode**.
+Tap the **streaming** button while in the [**recording**](#adding-features) mode and **Start streaming mode**.

+For layers with multipart geometry, the **streaming** option can be found in **More options**:
+
+
The vertices will be added automatically as you walk along the feature.
To stop the streaming mode, tap the **streaming** button and then **Stop streaming mode**.
@@ -81,35 +88,47 @@ It is possible to set the **Threshold interval**, i.e. how often you want to cap
:::
## Editing features
-Features can be browsed, edited and deleted through the [Layers](../layers/) panel in the . Note that layers that are set as [read-only](../../gis/enable_digitising/) in the project properties cannot be edited.
+Tap a feature on the map or *tap and hold* to select one from multiple overlaying features to display the form.
+
+Use the **Edit** button to open the attributes form for editing. To edit the geometry of a feature, tap the **Edit geometry** button.
-Tap the **Layers** button in the bottom navigation panel and select a layer to see the list of features it contains.
+Once you are finished with your changes, use the **Save** :heavy_check_mark: button.
+
+
+
+Features can also be browsed, edited and deleted through the [Layers](../layers/) panel. Layers that are set as [read-only](../../gis/enable_digitising/) in the project properties cannot be edited.
+- Tap the **Layers** button in the bottom navigation panel and select a layer to see the list of features it contains.
+- Select a feature from the list in the **Layers** panel to display its form and edit the values or geometry.

-To edit the attributes or geometry of a feature, select it from the list in the **Layers** panel. It is also possible to simply tap a feature on the map or *tap and hold* to select one from multiple overlaying features.
+### Editing geometry
+There are multiple options of editing the geometry of features depending on the geometry type of the survey layer: editing the vertices, [redrawing](#redraw-geometry) or [splitting](#split-geometry-of-lines-or-areas) features.
-Use the **Edit** button to open the attributes form. Here you can change the values of attributes as needed. To edit the geometry of a feature, tap the **Edit geometry** button.
+To edit geometry of a point feature simply adjust the location in the same manner as when [adding new features](#capture-points).
-
+Layers with MultiPoint, Line, MultiLine, Polygon and MultiPolygon geometries offer more options. Tap a feature, press the **Edit** button and then use **Edit geometry**. The vertices of the feature will be highlighted. You can move, **Release** or **Remove** them as needed. Tap the **Record** button to save the modified geometry.
-To edit geometry of a point feature simply adjust the location in the same manner as when [adding new features](#capture-points).
+
-Once you are finished with your changes, tap the **Save** :heavy_check_mark: button.
+### Adding part of multipart geometry
+Parts can be added to features from survey layers with multipart geometry type (MultiPoint, MultiLine, MultiPolygon) while editing geometry.
-### Edit geometry of lines or areas
-There are multiple options when it comes to editing the geometry of lines and polygons: editing the vertices, [redrawing](#redraw-geometry-of-lines-or-areas) or [splitting](#split-geometry-of-lines-or-areas) features.
+Tap the **More option** button while editing geometry and use the **Add part** option.
-Tap a line or polygon feature, press the **Edit** button and then use **Edit geometry**. The vertices of the feature will be highlighted. You can move, release or remove them as needed. Tap the **Record** button to save the modified geometry.
+
-
+Capture the part by using the editing tools and **Record** your changes. The part is added to the geometry of the feature.
+
+
-The [streaming mode](#streaming-mode-to-survey-lines-or-areas) can be also used while editing lines or areas. Tap the **More option** button and use the **Streaming mode**.
+### Using streaming mode to edit geometry
+The [streaming mode](#streaming-mode) can be also used while editing features with compatible geometry type. Tap the **More option** button and use the **Streaming mode**.

-### Redraw geometry of lines or areas
-The existing geometry of lines and areas can also be redrawn completely.
+### Redraw geometry
+The existing geometry of MultiPoint, Line, MultiLine, Polygon and MultiPolygon geometry can also be redrawn.
Tap the **More option** button and select the **Redraw geometry** option.
diff --git a/src/field/mobile-features/mobile-add-part.webp b/src/field/mobile-features/mobile-add-part.webp
new file mode 100644
index 00000000..447cc576
Binary files /dev/null and b/src/field/mobile-features/mobile-add-part.webp differ
diff --git a/src/field/mobile-features/mobile-add-part.xcf b/src/field/mobile-features/mobile-add-part.xcf
new file mode 100644
index 00000000..46182211
Binary files /dev/null and b/src/field/mobile-features/mobile-add-part.xcf differ
diff --git a/src/field/mobile-features/mobile-added-part.webp b/src/field/mobile-features/mobile-added-part.webp
new file mode 100644
index 00000000..883ecfe3
Binary files /dev/null and b/src/field/mobile-features/mobile-added-part.webp differ
diff --git a/src/field/mobile-features/mobile-added-part.xcf b/src/field/mobile-features/mobile-added-part.xcf
new file mode 100644
index 00000000..e87bd8c8
Binary files /dev/null and b/src/field/mobile-features/mobile-added-part.xcf differ
diff --git a/src/field/mobile-features/mobile-capture-line.jpg b/src/field/mobile-features/mobile-capture-line.jpg
index 49217edc..287ca0cd 100644
Binary files a/src/field/mobile-features/mobile-capture-line.jpg and b/src/field/mobile-features/mobile-capture-line.jpg differ
diff --git a/src/field/mobile-features/mobile-capture-line.xcf b/src/field/mobile-features/mobile-capture-line.xcf
index f9aaf92d..5a60679a 100644
Binary files a/src/field/mobile-features/mobile-capture-line.xcf and b/src/field/mobile-features/mobile-capture-line.xcf differ
diff --git a/src/field/mobile-features/mobile-capture-multipoint.webp b/src/field/mobile-features/mobile-capture-multipoint.webp
new file mode 100644
index 00000000..98132ca9
Binary files /dev/null and b/src/field/mobile-features/mobile-capture-multipoint.webp differ
diff --git a/src/field/mobile-features/mobile-capture-multipoint.xcf b/src/field/mobile-features/mobile-capture-multipoint.xcf
new file mode 100644
index 00000000..4f515d4d
Binary files /dev/null and b/src/field/mobile-features/mobile-capture-multipoint.xcf differ
diff --git a/src/field/mobile-features/mobile-capture-polyline.webp b/src/field/mobile-features/mobile-capture-polyline.webp
new file mode 100644
index 00000000..203bf5da
Binary files /dev/null and b/src/field/mobile-features/mobile-capture-polyline.webp differ
diff --git a/src/field/mobile-features/mobile-capture-polyline.xcf b/src/field/mobile-features/mobile-capture-polyline.xcf
new file mode 100644
index 00000000..f9c8c620
Binary files /dev/null and b/src/field/mobile-features/mobile-capture-polyline.xcf differ
diff --git a/src/field/mobile-features/mobile-edit-streaming.jpg b/src/field/mobile-features/mobile-edit-streaming.jpg
index e15bf4c3..2c0cd635 100644
Binary files a/src/field/mobile-features/mobile-edit-streaming.jpg and b/src/field/mobile-features/mobile-edit-streaming.jpg differ
diff --git a/src/field/mobile-features/mobile-edit-streaming.xcf b/src/field/mobile-features/mobile-edit-streaming.xcf
index bc1183f7..ef47fa45 100644
Binary files a/src/field/mobile-features/mobile-edit-streaming.xcf and b/src/field/mobile-features/mobile-edit-streaming.xcf differ
diff --git a/src/field/mobile-features/mobile-redraw-features.jpg b/src/field/mobile-features/mobile-redraw-features.jpg
index 44e2642d..89551189 100644
Binary files a/src/field/mobile-features/mobile-redraw-features.jpg and b/src/field/mobile-features/mobile-redraw-features.jpg differ
diff --git a/src/field/mobile-features/mobile-redraw-features.xcf b/src/field/mobile-features/mobile-redraw-features.xcf
index 6659fa5a..4a255b9a 100644
Binary files a/src/field/mobile-features/mobile-redraw-features.xcf and b/src/field/mobile-features/mobile-redraw-features.xcf differ
diff --git a/src/field/mobile-features/mobile-split-features.jpg b/src/field/mobile-features/mobile-split-features.jpg
index c78aa809..c6b42683 100644
Binary files a/src/field/mobile-features/mobile-split-features.jpg and b/src/field/mobile-features/mobile-split-features.jpg differ
diff --git a/src/field/mobile-features/mobile-split-features.xcf b/src/field/mobile-features/mobile-split-features.xcf
index ce3983d3..c1a82fe0 100644
Binary files a/src/field/mobile-features/mobile-split-features.xcf and b/src/field/mobile-features/mobile-split-features.xcf differ
diff --git a/src/field/mobile-features/mobile-streaming-mode-start-polyline.webp b/src/field/mobile-features/mobile-streaming-mode-start-polyline.webp
new file mode 100644
index 00000000..a285705e
Binary files /dev/null and b/src/field/mobile-features/mobile-streaming-mode-start-polyline.webp differ
diff --git a/src/field/mobile-features/mobile-streaming-mode-start-polyline.xcf b/src/field/mobile-features/mobile-streaming-mode-start-polyline.xcf
new file mode 100644
index 00000000..60841423
Binary files /dev/null and b/src/field/mobile-features/mobile-streaming-mode-start-polyline.xcf differ
diff --git a/src/gis/features/index.md b/src/gis/features/index.md
index 7661679f..2cb7d7f7 100644
--- a/src/gis/features/index.md
+++ b/src/gis/features/index.md
@@ -20,17 +20,17 @@ In [Creating a Project in QGIS](../../tutorials/creating-a-project-in-qgis/) you
## Survey layers
Vector layers can be used as survey layers in your project. You can apply styles and set up the forms to make your field survey easier.
-The same applies for non-spatial layers that can be used on their own to add new data or linked to a spatial layer, e.g. when linking multiple [photos](../../layer/photos/#how-to-attach-multiple-photos-to-one-feature) or [records](../../layer/one-to-n-relations/). They can be also used in [value relation](../../layer/value-select/#value-relation) widgets.
+The same applies to non-spatial layers that can be used on their own to add new data or linked to a spatial layer, e.g. when linking multiple [photos](../../layer/photos/#how-to-attach-multiple-photos-to-one-feature) or [records](../../layer/one-to-n-relations/). They can also be used in [value relation](../../layer/value-select/#value-relation) widgets.
Making changes in the data schema of layers can lead to issues in the synchronisation process. Be careful to [**deploy the revised project properly**](../../manage/deploy-new-project/). Design the data schema carefully when creating a layer to avoid the need to change it later.
Here are some practical tips for creating and maintaining layers in your project:
-- **Always use GeoPackage for layers**. If you use other formats, such as ESRI shapefile, it is not possible to detect changes from other users and they may be overwritten. Overwritten files are stored in a conflict file. This applies to both spatial and non-spatial layers.
-- **Add some extra back-up field attributes** when creating a survey layer with different types (e.g. a couple of texts, int, real, date/time) and hide them in the form design. These can serve as a backup: if you need extra fields later in the survey, just alias these extra fields and add them to form.
+- **Always use GeoPackage for layers**. If you use other formats, such as ESRI Shapefile, it is not possible to detect changes from other users and they may be overwritten. Overwritten files are stored in a conflict file. This applies to both spatial and non-spatial layers.
+- **Add some extra back-up field attributes** when creating a survey layer with different data types (e.g. text, int, real, date/time) and hide them in the form design. These can serve as a backup: if you need extra fields later in the survey, just alias these extra fields and add them to form.
- If you do not need a field, **remove it from the form**. You don't need to delete it from the table.
- **Instead of renaming a field, change its alias**.
- **Add new layers to your project as separate GeoPackages**. Do not add a new table to your existing GeoPackage that contains a survey layer. Just to be safe, it is better to have one GeoPackage for each of your survey layers.
-- use **GeoTIFF** format for your raster files or store them in a separate GeoPackage database
+- Use **GeoTIFF** format for your raster files or store them in a separate GeoPackage database
### Layer symbology
The same symbology as defined in the QGIS project will be used in . However, does not include all the SVG markers that are available within QGIS. Therefore, if you are using SVG markers for your layer styling, ensure those are copied to the project folder.
@@ -108,7 +108,7 @@ To set the project extent:
2. Select **View Settings** and check the **Set Project Full Extent** option.
- Here, either enter the coordinate extent of your project bounding box or use the map canvas extent. The extent can be also calculated from a layer in your project.
+ Here, either enter the coordinate extent of your project bounding box or use the map canvas extent. The extent can also be calculated from a layer in your project.

diff --git a/src/gis/ogc-api/dashboard-project-ogc-api-enabled.webp b/src/gis/ogc-api/dashboard-project-ogc-api-enabled.webp
new file mode 100644
index 00000000..73acee60
Binary files /dev/null and b/src/gis/ogc-api/dashboard-project-ogc-api-enabled.webp differ
diff --git a/src/gis/ogc-api/dashboard-project-ogc-api-enabled.xcf b/src/gis/ogc-api/dashboard-project-ogc-api-enabled.xcf
new file mode 100644
index 00000000..a6b1f4f5
Binary files /dev/null and b/src/gis/ogc-api/dashboard-project-ogc-api-enabled.xcf differ
diff --git a/src/gis/ogc-api/dashboard-settings-ogc-api-enabled.webp b/src/gis/ogc-api/dashboard-settings-ogc-api-enabled.webp
new file mode 100644
index 00000000..c4ad9c9f
Binary files /dev/null and b/src/gis/ogc-api/dashboard-settings-ogc-api-enabled.webp differ
diff --git a/src/gis/ogc-api/dashboard-settings-ogc-api-enabled.xcf b/src/gis/ogc-api/dashboard-settings-ogc-api-enabled.xcf
new file mode 100644
index 00000000..c24bc8c6
Binary files /dev/null and b/src/gis/ogc-api/dashboard-settings-ogc-api-enabled.xcf differ
diff --git a/src/gis/ogc-api/index.md b/src/gis/ogc-api/index.md
new file mode 100644
index 00000000..c8d6fafa
--- /dev/null
+++ b/src/gis/ogc-api/index.md
@@ -0,0 +1,80 @@
+---
+description: Your Mergin Maps project data can be published via OGC API as WMS / WMTS or WFS.
+
+outline: deep
+---
+
+# Publishing Projects via OGC API (WMS/WMTS, WFS)
+[[toc]]
+
+Your project data can be published using OGC API as WMS / WMTS or WFS. This way, your data can be displayed (read-only) in other software or web applications.
+
+::: tip Early access feature
+OGC API read-only access is one of the early access program features. It needs to be enabled for your workspace so you can try it out.
+:::
+
+## Enabling OGC API access
+As early access feature, OGC API has to be enabled for your workspace:
+1. Navigate to the **Settings** tab on the
+2. Make sure that the *OGC API read-only access* feature is enabled
+
+
+
+Now you can enable OGC API access for your project:
+
+
+**WFS URL** and **WMS / WMTS URL** can be copied and used, e.g., to [connect to these services in QGIS](#example-wms-wmts-and-wfs-connection-in-qgis).
+
+## Setup WMS, WMTS and WFS properties in QGIS
+In QGIS, you can define which layers and fields from your project should be published via WMS/WMTS and WFS.
+
+Explore the **QGIS server** tab in **Project Properties**:
+- in the **Service Capabilities** tab, you can (optionally) define the *title* and other metadata of your service
+- in the **WMTS** and **WFS** tabs, select the layers that should be published
+
+
+
+There may be some fields that you do not want to publish. These can be defined in the **Layer Properties** in the **Fields** tab for each field of the layer:
+
+
+Save and synchronise the project.
+
+## Example WMS/WMTS and WFS connection in QGIS
+[WFS URL and WMS/WMTS URL](#enabling-ogc-api-access) from the dashboard can be used to load the web services to any software that supports WFS and/or WMS (for example QGIS) to display the project data.
+
+### WMS/WMTS connection
+WMS/WMTS can be connected to QGIS in the **Browser** panel:
+
+1. Right-click on the **WMS/WMTS** entry and select **New Connection...**
+
+
+
+2. Fill in the connection details:
+ - **Name**
+ - **URL** - enter the URL copied from the
+ - set **WMS DPI-Mode** to *QGIS*
+ - select following options:
+ - :white_check_mark:
+ - :white_check_mark:
+ - :white_check_mark:
+
+
+
+3. Published layers from your project should now be displayed in the Browser panel and can be added to the project.
+
+
+### WFS connection
+WMS/WMTS can be connected to QGIS in the **Browser** panel:
+
+1. Right-click on the **WFS/OGC API - Features** entry and select **New Connection...**
+
+
+2. Fill in the connection details:
+ - **Name**
+ - **URL** - enter the URL copied from the
+ - **Version** - use the **Detect** button or select the value **1.1** from the list
+
+
+3. Published layers from your project should now be displayed in the Browser panel and can be added to the project.
+
+
diff --git a/src/gis/ogc-api/qgis-browser-new-wfs-connection.webp b/src/gis/ogc-api/qgis-browser-new-wfs-connection.webp
new file mode 100644
index 00000000..5ff4c7fb
Binary files /dev/null and b/src/gis/ogc-api/qgis-browser-new-wfs-connection.webp differ
diff --git a/src/gis/ogc-api/qgis-browser-new-wfs-connection.xcf b/src/gis/ogc-api/qgis-browser-new-wfs-connection.xcf
new file mode 100644
index 00000000..5d200bf4
Binary files /dev/null and b/src/gis/ogc-api/qgis-browser-new-wfs-connection.xcf differ
diff --git a/src/gis/ogc-api/qgis-browser-new-wms-connection.webp b/src/gis/ogc-api/qgis-browser-new-wms-connection.webp
new file mode 100644
index 00000000..930f428b
Binary files /dev/null and b/src/gis/ogc-api/qgis-browser-new-wms-connection.webp differ
diff --git a/src/gis/ogc-api/qgis-browser-new-wms-connection.xcf b/src/gis/ogc-api/qgis-browser-new-wms-connection.xcf
new file mode 100644
index 00000000..8549ca5e
Binary files /dev/null and b/src/gis/ogc-api/qgis-browser-new-wms-connection.xcf differ
diff --git a/src/gis/ogc-api/qgis-browser-wfs-connection.webp b/src/gis/ogc-api/qgis-browser-wfs-connection.webp
new file mode 100644
index 00000000..f5853a34
Binary files /dev/null and b/src/gis/ogc-api/qgis-browser-wfs-connection.webp differ
diff --git a/src/gis/ogc-api/qgis-browser-wfs-connection.xcf b/src/gis/ogc-api/qgis-browser-wfs-connection.xcf
new file mode 100644
index 00000000..4f1922e5
Binary files /dev/null and b/src/gis/ogc-api/qgis-browser-wfs-connection.xcf differ
diff --git a/src/gis/ogc-api/qgis-browser-wfs.webp b/src/gis/ogc-api/qgis-browser-wfs.webp
new file mode 100644
index 00000000..8c121668
Binary files /dev/null and b/src/gis/ogc-api/qgis-browser-wfs.webp differ
diff --git a/src/gis/ogc-api/qgis-browser-wfs.xcf b/src/gis/ogc-api/qgis-browser-wfs.xcf
new file mode 100644
index 00000000..278130af
Binary files /dev/null and b/src/gis/ogc-api/qgis-browser-wfs.xcf differ
diff --git a/src/gis/ogc-api/qgis-browser-wms-connection.webp b/src/gis/ogc-api/qgis-browser-wms-connection.webp
new file mode 100644
index 00000000..6bcc2f45
Binary files /dev/null and b/src/gis/ogc-api/qgis-browser-wms-connection.webp differ
diff --git a/src/gis/ogc-api/qgis-browser-wms-connection.xcf b/src/gis/ogc-api/qgis-browser-wms-connection.xcf
new file mode 100644
index 00000000..f57aec55
Binary files /dev/null and b/src/gis/ogc-api/qgis-browser-wms-connection.xcf differ
diff --git a/src/gis/ogc-api/qgis-browser-wms.webp b/src/gis/ogc-api/qgis-browser-wms.webp
new file mode 100644
index 00000000..8a48e392
Binary files /dev/null and b/src/gis/ogc-api/qgis-browser-wms.webp differ
diff --git a/src/gis/ogc-api/qgis-browser-wms.xcf b/src/gis/ogc-api/qgis-browser-wms.xcf
new file mode 100644
index 00000000..fc486ed0
Binary files /dev/null and b/src/gis/ogc-api/qgis-browser-wms.xcf differ
diff --git a/src/gis/ogc-api/qgis-layer-properties-fields.webp b/src/gis/ogc-api/qgis-layer-properties-fields.webp
new file mode 100644
index 00000000..4e951a5a
Binary files /dev/null and b/src/gis/ogc-api/qgis-layer-properties-fields.webp differ
diff --git a/src/gis/ogc-api/qgis-layer-properties-fields.xcf b/src/gis/ogc-api/qgis-layer-properties-fields.xcf
new file mode 100644
index 00000000..afd9e871
Binary files /dev/null and b/src/gis/ogc-api/qgis-layer-properties-fields.xcf differ
diff --git a/src/gis/ogc-api/qgis-project-properties-qgis-server.webp b/src/gis/ogc-api/qgis-project-properties-qgis-server.webp
new file mode 100644
index 00000000..606a56a5
Binary files /dev/null and b/src/gis/ogc-api/qgis-project-properties-qgis-server.webp differ
diff --git a/src/gis/ogc-api/qgis-project-properties-qgis-server.xcf b/src/gis/ogc-api/qgis-project-properties-qgis-server.xcf
new file mode 100644
index 00000000..25a2e253
Binary files /dev/null and b/src/gis/ogc-api/qgis-project-properties-qgis-server.xcf differ
diff --git a/src/gis/projections/index.md b/src/gis/projections/index.md
index e97d88f4..c82fccd9 100644
--- a/src/gis/projections/index.md
+++ b/src/gis/projections/index.md
@@ -30,10 +30,11 @@ More detailed information about the coordinate reference systems and projections
## How is it used in QGIS?
-QGIS is FOSS (free and open source) software standing on the shoulders of other FOSS libraries. Notably projection support is handled by [PROJ](https://proj.org). The version proj4 was used for decades, but in recent years it was recreated from scratch to reflect the recent modern ways for handling transformations and the increasing demand for high precision location. Different version of PROJ uses different set of resource files required to handle projections accurately. See [PROJ help](https://proj.org/resource_files.html) for details. Most importantly, the recent release of QGIS 3.16 LTR and QGIS 3.18 for all platforms is on PROJ6+ version.
+QGIS is FOSS (free and open source) software standing on the shoulders of other FOSS libraries. Notably projection support is handled by [PROJ](https://proj.org). The version proj4 was used for decades, but in recent years it was recreated from scratch to reflect the recent modern ways for handling transformations and the increasing demand for high precision location. Different version of PROJ uses different set of resource files required to handle projections accurately. See [PROJ help](https://proj.org/resource_files.html) for details. Most importantly, QGIS uses PROJ version 7+ since QGIS 3.16 LTR and QGIS 3.18 for all platforms.
-Your QGIS installation contains the basic set of PROJ resources required for most day-to-day work. But if you need some special coordinate reference systems, the required files for
- and for are available online. Also note that QGIS can automatically download the required files for your when requested. Just follow the instructions when you see the QGIS warning in the transformation dialog:
+Your QGIS installation contains the basic set of PROJ resources required for most day-to-day work. If you need some special coordinate reference systems, the required files for and for are available online.
+
+QGIS can automatically download the required files for your when requested. Just follow the instructions when you see the QGIS warning in the transformation dialog:

@@ -49,7 +50,7 @@ British National Grid (EPSG:27700) is based on datum OSGB 1936 which is differen

-In this case, the recommended transform is the[OSTN15 transformation](https://www.ordnancesurvey.co.uk/business-government/tools-support/os-net/for-developers)which uses a grid file to transform coordinates. Other transforms are using [Helmert transformation](https://en.wikipedia.org/wiki/Helmert_transformation) method and offer lower accuracy. Grid files for transforms are usually not shipped with QGIS. But QGIS *offers to auto install* these to the correct location for you! These files are then automatically used for all your projects if required. Once this is selected and ready, QGIS calls PROJ library to do datum transformation.
+In this case, the recommended transform is the [OSTN15 transformation](https://www.ordnancesurvey.co.uk/business-government/tools-support/os-net/for-developers) which uses a grid file to transform coordinates. Other transforms are using [Helmert transformation](https://en.wikipedia.org/wiki/Helmert_transformation) method and offer lower accuracy. Grid files for transforms are usually not shipped with QGIS. But QGIS *offers to auto install* these to the correct location for you! These files are then automatically used for all your projects if required. Once this is selected and ready, QGIS calls PROJ library to do datum transformation.
### 2. Map projection
@@ -74,7 +75,7 @@ The likely reason is that there is correctly downloaded and used extra datum shi
## QGIS transformation tab
-QGIS exposes a nice interface for coordinate reference systems through the Transformation tab in Settings. It is powered by [PROJ](https://proj.org/index.html), which tries to find the [best available](https://proj.org/operations/operations_computation.html)transformation route from the source to the destination coordinate reference system.
+QGIS exposes a nice interface for coordinate reference systems through the Transformation tab in Settings. It is powered by [PROJ](https://proj.org/index.html), which tries to find the [best available](https://proj.org/operations/operations_computation.html) transformation route from the source to the destination coordinate reference system.
Let's say we want to setup default transformation between British National Grid (EPSG:27700) and World Geodetic System used in GPS (EPSG:4326) for all our future QGIS projects.
diff --git a/src/gis/setup_themes/index.md b/src/gis/setup_themes/index.md
index af0fcd6c..32424d8b 100644
--- a/src/gis/setup_themes/index.md
+++ b/src/gis/setup_themes/index.md
@@ -12,7 +12,9 @@ In QGIS, you can define different **map themes** for your project to easily swit
Download or clone our public project to see how this setup works.
:::
-
+Prefer a video? Here is a short tutorial about map themes:
+
+
## Setting up styles and map themes in QGIS
Here, we will define different symbology for survey layers depending on the displayed background map using styles. Then we will set up [map themes](#map-themes-1) so that we can switch between the basic and the satellite background maps along with the corresponding layers' styles.
@@ -81,6 +83,7 @@ To modify an existing theme, make the desired changes in the **Layers** panel an
## Map themes in Mergin Maps mobile app
+
In the , tap **More** and select the **Map themes** option.

diff --git a/src/gis/setup_themes/mobile-map-themes.gif b/src/gis/setup_themes/mobile-map-themes.gif
deleted file mode 100644
index cea35d5f..00000000
Binary files a/src/gis/setup_themes/mobile-map-themes.gif and /dev/null differ
diff --git a/src/index.md b/src/index.md
index e771a7e3..aed76fd8 100644
--- a/src/index.md
+++ b/src/index.md
@@ -45,6 +45,9 @@ The ecosystem consist of various components:
- [Member Roles and Permissions](./manage/permissions/)
- [Synchronisation](./manage/synchronisation/)
- [Mergin Maps Project](./manage/project/)
+- [Webmaps](./manage/dashboard-maps/)
+ - [Sharing and Embedding](./manage/webmaps-sharing/)
+ - [Troubleshooting](./manage/webmaps-troubleshooting/)
- [How to Create a New Project](./manage/create-project/)
- [How to Share, Transfer or Delete Projects](./manage/project-advanced/)
- [How to Delete Files](./manage/delete-files)
@@ -52,7 +55,6 @@ The ecosystem consist of various components:
- [How to Recover Missing Data](./manage/missing-data/)
- [ Overview](./manage/plugin/)
- [Mergin Maps Dashboard](./manage/dashboard/)
-- [Webmaps](./manage/dashboard-maps/)
- [Project History and Versions](./manage/project-history/)
- [Selective Synchronisation](./manage/selective_sync/)
@@ -70,7 +72,8 @@ The ecosystem consist of various components:
## Configure Forms
- [Overview](./layer/overview/)
-- [Widgets](./layer/form-widgets/)
+- Widgets
+ - [Available Widgets](./layer/form-widgets/)
- [Text](./layer/text/)
- [Date and time](./layer/date-time/)
- [Relations](./layer/relations/)
@@ -80,14 +83,17 @@ The ecosystem consist of various components:
- [Selecting Single or Multiple Values ](./layer/value-select/)
- [Photos](./layer/photos/)
- [Informational Widgets](./layer/info-widgets/)
-- [Default Values](./layer/default-values/)
+- Default Values
+ - [Default Values Setup](./layer/default-values/)
- [Geotagging](./layer/exif/)
- [Variables](./layer/variables/)
- [Constraints](./layer/constraints/)
-- [Layout](./layer/form-layout/)
+- Layout
+ - [Form Layout](./layer/form-layout/)
- [Tabs and Groups](./layer/tabs-and-groups/)
- [Conditional Visibility](./layer/conditional-visibility/)
-- [Use Cases](./layer/use-cases/)
+- Use Cases
+ - [Use Cases Overview](./layer/use-cases/)
- [How to Open a File ](./layer/open-file/)
- [How to Use Hyperlinks](./layer/external-link/)
- [How to Open a Link to a Navigation App](./layer/link-to-navigation/)
@@ -95,6 +101,7 @@ The ecosystem consist of various components:
- [How to Link Multiple Records to One Feature](./layer/one-to-n-relations/)
- [How to Embed an Image](./layer/embed-image/)
- [How to Use Image Guides in Form](./layer/embed-image/)
+ - [How to Display Photo Location and Direction](./layer/photo-direction/)
## Fieldwork Tips
- [ Interface](./field/mobile-app-ui/)
diff --git a/src/layer/default-values/index.md b/src/layer/default-values/index.md
index c7a33d4b..ab33f17d 100644
--- a/src/layer/default-values/index.md
+++ b/src/layer/default-values/index.md
@@ -2,7 +2,7 @@
description: Default values can be used to automatically fill in the fields in the form using values, variables or expressions.
---
-# Default values
+# Default Values
Default values can be used to automatically record, e.g. the name of the surveyor, date and time of the survey, latitude and longitude of a feature or to have frequently used values filled in advance (see ).
Fields with default values can be hidden from the attributes form if they are used to store data that are not expected to be modified manually.
diff --git a/src/layer/exif/index.md b/src/layer/exif/index.md
index 80f1a17f..4b35ddc7 100644
--- a/src/layer/exif/index.md
+++ b/src/layer/exif/index.md
@@ -59,9 +59,9 @@ EXIF function supported by :
- `GPSLongitude` returns GPS Longitude as rationals, e.g. 17/1, 6/1, 244907/10000.
- `ImageWidth` returns the image width in pixels.
-The list of **EXIF tags** can be found in the Android developer documentation for [ ](https://developer.android.com/reference/android/media/ExifInterface) or in [ExifTool documentation](https://exiftool.org/TagNames/EXIF.html).
+The list of **EXIF tags** can be found in the Android developer documentation for [ ](https://developer.android.com/reference/android/media/ExifInterface) or in [ExifTool documentation](https://exiftool.sourceforge.net/TagNames/EXIF.html).
-Note that some of the tag names listed in [ExifTool documentation](https://exiftool.org/TagNames/EXIF.html) can differ from the EXIF specification. As an example, while `ImageWidth` tag is valid, `ImageHeight` is not and you have to use `ImageLength` tag name (defined by EXIF specification) when [recording EXIF metadata](#how-to-use-exif-metadata-in-mergin-maps-mobile-app) in .
+Note that some of the tag names listed in [ExifTool documentation](https://exiftool.sourceforge.net/TagNames/EXIF.html) can differ from the EXIF specification. As an example, while `ImageWidth` tag is valid, `ImageHeight` is not and you have to use `ImageLength` tag name (defined by EXIF specification) when [recording EXIF metadata](#how-to-use-exif-metadata-in-mergin-maps-mobile-app) in .
:::details
EXIF tags that can be retrieved from your images can vary depending on how they were created (e.g. what type of device you used to capture photos). EXIF tags that are recorded in your image can be displayed, e.g., using [ExifTool](https://exiftool.org/):
diff --git a/src/layer/form-layout/index.md b/src/layer/form-layout/index.md
index 73333bda..917cc189 100644
--- a/src/layer/form-layout/index.md
+++ b/src/layer/form-layout/index.md
@@ -2,7 +2,7 @@
description: Use QGIS drag and drop designer, conditional visibility, and widgets to create attributes forms tailored to your Mergin Maps project needs.
---
-# Attributes Form Layout
+# Form Layout
[[toc]]
Collecting and editing data in the field can be more efficient with forms that are easy to navigate. QGIS offers a lot of options for improving the layout of your forms, such as using [tabs and groups](../tabs-and-groups/) to keep related fields together, displaying or hiding a group of fields based on [conditional visibility](../conditional-visibility/), or displaying tips and instructions in the forms using the [Text or HTML widget](../info-widgets/). The starting point for creating a form is [QGIS Drag and Drop Designer](#qgis-drag-and-drop-designer).
diff --git a/src/layer/form-widgets/index.md b/src/layer/form-widgets/index.md
index 17b08bed..4989b574 100644
--- a/src/layer/form-widgets/index.md
+++ b/src/layer/form-widgets/index.md
@@ -2,7 +2,7 @@
description: Our Widget Gallery provides an overview of QGIS form widgets supported by the Mergin Maps mobile app. Find the best widget for your survey form!
---
-# Form Widgets Gallery
+# Available Widgets
Form widgets define the way you can enter values in the form, both in QGIS and in the . The configuration of form widgets in your project is done in QGIS.
diff --git a/src/layer/photo-direction/index.md b/src/layer/photo-direction/index.md
new file mode 100644
index 00000000..bf461091
--- /dev/null
+++ b/src/layer/photo-direction/index.md
@@ -0,0 +1,134 @@
+---
+description: Photo orientation can be displayed in your project. See the direction your camera was pointing when photos were captured using the Mergin Maps mobile app.
+
+outline: deep
+---
+
+# How to Display Photo Location and Direction
+
+[[toc]]
+
+The orientation of photos captured using the can be displayed in the project to see the camera's pointing direction.
+
+
+
+To do so, we will:
+- use EXIF metadata to store the location and direction of photos
+- use a virtual layer to display a point for each photo (location where the photo was taken)
+- style the virtual layer to visualise the photo direction
+
+:::tip Example project available
+To explore this setup, download this public project .
+:::
+
+## Storing photo direction and location
+Here, we use a project that allows attaching [multiple photos to one feature](../photos/#how-to-attach-multiple-photos-to-one-feature). It contains a point survey layer (here: `Survey`) and a non-spatial table for photos (here: `photos`).
+
+The photos layer has fields for storing location (latitude `lat`, longitude `long`) and direction (`direction`) of the photos. These values are stored automatically, using EXIF metadata as default values (see [Geotagging](../exif/) for more details).
+
+We use following default values as photos are stored in [a custom folder](../photos/#how-to-set-up-a-custom-folder-for-storing-photos) named `photo`:
+- latitude: `read_exif_latitude(@project_home + '/' + "photo")`
+- longitude: `read_exif_longitude(@project_home + '/' + "photo")`
+- direction: `read_exif_img_direction(@project_home + '/' + "photo")`
+
+
+
+:::warning Location tags
+To store EXIF metadata values, [location tags have to be allowed in the camera settings](../exif/#allowing-location-tags).
+:::
+
+## Virtual layer of photo locations
+The location and direction of photos is stored in a non-spatial table `photos`. Here, we will create a virtual layer, in which every photo has its location displayed as a point.
+
+:::tip Virtual layers
+Virtual layers are in essence database views. They are created as a result of an SQL query, so they do not contain any data themselves and cannot be edited.
+
+Virtual layers can be embedded in the project, synchronised and used in the .
+
+See for more information about virtual layers.
+
+:::
+
+1. Create a **New Virtual Layer**
+ 
+
+2. Click on the **Import** button to choose a layer from the project
+ 
+
+3. Select the layer that contains photos (here: `photos`)
+ 
+
+4. Define the virtual layer:
+ - **Layer name** can be set as needed (here: `Photo location`)
+ - **Embedded layers** should contain the imported layer (here: `photos`)
+ - **Query** for the virtual layer. In this case:
+ - the virtual layer will have the same fields as the `photos` layer
+ - `geometry` is derived from the longitude and latitude of the photos (see [storing photo direction and location](#storing-photo-direction-and-location))
+
+```
+SELECT fid,
+photo,
+surveyor,
+Date,
+lat,
+long,
+direction,
+transform( MakePoint(long, lat, 4326) , 'EPSG:4326', 'EPSG:3857' )as geometry
+FROM photos
+```
+
+ - **Geometry** of the virtual layer is **Manually defined** as:
+ - **Geometry column**: `geometry` (as defined in the query)
+ - **Type**: Point
+ - **CRS**: EPSG: 3857 (as used by the `MakePoint` function in the query)
+
+ 
+
+5. Use the **Add** button to add the virtual layer to the project.
+
+ It should appear as a point layer with the same data as the `photos` layer.
+
+## Symbology for photo location and direction
+Here we will define the symbology of the virtual layer. We will use an SVG marker for the photo location combined with a visualisation of the photo direction.
+
+1. Navigate to the **Symbology** tab of the **Layer Properties**
+
+2. First we will create a symbol for photo location.
+
+ In the **Symbol layer type**, switch the *Simple Marker* to ***SVG Marker*** and:
+ - Find an appropriate symbol in the **SVG Browser**. Here we use a photo symbol from the *App Symbols* > *shopping* folder.
+ - Set appropriate size and colour of the symbol
+
+ 
+
+3. Now we will create a visualisation of the photo direction.
+
+ Use the **Add symbol layer** button to add a new marker located under the SVG marker.
+
+ Set it up as follows:
+ - **Symbol layer type**: *Geometry Generator*
+ - **Geometry type**: *Polygon / MultiPolygon*
+ - **Expression**:
+ ```
+ wedge_buffer(center:=$geometry,azimuth:= to_int( "direction" ) ,width:=45,outer_radius:=100)
+ ```
+
+ 
+
+ This defines the geometry of the symbol. You can modify its size by changing the `width` and `outer_radius` variables in the `wedge_buffer` function.
+
+4. Finally, we will style this symbol.
+ - Switch the **Symbol layer type** from *Simple Fill* to * Fill*
+ - For **Gradients ** use the *Two * option and choose the colours. We recommend using semi-transparent colours.
+ - For **Shading Style**, **Set distance** as needed, here we use 5.00
+
+ 
+
+And this is how our setup looks like in QGIS:
+
+
+
+When you add a photo in the , it will be displayed in this virtual layer:
+
+
+
diff --git a/src/layer/photo-direction/mobile-photo-direction.webp b/src/layer/photo-direction/mobile-photo-direction.webp
new file mode 100644
index 00000000..65b8770b
Binary files /dev/null and b/src/layer/photo-direction/mobile-photo-direction.webp differ
diff --git a/src/layer/photo-direction/mobile-photo-direction.xcf b/src/layer/photo-direction/mobile-photo-direction.xcf
new file mode 100644
index 00000000..475fb8cd
Binary files /dev/null and b/src/layer/photo-direction/mobile-photo-direction.xcf differ
diff --git a/src/layer/photo-direction/qgis-default-value-direction.webp b/src/layer/photo-direction/qgis-default-value-direction.webp
new file mode 100644
index 00000000..23f4e550
Binary files /dev/null and b/src/layer/photo-direction/qgis-default-value-direction.webp differ
diff --git a/src/layer/photo-direction/qgis-default-value-direction.xcf b/src/layer/photo-direction/qgis-default-value-direction.xcf
new file mode 100644
index 00000000..d045ac8d
Binary files /dev/null and b/src/layer/photo-direction/qgis-default-value-direction.xcf differ
diff --git a/src/layer/photo-direction/qgis-display-photo-direction.webp b/src/layer/photo-direction/qgis-display-photo-direction.webp
new file mode 100644
index 00000000..e4259e27
Binary files /dev/null and b/src/layer/photo-direction/qgis-display-photo-direction.webp differ
diff --git a/src/layer/photo-direction/qgis-display-photo-direction.xcf b/src/layer/photo-direction/qgis-display-photo-direction.xcf
new file mode 100644
index 00000000..7f3fd8ce
Binary files /dev/null and b/src/layer/photo-direction/qgis-display-photo-direction.xcf differ
diff --git a/src/layer/photo-direction/qgis-new-virtual-layer.webp b/src/layer/photo-direction/qgis-new-virtual-layer.webp
new file mode 100644
index 00000000..cdca16e5
Binary files /dev/null and b/src/layer/photo-direction/qgis-new-virtual-layer.webp differ
diff --git a/src/layer/photo-direction/qgis-new-virtual-layer.xcf b/src/layer/photo-direction/qgis-new-virtual-layer.xcf
new file mode 100644
index 00000000..23dc6ef4
Binary files /dev/null and b/src/layer/photo-direction/qgis-new-virtual-layer.xcf differ
diff --git a/src/layer/photo-direction/qgis-select-virtual-layer.webp b/src/layer/photo-direction/qgis-select-virtual-layer.webp
new file mode 100644
index 00000000..629db928
Binary files /dev/null and b/src/layer/photo-direction/qgis-select-virtual-layer.webp differ
diff --git a/src/layer/photo-direction/qgis-select-virtual-layer.xcf b/src/layer/photo-direction/qgis-select-virtual-layer.xcf
new file mode 100644
index 00000000..7b211357
Binary files /dev/null and b/src/layer/photo-direction/qgis-select-virtual-layer.xcf differ
diff --git a/src/layer/photo-direction/qgis-symbology-direction-fill.webp b/src/layer/photo-direction/qgis-symbology-direction-fill.webp
new file mode 100644
index 00000000..054db31a
Binary files /dev/null and b/src/layer/photo-direction/qgis-symbology-direction-fill.webp differ
diff --git a/src/layer/photo-direction/qgis-symbology-direction-fill.xcf b/src/layer/photo-direction/qgis-symbology-direction-fill.xcf
new file mode 100644
index 00000000..b8cf528d
Binary files /dev/null and b/src/layer/photo-direction/qgis-symbology-direction-fill.xcf differ
diff --git a/src/layer/photo-direction/qgis-symbology-direction-geom-generator.webp b/src/layer/photo-direction/qgis-symbology-direction-geom-generator.webp
new file mode 100644
index 00000000..51ef41d3
Binary files /dev/null and b/src/layer/photo-direction/qgis-symbology-direction-geom-generator.webp differ
diff --git a/src/layer/photo-direction/qgis-symbology-direction-geom-generator.xcf b/src/layer/photo-direction/qgis-symbology-direction-geom-generator.xcf
new file mode 100644
index 00000000..6154fb07
Binary files /dev/null and b/src/layer/photo-direction/qgis-symbology-direction-geom-generator.xcf differ
diff --git a/src/layer/photo-direction/qgis-symbology-direction-marker.webp b/src/layer/photo-direction/qgis-symbology-direction-marker.webp
new file mode 100644
index 00000000..3b832524
Binary files /dev/null and b/src/layer/photo-direction/qgis-symbology-direction-marker.webp differ
diff --git a/src/layer/photo-direction/qgis-symbology-direction-marker.xcf b/src/layer/photo-direction/qgis-symbology-direction-marker.xcf
new file mode 100644
index 00000000..ae4111dd
Binary files /dev/null and b/src/layer/photo-direction/qgis-symbology-direction-marker.xcf differ
diff --git a/src/layer/photo-direction/qgis-virtual-layer-definition.webp b/src/layer/photo-direction/qgis-virtual-layer-definition.webp
new file mode 100644
index 00000000..4acca5ab
Binary files /dev/null and b/src/layer/photo-direction/qgis-virtual-layer-definition.webp differ
diff --git a/src/layer/photo-direction/qgis-virtual-layer-definition.xcf b/src/layer/photo-direction/qgis-virtual-layer-definition.xcf
new file mode 100644
index 00000000..f0fd5887
Binary files /dev/null and b/src/layer/photo-direction/qgis-virtual-layer-definition.xcf differ
diff --git a/src/layer/photo-direction/qgis-virtual-layer.webp b/src/layer/photo-direction/qgis-virtual-layer.webp
new file mode 100644
index 00000000..b67912b9
Binary files /dev/null and b/src/layer/photo-direction/qgis-virtual-layer.webp differ
diff --git a/src/layer/photo-direction/qgis-virtual-layer.xcf b/src/layer/photo-direction/qgis-virtual-layer.xcf
new file mode 100644
index 00000000..4d6c158c
Binary files /dev/null and b/src/layer/photo-direction/qgis-virtual-layer.xcf differ
diff --git a/src/layer/photos/index.md b/src/layer/photos/index.md
index c7933955..54826499 100644
--- a/src/layer/photos/index.md
+++ b/src/layer/photos/index.md
@@ -23,7 +23,7 @@ Adding photos to a surveyed feature can be really helpful. With .
-If you want to [attach multiple photos to one feature](#how-to-attach-multiple-photos-to-one-feature) explore the public project .
+If you want to [attach multiple photos to one feature](#how-to-attach-multiple-photos-to-one-feature) explore the public project . It also includes the setup for [displaying photo location and direction](../photo-direction/).
:::
Prefer a video? Here is a short tutorial about the photo widget:
diff --git a/src/layer/use-cases/index.md b/src/layer/use-cases/index.md
index 08374428..5ae6c55c 100644
--- a/src/layer/use-cases/index.md
+++ b/src/layer/use-cases/index.md
@@ -13,4 +13,5 @@ Our step-by-step guides provide detailed descriptions accompanied by public (recommended for fields with many values)
+ - **Allow multiple selections** - if you want to have the option to select multiple values
4. **Apply** the changes. Don't forget to save and sync your project!

@@ -87,6 +92,11 @@ When you open the field with **Value Relation** in the , y

+If you use the **Use completer** option for the value relation field, the search bar and keyboard appear automatically, making it easier to search for a value from the list.
+
+
+
+
## Drill-down forms
Drill-down or cascade forms enable to list values in a field depending on a value selected in another field.
diff --git a/src/layer/value-select/mobile-form-value-relation-completer.webp b/src/layer/value-select/mobile-form-value-relation-completer.webp
new file mode 100644
index 00000000..2dab48ca
Binary files /dev/null and b/src/layer/value-select/mobile-form-value-relation-completer.webp differ
diff --git a/src/layer/value-select/mobile-form-value-relation-completer.xcf b/src/layer/value-select/mobile-form-value-relation-completer.xcf
new file mode 100644
index 00000000..7c8c528f
Binary files /dev/null and b/src/layer/value-select/mobile-form-value-relation-completer.xcf differ
diff --git a/src/layer/value-select/mobile-form-value-relation.jpg b/src/layer/value-select/mobile-form-value-relation.jpg
index 81da9a2e..04bf267a 100644
Binary files a/src/layer/value-select/mobile-form-value-relation.jpg and b/src/layer/value-select/mobile-form-value-relation.jpg differ
diff --git a/src/layer/value-select/mobile-form-value-relation.xcf b/src/layer/value-select/mobile-form-value-relation.xcf
index 356c428c..ea1b7d63 100644
Binary files a/src/layer/value-select/mobile-form-value-relation.xcf and b/src/layer/value-select/mobile-form-value-relation.xcf differ
diff --git a/src/layer/value-select/qgis-form-value-relation-multiselect.jpg b/src/layer/value-select/qgis-form-value-relation-multiselect.jpg
index 1c4db0c8..664e489e 100644
Binary files a/src/layer/value-select/qgis-form-value-relation-multiselect.jpg and b/src/layer/value-select/qgis-form-value-relation-multiselect.jpg differ
diff --git a/src/layer/value-select/qgis-form-value-relation-multiselect.xcf b/src/layer/value-select/qgis-form-value-relation-multiselect.xcf
index 4620f721..0cb2d498 100644
Binary files a/src/layer/value-select/qgis-form-value-relation-multiselect.xcf and b/src/layer/value-select/qgis-form-value-relation-multiselect.xcf differ
diff --git a/src/layer/variables/index.md b/src/layer/variables/index.md
index 63cff238..4d2ca105 100644
--- a/src/layer/variables/index.md
+++ b/src/layer/variables/index.md
@@ -15,15 +15,15 @@ Here you can find the lists of:
The adds several variables that can be used in QGIS expressions:
-| Variable name | Sample value | Scope | Description |
-|-----------------------------|-------------------------------|---------|-------------
-| `@mm_full_name` | `martin second name` | global | Full name of the currently logged in user, blank if the full name is not set |
-| `@mm_username` | `martin` | global | Username of the user currently logged in to |
-| `@mm_user_email` | `martin@example.com` | global | Email of the user currently logged in to |
-| `@mm_url` | `https://app.merginmaps.com` | global | URL of the service |
-| `@mm_project_name` | `Tree survey` | project | Name of the active project |
-| `@mm_project_full_name` | `martin/Tree survey` | project | Workspace and project name joined with a forward slash |
-| `@mm_project_version` | `42` | project | Current version of the active project |
+| Variable name | Type | Sample value | Description |
+|-------------------------|-----------------|----------------|-------------|
+| `@mm_full_name` | Text (string) | `Joe Schmoe` | Full name of the currently logged in user, blank if the full name is not set |
+| `@mm_username` | Text (string) | `joe-schmoe` | Username of the user currently logged in to |
+| `@mm_user_email` | Text (string) | `joe.schmoe@mail.com` | Email of the user currently logged in to |
+| `@mm_url` | Text (string) | `https://app.merginmaps.com` | URL of the service |
+| `@mm_project_name` | Text (string) | `My project` | Name of the active project |
+| `@mm_project_full_name` | Text (string) | `my-team/My project` | Workspace and project name joined with a forward slash |
+| `@mm_project_version` | Number (integer) | `9` | Current version of the active project |
A common use case is to use `@mm_username` or `@mm_user_email` as the [default value](../default-values/) for one of the fields in a survey layer to automatically track who has added (and/or modified) a particular record.
@@ -40,35 +40,32 @@ With , it is possible to access GPS information using extra pos
Extra position variables can be used as [default values in feature forms](../default-values/).
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_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.
- - `@position_magnetic_variation` - The angle between the horizontal component of the magnetic field and true north, in degrees. Also known as magnetic declination. A positive value indicates a clockwise direction from true north and a negative value indicates a counter-clockwise direction.
- - `@position_horizontal_accuracy` - The accuracy of the provided latitude-longitude value, in meters.
- - `@position_vertical_accuracy` - The accuracy of the provided altitude value, in meters.
- - `@position_from_gps` - True, if recorded/edited feature's geometry corresponds with current user's position (Position marker has the same location as the crosshairs marker).
- - `@position_satellites_visible` - Number of visible satellites.
- - `@position_satellites_used` - Number of satellites used to calculate the position.
- - `@position_gps_fix` - GPS fix, e.g. "RTK float"
- - `@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"
- - `@position_provider_name` - GPS device name.
- - for internal GPS, returns "Internal"
- - for 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
- - `@position_hdop` - Horizontal dilution of precision (HDOP)
- - `@position_vdop` - Vertical dilution of precision (VDOP)
- - `@position_pdop` - Position (3D) dilution of precision (PDOP)
+| Variable name | Type | Description |
+|-------------------------|-----------------|-------------|
+| `@position_coordinate` | Geometry | A point with the coordinates in WGS84 |
+| `@position_latitude` | Number (decimal) | Latitude |
+| `@position_longitude` | Number (decimal) | Longitude |
+| `@position_elevation` | Number (decimal) | Orthometric or normal height. *May not be available for some providers* |
+| `@position_altitude` | Number (decimal) | Has been replaced by `@position_elevation`. It is still supported and returns the same values as `@position_elevation`. |
+| `@position_elevation_ellipsoid` | Number (decimal) | Ellipsoidal height. *May not be available for some providers* |
+| `@position_geoid_separation` | Number (decimal) | Geoid or quasi-geoid height (undulation). *May not be available for some providers* |
+| `@position_direction` | Number (integer) | The bearing measured in degrees clockwise from true north to the direction of travel |
+| `@position_ground_speed` | Number (decimal) | The ground speed, in meters/sec |
+| `@position_vertical_speed` | Number (decimal) | The vertical speed, in meters/sec |
+| `@position_magnetic_variation` | Number (decimal) | The angle between the horizontal component of the magnetic field and true north, in degrees. Also known as magnetic declination. A positive value indicates a clockwise direction from true north and a negative value indicates a counter-clockwise direction. |
+| `@position_horizontal_accuracy` | Number (decimal) | The accuracy of the provided latitude-longitude value, in meters |
+| `@position_vertical_accuracy` | Number (decimal) | The accuracy of the provided altitude value, in meters |
+| `@position_from_gps` | Boolean | *True* if recorded/edited feature's geometry corresponds with current user's position (position marker has the same location as the crosshairs marker) |
+| `@position_satellites_visible` | Number (integer) | Number of visible satellites |
+| `@position_satellites_used` | Number (integer) | Number of satellites used to calculate the position |
+| `@position_gps_fix` | Text (string) | GPS fix, e.g. "RTK float" |
+| `@position_gps_antenna_height` | Number (decimal) | Antenna height as defined in [GPS settings](../../field/mobile-app-ui/#gps-settings) |
+| `@position_provider_type` | Text (string) | GPS device type. For internal GPS, returns `internal`, for external GPS, returns `external_bt` (Bluetooth devices) or `external_ip` (network devices).|
+| `@position_provider_name` | Text (string) | GPS device name. For internal GPS, returns `Internal`, `Internal (fused)` or `Internal (gps)`. For external GPS, returns the name of the external device. If mock location is detected, returns `External (Mock)`. |
+| `@position_provider_address` | Text (string) | GPS device address. For internal GPS, returns `devicegps`, `android_fused` or `android_gps`. For external GPS, returns the MAC address (Bluetooth devices) or IP address with port (network devices). |
+| `@position_hdop` | Number (decimal) | Horizontal dilution of precision (HDOP) |
+| `@position_vdop` | Number (decimal) | Vertical dilution of precision (VDOP) |
+| `@position_pdop` | Number (decimal) | Position (3D) dilution of precision (PDOP) |
:::tip
**Dilution of precision** (DOP) is a useful value that reflects the confidence level of achieved position precision. In addition to the horizontal and vertical accuracy, the appropriate DOP value (horizontal, vertical, or 3D) can be used to assess the overall quality of your survey accuracy.
diff --git a/src/manage/dashboard-maps/dashboard-map-properties.webp b/src/manage/dashboard-maps/dashboard-map-properties.webp
index f67fe1f9..c71594cf 100644
Binary files a/src/manage/dashboard-maps/dashboard-map-properties.webp and b/src/manage/dashboard-maps/dashboard-map-properties.webp differ
diff --git a/src/manage/dashboard-maps/dashboard-map-properties.xcf b/src/manage/dashboard-maps/dashboard-map-properties.xcf
index f5e8aa6a..7db8aa36 100644
Binary files a/src/manage/dashboard-maps/dashboard-map-properties.xcf and b/src/manage/dashboard-maps/dashboard-map-properties.xcf differ
diff --git a/src/manage/dashboard-maps/dashboard-webmap.gif b/src/manage/dashboard-maps/dashboard-webmap.gif
index 06266642..7b289aec 100644
Binary files a/src/manage/dashboard-maps/dashboard-webmap.gif and b/src/manage/dashboard-maps/dashboard-webmap.gif differ
diff --git a/src/manage/dashboard-maps/index.md b/src/manage/dashboard-maps/index.md
index f7c9b198..d9b7ebbb 100644
--- a/src/manage/dashboard-maps/index.md
+++ b/src/manage/dashboard-maps/index.md
@@ -1,9 +1,9 @@
---
description: Webmaps display the map overview of your project's spatial data directly in your web browser, on Mergin Maps dashboard.
+outline: deep
---
-# Webmaps
-[[toc]]
+# Webmaps Overview
The spatial data of your project can be displayed and explored in the **Map** tab of the project on the . As an early access feature, they can also be [shared via URL](#sharing-maps-via-url).
@@ -12,45 +12,46 @@ The spatial data of your project can be displayed and explored in the **Map** ta
:::tip Usage details
Webmaps are available for cloud and users.
-Webmaps are **not** available for .
+Webmaps are **not** available for at this point.
:::
-## Webmaps content
+## Project layers
+On the webmaps, you will see your survey layers or raster layers that are [packaged](../project/#packaging-qgis-project) with the project. The default extent of maps is defined by the [extent set in the QGIS project](../../gis/features/#project-extent).
-On the webmaps, you will see your survey layers or raster layers that are [packaged](../project/#packaging-qgis-project) with the project. Other layers, such as online [background maps](../../gis/settingup_background_map/#background-maps) or PostgreSQL layers are not displayed. The extent of maps is defined by the [extent set in the QGIS project](../../gis/features/#project-extent).
+All maps on the by default use [ vector tile service](../../gis/settingup_background_map/#online-services-1) as a background map.
-All maps on the use [ vector tile service](../../gis/settingup_background_map/#online-services-1) as a background map.
+The webmap is refreshed automatically, you will see the latest version of your project all the time, even without refreshing the web page.
-The content of the maps and of the **Layers** panel is refreshed after every synchronisation of the project. This means you should always see your current spatial data here.
+The **Layers** panel lists all available layers displayed on the map, together with their legend as defined in QGIS. The eye button next to the layer name controls the visibility of layers. If you have defined map themes in your project, these are visible on top of the layers panel.
-The **Layers** panel lists all layers displayed on the map. The check button :white_check_mark: controls the visibility of layers.
+
-Click on a feature on the map to display its properties.
+You can also switch [Map themes](../../gis/setup_themes/) defined in the project:
+
-
-
-## Sharing maps via URL
-::: tip Early access feature
-Map sharing is in early access. If you would like to try it out, fill in [this form](https://wishlist.merginmaps.com/f/share-maps-via-url) to gain access to this feature.
+Click on a feature on the map to display its attributes.
-Try out this to see how shared maps work.
-:::
+
-Webmaps can be shared via URL. [Admins or owners](../permissions/) can enable map sharing for a project, so that anyone with the link can display and explore your project in a web browser, without the need to log into or making the project [public](../project-advanced/#make-your-project-public-private).
+## Available layers
+Webmaps by default show layers that are packaged with the project. These are layers that are loaded from project files. These are usually GeoPackage layers, shapefile layers and background maps that are made available for offline use (e.g. mbtiles, GeoTIFF, ...).
-1. Navigate to your project on the .
-2. In the **Map** tab, click on the **Share map** button to generate a shareable link
-3. Send the link to anyone to share your project
+Layers requiring network connection (e.g. PostgreSQL layers or online background maps) are by default not included on the webmap due to potential performance and connectivity problems. However, certain network layers (such as satellite background map) can be added manually, read more in the [following section](#add-custom-background-maps).
-To disable the map sharing, click on the **Revoke sharing** button.
+### Add custom background maps
+If you prefer a different background map than the official one provided by default, there are currently two ways to add a custom background map:
-
+1. **Map-script** - Map-script allows you to programmatically update and customise the webmap to your specific needs. Read more about `map-script` [here](../webmaps-applications/).
+2. **Package your background map** - Make your background map available offline in QGIS. This step packages the layer into a file and it will be visible on the webmap afterwards
-::: tip Blog about shared maps
-You can read about this functionality in our blog post .
+:::warning Background maps licensing
+Keep in mind that background maps services and data sources come with their own terms of use, especially if they are to be publicly shared. You should comply with any terms and conditions of the services of your choice.
:::
+
+## Custom webmap applications
+As described in the previous section, webmaps can be further programmatically customised via `map-script` to build a custom webmap application. Read more about it [here](../webmaps-applications/).
-## Webmaps extent
+## Extent
The extent of webmaps is defined in QGIS in the **Project Properties**.
@@ -64,13 +65,9 @@ If this parameter is not defined, the map extent will be set as the *Advertised
If there are no extent settings in the QGIS project, will calculate the extent from layers in the project.
-## Troubleshooting
-
-### Map config does not exist
-The **Map** tab of a project on the may display this error message:
-`Map config does not exist, please try update the project`
-
-
+## Sharing maps via URL
-This usually happens when the map was not initiated. All you need to do is to create a new version of the project: synchronisation of the project will activate the map content.
+Webmaps can be shared via URL or embedded on a website. You can find more details about this early access feature in [Sharing and Embedding Webmaps](../webmaps-sharing/).
+## Troubleshooting
+Troubleshooting tips for webmaps can be found [here](../webmaps-troubleshooting/).
diff --git a/src/manage/dashboard-maps/webmaps-map-themes.webp b/src/manage/dashboard-maps/webmaps-map-themes.webp
new file mode 100644
index 00000000..62092b46
Binary files /dev/null and b/src/manage/dashboard-maps/webmaps-map-themes.webp differ
diff --git a/src/manage/dashboard-maps/webmaps-map-themes.xcf b/src/manage/dashboard-maps/webmaps-map-themes.xcf
new file mode 100644
index 00000000..aff04277
Binary files /dev/null and b/src/manage/dashboard-maps/webmaps-map-themes.xcf differ
diff --git a/src/manage/dashboard-maps/webmaps-toggle-layer-visibility.webp b/src/manage/dashboard-maps/webmaps-toggle-layer-visibility.webp
new file mode 100644
index 00000000..d70a1050
Binary files /dev/null and b/src/manage/dashboard-maps/webmaps-toggle-layer-visibility.webp differ
diff --git a/src/manage/dashboard-maps/webmaps-toggle-layer-visibility.xcf b/src/manage/dashboard-maps/webmaps-toggle-layer-visibility.xcf
new file mode 100644
index 00000000..7ed20b2e
Binary files /dev/null and b/src/manage/dashboard-maps/webmaps-toggle-layer-visibility.xcf differ
diff --git a/src/manage/dashboard/index.md b/src/manage/dashboard/index.md
index 9c91e08d..51c9611a 100644
--- a/src/manage/dashboard/index.md
+++ b/src/manage/dashboard/index.md
@@ -72,17 +72,16 @@ In **Settings**, you can:
## Members
-The **Members** tab provides the overview of the [members and guests](../permissions/#workspace-members-and-guests) of the workspace, as well as pending invitations. You can use the [**invite**](../project-advanced/#add-users-to-a-workspace) option to add users to the workspace.
+The **Members** tab provides the overview of the [members and guests](../permissions/#workspace-members-and-guests) of the workspace, as well as pending invitations. You can use the [**invite**](../project-advanced/#add-users-to-a-workspace) button to add users to the workspace.
This tab is only available to [owners and admins](../permissions/#workspace-member-roles-and-project-permissions) of a workspace.
Here, you can:
- see the email addresses, usernames and names of your workspace users
-- see and change the [roles](../permissions/#workspace-member-roles-and-project-permissions) of your workspace members
+- see and change the [**roles**](../permissions/#workspace-member-roles-and-project-permissions) of your workspace members
- see the **Member type**, whether the user is a [contributor](../subscriptions/#contributors) or a read-only guest. Only contributors are counting towards your [subscription](../subscriptions/).
-- remove users from the workspace
-
-
+- **resend invitation** to a user with pending invitation
+- **remove** members from the workspace

diff --git a/src/manage/dashboard/mergin-maps-dashboard-members.jpg b/src/manage/dashboard/mergin-maps-dashboard-members.jpg
index d7e7b122..c6cd2e97 100644
Binary files a/src/manage/dashboard/mergin-maps-dashboard-members.jpg and b/src/manage/dashboard/mergin-maps-dashboard-members.jpg differ
diff --git a/src/manage/dashboard/mergin-maps-dashboard-members.xcf b/src/manage/dashboard/mergin-maps-dashboard-members.xcf
index 0e9182f8..a492c6bd 100644
Binary files a/src/manage/dashboard/mergin-maps-dashboard-members.xcf and b/src/manage/dashboard/mergin-maps-dashboard-members.xcf differ
diff --git a/src/manage/dashboard/mergin-maps-web-map.webp b/src/manage/dashboard/mergin-maps-web-map.webp
index 1e91e01d..fe064523 100644
Binary files a/src/manage/dashboard/mergin-maps-web-map.webp and b/src/manage/dashboard/mergin-maps-web-map.webp differ
diff --git a/src/manage/dashboard/mergin-maps-web-map.xcf b/src/manage/dashboard/mergin-maps-web-map.xcf
index 609ec5b8..f330284a 100644
Binary files a/src/manage/dashboard/mergin-maps-web-map.xcf and b/src/manage/dashboard/mergin-maps-web-map.xcf differ
diff --git a/src/manage/project/index.md b/src/manage/project/index.md
index 9e1de7d7..20bfcb8d 100644
--- a/src/manage/project/index.md
+++ b/src/manage/project/index.md
@@ -82,7 +82,7 @@ Save and sync the project. When syncing, you will see in the **Project status**

-If you used **keep as is** option when [packaging the project](#packaging-qgis-project) or add a layer that is not stored in the project's folder, the project will reference the relative path to its location. When opening the project on another computer, QGIS will try to load the file using the relative path. If this folder doesn't exist or is located elsewhere, the project will not be able to load the layer. The same applies for .
+If you used **keep as is** option when [packaging the project](#packaging-qgis-project) or add a layer that is not stored in the project's folder, the project will reference the relative path to its location. When opening the project on another computer, QGIS will try to load the file using the relative path. If this folder doesn't exist or is located elsewhere, the project will not be able to load the layer. The same applies to .
Only the content in the project's folder is synchronised!
diff --git a/src/manage/webmaps-applications/index.md b/src/manage/webmaps-applications/index.md
new file mode 100644
index 00000000..269ab4ae
--- /dev/null
+++ b/src/manage/webmaps-applications/index.md
@@ -0,0 +1,113 @@
+---
+description: Mergin Maps webmaps can be customised by integrating map-script to build custom applications, as an experimental feature.
+---
+
+# Building Webmap Applications
+
+::: warning Experimental feature 🧪
+Webmap applications is in experimental phase and its availability and functionality might change in the future. We are actively working on making these features easier to use.
+:::
+
+Webmap behaviour can be customised to your organisation's specific needs via a `map-script.js` file to build a webmap application.
+This is a JavaScript file that runs with your map and lets you add custom controls and behaviour on top of the built-in OpenLayers map. The script runs in both the project map view and in shared/embedded public maps.
+
+It has reference to the map itself, API and other components to allow further customisation, including WMS and WFS OGC API (read-only).
+
+The code can reference `MerginMaps` global object as:
+ - `MerginMaps.getMap()` - the OpenLayers `Map` instance
+ - `MerginMaps.getMapElement()` - the map container DOM element
+
+If your project is shared via URL, you can use the URL to access WFS and WMS endpoints in the script like this:
+ - WFS - `https://app.merginmaps.com/app/ogc/?SERVICE=WFS...`
+ - WMS - `https://app.merginmaps.com/app/ogc/?SERVICE=WMS...`
+
+Map script must be placed in your project root folder and named `map-script.js`. Members with writer and higher permission can update the script.
+
+## Helpful code snippets
+
+OpenLayers submodules imports from CDN
+```js
+import TileLayer from 'https://esm.sh/ol@10.8.0/layer/Tile'
+import { fromLonLat } from 'https://esm.sh/ol@10.8.0/proj'
+import XYZ from 'https://esm.sh/ol@10.8.0/source/XYZ'
+```
+
+Add custom XYZ layer (e.g. a basemap)
+```js
+const layer = new TileLayer({
+ name: 'My layer name',
+ source: new XYZ({
+ url: '...',
+ attributions: '...',
+ })
+})
+
+MerginMaps.getMap().addLayer(layer)
+```
+
+## Examples
+
+OpenLayers API availability opens a wide range of possibilities. Here we list a couple of examples of what you can achieve.
+
+
+| Example project | Map view | Map-script file |
+|-------|------|-------|
+| Light basemap example | [View map](https://app.merginmaps.com/maps/2kkKbiNZNPqd2_rogueUJMvRItE?cx=-1.795099776978127&cy=51.78119919095403&cz=13) | [map-script.js](https://app.merginmaps.com/projects/MerginMaps-Showcase/AS%20w%20light/tree?file_path=map-script.js) |
+| Example with measurement tools, address search and location | [View map](https://app.merginmaps.com/maps/abPOz6uw9A7DeOeq2OTqIbJMtpg) | [map-script.js](https://app.merginmaps.com/projects/MerginMaps-Showcase/AS%20w%20measure/tree?file_path=map-script.js) |
+
+
+
+## Custom webmap app with AI coding agent
+
+If you are using any AI coding agent, this is an example prompt that can help you start off the development of custom application. Fill in the **"What I want"** section.
+
+```
+You are building a custom **map script** for a Mergin Maps web map project: a
+standalone JavaScript ES module that runs on top of the project's OpenLayers map.
+
+## What I want
+[DESCRIBE YOUR FEATURE — e.g. "a button that centres the map on my GPS location
+and drops a marker", "a panel listing every feature in layer X", "a tool to
+measure distance and area".]
+
+## Runtime environment
+- The script runs inside a sandboxed `srcdoc` iframe embedded in the Mergin Maps
+ map page. A global `MerginMaps` object gives you the map:
+ - `MerginMaps.getMap()` → the OpenLayers `Map` instance
+ - `MerginMaps.getMapElement()` → the map container DOM element
+- Import OpenLayers submodules from a CDN, e.g.
+ `import Overlay from 'https://esm.sh/ol@10.8.0/Overlay'`. Pin the OpenLayers
+ version your Mergin Maps uses (10.8.0 at the time of writing). No build step.
+
+Project's layers are served over OGC here:
+- WFS: `${parent.location.origin}/app/ogc/?SERVICE=WFS...`
+- WMS: `${parent.location.origin}/app/ogc/?SERVICE=WMS...`
+Tip: `` is generated only once the map is made public ("Share map" in the UI). If there is no map link, ask me to publish the map first. Read the map-link from the `GET app/projects//map-links` API endpoint.
+
+## Guidelines for this environment
+- Build UI with `document.createElement` and set styles via
+ `Object.assign(el.style, {...})`. Append it to the map element with
+ `position: absolute` and a high `z-index`.
+- Do not inject `