From f74a9484c4f76b998a0ab33dd878beaddd6b7d48 Mon Sep 17 00:00:00 2001 From: CalebRas Date: Thu, 1 Jun 2023 09:32:51 -0700 Subject: [PATCH 01/29] Add ReadME --- Samples.xcodeproj/project.pbxproj | 12 +++++ .../README.md | 46 +++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 Shared/Samples/Set up location-driven geotriggers/README.md diff --git a/Samples.xcodeproj/project.pbxproj b/Samples.xcodeproj/project.pbxproj index 891908864..3a3b88a30 100644 --- a/Samples.xcodeproj/project.pbxproj +++ b/Samples.xcodeproj/project.pbxproj @@ -105,6 +105,7 @@ D75362D32A1E8C8800D83028 /* ApplyUniqueValueRendererView.swift in Copy Source Code Files */ = {isa = PBXBuildFile; fileRef = D75362D12A1E886700D83028 /* ApplyUniqueValueRendererView.swift */; }; D754E3232A1D66820006C5F1 /* StylePointWithPictureMarkerSymbolsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D754E3222A1D66820006C5F1 /* StylePointWithPictureMarkerSymbolsView.swift */; }; D754E3242A1D66C20006C5F1 /* StylePointWithPictureMarkerSymbolsView.swift in Copy Source Code Files */ = {isa = PBXBuildFile; fileRef = D754E3222A1D66820006C5F1 /* StylePointWithPictureMarkerSymbolsView.swift */; }; + D769C20F2A28FF8600030F61 /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = D769C20E2A28FF8600030F61 /* README.md */; }; D7E557682A1D768800B9FB09 /* AddWMSLayerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7E557672A1D768800B9FB09 /* AddWMSLayerView.swift */; }; D7E9EF292A1D2219000C4865 /* SetMinAndMaxScaleView.swift in Copy Source Code Files */ = {isa = PBXBuildFile; fileRef = D7EAF3592A1C023800D822C4 /* SetMinAndMaxScaleView.swift */; }; D7E9EF2A2A1D29F2000C4865 /* SetMaxExtentView.swift in Copy Source Code Files */ = {isa = PBXBuildFile; fileRef = D734FA092A183A5B00246D7E /* SetMaxExtentView.swift */; }; @@ -318,6 +319,7 @@ D734FA092A183A5B00246D7E /* SetMaxExtentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SetMaxExtentView.swift; sourceTree = ""; }; D75362D12A1E886700D83028 /* ApplyUniqueValueRendererView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApplyUniqueValueRendererView.swift; sourceTree = ""; }; D754E3222A1D66820006C5F1 /* StylePointWithPictureMarkerSymbolsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StylePointWithPictureMarkerSymbolsView.swift; sourceTree = ""; }; + D769C20E2A28FF8600030F61 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; D7E557672A1D768800B9FB09 /* AddWMSLayerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddWMSLayerView.swift; sourceTree = ""; }; D7EAF3592A1C023800D822C4 /* SetMinAndMaxScaleView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SetMinAndMaxScaleView.swift; sourceTree = ""; }; E000E75F2869E33D005D87C5 /* ClipGeometryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClipGeometryView.swift; sourceTree = ""; }; @@ -468,6 +470,7 @@ D734FA072A183A5A00246D7E /* Set max extent */, D7EAF34F2A1C011000D822C4 /* Set min and max scale */, E088E1552862578800413100 /* Set surface placement mode */, + D769C20D2A28FF8600030F61 /* Set up location-driven geotriggers */, E004A6B928414332002A1FE6 /* Set viewpoint rotation */, E004A6DE2846626A002A1FE6 /* Show callout */, E004A6E728493BBB002A1FE6 /* Show device location */, @@ -758,6 +761,14 @@ path = "Style point with picture marker symbols"; sourceTree = ""; }; + D769C20D2A28FF8600030F61 /* Set up location-driven geotriggers */ = { + isa = PBXGroup; + children = ( + D769C20E2A28FF8600030F61 /* README.md */, + ); + path = "Set up location-driven geotriggers"; + sourceTree = ""; + }; D7E557602A1D743100B9FB09 /* Add WMS layer */ = { isa = PBXGroup; children = ( @@ -1058,6 +1069,7 @@ 00D4EF9028638BF100B9CC30 /* LA_Trails.geodatabase in Resources */, 00D4EF9A28638BF100B9CC30 /* AuroraCO.gpkg in Resources */, F111CCC4288B641900205358 /* Yellowstone.mmpk in Resources */, + D769C20F2A28FF8600030F61 /* README.md in Resources */, 00D4EFB12863CE6300B9CC30 /* ScottishWildlifeTrust_reserves in Resources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/Shared/Samples/Set up location-driven geotriggers/README.md b/Shared/Samples/Set up location-driven geotriggers/README.md new file mode 100644 index 000000000..60c875d03 --- /dev/null +++ b/Shared/Samples/Set up location-driven geotriggers/README.md @@ -0,0 +1,46 @@ +# Set up location-driven geotriggers + +Create a notification every time a given location data source has entered and/or exited a set of features or graphics. + +![Geotriggers](set-up-location-driven-geotriggers.png) + +## Use case + +Geotriggers can be used to notify users when they have entered or exited a geofence by monitoring a given set of features or graphics. They could be used to display contextual information to museum visitors about nearby exhibits, notify hikers when they have wandered off their desired trail, notify dispatchers when service workers arrive at a scene, or more. + +## How to use the sample + +Observe a virtual walking tour of the Santa Barbara Botanic Garden. Information about the user's current Garden Section, as well as information about nearby points of interest within 10 meters will display or be removed from the UI when the user enters or exits the buffer of each feature. + +## How it works + +1. Create a `GeotriggerFeed` with an `AbstractLocationDataSource` class (in this case, a `SimulatedLocationDataSource`). +2. Create a `FeatureFenceParameters` class from a `ServiceFeatureTable`, a buffer distance at which to monitor each feature, an Arcade Expression, and a name for the specific geotrigger. +3. Create a `FenceGeotrigger` with the geotrigger feed, a `FenceRuleType`, and the fence parameters. +4. Create a `GeotriggerMonitor` with the fence geotrigger and call `GeotriggerMonitor::start()` to begin listening for events that meet the `FenceRuleType`. +5. When a `GeotriggerMonitor::geotriggerNotification` emits, capture the `GeotriggerNotificationInfo`. +6. For more information about the feature that triggered the notification, cast the `GeotriggerNotificationInfo` to a `FenceGeotriggerNotificationInfo` and call `FenceGeotriggerNotificationInfo::fenceGeoElement()`. +7. Depending on the `FenceGeotriggerNotificationInfo::fenceNotificationType()` display or hide information on the UI from the `GeoElement`'s attributes. + +## Relevant API + +* ArcadeExpression +* FeatureFenceParameters +* FenceGeotrigger +* FenceGeotriggerNotificationInfo +* FenceGeotrigger.RuleType +* GeoElement +* Geotrigger +* GeotriggerFeed +* GeotriggerMonitor +* GeotriggerNotificationInfo +* ServiceFeatureTable +* SimulatedLocationDataSource + +## About the data + +This sample uses the [Santa Barbara Botanic Garden Geotriggers Sample](https://arcgisruntime.maps.arcgis.com/home/item.html?id=6ab0e91dc39e478cae4f408e1a36a308) ArcGIS Online Web Map which includes a georeferenced map of the garden as well as select polygon and point features to denote garden sections and points of interest. Description text and attachment images in the feature layers were provided by the Santa Barbara Botanic Garden and more information can be found on the [Garden Sections & Displays](https://www.sbbg.org/explore-garden/garden-sections-displays) portion of their website. All assets are used with permission from the Santa Barbara Botanic Garden. For more information, visit the [Santa Barbara Botanic Garden](https://www.sbbg.org) website. + +## Tags + +alert, arcade, fence, geofence, geotrigger, location, navigation, notification, notify, routing, trigger From ed8d9c4b4395275f2680854595c43a7be61fb506 Mon Sep 17 00:00:00 2001 From: CalebRas Date: Thu, 1 Jun 2023 09:41:59 -0700 Subject: [PATCH 02/29] Add view file --- Samples.xcodeproj/project.pbxproj | 4 ++ .../SetUpLocationDrivenGeotriggersView.swift | 38 +++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift diff --git a/Samples.xcodeproj/project.pbxproj b/Samples.xcodeproj/project.pbxproj index 3a3b88a30..05b540bc3 100644 --- a/Samples.xcodeproj/project.pbxproj +++ b/Samples.xcodeproj/project.pbxproj @@ -106,6 +106,7 @@ D754E3232A1D66820006C5F1 /* StylePointWithPictureMarkerSymbolsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D754E3222A1D66820006C5F1 /* StylePointWithPictureMarkerSymbolsView.swift */; }; D754E3242A1D66C20006C5F1 /* StylePointWithPictureMarkerSymbolsView.swift in Copy Source Code Files */ = {isa = PBXBuildFile; fileRef = D754E3222A1D66820006C5F1 /* StylePointWithPictureMarkerSymbolsView.swift */; }; D769C20F2A28FF8600030F61 /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = D769C20E2A28FF8600030F61 /* README.md */; }; + D769C2122A29019B00030F61 /* SetUpLocationDrivenGeotriggersView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D769C2112A29019B00030F61 /* SetUpLocationDrivenGeotriggersView.swift */; }; D7E557682A1D768800B9FB09 /* AddWMSLayerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7E557672A1D768800B9FB09 /* AddWMSLayerView.swift */; }; D7E9EF292A1D2219000C4865 /* SetMinAndMaxScaleView.swift in Copy Source Code Files */ = {isa = PBXBuildFile; fileRef = D7EAF3592A1C023800D822C4 /* SetMinAndMaxScaleView.swift */; }; D7E9EF2A2A1D29F2000C4865 /* SetMaxExtentView.swift in Copy Source Code Files */ = {isa = PBXBuildFile; fileRef = D734FA092A183A5B00246D7E /* SetMaxExtentView.swift */; }; @@ -320,6 +321,7 @@ D75362D12A1E886700D83028 /* ApplyUniqueValueRendererView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApplyUniqueValueRendererView.swift; sourceTree = ""; }; D754E3222A1D66820006C5F1 /* StylePointWithPictureMarkerSymbolsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StylePointWithPictureMarkerSymbolsView.swift; sourceTree = ""; }; D769C20E2A28FF8600030F61 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + D769C2112A29019B00030F61 /* SetUpLocationDrivenGeotriggersView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SetUpLocationDrivenGeotriggersView.swift; sourceTree = ""; }; D7E557672A1D768800B9FB09 /* AddWMSLayerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddWMSLayerView.swift; sourceTree = ""; }; D7EAF3592A1C023800D822C4 /* SetMinAndMaxScaleView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SetMinAndMaxScaleView.swift; sourceTree = ""; }; E000E75F2869E33D005D87C5 /* ClipGeometryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClipGeometryView.swift; sourceTree = ""; }; @@ -764,6 +766,7 @@ D769C20D2A28FF8600030F61 /* Set up location-driven geotriggers */ = { isa = PBXGroup; children = ( + D769C2112A29019B00030F61 /* SetUpLocationDrivenGeotriggersView.swift */, D769C20E2A28FF8600030F61 /* README.md */, ); path = "Set up location-driven geotriggers"; @@ -1195,6 +1198,7 @@ E066DD3B2860CA08004D3D5B /* ShowResultOfSpatialRelationshipsView.swift in Sources */, 7573E81E29D6134C00BEED9C /* TraceUtilityNetworkView.Views.swift in Sources */, 4D2ADC5A29C4F612003B367F /* ChangeMapViewBackgroundView.swift in Sources */, + D769C2122A29019B00030F61 /* SetUpLocationDrivenGeotriggersView.swift in Sources */, 0044CDDF2995C39E004618CE /* ShowDeviceLocationHistoryView.swift in Sources */, E041ABC0287CA9F00056009B /* WebView.swift in Sources */, E088E1572862579D00413100 /* SetSurfacePlacementModeView.swift in Sources */, diff --git a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift new file mode 100644 index 000000000..218a737a0 --- /dev/null +++ b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift @@ -0,0 +1,38 @@ +// Copyright 2023 Esri +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import ArcGIS +import SwiftUI + +struct SetUpLocationDrivenGeotriggersView: View { + /// The view model for the sample. + @StateObject private var model = Model() + + var body: some View { + // Create a map view to display the map. + MapView(map: model.map) + } +} + +private extension SetUpLocationDrivenGeotriggersView { + /// The view model for the sample. + class Model: ObservableObject { + /// A 'Map' + var map = Map() + + init() { + + } + } +} From c5dbc62f11136f407208d2dba6c0aa1fb1f4ba44 Mon Sep 17 00:00:00 2001 From: CalebRas Date: Thu, 1 Jun 2023 09:57:09 -0700 Subject: [PATCH 03/29] Add metadata --- Samples.xcodeproj/project.pbxproj | 4 -- .../README.metadata.json | 50 +++++++++++++++++++ 2 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 Shared/Samples/Set up location-driven geotriggers/README.metadata.json diff --git a/Samples.xcodeproj/project.pbxproj b/Samples.xcodeproj/project.pbxproj index 05b540bc3..b370847a8 100644 --- a/Samples.xcodeproj/project.pbxproj +++ b/Samples.xcodeproj/project.pbxproj @@ -105,7 +105,6 @@ D75362D32A1E8C8800D83028 /* ApplyUniqueValueRendererView.swift in Copy Source Code Files */ = {isa = PBXBuildFile; fileRef = D75362D12A1E886700D83028 /* ApplyUniqueValueRendererView.swift */; }; D754E3232A1D66820006C5F1 /* StylePointWithPictureMarkerSymbolsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D754E3222A1D66820006C5F1 /* StylePointWithPictureMarkerSymbolsView.swift */; }; D754E3242A1D66C20006C5F1 /* StylePointWithPictureMarkerSymbolsView.swift in Copy Source Code Files */ = {isa = PBXBuildFile; fileRef = D754E3222A1D66820006C5F1 /* StylePointWithPictureMarkerSymbolsView.swift */; }; - D769C20F2A28FF8600030F61 /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = D769C20E2A28FF8600030F61 /* README.md */; }; D769C2122A29019B00030F61 /* SetUpLocationDrivenGeotriggersView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D769C2112A29019B00030F61 /* SetUpLocationDrivenGeotriggersView.swift */; }; D7E557682A1D768800B9FB09 /* AddWMSLayerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7E557672A1D768800B9FB09 /* AddWMSLayerView.swift */; }; D7E9EF292A1D2219000C4865 /* SetMinAndMaxScaleView.swift in Copy Source Code Files */ = {isa = PBXBuildFile; fileRef = D7EAF3592A1C023800D822C4 /* SetMinAndMaxScaleView.swift */; }; @@ -320,7 +319,6 @@ D734FA092A183A5B00246D7E /* SetMaxExtentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SetMaxExtentView.swift; sourceTree = ""; }; D75362D12A1E886700D83028 /* ApplyUniqueValueRendererView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApplyUniqueValueRendererView.swift; sourceTree = ""; }; D754E3222A1D66820006C5F1 /* StylePointWithPictureMarkerSymbolsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StylePointWithPictureMarkerSymbolsView.swift; sourceTree = ""; }; - D769C20E2A28FF8600030F61 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; D769C2112A29019B00030F61 /* SetUpLocationDrivenGeotriggersView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SetUpLocationDrivenGeotriggersView.swift; sourceTree = ""; }; D7E557672A1D768800B9FB09 /* AddWMSLayerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddWMSLayerView.swift; sourceTree = ""; }; D7EAF3592A1C023800D822C4 /* SetMinAndMaxScaleView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SetMinAndMaxScaleView.swift; sourceTree = ""; }; @@ -767,7 +765,6 @@ isa = PBXGroup; children = ( D769C2112A29019B00030F61 /* SetUpLocationDrivenGeotriggersView.swift */, - D769C20E2A28FF8600030F61 /* README.md */, ); path = "Set up location-driven geotriggers"; sourceTree = ""; @@ -1072,7 +1069,6 @@ 00D4EF9028638BF100B9CC30 /* LA_Trails.geodatabase in Resources */, 00D4EF9A28638BF100B9CC30 /* AuroraCO.gpkg in Resources */, F111CCC4288B641900205358 /* Yellowstone.mmpk in Resources */, - D769C20F2A28FF8600030F61 /* README.md in Resources */, 00D4EFB12863CE6300B9CC30 /* ScottishWildlifeTrust_reserves in Resources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/Shared/Samples/Set up location-driven geotriggers/README.metadata.json b/Shared/Samples/Set up location-driven geotriggers/README.metadata.json new file mode 100644 index 000000000..aecc86d1c --- /dev/null +++ b/Shared/Samples/Set up location-driven geotriggers/README.metadata.json @@ -0,0 +1,50 @@ +{ + "category": "Display information", + "description": "Create a notification every time a given location data source has entered and/or exited a set of features or graphics.", + "ignore": false, + "images": [], + "keywords": [ + "alert", + "arcade", + "fence", + "geofence", + "geotrigger", + "location", + "navigation", + "notification", + "notify", + "routing", + "trigger", + "ArcadeExpression", + "FeatureFenceParameters", + "FenceGeotrigger", + "FenceGeotrigger.RuleType", + "FenceGeotriggerNotificationInfo", + "GeoElement", + "Geotrigger", + "GeotriggerFeed", + "GeotriggerMonitor", + "GeotriggerNotificationInfo", + "ServiceFeatureTable", + "SimulatedLocationDataSource" + ], + "redirect_from": [], + "relevant_apis": [ + "ArcadeExpression", + "FeatureFenceParameters", + "FenceGeotrigger", + "FenceGeotrigger.RuleType", + "FenceGeotriggerNotificationInfo", + "GeoElement", + "Geotrigger", + "GeotriggerFeed", + "GeotriggerMonitor", + "GeotriggerNotificationInfo", + "ServiceFeatureTable", + "SimulatedLocationDataSource" + ], + "snippets": [ + "SetUpLocationDrivenGeotriggersView.swift" + ], + "title": "Set up location-driven geotriggers" +} From 0259e1ec680e9119de5d324fceeccaa3887aa2ef Mon Sep 17 00:00:00 2001 From: CalebRas Date: Thu, 1 Jun 2023 09:58:18 -0700 Subject: [PATCH 04/29] Add source file to Build Phases --- Samples.xcodeproj/project.pbxproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Samples.xcodeproj/project.pbxproj b/Samples.xcodeproj/project.pbxproj index b370847a8..077ad9239 100644 --- a/Samples.xcodeproj/project.pbxproj +++ b/Samples.xcodeproj/project.pbxproj @@ -106,6 +106,7 @@ D754E3232A1D66820006C5F1 /* StylePointWithPictureMarkerSymbolsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D754E3222A1D66820006C5F1 /* StylePointWithPictureMarkerSymbolsView.swift */; }; D754E3242A1D66C20006C5F1 /* StylePointWithPictureMarkerSymbolsView.swift in Copy Source Code Files */ = {isa = PBXBuildFile; fileRef = D754E3222A1D66820006C5F1 /* StylePointWithPictureMarkerSymbolsView.swift */; }; D769C2122A29019B00030F61 /* SetUpLocationDrivenGeotriggersView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D769C2112A29019B00030F61 /* SetUpLocationDrivenGeotriggersView.swift */; }; + D769C2132A29057200030F61 /* SetUpLocationDrivenGeotriggersView.swift in Copy Source Code Files */ = {isa = PBXBuildFile; fileRef = D769C2112A29019B00030F61 /* SetUpLocationDrivenGeotriggersView.swift */; }; D7E557682A1D768800B9FB09 /* AddWMSLayerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7E557672A1D768800B9FB09 /* AddWMSLayerView.swift */; }; D7E9EF292A1D2219000C4865 /* SetMinAndMaxScaleView.swift in Copy Source Code Files */ = {isa = PBXBuildFile; fileRef = D7EAF3592A1C023800D822C4 /* SetMinAndMaxScaleView.swift */; }; D7E9EF2A2A1D29F2000C4865 /* SetMaxExtentView.swift in Copy Source Code Files */ = {isa = PBXBuildFile; fileRef = D734FA092A183A5B00246D7E /* SetMaxExtentView.swift */; }; @@ -201,6 +202,7 @@ dstPath = ""; dstSubfolderSpec = 7; files = ( + D769C2132A29057200030F61 /* SetUpLocationDrivenGeotriggersView.swift in Copy Source Code Files */, D754E3242A1D66C20006C5F1 /* StylePointWithPictureMarkerSymbolsView.swift in Copy Source Code Files */, D7F2784C2A1D76F5002E4567 /* AddWMSLayerView.swift in Copy Source Code Files */, D75362D32A1E8C8800D83028 /* ApplyUniqueValueRendererView.swift in Copy Source Code Files */, From be83b688dc7a0c7d12563da346cb3ffe3c7cc81d Mon Sep 17 00:00:00 2001 From: CalebRas Date: Thu, 1 Jun 2023 11:26:00 -0700 Subject: [PATCH 05/29] Add map --- .../SetUpLocationDrivenGeotriggersView.swift | 66 ++++++++++++++++++- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift index 218a737a0..ab109710b 100644 --- a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift +++ b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift @@ -21,7 +21,7 @@ struct SetUpLocationDrivenGeotriggersView: View { var body: some View { // Create a map view to display the map. - MapView(map: model.map) + MapView(map: model.map, graphicsOverlays: [model.graphicsOverlay]) } } @@ -29,10 +29,72 @@ private extension SetUpLocationDrivenGeotriggersView { /// The view model for the sample. class Model: ObservableObject { /// A 'Map' - var map = Map() + var map: Map + + /// + let graphicsOverlay = GraphicsOverlay() + + /// A simulated location data source for demo purposes. + var simulatedLocationDataSource: SimulatedLocationDataSource! + init() { + map = makeMap() + } + + + + /// Create a map. + func makeMap() -> Map { + // Load a map with predefined tile basemap, feature styles, and labels. + let map = Map(item: PortalItem( + portal: .arcGISOnline(connection: .anonymous), + id: Item.ID(rawValue: "6ab0e91dc39e478cae4f408e1a36a308")! + )) + map.load { [weak self] _ in + guard let self = self else { return } + + // Set up location display with a simulated location data source. + let locationDataSource = self.makeDataSource(polylineJSONString: Self.walkingTourPolylineJSON) + self.simulatedLocationDataSource = locationDataSource + self.startDisplayingLocation(using: locationDataSource) + + // Get the service feature tables from the map's operational layers. + if let operationalLayers = map.operationalLayers as? [FeatureLayer], + let gardenSectionsLayer = operationalLayers.first(where: { $0.item?.itemID == "1ba816341ea04243832136379b8951d9" }), + let gardenPOIsLayer = operationalLayers.first(where: { $0.item?.itemID == "7c6280c290c34ae8aeb6b5c4ec841167" }), + let gardenSections = gardenSectionsLayer.featureTable as? ServiceFeatureTable, + let gardenPOIs = gardenPOIsLayer.featureTable as? ServiceFeatureTable { + // Create geotriggers for each of the service feature tables. + let geotriggerFeed = LocationGeotriggerFeed(locationDataSource: locationDataSource) + self.startMonitoring(feed: geotriggerFeed, featureTable: gardenSections, bufferDistance: 0.0, fenceGeotriggerName: Self.sectionFenceGeotriggerName) + self.startMonitoring(feed: geotriggerFeed, featureTable: gardenPOIs, bufferDistance: 10.0, fenceGeotriggerName: Self.poiFenceGeotriggerName) + } + } + return map + } + + /// Create a simulated location data source from a GeoJSON. + func makeDataSource(polylineJSONString: String) -> SimulatedLocationDataSource { + let simulatedDataSource = SimulatedLocationDataSource() + let jsonObject = try? JSONSerialization.jsonObject(with: polylineJSONString.data(using: .utf8)!) + let routePolyline = try? Polyline.fromJSON(jsonObject! as! String) as? Polyline + // Densify the polyline to control the simulation speed. + let densifiedRoute = GeometryEngine.geodeticDensify( + routePolyline!, + maxSegmentLength: 5.0, + lengthUnit: .meters, + curveType: .geodesic + ) as! Polyline + simulatedDataSource.setSimulatedLocations(with: densifiedRoute) + return simulatedDataSource } } } + + +private extension PortalItem.ID { + /// The . + static var incidentsInSanFrancisco: Self { Self("fb788308ea2e4d8682b9c05ef641f273")! } +} From 6e68a0d86847288bb7806db7fb8a52371cb05ffa Mon Sep 17 00:00:00 2001 From: CalebRas Date: Thu, 1 Jun 2023 13:16:04 -0700 Subject: [PATCH 06/29] Add map data --- .../SetUpLocationDrivenGeotriggersView.swift | 133 +++++++++++++----- 1 file changed, 95 insertions(+), 38 deletions(-) diff --git a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift index ab109710b..929d61c37 100644 --- a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift +++ b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift @@ -19,30 +19,53 @@ struct SetUpLocationDrivenGeotriggersView: View { /// The view model for the sample. @StateObject private var model = Model() + /// A Boolean value indicating whether to show an alert. + @State private var isShowingAlert = false + + /// The error shown in the alert. + @State private var error: Error? { + didSet { isShowingAlert = error != nil } + } + var body: some View { // Create a map view to display the map. - MapView(map: model.map, graphicsOverlays: [model.graphicsOverlay]) + MapView(map: model.map) + .locationDisplay(model.locationDisplay) + .task { + do { + try await model.map.load() + try await model.locationDisplay.dataSource.start() + } catch { + // Present an error message if the raster fails to load. + self.error = error + } + } + .alert(isPresented: $isShowingAlert, presentingError: error) } } private extension SetUpLocationDrivenGeotriggersView { /// The view model for the sample. class Model: ObservableObject { - /// A 'Map' - var map: Map + /// A map + lazy var map: Map = { + let map = makeMap() + return map + }() /// - let graphicsOverlay = GraphicsOverlay() - - /// A simulated location data source for demo purposes. - var simulatedLocationDataSource: SimulatedLocationDataSource! - - - init() { - map = makeMap() - } + lazy var locationDataSource = makeDataSource(polylineJSONString: walkingTourPolylineJSON) + /// The location display for the sample + lazy var locationDisplay: LocationDisplay = { + let locationDisplay = LocationDisplay(dataSource: locationDataSource) + locationDisplay.autoPanMode = .recenter + locationDisplay.initialZoomScale = 1000 + return locationDisplay + }() + /// A simulated location data source for demo purposes. + lazy var simulatedLocationDataSource = locationDataSource /// Create a map. func makeMap() -> Map { @@ -51,25 +74,17 @@ private extension SetUpLocationDrivenGeotriggersView { portal: .arcGISOnline(connection: .anonymous), id: Item.ID(rawValue: "6ab0e91dc39e478cae4f408e1a36a308")! )) - map.load { [weak self] _ in - guard let self = self else { return } - - // Set up location display with a simulated location data source. - let locationDataSource = self.makeDataSource(polylineJSONString: Self.walkingTourPolylineJSON) - self.simulatedLocationDataSource = locationDataSource - self.startDisplayingLocation(using: locationDataSource) - - // Get the service feature tables from the map's operational layers. - if let operationalLayers = map.operationalLayers as? [FeatureLayer], - let gardenSectionsLayer = operationalLayers.first(where: { $0.item?.itemID == "1ba816341ea04243832136379b8951d9" }), - let gardenPOIsLayer = operationalLayers.first(where: { $0.item?.itemID == "7c6280c290c34ae8aeb6b5c4ec841167" }), - let gardenSections = gardenSectionsLayer.featureTable as? ServiceFeatureTable, - let gardenPOIs = gardenPOIsLayer.featureTable as? ServiceFeatureTable { - // Create geotriggers for each of the service feature tables. - let geotriggerFeed = LocationGeotriggerFeed(locationDataSource: locationDataSource) - self.startMonitoring(feed: geotriggerFeed, featureTable: gardenSections, bufferDistance: 0.0, fenceGeotriggerName: Self.sectionFenceGeotriggerName) - self.startMonitoring(feed: geotriggerFeed, featureTable: gardenPOIs, bufferDistance: 10.0, fenceGeotriggerName: Self.poiFenceGeotriggerName) - } + + // Get the service feature tables from the map's operational layers. + if let operationalLayers = map.operationalLayers as? [FeatureLayer], + let gardenSectionsLayer = operationalLayers.first(where: { $0.item?.id == Item.ID(rawValue: "1ba816341ea04243832136379b8951d9") }), + let gardenPOIsLayer = operationalLayers.first(where: { $0.item?.id == Item.ID(rawValue: "7c6280c290c34ae8aeb6b5c4ec841167") }), + let gardenSections = gardenSectionsLayer.featureTable as? ServiceFeatureTable, + let gardenPOIs = gardenPOIsLayer.featureTable as? ServiceFeatureTable { + // Create geotriggers for each of the service feature tables. + let geotriggerFeed = LocationGeotriggerFeed(locationDataSource: locationDataSource) + startMonitoring(feed: geotriggerFeed, featureTable: gardenSections, bufferDistance: 0.0, fenceGeotriggerName: sectionFenceGeotriggerName) + startMonitoring(feed: geotriggerFeed, featureTable: gardenPOIs, bufferDistance: 10.0, fenceGeotriggerName: poiFenceGeotriggerName) } return map } @@ -77,10 +92,11 @@ private extension SetUpLocationDrivenGeotriggersView { /// Create a simulated location data source from a GeoJSON. func makeDataSource(polylineJSONString: String) -> SimulatedLocationDataSource { let simulatedDataSource = SimulatedLocationDataSource() - let jsonObject = try? JSONSerialization.jsonObject(with: polylineJSONString.data(using: .utf8)!) - let routePolyline = try? Polyline.fromJSON(jsonObject! as! String) as? Polyline + let jsonObject = try? JSONSerialization.jsonObject( + with: polylineJSONString.data(using: .utf8)! + ) as? String + let routePolyline = try? Polyline.fromJSON(jsonObject!) // Densify the polyline to control the simulation speed. - let densifiedRoute = GeometryEngine.geodeticDensify( routePolyline!, maxSegmentLength: 5.0, @@ -90,11 +106,52 @@ private extension SetUpLocationDrivenGeotriggersView { simulatedDataSource.setSimulatedLocations(with: densifiedRoute) return simulatedDataSource } + + /// Create a geotrigger monitor and start observing its notifications. + /// - Parameters: + /// - feed: The `AGSGeotriggerFeed` that is monitored for changes. + /// - featureTable: The `AGSFeatureTable` that contains the features to use + /// in the `AGSFeatureFenceParameters`. + /// - bufferDistance: A buffer distance in meters to apply to the features + /// when checking if an `AGSFenceGeotrigger` condition is met. + /// - fenceGeotriggerName: The name for the `AGSFenceGeotrigger`. + func startMonitoring(feed: GeotriggerFeed, featureTable: ServiceFeatureTable, bufferDistance: Double, fenceGeotriggerName: String) { + let fenceParameters = FeatureFenceParameters( + featureTable: featureTable, + bufferDistance: bufferDistance + ) + // The Arcade expression in the fence geotrigger returns the value for + // the "name" field of the feature that triggered the monitor. + let fenceGeotrigger = FenceGeotrigger( + feed: feed, + ruleType: .enterOrExit, + fenceParameters: fenceParameters, + messageExpression: ArcadeExpression(expression: "$fenceFeature.name"), + name: fenceGeotriggerName + ) + /* + // Create and start the geotrigger monitor. + let geotriggerMonitor = GeotriggerMonitor(geotrigger: fenceGeotrigger) + //geotriggerMonitor.start() + geotriggerMonitors.append(geotriggerMonitor) + + // Observe geotrigger notifications. + let observer = NotificationCenter.default.addObserver( + forName: .AGSGeotriggerMonitorDidTrigger, + object: geotriggerMonitor, + queue: nil, + using: { [weak self] note in self?.handleGeotriggerNotification(note) } + ) + observers.append(observer) + */ + } } } - -private extension PortalItem.ID { - /// The . - static var incidentsInSanFrancisco: Self { Self("fb788308ea2e4d8682b9c05ef641f273")! } +private extension SetUpLocationDrivenGeotriggersView { + static let sectionFenceGeotriggerName = "Section Fence Geotrigger" + static let poiFenceGeotriggerName = "POI Fence Geotrigger" + + /// A path in Santa Barbara Botanic Garden in GeoJSON format. + static let walkingTourPolylineJSON = #"{"paths":[[[-119.709881177746,34.4570041646846],[-119.709875813328,34.4570152227745],[-119.709869107805,34.4570240692453],[-119.709859720074,34.4570351273326],[-119.709853014551,34.4570539260775],[-119.709847650133,34.4570760422426],[-119.709848991238,34.4570926293626],[-119.70985569676,34.4571103222869],[-119.709873131119,34.4571202745552],[-119.709889224373,34.4571302268223],[-119.709902635418,34.4571357558591],[-119.709910682045,34.4571600836165],[-119.709910682045,34.4571744591062],[-119.709902635418,34.4571833055602],[-119.709889224373,34.4571910462067],[-119.70988251885,34.4571965752394],[-119.70988251885,34.4572032100782],[-119.709889224373,34.4572175855605],[-119.709898612104,34.4572264320099],[-119.709912023149,34.4572341726524],[-119.709901294313,34.4572419132941],[-119.709895929895,34.4572507597409],[-119.709897271,34.4572596061868],[-119.709902635418,34.4572728758539],[-119.709902635418,34.4572828281028],[-119.70990934094,34.457294991961],[-119.709912023149,34.4573038384022],[-119.709886542164,34.4573115790375],[-119.709861061178,34.4573248486963],[-119.709843626819,34.4573414357669],[-119.709836921297,34.4573668692686],[-119.709843626819,34.4573934085666],[-119.709827533565,34.4574055724087],[-119.709791323744,34.4574188420525],[-119.709749749504,34.4574332174977],[-119.709709516369,34.4574431697275],[-119.709734997354,34.4574807670294],[-119.709748062646,34.4575248306656],[-119.709757450378,34.4575635337324],[-119.709770861423,34.457600025179],[-119.709785613572,34.4576387282109],[-119.70980573014,34.4576730080242],[-119.709815117871,34.4577117110223],[-119.709821823394,34.4577504140025],[-119.709821823394,34.4577869053674],[-119.709821823394,34.4578256083127],[-119.70981780008,34.4578609938471],[-119.709819141185,34.457906331541],[-119.70981460448,34.4579890675855],[-119.709818627793,34.4580675790658],[-119.70982667442,34.4581118108532],[-119.709832038838,34.4581471962662],[-119.709834721047,34.4581947453913],[-119.709836062152,34.4582323423548],[-119.709834721047,34.4582787856393],[-119.709805216748,34.4583429215611],[-119.709759619195,34.4584026342716],[-119.709700610597,34.4584612411497],[-119.709645400048,34.4585103926263],[-119.709566274882,34.4585457778704],[-119.709493855239,34.4585944325566],[-119.709458986522,34.458622077252],[-119.709424117805,34.4586198656767],[-119.709386566878,34.4586110193749],[-119.70935438037,34.4586110193749],[-119.709339628221,34.4586231830396],[-119.709324876071,34.4586585682359],[-119.709306100608,34.4586862129101],[-119.709269890786,34.4587171749343],[-119.709244409801,34.4587238096523],[-119.709229657651,34.4587293385835],[-119.709212223293,34.4587459253751],[-119.70919076562,34.4587945799446],[-119.709174672366,34.4588503400161],[-119.709157238008,34.4589288506865],[-119.709153214694,34.4589951976744],[-119.709155896903,34.4590449578807],[-119.70916394353,34.4590958238387],[-119.709186742307,34.4591323146156],[-119.709218928815,34.4591621706939],[-119.709237704278,34.4591831805204],[-119.709241727592,34.4592252001575],[-119.709238133851,34.459258658624],[-119.709219358388,34.4592796684262],[-119.709207288447,34.4592962551085],[-119.709208629552,34.4593084186733],[-119.709271661463,34.4593791884701],[-119.709310553494,34.4594267368937],[-119.709330670062,34.4594510639836],[-119.709353468838,34.4595008239182],[-119.70936285657,34.4595362087426],[-119.709423221989,34.4595943612845],[-119.709455408497,34.4596297460692],[-119.709487595005,34.459665130839],[-119.709507711573,34.4596817174446],[-119.709523804827,34.4596861405389],[-119.709557332439,34.4596894578594],[-119.709586836739,34.4596894578594],[-119.709593542261,34.4596772943501],[-119.709590860052,34.4596496500041],[-119.709572084589,34.4595777746615],[-119.709566720171,34.4595313320996],[-119.709578790112,34.4595136396883],[-119.709590860052,34.4594992646013],[-119.709627069874,34.4594882068404],[-119.709675349636,34.4595567649343],[-119.709735699339,34.4596197941001],[-119.709775932474,34.4596795058974],[-119.709802754564,34.4597126790997],[-119.709832258863,34.4597359003334],[-119.70986712758,34.4597171021923],[-119.70986980979,34.4596839289918],[-119.709865786476,34.4596308518435],[-119.709876515312,34.4595788804365],[-119.70988187973,34.4595346494263],[-119.709879197521,34.4594926299449],[-119.709852375431,34.4594539277723],[-119.709806777878,34.4593953215911],[-119.709767885847,34.4593212344729],[-119.709720947189,34.4592195028005],[-119.709708720088,34.4591478732967],[-119.709710061193,34.4591058536206],[-119.709707378984,34.459079314867],[-119.709652393699,34.4590262373344],[-119.709617524982,34.4589499383221],[-119.709626771268,34.4588695962162],[-119.709683097658,34.4588032491285],[-119.709730036316,34.4587391135603],[-119.709759540615,34.4586993052518],[-119.7097850216,34.4586650258598],[-119.710059948024,34.4587744987075],[-119.710104204473,34.4587932970608],[-119.710128443889,34.4587649224307],[-119.71019415801,34.4587096331253],[-119.710273283176,34.4586731421637],[-119.71031619852,34.4586532379961],[-119.710367160491,34.4586023717685],[-119.710392641477,34.4585747270665],[-119.710432874612,34.4585083797445],[-119.710471766643,34.4584453497398],[-119.710505294256,34.4584165991955],[-119.710575487456,34.4583689119728],[-119.710705574593,34.4583136224052],[-119.710780676446,34.4582627559707],[-119.710839685044,34.4582030431601],[-119.710895995717,34.4581546042213],[-119.710948298793,34.458095997128],[-119.710988531928,34.4580263320391],[-119.711015354018,34.4579511379096],[-119.711011330705,34.4579102234284],[-119.710985849719,34.4578847900921],[-119.710946957688,34.4578715205223],[-119.710779319625,34.4578847900921],[-119.71073908649,34.4578847900921],[-119.7107122644,34.4578604625458],[-119.71069751225,34.4578295002039],[-119.710674713473,34.4578095958352],[-119.710642526965,34.4577996436491],[-119.710614363771,34.457830606002],[-119.71057547174,34.4578571451526],[-119.710539261918,34.4578737321174],[-119.71049500547,34.4578858958895],[-119.710452090125,34.4578836842947],[-119.710413198095,34.4578748379149],[-119.710375647168,34.4578527219614],[-119.710336755138,34.4578350291944],[-119.710299204211,34.4578107016336],[-119.71027506433,34.4577885856631],[-119.710269605616,34.4577886418169],[-119.710240101317,34.4577510446536],[-119.710198527077,34.4576758502763],[-119.710154270628,34.4575984442288],[-119.710112696389,34.4575265671206],[-119.710044300059,34.4574381029023],[-119.709978842634,34.4573543166616],[-119.709966772693,34.4573410470074],[-119.709972137111,34.4573200367174],[-119.70997481932,34.4573023438375],[-119.709973478216,34.4572846509538],[-119.709970796007,34.457259217427],[-119.709931903976,34.4572348896984],[-119.709914469617,34.4572337838924],[-119.709893011945,34.4572171968005],[-119.709884965318,34.4571972922858],[-119.709902232039,34.4571821133624],[-119.70991161977,34.457167737874],[-119.709907596457,34.4571389868898],[-119.709919666397,34.4571235055865],[-119.709922348606,34.4571047068572],[-119.709918325293,34.4570836965077],[-119.709919666397,34.4570648977695],[-119.70992637192,34.4570516280694],[-119.709933077442,34.4570339351326],[-119.709935759651,34.4570151363832],[-119.709927713024,34.4570062899114],[-119.70991161977,34.4570018666751],[-119.709883456576,34.4570040782933]]],"spatialReference":{"wkid":4326,"latestWkid":4326}}"# } From 6b0eb4ce0a9f2a6bf0853ae3473f875bddc434b2 Mon Sep 17 00:00:00 2001 From: CalebRas Date: Thu, 1 Jun 2023 14:09:16 -0700 Subject: [PATCH 07/29] Add toolbar --- .../SetUpLocationDrivenGeotriggersView.swift | 56 +++++++++++++++++-- 1 file changed, 50 insertions(+), 6 deletions(-) diff --git a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift index 929d61c37..24706caa1 100644 --- a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift +++ b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift @@ -41,6 +41,18 @@ struct SetUpLocationDrivenGeotriggersView: View { } } .alert(isPresented: $isShowingAlert, presentingError: error) + .toolbar { + ToolbarItemGroup(placement: .bottomBar) { + // Create button. + Button("Current Selction") { + } + .disabled(model.currentSectionBarButtonItem) + // Reset button. + Button("Point of Interest") { + } + .disabled(model.pointOfInterestBarButtonItem) + } + } } } @@ -64,9 +76,42 @@ private extension SetUpLocationDrivenGeotriggersView { return locationDisplay }() + /// The name of the current garden section feature. If currently not in any + /// garden section, it will be `nil`. + var currentSectionName: String? { + featureNamesInFenceGeotrigger[sectionFenceGeotriggerName]?.last + } + /// The names of nearby point-of-interest features. + var nearbyPOINames: [String] { + featureNamesInFenceGeotrigger[poiFenceGeotriggerName] ?? [] + } + + /// A dictionary for the feature names in each fence geotrigger. + /// - Key: The name of a fence geotrigger. + /// - Value: An array of names of features within the fence. + var featureNamesInFenceGeotrigger: [String: [String]] = [:] { + didSet { + currentSectionBarButtonItem = currentSectionName != nil + pointOfInterestBarButtonItem = !nearbyPOINames.isEmpty + } + } + + /// A dictionary for nearby features. + var nearbyFeatures: [String: ArcGISFeature] = [:] + /// An array of observers for geotrigger monitor notifications. + var observers: [NSObjectProtocol] = [] + /// An array of geotrigger monitors. + var geotriggerMonitors: [GeotriggerMonitor] = [] + /// A simulated location data source for demo purposes. lazy var simulatedLocationDataSource = locationDataSource + /// A Boolean indicating + @Published var currentSectionBarButtonItem = false + + /// A Boolean + @Published var pointOfInterestBarButtonItem = false + /// Create a map. func makeMap() -> Map { // Load a map with predefined tile basemap, feature styles, and labels. @@ -91,18 +136,16 @@ private extension SetUpLocationDrivenGeotriggersView { /// Create a simulated location data source from a GeoJSON. func makeDataSource(polylineJSONString: String) -> SimulatedLocationDataSource { - let simulatedDataSource = SimulatedLocationDataSource() - let jsonObject = try? JSONSerialization.jsonObject( - with: polylineJSONString.data(using: .utf8)! - ) as? String - let routePolyline = try? Polyline.fromJSON(jsonObject!) // Densify the polyline to control the simulation speed. + let routePolyline = try? Polyline.fromJSON(polylineJSONString) let densifiedRoute = GeometryEngine.geodeticDensify( routePolyline!, maxSegmentLength: 5.0, lengthUnit: .meters, curveType: .geodesic ) as! Polyline + + let simulatedDataSource = SimulatedLocationDataSource() simulatedDataSource.setSimulatedLocations(with: densifiedRoute) return simulatedDataSource } @@ -129,12 +172,13 @@ private extension SetUpLocationDrivenGeotriggersView { messageExpression: ArcadeExpression(expression: "$fenceFeature.name"), name: fenceGeotriggerName ) - /* + // Create and start the geotrigger monitor. let geotriggerMonitor = GeotriggerMonitor(geotrigger: fenceGeotrigger) //geotriggerMonitor.start() geotriggerMonitors.append(geotriggerMonitor) + /* // Observe geotrigger notifications. let observer = NotificationCenter.default.addObserver( forName: .AGSGeotriggerMonitorDidTrigger, From de90ca2832c650dc0485e965681f77d866b5cf63 Mon Sep 17 00:00:00 2001 From: CalebRas Date: Fri, 2 Jun 2023 15:32:28 -0700 Subject: [PATCH 08/29] Update error handling. --- .../SetUpLocationDrivenGeotriggersView.swift | 125 ++++++++++-------- 1 file changed, 71 insertions(+), 54 deletions(-) diff --git a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift index 24706caa1..5325f46ac 100644 --- a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift +++ b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift @@ -19,28 +19,11 @@ struct SetUpLocationDrivenGeotriggersView: View { /// The view model for the sample. @StateObject private var model = Model() - /// A Boolean value indicating whether to show an alert. - @State private var isShowingAlert = false - - /// The error shown in the alert. - @State private var error: Error? { - didSet { isShowingAlert = error != nil } - } - var body: some View { // Create a map view to display the map. MapView(map: model.map) .locationDisplay(model.locationDisplay) - .task { - do { - try await model.map.load() - try await model.locationDisplay.dataSource.start() - } catch { - // Present an error message if the raster fails to load. - self.error = error - } - } - .alert(isPresented: $isShowingAlert, presentingError: error) + .alert(isPresented: $model.isShowingAlert, presentingError: model.alertError) .toolbar { ToolbarItemGroup(placement: .bottomBar) { // Create button. @@ -60,21 +43,13 @@ private extension SetUpLocationDrivenGeotriggersView { /// The view model for the sample. class Model: ObservableObject { /// A map - lazy var map: Map = { - let map = makeMap() - return map - }() + lazy var map = makeMap() /// lazy var locationDataSource = makeDataSource(polylineJSONString: walkingTourPolylineJSON) /// The location display for the sample - lazy var locationDisplay: LocationDisplay = { - let locationDisplay = LocationDisplay(dataSource: locationDataSource) - locationDisplay.autoPanMode = .recenter - locationDisplay.initialZoomScale = 1000 - return locationDisplay - }() + lazy var locationDisplay = makeLocationDisplay() /// The name of the current garden section feature. If currently not in any /// garden section, it will be `nil`. @@ -106,10 +81,18 @@ private extension SetUpLocationDrivenGeotriggersView { /// A simulated location data source for demo purposes. lazy var simulatedLocationDataSource = locationDataSource + /// A Boolean value indicating whether to show an alert. + @Published var isShowingAlert = false + + /// The error shown in the alert. + @Published var alertError: Error? { + didSet { isShowingAlert = alertError != nil } + } + /// A Boolean indicating @Published var currentSectionBarButtonItem = false - /// A Boolean + /// A Boolean indicating @Published var pointOfInterestBarButtonItem = false /// Create a map. @@ -119,20 +102,30 @@ private extension SetUpLocationDrivenGeotriggersView { portal: .arcGISOnline(connection: .anonymous), id: Item.ID(rawValue: "6ab0e91dc39e478cae4f408e1a36a308")! )) - - // Get the service feature tables from the map's operational layers. - if let operationalLayers = map.operationalLayers as? [FeatureLayer], - let gardenSectionsLayer = operationalLayers.first(where: { $0.item?.id == Item.ID(rawValue: "1ba816341ea04243832136379b8951d9") }), - let gardenPOIsLayer = operationalLayers.first(where: { $0.item?.id == Item.ID(rawValue: "7c6280c290c34ae8aeb6b5c4ec841167") }), - let gardenSections = gardenSectionsLayer.featureTable as? ServiceFeatureTable, - let gardenPOIs = gardenPOIsLayer.featureTable as? ServiceFeatureTable { - // Create geotriggers for each of the service feature tables. - let geotriggerFeed = LocationGeotriggerFeed(locationDataSource: locationDataSource) - startMonitoring(feed: geotriggerFeed, featureTable: gardenSections, bufferDistance: 0.0, fenceGeotriggerName: sectionFenceGeotriggerName) - startMonitoring(feed: geotriggerFeed, featureTable: gardenPOIs, bufferDistance: 10.0, fenceGeotriggerName: poiFenceGeotriggerName) + Task { + do { + try await map.load() + } catch { + alertError = error + } } return map } + + /// Create and start a location display. + func makeLocationDisplay() -> LocationDisplay { + let locationDisplay = LocationDisplay(dataSource: locationDataSource) + locationDisplay.autoPanMode = .recenter + locationDisplay.initialZoomScale = 1000 + Task { + do { + try await locationDisplay.dataSource.start() + } catch { + alertError = error + } + } + return locationDisplay + } /// Create a simulated location data source from a GeoJSON. func makeDataSource(polylineJSONString: String) -> SimulatedLocationDataSource { @@ -144,12 +137,26 @@ private extension SetUpLocationDrivenGeotriggersView { lengthUnit: .meters, curveType: .geodesic ) as! Polyline - let simulatedDataSource = SimulatedLocationDataSource() simulatedDataSource.setSimulatedLocations(with: densifiedRoute) return simulatedDataSource } + /// Start geotriggers. + func startMonitoring() { + // Get the service feature tables from the map's operational layers. + if let operationalLayers = map.operationalLayers as? [FeatureLayer], + let gardenSectionsLayer = operationalLayers.first(where: { $0.item?.id == Item.ID(rawValue: "1ba816341ea04243832136379b8951d9") }), + let gardenPOIsLayer = operationalLayers.first(where: { $0.item?.id == Item.ID(rawValue: "7c6280c290c34ae8aeb6b5c4ec841167") }), + let gardenSections = gardenSectionsLayer.featureTable as? ServiceFeatureTable, + let gardenPOIs = gardenPOIsLayer.featureTable as? ServiceFeatureTable { + // Create geotriggers for each of the service feature tables. + let geotriggerFeed = LocationGeotriggerFeed(locationDataSource: locationDataSource) + makeGeotrigger(feed: geotriggerFeed, featureTable: gardenSections, bufferDistance: 0.0, fenceGeotriggerName: sectionFenceGeotriggerName) + makeGeotrigger(feed: geotriggerFeed, featureTable: gardenPOIs, bufferDistance: 10.0, fenceGeotriggerName: poiFenceGeotriggerName) + } + } + /// Create a geotrigger monitor and start observing its notifications. /// - Parameters: /// - feed: The `AGSGeotriggerFeed` that is monitored for changes. @@ -158,7 +165,7 @@ private extension SetUpLocationDrivenGeotriggersView { /// - bufferDistance: A buffer distance in meters to apply to the features /// when checking if an `AGSFenceGeotrigger` condition is met. /// - fenceGeotriggerName: The name for the `AGSFenceGeotrigger`. - func startMonitoring(feed: GeotriggerFeed, featureTable: ServiceFeatureTable, bufferDistance: Double, fenceGeotriggerName: String) { + func makeGeotrigger(feed: GeotriggerFeed, featureTable: ServiceFeatureTable, bufferDistance: Double, fenceGeotriggerName: String) { let fenceParameters = FeatureFenceParameters( featureTable: featureTable, bufferDistance: bufferDistance @@ -175,23 +182,33 @@ private extension SetUpLocationDrivenGeotriggersView { // Create and start the geotrigger monitor. let geotriggerMonitor = GeotriggerMonitor(geotrigger: fenceGeotrigger) - //geotriggerMonitor.start() - geotriggerMonitors.append(geotriggerMonitor) + + Task { + do { + try await geotriggerMonitor.start() + geotriggerMonitors.append(geotriggerMonitor) + } catch { + alertError = error + } + } - /* - // Observe geotrigger notifications. - let observer = NotificationCenter.default.addObserver( - forName: .AGSGeotriggerMonitorDidTrigger, - object: geotriggerMonitor, - queue: nil, - using: { [weak self] note in self?.handleGeotriggerNotification(note) } - ) - observers.append(observer) - */ + // Observe geotrigger notifications. + let observer = NotificationCenter.default.addObserver( + forName: .none, + object: geotriggerMonitor, + queue: nil, + using: { [weak self] note in handleGeotriggerNotification(note) } + ) + observers.append(observer) } } } +/// Handle the notifications posted by `AGSGeotriggerMonitor` when the fence +/// geotrigger condition has been met. +func handleGeotriggerNotification(_ notification: Notification) { +} + private extension SetUpLocationDrivenGeotriggersView { static let sectionFenceGeotriggerName = "Section Fence Geotrigger" static let poiFenceGeotriggerName = "POI Fence Geotrigger" From 82729247560f0adfcc2f9e582fd53201bd843837 Mon Sep 17 00:00:00 2001 From: CalebRas Date: Tue, 6 Jun 2023 16:54:25 -0700 Subject: [PATCH 09/29] Add view model. --- .../SetUpLocationDrivenGeotriggersView.swift | 184 ++++++++++++++---- 1 file changed, 141 insertions(+), 43 deletions(-) diff --git a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift index 5325f46ac..1a0aad5ba 100644 --- a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift +++ b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift @@ -12,38 +12,105 @@ // See the License for the specific language governing permissions and // limitations under the License. -import ArcGIS import SwiftUI +import ArcGIS +import ArcGISToolkit struct SetUpLocationDrivenGeotriggersView: View { /// The view model for the sample. @StateObject private var model = Model() + /// The popup to be shown as the result of the layer identify operation. + @State private var popup: Popup? + + /// A Boolean indicate whether to show the popup. + @State var isShowingPopup = false + var body: some View { - // Create a map view to display the map. MapView(map: model.map) .locationDisplay(model.locationDisplay) - .alert(isPresented: $model.isShowingAlert, presentingError: model.alertError) + .task { + // Start geotrigger monitoring once the map loads. + do { + try await model.map.load() + model.startMonitoring() + } catch { + model.alertError = error + } + } + .overlay(alignment: .top) { + VStack { + Text("\(model.fenceGeotriggerString)\n") + .frame(maxWidth: .infinity, alignment: .leading) + + Text(model.nearbyFeaturesString) + .foregroundColor(.orange) + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.top, -24) + } + .padding(8) + .background(.thinMaterial, ignoresSafeAreaEdges: .horizontal) + } .toolbar { ToolbarItemGroup(placement: .bottomBar) { - // Create button. - Button("Current Selction") { + Button("Current Selection") { + let sectionFeature = model.nearbyFeatures[model.currentSectionName!]! + popup = Popup(geoElement: sectionFeature) + isShowingPopup = true } - .disabled(model.currentSectionBarButtonItem) - // Reset button. + .disabled(!model.currentSectionBarButtonItem) + .opacity(isShowingPopup ? 0 : 1) + Button("Point of Interest") { + let poiFeature = model.nearbyFeatures[model.nearbyPOINames.first!]! + popup = Popup(geoElement: poiFeature) + isShowingPopup = true } - .disabled(model.pointOfInterestBarButtonItem) + .disabled(!model.pointOfInterestBarButtonItem) + .opacity(isShowingPopup ? 0 : 1) } } + .floatingPanel( + selectedDetent: .constant(.full), + horizontalAlignment: .leading, + isPresented: $isShowingPopup + ) { + Group { + if let popup = popup { + PopupView(popup: popup, isPresented: $isShowingPopup) + .showCloseButton(true) + } + } + .padding() + } + .task(id: isShowingPopup) { + // Stop location updates when the popup is showing. + if isShowingPopup { + await model.locationDisplay.dataSource.stop() + } else { + do { + try await model.locationDisplay.dataSource.start() + } catch { + model.alertError = error + } + } + } + .alert(isPresented: $model.isShowingAlert, presentingError: model.alertError) } } private extension SetUpLocationDrivenGeotriggersView { /// The view model for the sample. class Model: ObservableObject { - /// A map - lazy var map = makeMap() + /// A map of the Santa Barbara Botanic Garden + var map: Map = { + // Load a map with predefined tile basemap, feature styles, and labels. + let map = Map(item: PortalItem( + portal: .arcGISOnline(connection: .anonymous), + id: .santaBarbaraBotanicGardenMap + )) + return map + }() /// lazy var locationDataSource = makeDataSource(polylineJSONString: walkingTourPolylineJSON) @@ -61,6 +128,12 @@ private extension SetUpLocationDrivenGeotriggersView { featureNamesInFenceGeotrigger[poiFenceGeotriggerName] ?? [] } + /// The label to display fence geotrigger notification status. + @Published var fenceGeotriggerString = "Fence geotrigger info will be shown here." + + /// The label to display names of the currently nearby features. + @Published var nearbyFeaturesString = "Nearby features will be shown here." + /// A dictionary for the feature names in each fence geotrigger. /// - Key: The name of a fence geotrigger. /// - Value: An array of names of features within the fence. @@ -73,8 +146,7 @@ private extension SetUpLocationDrivenGeotriggersView { /// A dictionary for nearby features. var nearbyFeatures: [String: ArcGISFeature] = [:] - /// An array of observers for geotrigger monitor notifications. - var observers: [NSObjectProtocol] = [] + /// An array of geotrigger monitors. var geotriggerMonitors: [GeotriggerMonitor] = [] @@ -95,29 +167,12 @@ private extension SetUpLocationDrivenGeotriggersView { /// A Boolean indicating @Published var pointOfInterestBarButtonItem = false - /// Create a map. - func makeMap() -> Map { - // Load a map with predefined tile basemap, feature styles, and labels. - let map = Map(item: PortalItem( - portal: .arcGISOnline(connection: .anonymous), - id: Item.ID(rawValue: "6ab0e91dc39e478cae4f408e1a36a308")! - )) - Task { - do { - try await map.load() - } catch { - alertError = error - } - } - return map - } - /// Create and start a location display. func makeLocationDisplay() -> LocationDisplay { let locationDisplay = LocationDisplay(dataSource: locationDataSource) locationDisplay.autoPanMode = .recenter locationDisplay.initialZoomScale = 1000 - Task { + Task.detached { [unowned self] in do { try await locationDisplay.dataSource.start() } catch { @@ -182,8 +237,7 @@ private extension SetUpLocationDrivenGeotriggersView { // Create and start the geotrigger monitor. let geotriggerMonitor = GeotriggerMonitor(geotrigger: fenceGeotrigger) - - Task { + Task.detached { [unowned self] in do { try await geotriggerMonitor.start() geotriggerMonitors.append(geotriggerMonitor) @@ -192,21 +246,65 @@ private extension SetUpLocationDrivenGeotriggersView { } } - // Observe geotrigger notifications. - let observer = NotificationCenter.default.addObserver( - forName: .none, - object: geotriggerMonitor, - queue: nil, - using: { [weak self] note in handleGeotriggerNotification(note) } - ) - observers.append(observer) + // Observe geotrigger notifications. + Task.detached { [unowned self] in + for await notification in geotriggerMonitor.notifications { + handleGeotriggerNotification(notification as! FenceGeotriggerNotificationInfo) + } + } + } + + /// Handle the notifications posted by `AGSGeotriggerMonitor` when the fence + /// geotrigger condition has been met. + func handleGeotriggerNotification(_ fenceNotificationInfo: FenceGeotriggerNotificationInfo) { + // `AGSFenceGeotriggerNotificationInfo` provides information about the + // geotrigger monitor and the (fence) geotrigger that was triggered. + + // The feature name from the Arcade expression. + let featureName = fenceNotificationInfo.message + let fenceFeature = fenceNotificationInfo.fenceGeoElement as! ArcGISFeature + let geotriggerName = fenceNotificationInfo.geotriggerMonitor.geotrigger.name + + DispatchQueue.main.async { [weak self] in + guard let self = self else { return } + switch fenceNotificationInfo.fenceNotificationType { + case .entered: + // The user enters a geofence: add the feature for future querying. + self.featureNamesInFenceGeotrigger[geotriggerName, default: []].append(featureName) + self.nearbyFeatures[featureName] = fenceFeature + case .exited: + // The user leaves the geofence: remove the feature from the dicts. + if let poppedFeatureName = self.featureNamesInFenceGeotrigger[geotriggerName]?.popLast() { + self.nearbyFeatures.removeValue(forKey: poppedFeatureName) + } + @unknown default: + fatalError("Unexpected fence notification type.") + } + + // Update status labels. + self.updateStatusLabels(featureName: featureName, notificationType: fenceNotificationInfo.fenceNotificationType) + } + } + + /// + func updateStatusLabels(featureName: String, notificationType: FenceGeotriggerNotificationInfo.NotificationType) { + let typeString = notificationType == .entered ? "Entered" : "Exited" + let fenceGeotriggerText = String(format: "%@ the geofence of %@", typeString, featureName) + let nearbyFeaturesText: String + if nearbyFeatures.keys.isEmpty { + nearbyFeaturesText = "No nearby features." + } else { + nearbyFeaturesText = String(format: "Nearby: %@", ListFormatter.localizedString(byJoining: nearbyFeatures.keys.sorted())) + } + fenceGeotriggerString = fenceGeotriggerText + nearbyFeaturesString = nearbyFeaturesText } } } -/// Handle the notifications posted by `AGSGeotriggerMonitor` when the fence -/// geotrigger condition has been met. -func handleGeotriggerNotification(_ notification: Notification) { +private extension PortalItem.ID { + /// The portal item ID of a web map to be displayed on the map. + static var santaBarbaraBotanicGardenMap: Self { Self("6ab0e91dc39e478cae4f408e1a36a308")! } } private extension SetUpLocationDrivenGeotriggersView { From 31eb4847615154f1e9aff44861c1f2ba23c89160 Mon Sep 17 00:00:00 2001 From: CalebRas Date: Wed, 7 Jun 2023 12:08:49 -0700 Subject: [PATCH 10/29] Update comments. --- .../SetUpLocationDrivenGeotriggersView.swift | 59 +++++++++---------- 1 file changed, 28 insertions(+), 31 deletions(-) diff --git a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift index 1a0aad5ba..90bd4a538 100644 --- a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift +++ b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift @@ -35,7 +35,7 @@ struct SetUpLocationDrivenGeotriggersView: View { try await model.map.load() model.startMonitoring() } catch { - model.alertError = error + model.error = error } } .overlay(alignment: .top) { @@ -58,7 +58,7 @@ struct SetUpLocationDrivenGeotriggersView: View { popup = Popup(geoElement: sectionFeature) isShowingPopup = true } - .disabled(!model.currentSectionBarButtonItem) + .disabled(!model.hasCurrentSection) .opacity(isShowingPopup ? 0 : 1) Button("Point of Interest") { @@ -66,7 +66,7 @@ struct SetUpLocationDrivenGeotriggersView: View { popup = Popup(geoElement: poiFeature) isShowingPopup = true } - .disabled(!model.pointOfInterestBarButtonItem) + .disabled(!model.hasPointOfInterest) .opacity(isShowingPopup ? 0 : 1) } } @@ -91,18 +91,18 @@ struct SetUpLocationDrivenGeotriggersView: View { do { try await model.locationDisplay.dataSource.start() } catch { - model.alertError = error + model.error = error } } } - .alert(isPresented: $model.isShowingAlert, presentingError: model.alertError) + .alert(isPresented: $model.isShowingAlert, presentingError: model.error) } } private extension SetUpLocationDrivenGeotriggersView { /// The view model for the sample. class Model: ObservableObject { - /// A map of the Santa Barbara Botanic Garden + /// A map of the Santa Barbara Botanic Garden. var map: Map = { // Load a map with predefined tile basemap, feature styles, and labels. let map = Map(item: PortalItem( @@ -112,61 +112,58 @@ private extension SetUpLocationDrivenGeotriggersView { return map }() - /// + /// The simulated location data source for the sample. lazy var locationDataSource = makeDataSource(polylineJSONString: walkingTourPolylineJSON) /// The location display for the sample lazy var locationDisplay = makeLocationDisplay() - /// The name of the current garden section feature. If currently not in any - /// garden section, it will be `nil`. + /// An array of geotrigger monitors. + var geotriggerMonitors: [GeotriggerMonitor] = [] + + /// The name of the current garden section feature. var currentSectionName: String? { featureNamesInFenceGeotrigger[sectionFenceGeotriggerName]?.last } + /// The names of nearby point-of-interest features. var nearbyPOINames: [String] { featureNamesInFenceGeotrigger[poiFenceGeotriggerName] ?? [] } - /// The label to display fence geotrigger notification status. - @Published var fenceGeotriggerString = "Fence geotrigger info will be shown here." - - /// The label to display names of the currently nearby features. - @Published var nearbyFeaturesString = "Nearby features will be shown here." - /// A dictionary for the feature names in each fence geotrigger. /// - Key: The name of a fence geotrigger. /// - Value: An array of names of features within the fence. var featureNamesInFenceGeotrigger: [String: [String]] = [:] { didSet { - currentSectionBarButtonItem = currentSectionName != nil - pointOfInterestBarButtonItem = !nearbyPOINames.isEmpty + hasCurrentSection = currentSectionName != nil + hasPointOfInterest = !nearbyPOINames.isEmpty } } /// A dictionary for nearby features. var nearbyFeatures: [String: ArcGISFeature] = [:] - /// An array of geotrigger monitors. - var geotriggerMonitors: [GeotriggerMonitor] = [] + /// A string for the fence geotrigger notification status. + @Published var fenceGeotriggerString = "Fence geotrigger info will be shown here." + + /// A string for the display names of the currently nearby features. + @Published var nearbyFeaturesString = "Nearby features will be shown here." + + /// A Boolean indicating whether there is a current section. + @Published var hasCurrentSection = false - /// A simulated location data source for demo purposes. - lazy var simulatedLocationDataSource = locationDataSource + /// A Boolean indicating whether there is a point of interest. + @Published var hasPointOfInterest = false /// A Boolean value indicating whether to show an alert. @Published var isShowingAlert = false /// The error shown in the alert. - @Published var alertError: Error? { - didSet { isShowingAlert = alertError != nil } + @Published var error: Error? { + didSet { isShowingAlert = error != nil } } - /// A Boolean indicating - @Published var currentSectionBarButtonItem = false - - /// A Boolean indicating - @Published var pointOfInterestBarButtonItem = false - /// Create and start a location display. func makeLocationDisplay() -> LocationDisplay { let locationDisplay = LocationDisplay(dataSource: locationDataSource) @@ -176,7 +173,7 @@ private extension SetUpLocationDrivenGeotriggersView { do { try await locationDisplay.dataSource.start() } catch { - alertError = error + self.error = error } } return locationDisplay @@ -242,7 +239,7 @@ private extension SetUpLocationDrivenGeotriggersView { try await geotriggerMonitor.start() geotriggerMonitors.append(geotriggerMonitor) } catch { - alertError = error + self.error = error } } From f4032cc6adb96d7c7e39cfe05f3dc6c32ce8cb74 Mon Sep 17 00:00:00 2001 From: CalebRas Date: Wed, 7 Jun 2023 15:39:05 -0700 Subject: [PATCH 11/29] Add screenshot. --- .../README.md | 6 +- .../README.metadata.json | 4 +- .../SetUpLocationDrivenGeotriggersView.swift | 204 ++++++++++-------- .../set-up-location-driven-geotriggers.png | Bin 0 -> 294893 bytes 4 files changed, 120 insertions(+), 94 deletions(-) create mode 100644 Shared/Samples/Set up location-driven geotriggers/set-up-location-driven-geotriggers.png diff --git a/Shared/Samples/Set up location-driven geotriggers/README.md b/Shared/Samples/Set up location-driven geotriggers/README.md index 60c875d03..d8ba73442 100644 --- a/Shared/Samples/Set up location-driven geotriggers/README.md +++ b/Shared/Samples/Set up location-driven geotriggers/README.md @@ -17,10 +17,10 @@ Observe a virtual walking tour of the Santa Barbara Botanic Garden. Information 1. Create a `GeotriggerFeed` with an `AbstractLocationDataSource` class (in this case, a `SimulatedLocationDataSource`). 2. Create a `FeatureFenceParameters` class from a `ServiceFeatureTable`, a buffer distance at which to monitor each feature, an Arcade Expression, and a name for the specific geotrigger. 3. Create a `FenceGeotrigger` with the geotrigger feed, a `FenceRuleType`, and the fence parameters. -4. Create a `GeotriggerMonitor` with the fence geotrigger and call `GeotriggerMonitor::start()` to begin listening for events that meet the `FenceRuleType`. +4. Create a `GeotriggerMonitor` with the fence geotrigger and call `GeotriggerMonitor.start()` to begin listening for events that meet the `FenceRuleType`. 5. When a `GeotriggerMonitor::geotriggerNotification` emits, capture the `GeotriggerNotificationInfo`. -6. For more information about the feature that triggered the notification, cast the `GeotriggerNotificationInfo` to a `FenceGeotriggerNotificationInfo` and call `FenceGeotriggerNotificationInfo::fenceGeoElement()`. -7. Depending on the `FenceGeotriggerNotificationInfo::fenceNotificationType()` display or hide information on the UI from the `GeoElement`'s attributes. +6. For more information about the feature that triggered the notification, cast the `GeotriggerNotificationInfo` to a `FenceGeotriggerNotificationInfo` and call `FenceGeotriggerNotificationInfo.fenceGeoElement`. +7. Depending on the `FenceGeotriggerNotificationInfo.fenceNotificationType` display or hide information on the UI from the `GeoElement`'s attributes. ## Relevant API diff --git a/Shared/Samples/Set up location-driven geotriggers/README.metadata.json b/Shared/Samples/Set up location-driven geotriggers/README.metadata.json index aecc86d1c..21c14f575 100644 --- a/Shared/Samples/Set up location-driven geotriggers/README.metadata.json +++ b/Shared/Samples/Set up location-driven geotriggers/README.metadata.json @@ -2,7 +2,9 @@ "category": "Display information", "description": "Create a notification every time a given location data source has entered and/or exited a set of features or graphics.", "ignore": false, - "images": [], + "images": [ + "set-up-location-driven-geotriggers.png" + ], "keywords": [ "alert", "arcade", diff --git a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift index 90bd4a538..b15282408 100644 --- a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift +++ b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift @@ -20,12 +20,12 @@ struct SetUpLocationDrivenGeotriggersView: View { /// The view model for the sample. @StateObject private var model = Model() - /// The popup to be shown as the result of the layer identify operation. + /// The popup to show the feature information. @State private var popup: Popup? - /// A Boolean indicate whether to show the popup. + /// A Boolean value indicating whether to show the popup. @State var isShowingPopup = false - + var body: some View { MapView(map: model.map) .locationDisplay(model.locationDisplay) @@ -33,17 +33,18 @@ struct SetUpLocationDrivenGeotriggersView: View { // Start geotrigger monitoring once the map loads. do { try await model.map.load() - model.startMonitoring() + model.startGeotriggerMonitoring() } catch { model.error = error } } .overlay(alignment: .top) { + // Status text overlay. VStack { - Text("\(model.fenceGeotriggerString)\n") + Text("\(model.fenceGeotriggerText)\n") .frame(maxWidth: .infinity, alignment: .leading) - Text(model.nearbyFeaturesString) + Text(model.nearbyFeaturesText) .foregroundColor(.orange) .frame(maxWidth: .infinity, alignment: .leading) .padding(.top, -24) @@ -52,6 +53,7 @@ struct SetUpLocationDrivenGeotriggersView: View { .background(.thinMaterial, ignoresSafeAreaEdges: .horizontal) } .toolbar { + // Bottom button toolbar. ToolbarItemGroup(placement: .bottomBar) { Button("Current Selection") { let sectionFeature = model.nearbyFeatures[model.currentSectionName!]! @@ -60,7 +62,7 @@ struct SetUpLocationDrivenGeotriggersView: View { } .disabled(!model.hasCurrentSection) .opacity(isShowingPopup ? 0 : 1) - + Button("Point of Interest") { let poiFeature = model.nearbyFeatures[model.nearbyPOINames.first!]! popup = Popup(geoElement: poiFeature) @@ -76,6 +78,7 @@ struct SetUpLocationDrivenGeotriggersView: View { isPresented: $isShowingPopup ) { Group { + // Feature info popup. if let popup = popup { PopupView(popup: popup, isPresented: $isShowingPopup) .showCloseButton(true) @@ -103,23 +106,19 @@ private extension SetUpLocationDrivenGeotriggersView { /// The view model for the sample. class Model: ObservableObject { /// A map of the Santa Barbara Botanic Garden. - var map: Map = { - // Load a map with predefined tile basemap, feature styles, and labels. - let map = Map(item: PortalItem( - portal: .arcGISOnline(connection: .anonymous), - id: .santaBarbaraBotanicGardenMap - )) - return map - }() + let map = Map(item: PortalItem( + portal: .arcGISOnline(connection: .anonymous), + id: .santaBarbaraBotanicGardenMap + )) - /// The simulated location data source for the sample. - lazy var locationDataSource = makeDataSource(polylineJSONString: walkingTourPolylineJSON) - - /// The location display for the sample + /// The location display for the map view. lazy var locationDisplay = makeLocationDisplay() + /// The route simulated location data source. + private lazy var locationDataSource = makeDataSource() + /// An array of geotrigger monitors. - var geotriggerMonitors: [GeotriggerMonitor] = [] + private var geotriggerMonitors: [GeotriggerMonitor] = [] /// The name of the current garden section feature. var currentSectionName: String? { @@ -131,32 +130,32 @@ private extension SetUpLocationDrivenGeotriggersView { featureNamesInFenceGeotrigger[poiFenceGeotriggerName] ?? [] } + /// A dictionary for nearby features. + var nearbyFeatures: [String: ArcGISFeature] = [:] + /// A dictionary for the feature names in each fence geotrigger. /// - Key: The name of a fence geotrigger. /// - Value: An array of names of features within the fence. - var featureNamesInFenceGeotrigger: [String: [String]] = [:] { + private var featureNamesInFenceGeotrigger: [String: [String]] = [:] { didSet { hasCurrentSection = currentSectionName != nil hasPointOfInterest = !nearbyPOINames.isEmpty } } - /// A dictionary for nearby features. - var nearbyFeatures: [String: ArcGISFeature] = [:] - /// A string for the fence geotrigger notification status. - @Published var fenceGeotriggerString = "Fence geotrigger info will be shown here." + @Published var fenceGeotriggerText = "Fence geotrigger info will be shown here." - /// A string for the display names of the currently nearby features. - @Published var nearbyFeaturesString = "Nearby features will be shown here." + /// A string for the display name of the currently nearby feature. + @Published var nearbyFeaturesText = "Nearby features will be shown here." - /// A Boolean indicating whether there is a current section. + /// A Boolean value indicating whether there is a current section. @Published var hasCurrentSection = false - /// A Boolean indicating whether there is a point of interest. + /// A Boolean value indicating whether there is a point-of-interest. @Published var hasPointOfInterest = false - /// A Boolean value indicating whether to show an alert. + /// A Boolean value indicating whether to show an error alert. @Published var isShowingAlert = false /// The error shown in the alert. @@ -164,42 +163,19 @@ private extension SetUpLocationDrivenGeotriggersView { didSet { isShowingAlert = error != nil } } - /// Create and start a location display. - func makeLocationDisplay() -> LocationDisplay { - let locationDisplay = LocationDisplay(dataSource: locationDataSource) - locationDisplay.autoPanMode = .recenter - locationDisplay.initialZoomScale = 1000 - Task.detached { [unowned self] in - do { - try await locationDisplay.dataSource.start() - } catch { - self.error = error - } - } - return locationDisplay - } + /// The handle for the geotrigger monitor notification task. + private var notificationTaskHandle: Task! - /// Create a simulated location data source from a GeoJSON. - func makeDataSource(polylineJSONString: String) -> SimulatedLocationDataSource { - // Densify the polyline to control the simulation speed. - let routePolyline = try? Polyline.fromJSON(polylineJSONString) - let densifiedRoute = GeometryEngine.geodeticDensify( - routePolyline!, - maxSegmentLength: 5.0, - lengthUnit: .meters, - curveType: .geodesic - ) as! Polyline - let simulatedDataSource = SimulatedLocationDataSource() - simulatedDataSource.setSimulatedLocations(with: densifiedRoute) - return simulatedDataSource + deinit { + notificationTaskHandle.cancel() } - /// Start geotriggers. - func startMonitoring() { + /// Creates geotriggers from the map's operational layers. + func startGeotriggerMonitoring() { // Get the service feature tables from the map's operational layers. if let operationalLayers = map.operationalLayers as? [FeatureLayer], - let gardenSectionsLayer = operationalLayers.first(where: { $0.item?.id == Item.ID(rawValue: "1ba816341ea04243832136379b8951d9") }), - let gardenPOIsLayer = operationalLayers.first(where: { $0.item?.id == Item.ID(rawValue: "7c6280c290c34ae8aeb6b5c4ec841167") }), + let gardenSectionsLayer = operationalLayers.first(where: { $0.item?.id == .gardenSectionsLayer }), + let gardenPOIsLayer = operationalLayers.first(where: { $0.item?.id == .gardenPOIsLayer }), let gardenSections = gardenSectionsLayer.featureTable as? ServiceFeatureTable, let gardenPOIs = gardenPOIsLayer.featureTable as? ServiceFeatureTable { // Create geotriggers for each of the service feature tables. @@ -211,17 +187,18 @@ private extension SetUpLocationDrivenGeotriggersView { /// Create a geotrigger monitor and start observing its notifications. /// - Parameters: - /// - feed: The `AGSGeotriggerFeed` that is monitored for changes. - /// - featureTable: The `AGSFeatureTable` that contains the features to use - /// in the `AGSFeatureFenceParameters`. - /// - bufferDistance: A buffer distance in meters to apply to the features - /// when checking if an `AGSFenceGeotrigger` condition is met. - /// - fenceGeotriggerName: The name for the `AGSFenceGeotrigger`. - func makeGeotrigger(feed: GeotriggerFeed, featureTable: ServiceFeatureTable, bufferDistance: Double, fenceGeotriggerName: String) { + /// - feed: The `GeotriggerFeed` that is monitored for changes. + /// - featureTable: The `ServiceFeatureTable` that contains the features + /// to use in the `FeatureFenceParameters`. + /// - bufferDistance: The `Double` buffer distance in meters to apply to + /// the features when checking if an `FenceGeotrigger` condition is met. + /// - fenceGeotriggerName: The name for the `FenceGeotrigger`. + private func makeGeotrigger(feed: GeotriggerFeed, featureTable: ServiceFeatureTable, bufferDistance: Double, fenceGeotriggerName: String) { let fenceParameters = FeatureFenceParameters( featureTable: featureTable, bufferDistance: bufferDistance ) + // The Arcade expression in the fence geotrigger returns the value for // the "name" field of the feature that triggered the monitor. let fenceGeotrigger = FenceGeotrigger( @@ -243,34 +220,35 @@ private extension SetUpLocationDrivenGeotriggersView { } } - // Observe geotrigger notifications. - Task.detached { [unowned self] in + // Handle posted geotrigger notifications. + notificationTaskHandle = Task { for await notification in geotriggerMonitor.notifications { handleGeotriggerNotification(notification as! FenceGeotriggerNotificationInfo) } } } - /// Handle the notifications posted by `AGSGeotriggerMonitor` when the fence - /// geotrigger condition has been met. - func handleGeotriggerNotification(_ fenceNotificationInfo: FenceGeotriggerNotificationInfo) { - // `AGSFenceGeotriggerNotificationInfo` provides information about the - // geotrigger monitor and the (fence) geotrigger that was triggered. - + /// Handle a notification posted by a geotrigger monitor when a fence geotrigger + /// condition has been met. + /// - Parameter fenceNotificationInfo: The `FenceGeotriggerNotificationInfo` + /// which provides information about the geotrigger monitor and the fence + /// geotrigger that was triggered. + private func handleGeotriggerNotification(_ fenceNotificationInfo: FenceGeotriggerNotificationInfo) { // The feature name from the Arcade expression. let featureName = fenceNotificationInfo.message let fenceFeature = fenceNotificationInfo.fenceGeoElement as! ArcGISFeature let geotriggerName = fenceNotificationInfo.geotriggerMonitor.geotrigger.name + // Handle notification types. DispatchQueue.main.async { [weak self] in guard let self = self else { return } switch fenceNotificationInfo.fenceNotificationType { case .entered: - // The user enters a geofence: add the feature for future querying. + // The user entered a geofence: add the feature for future querying. self.featureNamesInFenceGeotrigger[geotriggerName, default: []].append(featureName) self.nearbyFeatures[featureName] = fenceFeature case .exited: - // The user leaves the geofence: remove the feature from the dicts. + // The user left the geofence: remove the feature from the dicts. if let poppedFeatureName = self.featureNamesInFenceGeotrigger[geotriggerName]?.popLast() { self.nearbyFeatures.removeValue(forKey: poppedFeatureName) } @@ -278,34 +256,80 @@ private extension SetUpLocationDrivenGeotriggersView { fatalError("Unexpected fence notification type.") } - // Update status labels. - self.updateStatusLabels(featureName: featureName, notificationType: fenceNotificationInfo.fenceNotificationType) + // Update the status texts. + self.updateStatusText(featureName: featureName, notificationType: fenceNotificationInfo.fenceNotificationType) } } - /// - func updateStatusLabels(featureName: String, notificationType: FenceGeotriggerNotificationInfo.NotificationType) { + /// Update the status texts with the feature name and notification type. + /// - Parameters: + /// - featureName: The name of the feature. + /// - notificationType: The fence `NotificationType`. + private func updateStatusText(featureName: String, notificationType: FenceGeotriggerNotificationInfo.NotificationType) { + // Set fence geotrigger text. let typeString = notificationType == .entered ? "Entered" : "Exited" - let fenceGeotriggerText = String(format: "%@ the geofence of %@", typeString, featureName) - let nearbyFeaturesText: String - if nearbyFeatures.keys.isEmpty { - nearbyFeaturesText = "No nearby features." + self.fenceGeotriggerText = String(format: "%@ the geofence of %@", typeString, featureName) + + // Set nearby features text. + if nearbyFeatures.isEmpty { + self.nearbyFeaturesText = "No nearby features." } else { - nearbyFeaturesText = String(format: "Nearby: %@", ListFormatter.localizedString(byJoining: nearbyFeatures.keys.sorted())) + self.nearbyFeaturesText = String(format: "Nearby: %@", ListFormatter.localizedString(byJoining: nearbyFeatures.keys.sorted())) } - fenceGeotriggerString = fenceGeotriggerText - nearbyFeaturesString = nearbyFeaturesText + } + + /// Create a simulated location data source route from a GeoJSON string. + /// - Returns: A new `SimulatedLocationDataSource` object for the example route. + private func makeDataSource() -> SimulatedLocationDataSource { + // Densify the polyline to control the simulation speed. + let routePolyline = try? Polyline.fromJSON(walkingTourPolylineJSON) + let densifiedRoute = GeometryEngine.geodeticDensify( + routePolyline!, + maxSegmentLength: 5.0, + lengthUnit: .meters, + curveType: .geodesic + ) as! Polyline + + // Create simulated data source with the route polyline. + return SimulatedLocationDataSource(polyline: densifiedRoute) + } + + /// Create and start a location display from the location data source. + /// - Returns: A new `LocationDisplay` object. + private func makeLocationDisplay() -> LocationDisplay { + let locationDisplay = LocationDisplay(dataSource: locationDataSource) + locationDisplay.autoPanMode = .recenter + locationDisplay.initialZoomScale = 1000 + Task.detached { [unowned self] in + do { + try await locationDisplay.dataSource.start() + } catch { + self.error = error + } + } + return locationDisplay } } } private extension PortalItem.ID { - /// The portal item ID of a web map to be displayed on the map. + /// The portal item ID of a Santa Barbara Botanic Garden web map. static var santaBarbaraBotanicGardenMap: Self { Self("6ab0e91dc39e478cae4f408e1a36a308")! } } +private extension Item.ID { + /// The Santa Barbara Botanic Garden Sections layer id. + static var gardenSectionsLayer: Self { Self("1ba816341ea04243832136379b8951d9")! } + + /// The Santa Barbara Botanic Garden Points of Interest layer id. + static var gardenPOIsLayer: Self { Self("7c6280c290c34ae8aeb6b5c4ec841167")! } +} + private extension SetUpLocationDrivenGeotriggersView { + /// The section fence geotrigger name. static let sectionFenceGeotriggerName = "Section Fence Geotrigger" + + /// The point-of-interest geotrigger name. static let poiFenceGeotriggerName = "POI Fence Geotrigger" /// A path in Santa Barbara Botanic Garden in GeoJSON format. diff --git a/Shared/Samples/Set up location-driven geotriggers/set-up-location-driven-geotriggers.png b/Shared/Samples/Set up location-driven geotriggers/set-up-location-driven-geotriggers.png new file mode 100644 index 0000000000000000000000000000000000000000..a949f28d2be3e95ecec4a59047d06ba02fd7d276 GIT binary patch literal 294893 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 t-E)<-P!$T>~DD#j@8Cos^Wb)htuc`K+`! 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

8U2099=F%I9#k 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®8Ix+J*WO#-}`HFd`G=q+1 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 SdeVsi0000 Date: Wed, 7 Jun 2023 15:44:47 -0700 Subject: [PATCH 12/29] Update source. --- .../SetUpLocationDrivenGeotriggersView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift index b15282408..8d2f50d30 100644 --- a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift +++ b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift @@ -55,7 +55,7 @@ struct SetUpLocationDrivenGeotriggersView: View { .toolbar { // Bottom button toolbar. ToolbarItemGroup(placement: .bottomBar) { - Button("Current Selection") { + Button("Current Section") { let sectionFeature = model.nearbyFeatures[model.currentSectionName!]! popup = Popup(geoElement: sectionFeature) isShowingPopup = true From 665bb3f4eff2095ef05648a4231bc0a194179a73 Mon Sep 17 00:00:00 2001 From: CalebRas Date: Fri, 9 Jun 2023 10:53:05 -0700 Subject: [PATCH 13/29] Update source file. --- .../SetUpLocationDrivenGeotriggersView.swift | 37 +++++++++---------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift index 8d2f50d30..7e4dcb36c 100644 --- a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift +++ b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift @@ -115,7 +115,7 @@ private extension SetUpLocationDrivenGeotriggersView { lazy var locationDisplay = makeLocationDisplay() /// The route simulated location data source. - private lazy var locationDataSource = makeDataSource() + private let locationDataSource: SimulatedLocationDataSource /// An array of geotrigger monitors. private var geotriggerMonitors: [GeotriggerMonitor] = [] @@ -166,6 +166,21 @@ private extension SetUpLocationDrivenGeotriggersView { /// The handle for the geotrigger monitor notification task. private var notificationTaskHandle: Task! + init() { + // Make data source + // Densify the polyline to control the simulation speed. + let routePolyline = try? Polyline.fromJSON(walkingTourPolylineJSON) + let densifiedRoute = GeometryEngine.geodeticDensify( + routePolyline!, + maxSegmentLength: 5.0, + lengthUnit: .meters, + curveType: .geodesic + ) as! Polyline + + // Create simulated data source with the route polyline. + locationDataSource = SimulatedLocationDataSource(polyline: densifiedRoute) + } + deinit { notificationTaskHandle.cancel() } @@ -278,22 +293,6 @@ private extension SetUpLocationDrivenGeotriggersView { } } - /// Create a simulated location data source route from a GeoJSON string. - /// - Returns: A new `SimulatedLocationDataSource` object for the example route. - private func makeDataSource() -> SimulatedLocationDataSource { - // Densify the polyline to control the simulation speed. - let routePolyline = try? Polyline.fromJSON(walkingTourPolylineJSON) - let densifiedRoute = GeometryEngine.geodeticDensify( - routePolyline!, - maxSegmentLength: 5.0, - lengthUnit: .meters, - curveType: .geodesic - ) as! Polyline - - // Create simulated data source with the route polyline. - return SimulatedLocationDataSource(polyline: densifiedRoute) - } - /// Create and start a location display from the location data source. /// - Returns: A new `LocationDisplay` object. private func makeLocationDisplay() -> LocationDisplay { @@ -318,10 +317,10 @@ private extension PortalItem.ID { } private extension Item.ID { - /// The Santa Barbara Botanic Garden Sections layer id. + /// An id Santa Barbara Botanic Garden Sections layer. static var gardenSectionsLayer: Self { Self("1ba816341ea04243832136379b8951d9")! } - /// The Santa Barbara Botanic Garden Points of Interest layer id. + /// An id for Santa Barbara Botanic Garden Points of Interest layer. static var gardenPOIsLayer: Self { Self("7c6280c290c34ae8aeb6b5c4ec841167")! } } From 3654a065d83a908cb6ce0b4032f0ef4160ac53b1 Mon Sep 17 00:00:00 2001 From: Caleb Rasmussen Date: Thu, 15 Jun 2023 10:27:09 -0700 Subject: [PATCH 14/29] Update Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift Co-authored-by: Ting --- .../SetUpLocationDrivenGeotriggersView.swift | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift index 7e4dcb36c..512ba90a4 100644 --- a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift +++ b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift @@ -299,13 +299,6 @@ private extension SetUpLocationDrivenGeotriggersView { let locationDisplay = LocationDisplay(dataSource: locationDataSource) locationDisplay.autoPanMode = .recenter locationDisplay.initialZoomScale = 1000 - Task.detached { [unowned self] in - do { - try await locationDisplay.dataSource.start() - } catch { - self.error = error - } - } return locationDisplay } } From ef9a58fac9263d468232a444ec32ad2ef4eed765 Mon Sep 17 00:00:00 2001 From: Caleb Rasmussen Date: Thu, 15 Jun 2023 10:27:37 -0700 Subject: [PATCH 15/29] Update Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift Co-authored-by: Ting --- .../SetUpLocationDrivenGeotriggersView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift index 512ba90a4..3ab89e7be 100644 --- a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift +++ b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift @@ -112,7 +112,7 @@ private extension SetUpLocationDrivenGeotriggersView { )) /// The location display for the map view. - lazy var locationDisplay = makeLocationDisplay() + let locationDisplay: LocationDisplay /// The route simulated location data source. private let locationDataSource: SimulatedLocationDataSource From 65d75afede08bcdc596b626216946de571567118 Mon Sep 17 00:00:00 2001 From: CalebRas Date: Thu, 15 Jun 2023 10:42:38 -0700 Subject: [PATCH 16/29] Update with review suggestions. --- .../SetUpLocationDrivenGeotriggersView.swift | 63 ++++++++++--------- 1 file changed, 33 insertions(+), 30 deletions(-) diff --git a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift index 3ab89e7be..d0ec58327 100644 --- a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift +++ b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift @@ -41,13 +41,12 @@ struct SetUpLocationDrivenGeotriggersView: View { .overlay(alignment: .top) { // Status text overlay. VStack { - Text("\(model.fenceGeotriggerText)\n") + Text("\(model.fenceGeotriggerText)") .frame(maxWidth: .infinity, alignment: .leading) Text(model.nearbyFeaturesText) .foregroundColor(.orange) .frame(maxWidth: .infinity, alignment: .leading) - .padding(.top, -24) } .padding(8) .background(.thinMaterial, ignoresSafeAreaEdges: .horizontal) @@ -91,11 +90,7 @@ struct SetUpLocationDrivenGeotriggersView: View { if isShowingPopup { await model.locationDisplay.dataSource.stop() } else { - do { - try await model.locationDisplay.dataSource.start() - } catch { - model.error = error - } + try? await model.locationDisplay.dataSource.start() } } .alert(isPresented: $model.isShowingAlert, presentingError: model.error) @@ -167,18 +162,11 @@ private extension SetUpLocationDrivenGeotriggersView { private var notificationTaskHandle: Task! init() { - // Make data source - // Densify the polyline to control the simulation speed. - let routePolyline = try? Polyline.fromJSON(walkingTourPolylineJSON) - let densifiedRoute = GeometryEngine.geodeticDensify( - routePolyline!, - maxSegmentLength: 5.0, - lengthUnit: .meters, - curveType: .geodesic - ) as! Polyline - // Create simulated data source with the route polyline. - locationDataSource = SimulatedLocationDataSource(polyline: densifiedRoute) + locationDataSource = SimulatedLocationDataSource(polyline: .walkingTour) + + // Create location display. + locationDisplay = Self.makeLocationDisplay(dataSource: locationDataSource) } deinit { @@ -293,10 +281,11 @@ private extension SetUpLocationDrivenGeotriggersView { } } - /// Create and start a location display from the location data source. + /// Creates a location display from the location data source. + /// - Parameter dataSource: The `LocationDataSource` to create the location display from. /// - Returns: A new `LocationDisplay` object. - private func makeLocationDisplay() -> LocationDisplay { - let locationDisplay = LocationDisplay(dataSource: locationDataSource) + private static func makeLocationDisplay(dataSource: LocationDataSource) -> LocationDisplay { + let locationDisplay = LocationDisplay(dataSource: dataSource) locationDisplay.autoPanMode = .recenter locationDisplay.initialZoomScale = 1000 return locationDisplay @@ -304,6 +293,14 @@ private extension SetUpLocationDrivenGeotriggersView { } } +private extension SetUpLocationDrivenGeotriggersView { + /// The section fence geotrigger name. + static let sectionFenceGeotriggerName = "Section Fence Geotrigger" + + /// The point-of-interest geotrigger name. + static let poiFenceGeotriggerName = "POI Fence Geotrigger" +} + private extension PortalItem.ID { /// The portal item ID of a Santa Barbara Botanic Garden web map. static var santaBarbaraBotanicGardenMap: Self { Self("6ab0e91dc39e478cae4f408e1a36a308")! } @@ -317,13 +314,19 @@ private extension Item.ID { static var gardenPOIsLayer: Self { Self("7c6280c290c34ae8aeb6b5c4ec841167")! } } -private extension SetUpLocationDrivenGeotriggersView { - /// The section fence geotrigger name. - static let sectionFenceGeotriggerName = "Section Fence Geotrigger" - - /// The point-of-interest geotrigger name. - static let poiFenceGeotriggerName = "POI Fence Geotrigger" - - /// A path in Santa Barbara Botanic Garden in GeoJSON format. - static let walkingTourPolylineJSON = #"{"paths":[[[-119.709881177746,34.4570041646846],[-119.709875813328,34.4570152227745],[-119.709869107805,34.4570240692453],[-119.709859720074,34.4570351273326],[-119.709853014551,34.4570539260775],[-119.709847650133,34.4570760422426],[-119.709848991238,34.4570926293626],[-119.70985569676,34.4571103222869],[-119.709873131119,34.4571202745552],[-119.709889224373,34.4571302268223],[-119.709902635418,34.4571357558591],[-119.709910682045,34.4571600836165],[-119.709910682045,34.4571744591062],[-119.709902635418,34.4571833055602],[-119.709889224373,34.4571910462067],[-119.70988251885,34.4571965752394],[-119.70988251885,34.4572032100782],[-119.709889224373,34.4572175855605],[-119.709898612104,34.4572264320099],[-119.709912023149,34.4572341726524],[-119.709901294313,34.4572419132941],[-119.709895929895,34.4572507597409],[-119.709897271,34.4572596061868],[-119.709902635418,34.4572728758539],[-119.709902635418,34.4572828281028],[-119.70990934094,34.457294991961],[-119.709912023149,34.4573038384022],[-119.709886542164,34.4573115790375],[-119.709861061178,34.4573248486963],[-119.709843626819,34.4573414357669],[-119.709836921297,34.4573668692686],[-119.709843626819,34.4573934085666],[-119.709827533565,34.4574055724087],[-119.709791323744,34.4574188420525],[-119.709749749504,34.4574332174977],[-119.709709516369,34.4574431697275],[-119.709734997354,34.4574807670294],[-119.709748062646,34.4575248306656],[-119.709757450378,34.4575635337324],[-119.709770861423,34.457600025179],[-119.709785613572,34.4576387282109],[-119.70980573014,34.4576730080242],[-119.709815117871,34.4577117110223],[-119.709821823394,34.4577504140025],[-119.709821823394,34.4577869053674],[-119.709821823394,34.4578256083127],[-119.70981780008,34.4578609938471],[-119.709819141185,34.457906331541],[-119.70981460448,34.4579890675855],[-119.709818627793,34.4580675790658],[-119.70982667442,34.4581118108532],[-119.709832038838,34.4581471962662],[-119.709834721047,34.4581947453913],[-119.709836062152,34.4582323423548],[-119.709834721047,34.4582787856393],[-119.709805216748,34.4583429215611],[-119.709759619195,34.4584026342716],[-119.709700610597,34.4584612411497],[-119.709645400048,34.4585103926263],[-119.709566274882,34.4585457778704],[-119.709493855239,34.4585944325566],[-119.709458986522,34.458622077252],[-119.709424117805,34.4586198656767],[-119.709386566878,34.4586110193749],[-119.70935438037,34.4586110193749],[-119.709339628221,34.4586231830396],[-119.709324876071,34.4586585682359],[-119.709306100608,34.4586862129101],[-119.709269890786,34.4587171749343],[-119.709244409801,34.4587238096523],[-119.709229657651,34.4587293385835],[-119.709212223293,34.4587459253751],[-119.70919076562,34.4587945799446],[-119.709174672366,34.4588503400161],[-119.709157238008,34.4589288506865],[-119.709153214694,34.4589951976744],[-119.709155896903,34.4590449578807],[-119.70916394353,34.4590958238387],[-119.709186742307,34.4591323146156],[-119.709218928815,34.4591621706939],[-119.709237704278,34.4591831805204],[-119.709241727592,34.4592252001575],[-119.709238133851,34.459258658624],[-119.709219358388,34.4592796684262],[-119.709207288447,34.4592962551085],[-119.709208629552,34.4593084186733],[-119.709271661463,34.4593791884701],[-119.709310553494,34.4594267368937],[-119.709330670062,34.4594510639836],[-119.709353468838,34.4595008239182],[-119.70936285657,34.4595362087426],[-119.709423221989,34.4595943612845],[-119.709455408497,34.4596297460692],[-119.709487595005,34.459665130839],[-119.709507711573,34.4596817174446],[-119.709523804827,34.4596861405389],[-119.709557332439,34.4596894578594],[-119.709586836739,34.4596894578594],[-119.709593542261,34.4596772943501],[-119.709590860052,34.4596496500041],[-119.709572084589,34.4595777746615],[-119.709566720171,34.4595313320996],[-119.709578790112,34.4595136396883],[-119.709590860052,34.4594992646013],[-119.709627069874,34.4594882068404],[-119.709675349636,34.4595567649343],[-119.709735699339,34.4596197941001],[-119.709775932474,34.4596795058974],[-119.709802754564,34.4597126790997],[-119.709832258863,34.4597359003334],[-119.70986712758,34.4597171021923],[-119.70986980979,34.4596839289918],[-119.709865786476,34.4596308518435],[-119.709876515312,34.4595788804365],[-119.70988187973,34.4595346494263],[-119.709879197521,34.4594926299449],[-119.709852375431,34.4594539277723],[-119.709806777878,34.4593953215911],[-119.709767885847,34.4593212344729],[-119.709720947189,34.4592195028005],[-119.709708720088,34.4591478732967],[-119.709710061193,34.4591058536206],[-119.709707378984,34.459079314867],[-119.709652393699,34.4590262373344],[-119.709617524982,34.4589499383221],[-119.709626771268,34.4588695962162],[-119.709683097658,34.4588032491285],[-119.709730036316,34.4587391135603],[-119.709759540615,34.4586993052518],[-119.7097850216,34.4586650258598],[-119.710059948024,34.4587744987075],[-119.710104204473,34.4587932970608],[-119.710128443889,34.4587649224307],[-119.71019415801,34.4587096331253],[-119.710273283176,34.4586731421637],[-119.71031619852,34.4586532379961],[-119.710367160491,34.4586023717685],[-119.710392641477,34.4585747270665],[-119.710432874612,34.4585083797445],[-119.710471766643,34.4584453497398],[-119.710505294256,34.4584165991955],[-119.710575487456,34.4583689119728],[-119.710705574593,34.4583136224052],[-119.710780676446,34.4582627559707],[-119.710839685044,34.4582030431601],[-119.710895995717,34.4581546042213],[-119.710948298793,34.458095997128],[-119.710988531928,34.4580263320391],[-119.711015354018,34.4579511379096],[-119.711011330705,34.4579102234284],[-119.710985849719,34.4578847900921],[-119.710946957688,34.4578715205223],[-119.710779319625,34.4578847900921],[-119.71073908649,34.4578847900921],[-119.7107122644,34.4578604625458],[-119.71069751225,34.4578295002039],[-119.710674713473,34.4578095958352],[-119.710642526965,34.4577996436491],[-119.710614363771,34.457830606002],[-119.71057547174,34.4578571451526],[-119.710539261918,34.4578737321174],[-119.71049500547,34.4578858958895],[-119.710452090125,34.4578836842947],[-119.710413198095,34.4578748379149],[-119.710375647168,34.4578527219614],[-119.710336755138,34.4578350291944],[-119.710299204211,34.4578107016336],[-119.71027506433,34.4577885856631],[-119.710269605616,34.4577886418169],[-119.710240101317,34.4577510446536],[-119.710198527077,34.4576758502763],[-119.710154270628,34.4575984442288],[-119.710112696389,34.4575265671206],[-119.710044300059,34.4574381029023],[-119.709978842634,34.4573543166616],[-119.709966772693,34.4573410470074],[-119.709972137111,34.4573200367174],[-119.70997481932,34.4573023438375],[-119.709973478216,34.4572846509538],[-119.709970796007,34.457259217427],[-119.709931903976,34.4572348896984],[-119.709914469617,34.4572337838924],[-119.709893011945,34.4572171968005],[-119.709884965318,34.4571972922858],[-119.709902232039,34.4571821133624],[-119.70991161977,34.457167737874],[-119.709907596457,34.4571389868898],[-119.709919666397,34.4571235055865],[-119.709922348606,34.4571047068572],[-119.709918325293,34.4570836965077],[-119.709919666397,34.4570648977695],[-119.70992637192,34.4570516280694],[-119.709933077442,34.4570339351326],[-119.709935759651,34.4570151363832],[-119.709927713024,34.4570062899114],[-119.70991161977,34.4570018666751],[-119.709883456576,34.4570040782933]]],"spatialReference":{"wkid":4326,"latestWkid":4326}}"# +private extension Polyline { + /// A path in Santa Barbara Botanic Garden. + static var walkingTour: Polyline { + let walkingTourPolylineJSON = #"{"paths":[[[-119.709881177746,34.4570041646846],[-119.709875813328,34.4570152227745],[-119.709869107805,34.4570240692453],[-119.709859720074,34.4570351273326],[-119.709853014551,34.4570539260775],[-119.709847650133,34.4570760422426],[-119.709848991238,34.4570926293626],[-119.70985569676,34.4571103222869],[-119.709873131119,34.4571202745552],[-119.709889224373,34.4571302268223],[-119.709902635418,34.4571357558591],[-119.709910682045,34.4571600836165],[-119.709910682045,34.4571744591062],[-119.709902635418,34.4571833055602],[-119.709889224373,34.4571910462067],[-119.70988251885,34.4571965752394],[-119.70988251885,34.4572032100782],[-119.709889224373,34.4572175855605],[-119.709898612104,34.4572264320099],[-119.709912023149,34.4572341726524],[-119.709901294313,34.4572419132941],[-119.709895929895,34.4572507597409],[-119.709897271,34.4572596061868],[-119.709902635418,34.4572728758539],[-119.709902635418,34.4572828281028],[-119.70990934094,34.457294991961],[-119.709912023149,34.4573038384022],[-119.709886542164,34.4573115790375],[-119.709861061178,34.4573248486963],[-119.709843626819,34.4573414357669],[-119.709836921297,34.4573668692686],[-119.709843626819,34.4573934085666],[-119.709827533565,34.4574055724087],[-119.709791323744,34.4574188420525],[-119.709749749504,34.4574332174977],[-119.709709516369,34.4574431697275],[-119.709734997354,34.4574807670294],[-119.709748062646,34.4575248306656],[-119.709757450378,34.4575635337324],[-119.709770861423,34.457600025179],[-119.709785613572,34.4576387282109],[-119.70980573014,34.4576730080242],[-119.709815117871,34.4577117110223],[-119.709821823394,34.4577504140025],[-119.709821823394,34.4577869053674],[-119.709821823394,34.4578256083127],[-119.70981780008,34.4578609938471],[-119.709819141185,34.457906331541],[-119.70981460448,34.4579890675855],[-119.709818627793,34.4580675790658],[-119.70982667442,34.4581118108532],[-119.709832038838,34.4581471962662],[-119.709834721047,34.4581947453913],[-119.709836062152,34.4582323423548],[-119.709834721047,34.4582787856393],[-119.709805216748,34.4583429215611],[-119.709759619195,34.4584026342716],[-119.709700610597,34.4584612411497],[-119.709645400048,34.4585103926263],[-119.709566274882,34.4585457778704],[-119.709493855239,34.4585944325566],[-119.709458986522,34.458622077252],[-119.709424117805,34.4586198656767],[-119.709386566878,34.4586110193749],[-119.70935438037,34.4586110193749],[-119.709339628221,34.4586231830396],[-119.709324876071,34.4586585682359],[-119.709306100608,34.4586862129101],[-119.709269890786,34.4587171749343],[-119.709244409801,34.4587238096523],[-119.709229657651,34.4587293385835],[-119.709212223293,34.4587459253751],[-119.70919076562,34.4587945799446],[-119.709174672366,34.4588503400161],[-119.709157238008,34.4589288506865],[-119.709153214694,34.4589951976744],[-119.709155896903,34.4590449578807],[-119.70916394353,34.4590958238387],[-119.709186742307,34.4591323146156],[-119.709218928815,34.4591621706939],[-119.709237704278,34.4591831805204],[-119.709241727592,34.4592252001575],[-119.709238133851,34.459258658624],[-119.709219358388,34.4592796684262],[-119.709207288447,34.4592962551085],[-119.709208629552,34.4593084186733],[-119.709271661463,34.4593791884701],[-119.709310553494,34.4594267368937],[-119.709330670062,34.4594510639836],[-119.709353468838,34.4595008239182],[-119.70936285657,34.4595362087426],[-119.709423221989,34.4595943612845],[-119.709455408497,34.4596297460692],[-119.709487595005,34.459665130839],[-119.709507711573,34.4596817174446],[-119.709523804827,34.4596861405389],[-119.709557332439,34.4596894578594],[-119.709586836739,34.4596894578594],[-119.709593542261,34.4596772943501],[-119.709590860052,34.4596496500041],[-119.709572084589,34.4595777746615],[-119.709566720171,34.4595313320996],[-119.709578790112,34.4595136396883],[-119.709590860052,34.4594992646013],[-119.709627069874,34.4594882068404],[-119.709675349636,34.4595567649343],[-119.709735699339,34.4596197941001],[-119.709775932474,34.4596795058974],[-119.709802754564,34.4597126790997],[-119.709832258863,34.4597359003334],[-119.70986712758,34.4597171021923],[-119.70986980979,34.4596839289918],[-119.709865786476,34.4596308518435],[-119.709876515312,34.4595788804365],[-119.70988187973,34.4595346494263],[-119.709879197521,34.4594926299449],[-119.709852375431,34.4594539277723],[-119.709806777878,34.4593953215911],[-119.709767885847,34.4593212344729],[-119.709720947189,34.4592195028005],[-119.709708720088,34.4591478732967],[-119.709710061193,34.4591058536206],[-119.709707378984,34.459079314867],[-119.709652393699,34.4590262373344],[-119.709617524982,34.4589499383221],[-119.709626771268,34.4588695962162],[-119.709683097658,34.4588032491285],[-119.709730036316,34.4587391135603],[-119.709759540615,34.4586993052518],[-119.7097850216,34.4586650258598],[-119.710059948024,34.4587744987075],[-119.710104204473,34.4587932970608],[-119.710128443889,34.4587649224307],[-119.71019415801,34.4587096331253],[-119.710273283176,34.4586731421637],[-119.71031619852,34.4586532379961],[-119.710367160491,34.4586023717685],[-119.710392641477,34.4585747270665],[-119.710432874612,34.4585083797445],[-119.710471766643,34.4584453497398],[-119.710505294256,34.4584165991955],[-119.710575487456,34.4583689119728],[-119.710705574593,34.4583136224052],[-119.710780676446,34.4582627559707],[-119.710839685044,34.4582030431601],[-119.710895995717,34.4581546042213],[-119.710948298793,34.458095997128],[-119.710988531928,34.4580263320391],[-119.711015354018,34.4579511379096],[-119.711011330705,34.4579102234284],[-119.710985849719,34.4578847900921],[-119.710946957688,34.4578715205223],[-119.710779319625,34.4578847900921],[-119.71073908649,34.4578847900921],[-119.7107122644,34.4578604625458],[-119.71069751225,34.4578295002039],[-119.710674713473,34.4578095958352],[-119.710642526965,34.4577996436491],[-119.710614363771,34.457830606002],[-119.71057547174,34.4578571451526],[-119.710539261918,34.4578737321174],[-119.71049500547,34.4578858958895],[-119.710452090125,34.4578836842947],[-119.710413198095,34.4578748379149],[-119.710375647168,34.4578527219614],[-119.710336755138,34.4578350291944],[-119.710299204211,34.4578107016336],[-119.71027506433,34.4577885856631],[-119.710269605616,34.4577886418169],[-119.710240101317,34.4577510446536],[-119.710198527077,34.4576758502763],[-119.710154270628,34.4575984442288],[-119.710112696389,34.4575265671206],[-119.710044300059,34.4574381029023],[-119.709978842634,34.4573543166616],[-119.709966772693,34.4573410470074],[-119.709972137111,34.4573200367174],[-119.70997481932,34.4573023438375],[-119.709973478216,34.4572846509538],[-119.709970796007,34.457259217427],[-119.709931903976,34.4572348896984],[-119.709914469617,34.4572337838924],[-119.709893011945,34.4572171968005],[-119.709884965318,34.4571972922858],[-119.709902232039,34.4571821133624],[-119.70991161977,34.457167737874],[-119.709907596457,34.4571389868898],[-119.709919666397,34.4571235055865],[-119.709922348606,34.4571047068572],[-119.709918325293,34.4570836965077],[-119.709919666397,34.4570648977695],[-119.70992637192,34.4570516280694],[-119.709933077442,34.4570339351326],[-119.709935759651,34.4570151363832],[-119.709927713024,34.4570062899114],[-119.70991161977,34.4570018666751],[-119.709883456576,34.4570040782933]]],"spatialReference":{"wkid":4326,"latestWkid":4326}}"# + let routePolyline = try? Polyline.fromJSON(walkingTourPolylineJSON) + + // Densify the polyline to control the simulation speed. + let densifiedRoute = GeometryEngine.geodeticDensify( + routePolyline!, + maxSegmentLength: 5.0, + lengthUnit: .meters, + curveType: .geodesic + ) as! Polyline + return densifiedRoute + } } From b3f0b27aa0dc63abd305a83118c4e33ef152c8ff Mon Sep 17 00:00:00 2001 From: Caleb Rasmussen Date: Thu, 15 Jun 2023 10:43:17 -0700 Subject: [PATCH 17/29] Update Shared/Samples/Set up location-driven geotriggers/README.md Co-authored-by: Ting --- Shared/Samples/Set up location-driven geotriggers/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared/Samples/Set up location-driven geotriggers/README.md b/Shared/Samples/Set up location-driven geotriggers/README.md index d8ba73442..e412601c0 100644 --- a/Shared/Samples/Set up location-driven geotriggers/README.md +++ b/Shared/Samples/Set up location-driven geotriggers/README.md @@ -14,7 +14,7 @@ Observe a virtual walking tour of the Santa Barbara Botanic Garden. Information ## How it works -1. Create a `GeotriggerFeed` with an `AbstractLocationDataSource` class (in this case, a `SimulatedLocationDataSource`). +1. Create a `GeotriggerFeed` with a `LocationDataSource` object (in this case, a `SimulatedLocationDataSource`). 2. Create a `FeatureFenceParameters` class from a `ServiceFeatureTable`, a buffer distance at which to monitor each feature, an Arcade Expression, and a name for the specific geotrigger. 3. Create a `FenceGeotrigger` with the geotrigger feed, a `FenceRuleType`, and the fence parameters. 4. Create a `GeotriggerMonitor` with the fence geotrigger and call `GeotriggerMonitor.start()` to begin listening for events that meet the `FenceRuleType`. From eef296af9486fedf7dc059ea7ea0f5c02cb9e671 Mon Sep 17 00:00:00 2001 From: CalebRas Date: Thu, 15 Jun 2023 10:50:00 -0700 Subject: [PATCH 18/29] Update ReadME. --- Shared/Samples/Set up location-driven geotriggers/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared/Samples/Set up location-driven geotriggers/README.md b/Shared/Samples/Set up location-driven geotriggers/README.md index d8ba73442..dc7219644 100644 --- a/Shared/Samples/Set up location-driven geotriggers/README.md +++ b/Shared/Samples/Set up location-driven geotriggers/README.md @@ -27,8 +27,8 @@ Observe a virtual walking tour of the Santa Barbara Botanic Garden. Information * ArcadeExpression * FeatureFenceParameters * FenceGeotrigger -* FenceGeotriggerNotificationInfo * FenceGeotrigger.RuleType +* FenceGeotriggerNotificationInfo * GeoElement * Geotrigger * GeotriggerFeed From f41a25b826759c0369e5a2e283b165a41d82f0c7 Mon Sep 17 00:00:00 2001 From: Caleb Rasmussen Date: Fri, 16 Jun 2023 08:10:44 -0700 Subject: [PATCH 19/29] Update Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift Co-authored-by: Ting --- .../SetUpLocationDrivenGeotriggersView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift index d0ec58327..1bb243238 100644 --- a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift +++ b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift @@ -41,7 +41,7 @@ struct SetUpLocationDrivenGeotriggersView: View { .overlay(alignment: .top) { // Status text overlay. VStack { - Text("\(model.fenceGeotriggerText)") + Text(model.fenceGeotriggerText) .frame(maxWidth: .infinity, alignment: .leading) Text(model.nearbyFeaturesText) From 34eb6ec11d51d79b9e712bc58404245221536163 Mon Sep 17 00:00:00 2001 From: Caleb Rasmussen Date: Fri, 16 Jun 2023 08:13:11 -0700 Subject: [PATCH 20/29] Update Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift Co-authored-by: Ting --- .../SetUpLocationDrivenGeotriggersView.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift index 1bb243238..67871f38f 100644 --- a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift +++ b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift @@ -268,6 +268,7 @@ private extension SetUpLocationDrivenGeotriggersView { /// - Parameters: /// - featureName: The name of the feature. /// - notificationType: The fence `NotificationType`. + @MainActor private func updateStatusText(featureName: String, notificationType: FenceGeotriggerNotificationInfo.NotificationType) { // Set fence geotrigger text. let typeString = notificationType == .entered ? "Entered" : "Exited" From 63311eac49b5ad023301e06958f0ca4aa203bdd9 Mon Sep 17 00:00:00 2001 From: CalebRas Date: Fri, 16 Jun 2023 10:49:58 -0700 Subject: [PATCH 21/29] Update with review suggestions. --- .../SetUpLocationDrivenGeotriggersView.swift | 80 +++++++++++-------- 1 file changed, 47 insertions(+), 33 deletions(-) diff --git a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift index 67871f38f..09692ee2e 100644 --- a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift +++ b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift @@ -109,13 +109,8 @@ private extension SetUpLocationDrivenGeotriggersView { /// The location display for the map view. let locationDisplay: LocationDisplay - /// The route simulated location data source. - private let locationDataSource: SimulatedLocationDataSource - - /// An array of geotrigger monitors. - private var geotriggerMonitors: [GeotriggerMonitor] = [] - - /// The name of the current garden section feature. + /// The name of the current garden section feature. Will be `nil` if there + /// is not a current garden section. var currentSectionName: String? { featureNamesInFenceGeotrigger[sectionFenceGeotriggerName]?.last } @@ -128,6 +123,12 @@ private extension SetUpLocationDrivenGeotriggersView { /// A dictionary for nearby features. var nearbyFeatures: [String: ArcGISFeature] = [:] + /// The route simulated location data source. + private let locationDataSource: SimulatedLocationDataSource + + /// An array of geotrigger monitors. + private var geotriggerMonitors: [GeotriggerMonitor] = [] + /// A dictionary for the feature names in each fence geotrigger. /// - Key: The name of a fence geotrigger. /// - Value: An array of names of features within the fence. @@ -158,8 +159,8 @@ private extension SetUpLocationDrivenGeotriggersView { didSet { isShowingAlert = error != nil } } - /// The handle for the geotrigger monitor notification task. - private var notificationTaskHandle: Task! + /// The handles for all the async tasks. + private var taskHandles: [Task] = [] init() { // Create simulated data source with the route polyline. @@ -170,10 +171,13 @@ private extension SetUpLocationDrivenGeotriggersView { } deinit { - notificationTaskHandle.cancel() + // Cancel all task handle when class is deconstructed. + for handle in taskHandles { + handle.cancel() + } } - /// Creates geotriggers from the map's operational layers. + /// Creates and starts geotriggers from the map's operational layers. func startGeotriggerMonitoring() { // Get the service feature tables from the map's operational layers. if let operationalLayers = map.operationalLayers as? [FeatureLayer], @@ -183,12 +187,36 @@ private extension SetUpLocationDrivenGeotriggersView { let gardenPOIs = gardenPOIsLayer.featureTable as? ServiceFeatureTable { // Create geotriggers for each of the service feature tables. let geotriggerFeed = LocationGeotriggerFeed(locationDataSource: locationDataSource) - makeGeotrigger(feed: geotriggerFeed, featureTable: gardenSections, bufferDistance: 0.0, fenceGeotriggerName: sectionFenceGeotriggerName) - makeGeotrigger(feed: geotriggerFeed, featureTable: gardenPOIs, bufferDistance: 10.0, fenceGeotriggerName: poiFenceGeotriggerName) + let gardenSectionsGeotrigger = makeGeotriggerMonitor( + feed: geotriggerFeed, + featureTable: gardenSections, + bufferDistance: 0.0, + fenceGeotriggerName: sectionFenceGeotriggerName + ) + let gardenPOIsGeotrigger = makeGeotriggerMonitor( + feed: geotriggerFeed, + featureTable: gardenPOIs, + bufferDistance: 10.0, + fenceGeotriggerName: poiFenceGeotriggerName + ) + geotriggerMonitors.append(contentsOf: [ + gardenSectionsGeotrigger, + gardenPOIsGeotrigger + ]) + + // Start the geotrigger monitors and handle posted geotrigger notifications. + for geotriggerMonitor in geotriggerMonitors { + taskHandles.append( Task { + try? await geotriggerMonitor.start() + for await notification in geotriggerMonitor.notifications { + handleGeotriggerNotification(notification as! FenceGeotriggerNotificationInfo) + } + }) + } } } - /// Create a geotrigger monitor and start observing its notifications. + /// Create a geotrigger monitor. /// - Parameters: /// - feed: The `GeotriggerFeed` that is monitored for changes. /// - featureTable: The `ServiceFeatureTable` that contains the features @@ -196,7 +224,8 @@ private extension SetUpLocationDrivenGeotriggersView { /// - bufferDistance: The `Double` buffer distance in meters to apply to /// the features when checking if an `FenceGeotrigger` condition is met. /// - fenceGeotriggerName: The name for the `FenceGeotrigger`. - private func makeGeotrigger(feed: GeotriggerFeed, featureTable: ServiceFeatureTable, bufferDistance: Double, fenceGeotriggerName: String) { + /// - Returns: A new `GeotriggerMonitor` object. + private func makeGeotriggerMonitor(feed: GeotriggerFeed, featureTable: ServiceFeatureTable, bufferDistance: Double, fenceGeotriggerName: String) -> GeotriggerMonitor { let fenceParameters = FeatureFenceParameters( featureTable: featureTable, bufferDistance: bufferDistance @@ -212,23 +241,8 @@ private extension SetUpLocationDrivenGeotriggersView { name: fenceGeotriggerName ) - // Create and start the geotrigger monitor. - let geotriggerMonitor = GeotriggerMonitor(geotrigger: fenceGeotrigger) - Task.detached { [unowned self] in - do { - try await geotriggerMonitor.start() - geotriggerMonitors.append(geotriggerMonitor) - } catch { - self.error = error - } - } - - // Handle posted geotrigger notifications. - notificationTaskHandle = Task { - for await notification in geotriggerMonitor.notifications { - handleGeotriggerNotification(notification as! FenceGeotriggerNotificationInfo) - } - } + // Create and return geotrigger. + return GeotriggerMonitor(geotrigger: fenceGeotrigger) } /// Handle a notification posted by a geotrigger monitor when a fence geotrigger @@ -272,7 +286,7 @@ private extension SetUpLocationDrivenGeotriggersView { private func updateStatusText(featureName: String, notificationType: FenceGeotriggerNotificationInfo.NotificationType) { // Set fence geotrigger text. let typeString = notificationType == .entered ? "Entered" : "Exited" - self.fenceGeotriggerText = String(format: "%@ the geofence of %@", typeString, featureName) + fenceGeotriggerText = String(format: "%@ the geofence of %@", typeString, featureName) // Set nearby features text. if nearbyFeatures.isEmpty { From d0f40b4e2db4e5343215310ce19950d1470312ff Mon Sep 17 00:00:00 2001 From: CalebRas Date: Wed, 21 Jun 2023 10:27:30 -0700 Subject: [PATCH 22/29] Update swift concurrency. https://github.com/Esri/arcgis-maps-sdk-swift-samples/pull/198#discussion_r1231640535 --- .../SetUpLocationDrivenGeotriggersView.swift | 35 +++++++++---------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift index 09692ee2e..41a4a8eff 100644 --- a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift +++ b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift @@ -209,7 +209,7 @@ private extension SetUpLocationDrivenGeotriggersView { taskHandles.append( Task { try? await geotriggerMonitor.start() for await notification in geotriggerMonitor.notifications { - handleGeotriggerNotification(notification as! FenceGeotriggerNotificationInfo) + await handleGeotriggerNotification(notification as! FenceGeotriggerNotificationInfo) } }) } @@ -250,6 +250,7 @@ private extension SetUpLocationDrivenGeotriggersView { /// - Parameter fenceNotificationInfo: The `FenceGeotriggerNotificationInfo` /// which provides information about the geotrigger monitor and the fence /// geotrigger that was triggered. + @MainActor private func handleGeotriggerNotification(_ fenceNotificationInfo: FenceGeotriggerNotificationInfo) { // The feature name from the Arcade expression. let featureName = fenceNotificationInfo.message @@ -257,32 +258,28 @@ private extension SetUpLocationDrivenGeotriggersView { let geotriggerName = fenceNotificationInfo.geotriggerMonitor.geotrigger.name // Handle notification types. - DispatchQueue.main.async { [weak self] in - guard let self = self else { return } - switch fenceNotificationInfo.fenceNotificationType { - case .entered: - // The user entered a geofence: add the feature for future querying. - self.featureNamesInFenceGeotrigger[geotriggerName, default: []].append(featureName) - self.nearbyFeatures[featureName] = fenceFeature - case .exited: - // The user left the geofence: remove the feature from the dicts. - if let poppedFeatureName = self.featureNamesInFenceGeotrigger[geotriggerName]?.popLast() { - self.nearbyFeatures.removeValue(forKey: poppedFeatureName) - } - @unknown default: - fatalError("Unexpected fence notification type.") + switch fenceNotificationInfo.fenceNotificationType { + case .entered: + // The user entered a geofence: add the feature for future querying. + self.featureNamesInFenceGeotrigger[geotriggerName, default: []].append(featureName) + self.nearbyFeatures[featureName] = fenceFeature + case .exited: + // The user left the geofence: remove the feature from the dicts. + if let poppedFeatureName = self.featureNamesInFenceGeotrigger[geotriggerName]?.popLast() { + self.nearbyFeatures.removeValue(forKey: poppedFeatureName) } - - // Update the status texts. - self.updateStatusText(featureName: featureName, notificationType: fenceNotificationInfo.fenceNotificationType) + @unknown default: + fatalError("Unexpected fence notification type.") } + + // Update the status texts. + updateStatusText(featureName: featureName, notificationType: fenceNotificationInfo.fenceNotificationType) } /// Update the status texts with the feature name and notification type. /// - Parameters: /// - featureName: The name of the feature. /// - notificationType: The fence `NotificationType`. - @MainActor private func updateStatusText(featureName: String, notificationType: FenceGeotriggerNotificationInfo.NotificationType) { // Set fence geotrigger text. let typeString = notificationType == .entered ? "Entered" : "Exited" From e2e98c36c8dd1cd45c1d740162a52fa2dbb7ba31 Mon Sep 17 00:00:00 2001 From: CalebRas Date: Wed, 28 Jun 2023 15:30:18 -0700 Subject: [PATCH 23/29] Add view model file. --- Samples.xcodeproj/project.pbxproj | 6 + ...pLocationDrivenGeotriggersView.Model.swift | 262 ++++++++++++++++++ .../SetUpLocationDrivenGeotriggersView.swift | 246 ---------------- 3 files changed, 268 insertions(+), 246 deletions(-) create mode 100644 Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.Model.swift diff --git a/Samples.xcodeproj/project.pbxproj b/Samples.xcodeproj/project.pbxproj index 63fed8f29..bbe0ce33a 100644 --- a/Samples.xcodeproj/project.pbxproj +++ b/Samples.xcodeproj/project.pbxproj @@ -137,6 +137,8 @@ D769C2132A29057200030F61 /* SetUpLocationDrivenGeotriggersView.swift in Copy Source Code Files */ = {isa = PBXBuildFile; fileRef = D769C2112A29019B00030F61 /* SetUpLocationDrivenGeotriggersView.swift */; }; D78666AD2A2161F100C60110 /* FindNearestVertexView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D78666AC2A2161F100C60110 /* FindNearestVertexView.swift */; }; D78666AE2A21629200C60110 /* FindNearestVertexView.swift in Copy Source Code Files */ = {isa = PBXBuildFile; fileRef = D78666AC2A2161F100C60110 /* FindNearestVertexView.swift */; }; + D79EE76E2A4CEA5D005A52AE /* SetUpLocationDrivenGeotriggersView.Model.swift in Sources */ = {isa = PBXBuildFile; fileRef = D79EE76D2A4CEA5D005A52AE /* SetUpLocationDrivenGeotriggersView.Model.swift */; }; + D79EE76F2A4CEA7F005A52AE /* SetUpLocationDrivenGeotriggersView.Model.swift in Copy Source Code Files */ = {isa = PBXBuildFile; fileRef = D79EE76D2A4CEA5D005A52AE /* SetUpLocationDrivenGeotriggersView.Model.swift */; }; D7ABA2F92A32579C0021822B /* MeasureDistanceInSceneView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7ABA2F82A32579C0021822B /* MeasureDistanceInSceneView.swift */; }; D7ABA2FA2A32760D0021822B /* MeasureDistanceInSceneView.swift in Copy Source Code Files */ = {isa = PBXBuildFile; fileRef = D7ABA2F82A32579C0021822B /* MeasureDistanceInSceneView.swift */; }; D7CC33FF2A31475C00198EDF /* ShowLineOfSightBetweenPointsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7CC33FD2A31475C00198EDF /* ShowLineOfSightBetweenPointsView.swift */; }; @@ -240,6 +242,7 @@ dstPath = ""; dstSubfolderSpec = 7; files = ( + D79EE76F2A4CEA7F005A52AE /* SetUpLocationDrivenGeotriggersView.Model.swift in Copy Source Code Files */, D769C2132A29057200030F61 /* SetUpLocationDrivenGeotriggersView.swift in Copy Source Code Files */, D7ABA2FA2A32760D0021822B /* MeasureDistanceInSceneView.swift in Copy Source Code Files */, D722BD232A420DEC002C2087 /* ShowExtrudedFeaturesView.swift in Copy Source Code Files */, @@ -394,6 +397,7 @@ D754E3222A1D66820006C5F1 /* StylePointWithPictureMarkerSymbolsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StylePointWithPictureMarkerSymbolsView.swift; sourceTree = ""; }; D769C2112A29019B00030F61 /* SetUpLocationDrivenGeotriggersView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SetUpLocationDrivenGeotriggersView.swift; sourceTree = ""; }; D78666AC2A2161F100C60110 /* FindNearestVertexView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FindNearestVertexView.swift; sourceTree = ""; }; + D79EE76D2A4CEA5D005A52AE /* SetUpLocationDrivenGeotriggersView.Model.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SetUpLocationDrivenGeotriggersView.Model.swift; sourceTree = ""; }; D7ABA2F82A32579C0021822B /* MeasureDistanceInSceneView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MeasureDistanceInSceneView.swift; sourceTree = ""; }; D7CC33FD2A31475C00198EDF /* ShowLineOfSightBetweenPointsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShowLineOfSightBetweenPointsView.swift; sourceTree = ""; }; D7E440D62A1ECE7D005D74DE /* CreateBuffersAroundPointsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CreateBuffersAroundPointsView.swift; sourceTree = ""; }; @@ -942,6 +946,7 @@ isa = PBXGroup; children = ( D769C2112A29019B00030F61 /* SetUpLocationDrivenGeotriggersView.swift */, + D79EE76D2A4CEA5D005A52AE /* SetUpLocationDrivenGeotriggersView.Model.swift */, ); path = "Set up location-driven geotriggers"; sourceTree = ""; @@ -1408,6 +1413,7 @@ 0005580A2817C51E00224BC6 /* SampleDetailView.swift in Sources */, 4D2ADC6229C5071C003B367F /* ChangeMapViewBackgroundView.Model.swift in Sources */, 0074ABCD2817BCC30037244A /* SamplesApp+Samples.swift.tache in Sources */, + D79EE76E2A4CEA5D005A52AE /* SetUpLocationDrivenGeotriggersView.Model.swift in Sources */, E004A6F3284E4FEB002A1FE6 /* ShowResultOfSpatialOperationsView.swift in Sources */, D751018E2A2E962D00B8FA48 /* IdentifyLayerFeaturesView.swift in Sources */, F1E71BF1289473760064C33F /* AddRasterFromFileView.swift in Sources */, diff --git a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.Model.swift b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.Model.swift new file mode 100644 index 000000000..a1aa4fc4e --- /dev/null +++ b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.Model.swift @@ -0,0 +1,262 @@ +// Copyright 2023 Esri +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import SwiftUI +import ArcGIS + +extension SetUpLocationDrivenGeotriggersView { + /// The view model for the sample. + class Model: ObservableObject { + /// A map of the Santa Barbara Botanic Garden. + let map = Map(item: PortalItem( + portal: .arcGISOnline(connection: .anonymous), + id: .santaBarbaraBotanicGardenMap + )) + + /// The location display for the map view. + let locationDisplay: LocationDisplay + + /// The name of the current garden section feature. Will be `nil` if there + /// is not a current garden section. + var currentSectionName: String? { + featureNamesInFenceGeotrigger[sectionFenceGeotriggerName]?.last + } + + /// The names of nearby point-of-interest features. + var nearbyPOINames: [String] { + featureNamesInFenceGeotrigger[poiFenceGeotriggerName] ?? [] + } + + /// A dictionary for nearby features. + var nearbyFeatures: [String: ArcGISFeature] = [:] + + /// The route simulated location data source. + private let locationDataSource: SimulatedLocationDataSource + + /// An array of geotrigger monitors. + private var geotriggerMonitors: [GeotriggerMonitor] = [] + + /// A dictionary for the feature names in each fence geotrigger. + /// - Key: The name of a fence geotrigger. + /// - Value: An array of names of features within the fence. + private var featureNamesInFenceGeotrigger: [String: [String]] = [:] { + didSet { + hasCurrentSection = currentSectionName != nil + hasPointOfInterest = !nearbyPOINames.isEmpty + } + } + + /// A string for the fence geotrigger notification status. + @Published var fenceGeotriggerText = "Fence geotrigger info will be shown here." + + /// A string for the display name of the currently nearby feature. + @Published var nearbyFeaturesText = "Nearby features will be shown here." + + /// A Boolean value indicating whether there is a current section. + @Published var hasCurrentSection = false + + /// A Boolean value indicating whether there is a point-of-interest. + @Published var hasPointOfInterest = false + + /// A Boolean value indicating whether to show an error alert. + @Published var isShowingAlert = false + + /// The error shown in the alert. + @Published var error: Error? { + didSet { isShowingAlert = error != nil } + } + + /// The handles for all the async tasks. + private var taskHandles: [Task] = [] + + init() { + // Create simulated data source with the route polyline. + locationDataSource = SimulatedLocationDataSource(polyline: .walkingTour) + + // Create location display. + locationDisplay = Self.makeLocationDisplay(dataSource: locationDataSource) + } + + deinit { + // Cancel all task handle when class is deconstructed. + for handle in taskHandles { + handle.cancel() + } + } + + /// Creates and starts geotriggers from the map's operational layers. + func startGeotriggerMonitoring() { + // Get the service feature tables from the map's operational layers. + if let operationalLayers = map.operationalLayers as? [FeatureLayer], + let gardenSectionsLayer = operationalLayers.first(where: { $0.item?.id == .gardenSectionsLayer }), + let gardenPOIsLayer = operationalLayers.first(where: { $0.item?.id == .gardenPOIsLayer }), + let gardenSections = gardenSectionsLayer.featureTable as? ServiceFeatureTable, + let gardenPOIs = gardenPOIsLayer.featureTable as? ServiceFeatureTable { + // Create geotriggers for each of the service feature tables. + let geotriggerFeed = LocationGeotriggerFeed(locationDataSource: locationDataSource) + let gardenSectionsGeotrigger = makeGeotriggerMonitor( + feed: geotriggerFeed, + featureTable: gardenSections, + bufferDistance: 0.0, + fenceGeotriggerName: sectionFenceGeotriggerName + ) + let gardenPOIsGeotrigger = makeGeotriggerMonitor( + feed: geotriggerFeed, + featureTable: gardenPOIs, + bufferDistance: 10.0, + fenceGeotriggerName: poiFenceGeotriggerName + ) + geotriggerMonitors.append(contentsOf: [ + gardenSectionsGeotrigger, + gardenPOIsGeotrigger + ]) + + // Start the geotrigger monitors and handle posted geotrigger notifications. + for geotriggerMonitor in geotriggerMonitors { + taskHandles.append( Task { + try? await geotriggerMonitor.start() + for await notification in geotriggerMonitor.notifications { + await handleGeotriggerNotification(notification as! FenceGeotriggerNotificationInfo) + } + }) + } + } + } + + /// Create a geotrigger monitor. + /// - Parameters: + /// - feed: The `GeotriggerFeed` that is monitored for changes. + /// - featureTable: The `ServiceFeatureTable` that contains the features + /// to use in the `FeatureFenceParameters`. + /// - bufferDistance: The `Double` buffer distance in meters to apply to + /// the features when checking if an `FenceGeotrigger` condition is met. + /// - fenceGeotriggerName: The name for the `FenceGeotrigger`. + /// - Returns: A new `GeotriggerMonitor` object. + private func makeGeotriggerMonitor(feed: GeotriggerFeed, featureTable: ServiceFeatureTable, bufferDistance: Double, fenceGeotriggerName: String) -> GeotriggerMonitor { + let fenceParameters = FeatureFenceParameters( + featureTable: featureTable, + bufferDistance: bufferDistance + ) + + // The Arcade expression in the fence geotrigger returns the value for + // the "name" field of the feature that triggered the monitor. + let fenceGeotrigger = FenceGeotrigger( + feed: feed, + ruleType: .enterOrExit, + fenceParameters: fenceParameters, + messageExpression: ArcadeExpression(expression: "$fenceFeature.name"), + name: fenceGeotriggerName + ) + + // Create and return geotrigger. + return GeotriggerMonitor(geotrigger: fenceGeotrigger) + } + + /// Handle a notification posted by a geotrigger monitor when a fence geotrigger + /// condition has been met. + /// - Parameter fenceNotificationInfo: The `FenceGeotriggerNotificationInfo` + /// which provides information about the geotrigger monitor and the fence + /// geotrigger that was triggered. + @MainActor + private func handleGeotriggerNotification(_ fenceNotificationInfo: FenceGeotriggerNotificationInfo) { + // The feature name from the Arcade expression. + let featureName = fenceNotificationInfo.message + let fenceFeature = fenceNotificationInfo.fenceGeoElement as! ArcGISFeature + let geotriggerName = fenceNotificationInfo.geotriggerMonitor.geotrigger.name + + // Handle notification types. + switch fenceNotificationInfo.fenceNotificationType { + case .entered: + // The user entered a geofence: add the feature for future querying. + self.featureNamesInFenceGeotrigger[geotriggerName, default: []].append(featureName) + self.nearbyFeatures[featureName] = fenceFeature + case .exited: + // The user left the geofence: remove the feature from the dicts. + if let poppedFeatureName = self.featureNamesInFenceGeotrigger[geotriggerName]?.popLast() { + self.nearbyFeatures.removeValue(forKey: poppedFeatureName) + } + @unknown default: + fatalError("Unexpected fence notification type.") + } + + // Update the status texts. + updateStatusText(featureName: featureName, notificationType: fenceNotificationInfo.fenceNotificationType) + } + + /// Update the status texts with the feature name and notification type. + /// - Parameters: + /// - featureName: The name of the feature. + /// - notificationType: The fence `NotificationType`. + private func updateStatusText(featureName: String, notificationType: FenceGeotriggerNotificationInfo.NotificationType) { + // Set fence geotrigger text. + let typeString = notificationType == .entered ? "Entered" : "Exited" + fenceGeotriggerText = String(format: "%@ the geofence of %@", typeString, featureName) + + // Set nearby features text. + if nearbyFeatures.isEmpty { + self.nearbyFeaturesText = "No nearby features." + } else { + self.nearbyFeaturesText = String(format: "Nearby: %@", ListFormatter.localizedString(byJoining: nearbyFeatures.keys.sorted())) + } + } + + /// Creates a location display from the location data source. + /// - Parameter dataSource: The `LocationDataSource` to create the location display from. + /// - Returns: A new `LocationDisplay` object. + private static func makeLocationDisplay(dataSource: LocationDataSource) -> LocationDisplay { + let locationDisplay = LocationDisplay(dataSource: dataSource) + locationDisplay.autoPanMode = .recenter + locationDisplay.initialZoomScale = 1000 + return locationDisplay + } + } +} + +private extension SetUpLocationDrivenGeotriggersView { + /// The section fence geotrigger name. + static let sectionFenceGeotriggerName = "Section Fence Geotrigger" + + /// The point-of-interest geotrigger name. + static let poiFenceGeotriggerName = "POI Fence Geotrigger" +} + +private extension PortalItem.ID { + /// The portal item ID of a Santa Barbara Botanic Garden web map. + static var santaBarbaraBotanicGardenMap: Self { Self("6ab0e91dc39e478cae4f408e1a36a308")! } +} + +private extension Item.ID { + /// An id Santa Barbara Botanic Garden Sections layer. + static var gardenSectionsLayer: Self { Self("1ba816341ea04243832136379b8951d9")! } + + /// An id for Santa Barbara Botanic Garden Points of Interest layer. + static var gardenPOIsLayer: Self { Self("7c6280c290c34ae8aeb6b5c4ec841167")! } +} + +private extension Polyline { + /// A path in Santa Barbara Botanic Garden. + static var walkingTour: Polyline { + let walkingTourPolylineJSON = #"{"paths":[[[-119.709881177746,34.4570041646846],[-119.709875813328,34.4570152227745],[-119.709869107805,34.4570240692453],[-119.709859720074,34.4570351273326],[-119.709853014551,34.4570539260775],[-119.709847650133,34.4570760422426],[-119.709848991238,34.4570926293626],[-119.70985569676,34.4571103222869],[-119.709873131119,34.4571202745552],[-119.709889224373,34.4571302268223],[-119.709902635418,34.4571357558591],[-119.709910682045,34.4571600836165],[-119.709910682045,34.4571744591062],[-119.709902635418,34.4571833055602],[-119.709889224373,34.4571910462067],[-119.70988251885,34.4571965752394],[-119.70988251885,34.4572032100782],[-119.709889224373,34.4572175855605],[-119.709898612104,34.4572264320099],[-119.709912023149,34.4572341726524],[-119.709901294313,34.4572419132941],[-119.709895929895,34.4572507597409],[-119.709897271,34.4572596061868],[-119.709902635418,34.4572728758539],[-119.709902635418,34.4572828281028],[-119.70990934094,34.457294991961],[-119.709912023149,34.4573038384022],[-119.709886542164,34.4573115790375],[-119.709861061178,34.4573248486963],[-119.709843626819,34.4573414357669],[-119.709836921297,34.4573668692686],[-119.709843626819,34.4573934085666],[-119.709827533565,34.4574055724087],[-119.709791323744,34.4574188420525],[-119.709749749504,34.4574332174977],[-119.709709516369,34.4574431697275],[-119.709734997354,34.4574807670294],[-119.709748062646,34.4575248306656],[-119.709757450378,34.4575635337324],[-119.709770861423,34.457600025179],[-119.709785613572,34.4576387282109],[-119.70980573014,34.4576730080242],[-119.709815117871,34.4577117110223],[-119.709821823394,34.4577504140025],[-119.709821823394,34.4577869053674],[-119.709821823394,34.4578256083127],[-119.70981780008,34.4578609938471],[-119.709819141185,34.457906331541],[-119.70981460448,34.4579890675855],[-119.709818627793,34.4580675790658],[-119.70982667442,34.4581118108532],[-119.709832038838,34.4581471962662],[-119.709834721047,34.4581947453913],[-119.709836062152,34.4582323423548],[-119.709834721047,34.4582787856393],[-119.709805216748,34.4583429215611],[-119.709759619195,34.4584026342716],[-119.709700610597,34.4584612411497],[-119.709645400048,34.4585103926263],[-119.709566274882,34.4585457778704],[-119.709493855239,34.4585944325566],[-119.709458986522,34.458622077252],[-119.709424117805,34.4586198656767],[-119.709386566878,34.4586110193749],[-119.70935438037,34.4586110193749],[-119.709339628221,34.4586231830396],[-119.709324876071,34.4586585682359],[-119.709306100608,34.4586862129101],[-119.709269890786,34.4587171749343],[-119.709244409801,34.4587238096523],[-119.709229657651,34.4587293385835],[-119.709212223293,34.4587459253751],[-119.70919076562,34.4587945799446],[-119.709174672366,34.4588503400161],[-119.709157238008,34.4589288506865],[-119.709153214694,34.4589951976744],[-119.709155896903,34.4590449578807],[-119.70916394353,34.4590958238387],[-119.709186742307,34.4591323146156],[-119.709218928815,34.4591621706939],[-119.709237704278,34.4591831805204],[-119.709241727592,34.4592252001575],[-119.709238133851,34.459258658624],[-119.709219358388,34.4592796684262],[-119.709207288447,34.4592962551085],[-119.709208629552,34.4593084186733],[-119.709271661463,34.4593791884701],[-119.709310553494,34.4594267368937],[-119.709330670062,34.4594510639836],[-119.709353468838,34.4595008239182],[-119.70936285657,34.4595362087426],[-119.709423221989,34.4595943612845],[-119.709455408497,34.4596297460692],[-119.709487595005,34.459665130839],[-119.709507711573,34.4596817174446],[-119.709523804827,34.4596861405389],[-119.709557332439,34.4596894578594],[-119.709586836739,34.4596894578594],[-119.709593542261,34.4596772943501],[-119.709590860052,34.4596496500041],[-119.709572084589,34.4595777746615],[-119.709566720171,34.4595313320996],[-119.709578790112,34.4595136396883],[-119.709590860052,34.4594992646013],[-119.709627069874,34.4594882068404],[-119.709675349636,34.4595567649343],[-119.709735699339,34.4596197941001],[-119.709775932474,34.4596795058974],[-119.709802754564,34.4597126790997],[-119.709832258863,34.4597359003334],[-119.70986712758,34.4597171021923],[-119.70986980979,34.4596839289918],[-119.709865786476,34.4596308518435],[-119.709876515312,34.4595788804365],[-119.70988187973,34.4595346494263],[-119.709879197521,34.4594926299449],[-119.709852375431,34.4594539277723],[-119.709806777878,34.4593953215911],[-119.709767885847,34.4593212344729],[-119.709720947189,34.4592195028005],[-119.709708720088,34.4591478732967],[-119.709710061193,34.4591058536206],[-119.709707378984,34.459079314867],[-119.709652393699,34.4590262373344],[-119.709617524982,34.4589499383221],[-119.709626771268,34.4588695962162],[-119.709683097658,34.4588032491285],[-119.709730036316,34.4587391135603],[-119.709759540615,34.4586993052518],[-119.7097850216,34.4586650258598],[-119.710059948024,34.4587744987075],[-119.710104204473,34.4587932970608],[-119.710128443889,34.4587649224307],[-119.71019415801,34.4587096331253],[-119.710273283176,34.4586731421637],[-119.71031619852,34.4586532379961],[-119.710367160491,34.4586023717685],[-119.710392641477,34.4585747270665],[-119.710432874612,34.4585083797445],[-119.710471766643,34.4584453497398],[-119.710505294256,34.4584165991955],[-119.710575487456,34.4583689119728],[-119.710705574593,34.4583136224052],[-119.710780676446,34.4582627559707],[-119.710839685044,34.4582030431601],[-119.710895995717,34.4581546042213],[-119.710948298793,34.458095997128],[-119.710988531928,34.4580263320391],[-119.711015354018,34.4579511379096],[-119.711011330705,34.4579102234284],[-119.710985849719,34.4578847900921],[-119.710946957688,34.4578715205223],[-119.710779319625,34.4578847900921],[-119.71073908649,34.4578847900921],[-119.7107122644,34.4578604625458],[-119.71069751225,34.4578295002039],[-119.710674713473,34.4578095958352],[-119.710642526965,34.4577996436491],[-119.710614363771,34.457830606002],[-119.71057547174,34.4578571451526],[-119.710539261918,34.4578737321174],[-119.71049500547,34.4578858958895],[-119.710452090125,34.4578836842947],[-119.710413198095,34.4578748379149],[-119.710375647168,34.4578527219614],[-119.710336755138,34.4578350291944],[-119.710299204211,34.4578107016336],[-119.71027506433,34.4577885856631],[-119.710269605616,34.4577886418169],[-119.710240101317,34.4577510446536],[-119.710198527077,34.4576758502763],[-119.710154270628,34.4575984442288],[-119.710112696389,34.4575265671206],[-119.710044300059,34.4574381029023],[-119.709978842634,34.4573543166616],[-119.709966772693,34.4573410470074],[-119.709972137111,34.4573200367174],[-119.70997481932,34.4573023438375],[-119.709973478216,34.4572846509538],[-119.709970796007,34.457259217427],[-119.709931903976,34.4572348896984],[-119.709914469617,34.4572337838924],[-119.709893011945,34.4572171968005],[-119.709884965318,34.4571972922858],[-119.709902232039,34.4571821133624],[-119.70991161977,34.457167737874],[-119.709907596457,34.4571389868898],[-119.709919666397,34.4571235055865],[-119.709922348606,34.4571047068572],[-119.709918325293,34.4570836965077],[-119.709919666397,34.4570648977695],[-119.70992637192,34.4570516280694],[-119.709933077442,34.4570339351326],[-119.709935759651,34.4570151363832],[-119.709927713024,34.4570062899114],[-119.70991161977,34.4570018666751],[-119.709883456576,34.4570040782933]]],"spatialReference":{"wkid":4326,"latestWkid":4326}}"# + let routePolyline = try? Polyline.fromJSON(walkingTourPolylineJSON) + + // Densify the polyline to control the simulation speed. + let densifiedRoute = GeometryEngine.geodeticDensify( + routePolyline!, + maxSegmentLength: 5.0, + lengthUnit: .meters, + curveType: .geodesic + ) as! Polyline + return densifiedRoute + } +} diff --git a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift index 41a4a8eff..63aa77071 100644 --- a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift +++ b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift @@ -96,249 +96,3 @@ struct SetUpLocationDrivenGeotriggersView: View { .alert(isPresented: $model.isShowingAlert, presentingError: model.error) } } - -private extension SetUpLocationDrivenGeotriggersView { - /// The view model for the sample. - class Model: ObservableObject { - /// A map of the Santa Barbara Botanic Garden. - let map = Map(item: PortalItem( - portal: .arcGISOnline(connection: .anonymous), - id: .santaBarbaraBotanicGardenMap - )) - - /// The location display for the map view. - let locationDisplay: LocationDisplay - - /// The name of the current garden section feature. Will be `nil` if there - /// is not a current garden section. - var currentSectionName: String? { - featureNamesInFenceGeotrigger[sectionFenceGeotriggerName]?.last - } - - /// The names of nearby point-of-interest features. - var nearbyPOINames: [String] { - featureNamesInFenceGeotrigger[poiFenceGeotriggerName] ?? [] - } - - /// A dictionary for nearby features. - var nearbyFeatures: [String: ArcGISFeature] = [:] - - /// The route simulated location data source. - private let locationDataSource: SimulatedLocationDataSource - - /// An array of geotrigger monitors. - private var geotriggerMonitors: [GeotriggerMonitor] = [] - - /// A dictionary for the feature names in each fence geotrigger. - /// - Key: The name of a fence geotrigger. - /// - Value: An array of names of features within the fence. - private var featureNamesInFenceGeotrigger: [String: [String]] = [:] { - didSet { - hasCurrentSection = currentSectionName != nil - hasPointOfInterest = !nearbyPOINames.isEmpty - } - } - - /// A string for the fence geotrigger notification status. - @Published var fenceGeotriggerText = "Fence geotrigger info will be shown here." - - /// A string for the display name of the currently nearby feature. - @Published var nearbyFeaturesText = "Nearby features will be shown here." - - /// A Boolean value indicating whether there is a current section. - @Published var hasCurrentSection = false - - /// A Boolean value indicating whether there is a point-of-interest. - @Published var hasPointOfInterest = false - - /// A Boolean value indicating whether to show an error alert. - @Published var isShowingAlert = false - - /// The error shown in the alert. - @Published var error: Error? { - didSet { isShowingAlert = error != nil } - } - - /// The handles for all the async tasks. - private var taskHandles: [Task] = [] - - init() { - // Create simulated data source with the route polyline. - locationDataSource = SimulatedLocationDataSource(polyline: .walkingTour) - - // Create location display. - locationDisplay = Self.makeLocationDisplay(dataSource: locationDataSource) - } - - deinit { - // Cancel all task handle when class is deconstructed. - for handle in taskHandles { - handle.cancel() - } - } - - /// Creates and starts geotriggers from the map's operational layers. - func startGeotriggerMonitoring() { - // Get the service feature tables from the map's operational layers. - if let operationalLayers = map.operationalLayers as? [FeatureLayer], - let gardenSectionsLayer = operationalLayers.first(where: { $0.item?.id == .gardenSectionsLayer }), - let gardenPOIsLayer = operationalLayers.first(where: { $0.item?.id == .gardenPOIsLayer }), - let gardenSections = gardenSectionsLayer.featureTable as? ServiceFeatureTable, - let gardenPOIs = gardenPOIsLayer.featureTable as? ServiceFeatureTable { - // Create geotriggers for each of the service feature tables. - let geotriggerFeed = LocationGeotriggerFeed(locationDataSource: locationDataSource) - let gardenSectionsGeotrigger = makeGeotriggerMonitor( - feed: geotriggerFeed, - featureTable: gardenSections, - bufferDistance: 0.0, - fenceGeotriggerName: sectionFenceGeotriggerName - ) - let gardenPOIsGeotrigger = makeGeotriggerMonitor( - feed: geotriggerFeed, - featureTable: gardenPOIs, - bufferDistance: 10.0, - fenceGeotriggerName: poiFenceGeotriggerName - ) - geotriggerMonitors.append(contentsOf: [ - gardenSectionsGeotrigger, - gardenPOIsGeotrigger - ]) - - // Start the geotrigger monitors and handle posted geotrigger notifications. - for geotriggerMonitor in geotriggerMonitors { - taskHandles.append( Task { - try? await geotriggerMonitor.start() - for await notification in geotriggerMonitor.notifications { - await handleGeotriggerNotification(notification as! FenceGeotriggerNotificationInfo) - } - }) - } - } - } - - /// Create a geotrigger monitor. - /// - Parameters: - /// - feed: The `GeotriggerFeed` that is monitored for changes. - /// - featureTable: The `ServiceFeatureTable` that contains the features - /// to use in the `FeatureFenceParameters`. - /// - bufferDistance: The `Double` buffer distance in meters to apply to - /// the features when checking if an `FenceGeotrigger` condition is met. - /// - fenceGeotriggerName: The name for the `FenceGeotrigger`. - /// - Returns: A new `GeotriggerMonitor` object. - private func makeGeotriggerMonitor(feed: GeotriggerFeed, featureTable: ServiceFeatureTable, bufferDistance: Double, fenceGeotriggerName: String) -> GeotriggerMonitor { - let fenceParameters = FeatureFenceParameters( - featureTable: featureTable, - bufferDistance: bufferDistance - ) - - // The Arcade expression in the fence geotrigger returns the value for - // the "name" field of the feature that triggered the monitor. - let fenceGeotrigger = FenceGeotrigger( - feed: feed, - ruleType: .enterOrExit, - fenceParameters: fenceParameters, - messageExpression: ArcadeExpression(expression: "$fenceFeature.name"), - name: fenceGeotriggerName - ) - - // Create and return geotrigger. - return GeotriggerMonitor(geotrigger: fenceGeotrigger) - } - - /// Handle a notification posted by a geotrigger monitor when a fence geotrigger - /// condition has been met. - /// - Parameter fenceNotificationInfo: The `FenceGeotriggerNotificationInfo` - /// which provides information about the geotrigger monitor and the fence - /// geotrigger that was triggered. - @MainActor - private func handleGeotriggerNotification(_ fenceNotificationInfo: FenceGeotriggerNotificationInfo) { - // The feature name from the Arcade expression. - let featureName = fenceNotificationInfo.message - let fenceFeature = fenceNotificationInfo.fenceGeoElement as! ArcGISFeature - let geotriggerName = fenceNotificationInfo.geotriggerMonitor.geotrigger.name - - // Handle notification types. - switch fenceNotificationInfo.fenceNotificationType { - case .entered: - // The user entered a geofence: add the feature for future querying. - self.featureNamesInFenceGeotrigger[geotriggerName, default: []].append(featureName) - self.nearbyFeatures[featureName] = fenceFeature - case .exited: - // The user left the geofence: remove the feature from the dicts. - if let poppedFeatureName = self.featureNamesInFenceGeotrigger[geotriggerName]?.popLast() { - self.nearbyFeatures.removeValue(forKey: poppedFeatureName) - } - @unknown default: - fatalError("Unexpected fence notification type.") - } - - // Update the status texts. - updateStatusText(featureName: featureName, notificationType: fenceNotificationInfo.fenceNotificationType) - } - - /// Update the status texts with the feature name and notification type. - /// - Parameters: - /// - featureName: The name of the feature. - /// - notificationType: The fence `NotificationType`. - private func updateStatusText(featureName: String, notificationType: FenceGeotriggerNotificationInfo.NotificationType) { - // Set fence geotrigger text. - let typeString = notificationType == .entered ? "Entered" : "Exited" - fenceGeotriggerText = String(format: "%@ the geofence of %@", typeString, featureName) - - // Set nearby features text. - if nearbyFeatures.isEmpty { - self.nearbyFeaturesText = "No nearby features." - } else { - self.nearbyFeaturesText = String(format: "Nearby: %@", ListFormatter.localizedString(byJoining: nearbyFeatures.keys.sorted())) - } - } - - /// Creates a location display from the location data source. - /// - Parameter dataSource: The `LocationDataSource` to create the location display from. - /// - Returns: A new `LocationDisplay` object. - private static func makeLocationDisplay(dataSource: LocationDataSource) -> LocationDisplay { - let locationDisplay = LocationDisplay(dataSource: dataSource) - locationDisplay.autoPanMode = .recenter - locationDisplay.initialZoomScale = 1000 - return locationDisplay - } - } -} - -private extension SetUpLocationDrivenGeotriggersView { - /// The section fence geotrigger name. - static let sectionFenceGeotriggerName = "Section Fence Geotrigger" - - /// The point-of-interest geotrigger name. - static let poiFenceGeotriggerName = "POI Fence Geotrigger" -} - -private extension PortalItem.ID { - /// The portal item ID of a Santa Barbara Botanic Garden web map. - static var santaBarbaraBotanicGardenMap: Self { Self("6ab0e91dc39e478cae4f408e1a36a308")! } -} - -private extension Item.ID { - /// An id Santa Barbara Botanic Garden Sections layer. - static var gardenSectionsLayer: Self { Self("1ba816341ea04243832136379b8951d9")! } - - /// An id for Santa Barbara Botanic Garden Points of Interest layer. - static var gardenPOIsLayer: Self { Self("7c6280c290c34ae8aeb6b5c4ec841167")! } -} - -private extension Polyline { - /// A path in Santa Barbara Botanic Garden. - static var walkingTour: Polyline { - let walkingTourPolylineJSON = #"{"paths":[[[-119.709881177746,34.4570041646846],[-119.709875813328,34.4570152227745],[-119.709869107805,34.4570240692453],[-119.709859720074,34.4570351273326],[-119.709853014551,34.4570539260775],[-119.709847650133,34.4570760422426],[-119.709848991238,34.4570926293626],[-119.70985569676,34.4571103222869],[-119.709873131119,34.4571202745552],[-119.709889224373,34.4571302268223],[-119.709902635418,34.4571357558591],[-119.709910682045,34.4571600836165],[-119.709910682045,34.4571744591062],[-119.709902635418,34.4571833055602],[-119.709889224373,34.4571910462067],[-119.70988251885,34.4571965752394],[-119.70988251885,34.4572032100782],[-119.709889224373,34.4572175855605],[-119.709898612104,34.4572264320099],[-119.709912023149,34.4572341726524],[-119.709901294313,34.4572419132941],[-119.709895929895,34.4572507597409],[-119.709897271,34.4572596061868],[-119.709902635418,34.4572728758539],[-119.709902635418,34.4572828281028],[-119.70990934094,34.457294991961],[-119.709912023149,34.4573038384022],[-119.709886542164,34.4573115790375],[-119.709861061178,34.4573248486963],[-119.709843626819,34.4573414357669],[-119.709836921297,34.4573668692686],[-119.709843626819,34.4573934085666],[-119.709827533565,34.4574055724087],[-119.709791323744,34.4574188420525],[-119.709749749504,34.4574332174977],[-119.709709516369,34.4574431697275],[-119.709734997354,34.4574807670294],[-119.709748062646,34.4575248306656],[-119.709757450378,34.4575635337324],[-119.709770861423,34.457600025179],[-119.709785613572,34.4576387282109],[-119.70980573014,34.4576730080242],[-119.709815117871,34.4577117110223],[-119.709821823394,34.4577504140025],[-119.709821823394,34.4577869053674],[-119.709821823394,34.4578256083127],[-119.70981780008,34.4578609938471],[-119.709819141185,34.457906331541],[-119.70981460448,34.4579890675855],[-119.709818627793,34.4580675790658],[-119.70982667442,34.4581118108532],[-119.709832038838,34.4581471962662],[-119.709834721047,34.4581947453913],[-119.709836062152,34.4582323423548],[-119.709834721047,34.4582787856393],[-119.709805216748,34.4583429215611],[-119.709759619195,34.4584026342716],[-119.709700610597,34.4584612411497],[-119.709645400048,34.4585103926263],[-119.709566274882,34.4585457778704],[-119.709493855239,34.4585944325566],[-119.709458986522,34.458622077252],[-119.709424117805,34.4586198656767],[-119.709386566878,34.4586110193749],[-119.70935438037,34.4586110193749],[-119.709339628221,34.4586231830396],[-119.709324876071,34.4586585682359],[-119.709306100608,34.4586862129101],[-119.709269890786,34.4587171749343],[-119.709244409801,34.4587238096523],[-119.709229657651,34.4587293385835],[-119.709212223293,34.4587459253751],[-119.70919076562,34.4587945799446],[-119.709174672366,34.4588503400161],[-119.709157238008,34.4589288506865],[-119.709153214694,34.4589951976744],[-119.709155896903,34.4590449578807],[-119.70916394353,34.4590958238387],[-119.709186742307,34.4591323146156],[-119.709218928815,34.4591621706939],[-119.709237704278,34.4591831805204],[-119.709241727592,34.4592252001575],[-119.709238133851,34.459258658624],[-119.709219358388,34.4592796684262],[-119.709207288447,34.4592962551085],[-119.709208629552,34.4593084186733],[-119.709271661463,34.4593791884701],[-119.709310553494,34.4594267368937],[-119.709330670062,34.4594510639836],[-119.709353468838,34.4595008239182],[-119.70936285657,34.4595362087426],[-119.709423221989,34.4595943612845],[-119.709455408497,34.4596297460692],[-119.709487595005,34.459665130839],[-119.709507711573,34.4596817174446],[-119.709523804827,34.4596861405389],[-119.709557332439,34.4596894578594],[-119.709586836739,34.4596894578594],[-119.709593542261,34.4596772943501],[-119.709590860052,34.4596496500041],[-119.709572084589,34.4595777746615],[-119.709566720171,34.4595313320996],[-119.709578790112,34.4595136396883],[-119.709590860052,34.4594992646013],[-119.709627069874,34.4594882068404],[-119.709675349636,34.4595567649343],[-119.709735699339,34.4596197941001],[-119.709775932474,34.4596795058974],[-119.709802754564,34.4597126790997],[-119.709832258863,34.4597359003334],[-119.70986712758,34.4597171021923],[-119.70986980979,34.4596839289918],[-119.709865786476,34.4596308518435],[-119.709876515312,34.4595788804365],[-119.70988187973,34.4595346494263],[-119.709879197521,34.4594926299449],[-119.709852375431,34.4594539277723],[-119.709806777878,34.4593953215911],[-119.709767885847,34.4593212344729],[-119.709720947189,34.4592195028005],[-119.709708720088,34.4591478732967],[-119.709710061193,34.4591058536206],[-119.709707378984,34.459079314867],[-119.709652393699,34.4590262373344],[-119.709617524982,34.4589499383221],[-119.709626771268,34.4588695962162],[-119.709683097658,34.4588032491285],[-119.709730036316,34.4587391135603],[-119.709759540615,34.4586993052518],[-119.7097850216,34.4586650258598],[-119.710059948024,34.4587744987075],[-119.710104204473,34.4587932970608],[-119.710128443889,34.4587649224307],[-119.71019415801,34.4587096331253],[-119.710273283176,34.4586731421637],[-119.71031619852,34.4586532379961],[-119.710367160491,34.4586023717685],[-119.710392641477,34.4585747270665],[-119.710432874612,34.4585083797445],[-119.710471766643,34.4584453497398],[-119.710505294256,34.4584165991955],[-119.710575487456,34.4583689119728],[-119.710705574593,34.4583136224052],[-119.710780676446,34.4582627559707],[-119.710839685044,34.4582030431601],[-119.710895995717,34.4581546042213],[-119.710948298793,34.458095997128],[-119.710988531928,34.4580263320391],[-119.711015354018,34.4579511379096],[-119.711011330705,34.4579102234284],[-119.710985849719,34.4578847900921],[-119.710946957688,34.4578715205223],[-119.710779319625,34.4578847900921],[-119.71073908649,34.4578847900921],[-119.7107122644,34.4578604625458],[-119.71069751225,34.4578295002039],[-119.710674713473,34.4578095958352],[-119.710642526965,34.4577996436491],[-119.710614363771,34.457830606002],[-119.71057547174,34.4578571451526],[-119.710539261918,34.4578737321174],[-119.71049500547,34.4578858958895],[-119.710452090125,34.4578836842947],[-119.710413198095,34.4578748379149],[-119.710375647168,34.4578527219614],[-119.710336755138,34.4578350291944],[-119.710299204211,34.4578107016336],[-119.71027506433,34.4577885856631],[-119.710269605616,34.4577886418169],[-119.710240101317,34.4577510446536],[-119.710198527077,34.4576758502763],[-119.710154270628,34.4575984442288],[-119.710112696389,34.4575265671206],[-119.710044300059,34.4574381029023],[-119.709978842634,34.4573543166616],[-119.709966772693,34.4573410470074],[-119.709972137111,34.4573200367174],[-119.70997481932,34.4573023438375],[-119.709973478216,34.4572846509538],[-119.709970796007,34.457259217427],[-119.709931903976,34.4572348896984],[-119.709914469617,34.4572337838924],[-119.709893011945,34.4572171968005],[-119.709884965318,34.4571972922858],[-119.709902232039,34.4571821133624],[-119.70991161977,34.457167737874],[-119.709907596457,34.4571389868898],[-119.709919666397,34.4571235055865],[-119.709922348606,34.4571047068572],[-119.709918325293,34.4570836965077],[-119.709919666397,34.4570648977695],[-119.70992637192,34.4570516280694],[-119.709933077442,34.4570339351326],[-119.709935759651,34.4570151363832],[-119.709927713024,34.4570062899114],[-119.70991161977,34.4570018666751],[-119.709883456576,34.4570040782933]]],"spatialReference":{"wkid":4326,"latestWkid":4326}}"# - let routePolyline = try? Polyline.fromJSON(walkingTourPolylineJSON) - - // Densify the polyline to control the simulation speed. - let densifiedRoute = GeometryEngine.geodeticDensify( - routePolyline!, - maxSegmentLength: 5.0, - lengthUnit: .meters, - curveType: .geodesic - ) as! Polyline - return densifiedRoute - } -} From 26663a46ac599346afa2f36a3210a75051c4ecf5 Mon Sep 17 00:00:00 2001 From: CalebRas Date: Wed, 28 Jun 2023 15:33:10 -0700 Subject: [PATCH 24/29] Update metadata. --- .../Set up location-driven geotriggers/README.metadata.json | 1 + 1 file changed, 1 insertion(+) diff --git a/Shared/Samples/Set up location-driven geotriggers/README.metadata.json b/Shared/Samples/Set up location-driven geotriggers/README.metadata.json index 21c14f575..2b20dda78 100644 --- a/Shared/Samples/Set up location-driven geotriggers/README.metadata.json +++ b/Shared/Samples/Set up location-driven geotriggers/README.metadata.json @@ -47,6 +47,7 @@ ], "snippets": [ "SetUpLocationDrivenGeotriggersView.swift" + "SetUpLocationDrivenGeotriggersView.Model.swift" ], "title": "Set up location-driven geotriggers" } From 3c6aad81ce2172ead3aacc3bdde1a17d2ed224dc Mon Sep 17 00:00:00 2001 From: CalebRas Date: Wed, 28 Jun 2023 15:36:38 -0700 Subject: [PATCH 25/29] Update metadata. --- .../Set up location-driven geotriggers/README.metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared/Samples/Set up location-driven geotriggers/README.metadata.json b/Shared/Samples/Set up location-driven geotriggers/README.metadata.json index 2b20dda78..5308e0045 100644 --- a/Shared/Samples/Set up location-driven geotriggers/README.metadata.json +++ b/Shared/Samples/Set up location-driven geotriggers/README.metadata.json @@ -46,7 +46,7 @@ "SimulatedLocationDataSource" ], "snippets": [ - "SetUpLocationDrivenGeotriggersView.swift" + "SetUpLocationDrivenGeotriggersView.swift", "SetUpLocationDrivenGeotriggersView.Model.swift" ], "title": "Set up location-driven geotriggers" From af360992d0cd1f3bc0e9a966fe75b5083277ec51 Mon Sep 17 00:00:00 2001 From: Caleb Rasmussen Date: Wed, 28 Jun 2023 16:35:10 -0700 Subject: [PATCH 26/29] Apply suggestions from code review. Co-authored-by: Ting --- .../Samples/Set up location-driven geotriggers/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Shared/Samples/Set up location-driven geotriggers/README.md b/Shared/Samples/Set up location-driven geotriggers/README.md index 00f0f44f9..de529133d 100644 --- a/Shared/Samples/Set up location-driven geotriggers/README.md +++ b/Shared/Samples/Set up location-driven geotriggers/README.md @@ -2,7 +2,7 @@ Create a notification every time a given location data source has entered and/or exited a set of features or graphics. -![Geotriggers](set-up-location-driven-geotriggers.png) +![Image of Set up location-driven geotriggers sample](set-up-location-driven-geotriggers.png) ## Use case @@ -16,9 +16,9 @@ Observe a virtual walking tour of the Santa Barbara Botanic Garden. Information 1. Create a `GeotriggerFeed` with a `LocationDataSource` object (in this case, a `SimulatedLocationDataSource`). 2. Create a `FeatureFenceParameters` class from a `ServiceFeatureTable`, a buffer distance at which to monitor each feature, an Arcade Expression, and a name for the specific geotrigger. -3. Create a `FenceGeotrigger` with the geotrigger feed, a `FenceRuleType`, and the fence parameters. -4. Create a `GeotriggerMonitor` with the fence geotrigger and call `GeotriggerMonitor.start()` to begin listening for events that meet the `FenceRuleType`. -5. When a `GeotriggerMonitor::geotriggerNotification` emits, capture the `GeotriggerNotificationInfo`. +3. Create a `FenceGeotrigger` with the geotrigger feed, a `FenceGeotrigger.RuleType`, and the fence parameters. +4. Create a `GeotriggerMonitor` with the fence geotrigger and call `GeotriggerMonitor.start()` to begin listening for events that meet the fence rule type. +5. When the `notifications` emit, capture the `GeotriggerNotificationInfo`. 6. For more information about the feature that triggered the notification, cast the `GeotriggerNotificationInfo` to a `FenceGeotriggerNotificationInfo` and call `FenceGeotriggerNotificationInfo.fenceGeoElement`. 7. Depending on the `FenceGeotriggerNotificationInfo.fenceNotificationType` display or hide information on the UI from the `GeoElement`'s attributes. From 2490c1d9016e41d1f2f227fee0eba667181d1774 Mon Sep 17 00:00:00 2001 From: CalebRas Date: Mon, 3 Jul 2023 12:52:03 -0700 Subject: [PATCH 27/29] Apply review suggestions. https://github.com/Esri/arcgis-maps-sdk-swift-samples/pull/198#pullrequestreview-1505779490 --- ...pLocationDrivenGeotriggersView.Model.swift | 220 ++++++++---------- .../SetUpLocationDrivenGeotriggersView.swift | 97 ++++++-- 2 files changed, 178 insertions(+), 139 deletions(-) diff --git a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.Model.swift b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.Model.swift index a1aa4fc4e..45d8f4b65 100644 --- a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.Model.swift +++ b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.Model.swift @@ -17,7 +17,25 @@ import ArcGIS extension SetUpLocationDrivenGeotriggersView { /// The view model for the sample. + @MainActor class Model: ObservableObject { + // MARK: Properties + + /// A Boolean value indicating whether there is a current section. + @Published private(set) var hasCurrentSection = false + + /// A Boolean value indicating whether there is a point-of-interest. + @Published private(set) var hasPointOfInterest = false + + /// A dictionary for nearby features. + @Published private(set) var nearbyFeatures: [String: ArcGISFeature] = [:] + + /// The popup to show the feature information. + @Published private(set) var popup: Popup? + + /// The fence geotrigger notification info status. + @Published private(set) var fenceGeotriggerStatus: FenceGeotriggerStatus = .notSet + /// A map of the Santa Barbara Botanic Garden. let map = Map(item: PortalItem( portal: .arcGISOnline(connection: .anonymous), @@ -27,26 +45,20 @@ extension SetUpLocationDrivenGeotriggersView { /// The location display for the map view. let locationDisplay: LocationDisplay + /// The route simulated location data source. + private let locationDataSource = SimulatedLocationDataSource(polyline: .walkingTour()) + /// The name of the current garden section feature. Will be `nil` if there /// is not a current garden section. - var currentSectionName: String? { - featureNamesInFenceGeotrigger[sectionFenceGeotriggerName]?.last + private var currentSectionName: String? { + featureNamesInFenceGeotrigger[.sectionFenceGeotrigger]?.last } /// The names of nearby point-of-interest features. - var nearbyPOINames: [String] { - featureNamesInFenceGeotrigger[poiFenceGeotriggerName] ?? [] + private var nearbyPOINames: [String] { + featureNamesInFenceGeotrigger[.poiFenceGeotrigger] ?? [] } - /// A dictionary for nearby features. - var nearbyFeatures: [String: ArcGISFeature] = [:] - - /// The route simulated location data source. - private let locationDataSource: SimulatedLocationDataSource - - /// An array of geotrigger monitors. - private var geotriggerMonitors: [GeotriggerMonitor] = [] - /// A dictionary for the feature names in each fence geotrigger. /// - Key: The name of a fence geotrigger. /// - Value: An array of names of features within the fence. @@ -57,84 +69,44 @@ extension SetUpLocationDrivenGeotriggersView { } } - /// A string for the fence geotrigger notification status. - @Published var fenceGeotriggerText = "Fence geotrigger info will be shown here." - - /// A string for the display name of the currently nearby feature. - @Published var nearbyFeaturesText = "Nearby features will be shown here." - - /// A Boolean value indicating whether there is a current section. - @Published var hasCurrentSection = false - - /// A Boolean value indicating whether there is a point-of-interest. - @Published var hasPointOfInterest = false - - /// A Boolean value indicating whether to show an error alert. - @Published var isShowingAlert = false - - /// The error shown in the alert. - @Published var error: Error? { - didSet { isShowingAlert = error != nil } - } - - /// The handles for all the async tasks. - private var taskHandles: [Task] = [] + // MARK: Methods init() { - // Create simulated data source with the route polyline. - locationDataSource = SimulatedLocationDataSource(polyline: .walkingTour) - // Create location display. locationDisplay = Self.makeLocationDisplay(dataSource: locationDataSource) } - deinit { - // Cancel all task handle when class is deconstructed. - for handle in taskHandles { - handle.cancel() - } - } - - /// Creates and starts geotriggers from the map's operational layers. - func startGeotriggerMonitoring() { + /// Creates fence geotrigger monitors from the map's operational layers. + func makeGeotriggerMonitors() -> [GeotriggerMonitor] { // Get the service feature tables from the map's operational layers. - if let operationalLayers = map.operationalLayers as? [FeatureLayer], - let gardenSectionsLayer = operationalLayers.first(where: { $0.item?.id == .gardenSectionsLayer }), - let gardenPOIsLayer = operationalLayers.first(where: { $0.item?.id == .gardenPOIsLayer }), - let gardenSections = gardenSectionsLayer.featureTable as? ServiceFeatureTable, - let gardenPOIs = gardenPOIsLayer.featureTable as? ServiceFeatureTable { - // Create geotriggers for each of the service feature tables. - let geotriggerFeed = LocationGeotriggerFeed(locationDataSource: locationDataSource) - let gardenSectionsGeotrigger = makeGeotriggerMonitor( - feed: geotriggerFeed, - featureTable: gardenSections, - bufferDistance: 0.0, - fenceGeotriggerName: sectionFenceGeotriggerName - ) - let gardenPOIsGeotrigger = makeGeotriggerMonitor( - feed: geotriggerFeed, - featureTable: gardenPOIs, - bufferDistance: 10.0, - fenceGeotriggerName: poiFenceGeotriggerName - ) - geotriggerMonitors.append(contentsOf: [ - gardenSectionsGeotrigger, - gardenPOIsGeotrigger - ]) - - // Start the geotrigger monitors and handle posted geotrigger notifications. - for geotriggerMonitor in geotriggerMonitors { - taskHandles.append( Task { - try? await geotriggerMonitor.start() - for await notification in geotriggerMonitor.notifications { - await handleGeotriggerNotification(notification as! FenceGeotriggerNotificationInfo) - } - }) - } + guard let operationalLayers = map.operationalLayers as? [FeatureLayer], + let gardenSectionsLayer = operationalLayers.first(where: { $0.item?.id == .gardenSectionsLayer }), + let gardenPOIsLayer = operationalLayers.first(where: { $0.item?.id == .gardenPOIsLayer }), + let gardenSectionsTable = gardenSectionsLayer.featureTable as? ServiceFeatureTable, + let gardenPOIsTable = gardenPOIsLayer.featureTable as? ServiceFeatureTable + else { + return [] } + + // Create geotriggers for each of the service feature tables. + let geotriggerFeed = LocationGeotriggerFeed(locationDataSource: locationDataSource) + let gardenSectionsGeotriggerMonitor = makeFenceGeotriggerMonitor( + feed: geotriggerFeed, + featureTable: gardenSectionsTable, + bufferDistance: 0.0, + fenceGeotriggerName: .sectionFenceGeotrigger + ) + let gardenPOIsGeotriggerMonitor = makeFenceGeotriggerMonitor( + feed: geotriggerFeed, + featureTable: gardenPOIsTable, + bufferDistance: 10.0, + fenceGeotriggerName: .poiFenceGeotrigger + ) + + return [gardenSectionsGeotriggerMonitor, gardenPOIsGeotriggerMonitor] } - /// Create a geotrigger monitor. + /// Creates a fence geotrigger monitor. /// - Parameters: /// - feed: The `GeotriggerFeed` that is monitored for changes. /// - featureTable: The `ServiceFeatureTable` that contains the features @@ -143,7 +115,12 @@ extension SetUpLocationDrivenGeotriggersView { /// the features when checking if an `FenceGeotrigger` condition is met. /// - fenceGeotriggerName: The name for the `FenceGeotrigger`. /// - Returns: A new `GeotriggerMonitor` object. - private func makeGeotriggerMonitor(feed: GeotriggerFeed, featureTable: ServiceFeatureTable, bufferDistance: Double, fenceGeotriggerName: String) -> GeotriggerMonitor { + private func makeFenceGeotriggerMonitor( + feed: GeotriggerFeed, + featureTable: ServiceFeatureTable, + bufferDistance: Double, + fenceGeotriggerName: String + ) -> GeotriggerMonitor { let fenceParameters = FeatureFenceParameters( featureTable: featureTable, bufferDistance: bufferDistance @@ -163,55 +140,54 @@ extension SetUpLocationDrivenGeotriggersView { return GeotriggerMonitor(geotrigger: fenceGeotrigger) } - /// Handle a notification posted by a geotrigger monitor when a fence geotrigger + /// Handles a notification posted by a geotrigger monitor when a fence geotrigger /// condition has been met. - /// - Parameter fenceNotificationInfo: The `FenceGeotriggerNotificationInfo` - /// which provides information about the geotrigger monitor and the fence - /// geotrigger that was triggered. - @MainActor - private func handleGeotriggerNotification(_ fenceNotificationInfo: FenceGeotriggerNotificationInfo) { + /// - Parameter fenceNotificationInfo: The information about the geotrigger monitor + /// and the geofence that was triggered. + func handleGeotriggerNotification(_ fenceNotificationInfo: FenceGeotriggerNotificationInfo) { // The feature name from the Arcade expression. + let notificationType = fenceNotificationInfo.fenceNotificationType let featureName = fenceNotificationInfo.message let fenceFeature = fenceNotificationInfo.fenceGeoElement as! ArcGISFeature let geotriggerName = fenceNotificationInfo.geotriggerMonitor.geotrigger.name // Handle notification types. - switch fenceNotificationInfo.fenceNotificationType { + switch notificationType { case .entered: // The user entered a geofence: add the feature for future querying. - self.featureNamesInFenceGeotrigger[geotriggerName, default: []].append(featureName) - self.nearbyFeatures[featureName] = fenceFeature + featureNamesInFenceGeotrigger[geotriggerName, default: []].append(featureName) + nearbyFeatures[featureName] = fenceFeature + + // Update the status to notify the view to update. + fenceGeotriggerStatus = .entered(featureName: featureName) case .exited: // The user left the geofence: remove the feature from the dicts. - if let poppedFeatureName = self.featureNamesInFenceGeotrigger[geotriggerName]?.popLast() { - self.nearbyFeatures.removeValue(forKey: poppedFeatureName) + // Enter and exit events follow a first-in-last-out order, so the + // array is used as a stack. + if let poppedFeatureName = featureNamesInFenceGeotrigger[geotriggerName]?.popLast() { + nearbyFeatures.removeValue(forKey: poppedFeatureName) } + fenceGeotriggerStatus = .exited(featureName: featureName) @unknown default: fatalError("Unexpected fence notification type.") } - - // Update the status texts. - updateStatusText(featureName: featureName, notificationType: fenceNotificationInfo.fenceNotificationType) } - /// Update the status texts with the feature name and notification type. - /// - Parameters: - /// - featureName: The name of the feature. - /// - notificationType: The fence `NotificationType`. - private func updateStatusText(featureName: String, notificationType: FenceGeotriggerNotificationInfo.NotificationType) { - // Set fence geotrigger text. - let typeString = notificationType == .entered ? "Entered" : "Exited" - fenceGeotriggerText = String(format: "%@ the geofence of %@", typeString, featureName) - - // Set nearby features text. - if nearbyFeatures.isEmpty { - self.nearbyFeaturesText = "No nearby features." - } else { - self.nearbyFeaturesText = String(format: "Nearby: %@", ListFormatter.localizedString(byJoining: nearbyFeatures.keys.sorted())) - } + /// Sets the popup to show the information of the current garden section. + func setSectionPopup() { + guard let currentSectionName, + let sectionFeature = nearbyFeatures[currentSectionName] else { return } + popup = Popup(geoElement: sectionFeature) + } + + /// Sets the popup to show the information of the first nearby POI. + func setPOIPopup() { + guard let name = nearbyPOINames.first, + let poiFeature = nearbyFeatures[name] else { return } + popup = Popup(geoElement: poiFeature) } - /// Creates a location display from the location data source. + /// Creates a location display from a location data source. /// - Parameter dataSource: The `LocationDataSource` to create the location display from. /// - Returns: A new `LocationDisplay` object. private static func makeLocationDisplay(dataSource: LocationDataSource) -> LocationDisplay { @@ -223,30 +199,30 @@ extension SetUpLocationDrivenGeotriggersView { } } -private extension SetUpLocationDrivenGeotriggersView { +// MARK: Extensions + +private extension String { /// The section fence geotrigger name. - static let sectionFenceGeotriggerName = "Section Fence Geotrigger" + static let sectionFenceGeotrigger = "Section Fence Geotrigger" /// The point-of-interest geotrigger name. - static let poiFenceGeotriggerName = "POI Fence Geotrigger" + static let poiFenceGeotrigger = "POI Fence Geotrigger" } -private extension PortalItem.ID { +private extension Item.ID { /// The portal item ID of a Santa Barbara Botanic Garden web map. static var santaBarbaraBotanicGardenMap: Self { Self("6ab0e91dc39e478cae4f408e1a36a308")! } -} - -private extension Item.ID { - /// An id Santa Barbara Botanic Garden Sections layer. + + /// The layer ID of Santa Barbara Botanic Garden Sections layer. static var gardenSectionsLayer: Self { Self("1ba816341ea04243832136379b8951d9")! } - /// An id for Santa Barbara Botanic Garden Points of Interest layer. + /// The layer ID of Santa Barbara Botanic Garden Points of Interest layer. static var gardenPOIsLayer: Self { Self("7c6280c290c34ae8aeb6b5c4ec841167")! } } private extension Polyline { /// A path in Santa Barbara Botanic Garden. - static var walkingTour: Polyline { + static func walkingTour() -> Polyline { let walkingTourPolylineJSON = #"{"paths":[[[-119.709881177746,34.4570041646846],[-119.709875813328,34.4570152227745],[-119.709869107805,34.4570240692453],[-119.709859720074,34.4570351273326],[-119.709853014551,34.4570539260775],[-119.709847650133,34.4570760422426],[-119.709848991238,34.4570926293626],[-119.70985569676,34.4571103222869],[-119.709873131119,34.4571202745552],[-119.709889224373,34.4571302268223],[-119.709902635418,34.4571357558591],[-119.709910682045,34.4571600836165],[-119.709910682045,34.4571744591062],[-119.709902635418,34.4571833055602],[-119.709889224373,34.4571910462067],[-119.70988251885,34.4571965752394],[-119.70988251885,34.4572032100782],[-119.709889224373,34.4572175855605],[-119.709898612104,34.4572264320099],[-119.709912023149,34.4572341726524],[-119.709901294313,34.4572419132941],[-119.709895929895,34.4572507597409],[-119.709897271,34.4572596061868],[-119.709902635418,34.4572728758539],[-119.709902635418,34.4572828281028],[-119.70990934094,34.457294991961],[-119.709912023149,34.4573038384022],[-119.709886542164,34.4573115790375],[-119.709861061178,34.4573248486963],[-119.709843626819,34.4573414357669],[-119.709836921297,34.4573668692686],[-119.709843626819,34.4573934085666],[-119.709827533565,34.4574055724087],[-119.709791323744,34.4574188420525],[-119.709749749504,34.4574332174977],[-119.709709516369,34.4574431697275],[-119.709734997354,34.4574807670294],[-119.709748062646,34.4575248306656],[-119.709757450378,34.4575635337324],[-119.709770861423,34.457600025179],[-119.709785613572,34.4576387282109],[-119.70980573014,34.4576730080242],[-119.709815117871,34.4577117110223],[-119.709821823394,34.4577504140025],[-119.709821823394,34.4577869053674],[-119.709821823394,34.4578256083127],[-119.70981780008,34.4578609938471],[-119.709819141185,34.457906331541],[-119.70981460448,34.4579890675855],[-119.709818627793,34.4580675790658],[-119.70982667442,34.4581118108532],[-119.709832038838,34.4581471962662],[-119.709834721047,34.4581947453913],[-119.709836062152,34.4582323423548],[-119.709834721047,34.4582787856393],[-119.709805216748,34.4583429215611],[-119.709759619195,34.4584026342716],[-119.709700610597,34.4584612411497],[-119.709645400048,34.4585103926263],[-119.709566274882,34.4585457778704],[-119.709493855239,34.4585944325566],[-119.709458986522,34.458622077252],[-119.709424117805,34.4586198656767],[-119.709386566878,34.4586110193749],[-119.70935438037,34.4586110193749],[-119.709339628221,34.4586231830396],[-119.709324876071,34.4586585682359],[-119.709306100608,34.4586862129101],[-119.709269890786,34.4587171749343],[-119.709244409801,34.4587238096523],[-119.709229657651,34.4587293385835],[-119.709212223293,34.4587459253751],[-119.70919076562,34.4587945799446],[-119.709174672366,34.4588503400161],[-119.709157238008,34.4589288506865],[-119.709153214694,34.4589951976744],[-119.709155896903,34.4590449578807],[-119.70916394353,34.4590958238387],[-119.709186742307,34.4591323146156],[-119.709218928815,34.4591621706939],[-119.709237704278,34.4591831805204],[-119.709241727592,34.4592252001575],[-119.709238133851,34.459258658624],[-119.709219358388,34.4592796684262],[-119.709207288447,34.4592962551085],[-119.709208629552,34.4593084186733],[-119.709271661463,34.4593791884701],[-119.709310553494,34.4594267368937],[-119.709330670062,34.4594510639836],[-119.709353468838,34.4595008239182],[-119.70936285657,34.4595362087426],[-119.709423221989,34.4595943612845],[-119.709455408497,34.4596297460692],[-119.709487595005,34.459665130839],[-119.709507711573,34.4596817174446],[-119.709523804827,34.4596861405389],[-119.709557332439,34.4596894578594],[-119.709586836739,34.4596894578594],[-119.709593542261,34.4596772943501],[-119.709590860052,34.4596496500041],[-119.709572084589,34.4595777746615],[-119.709566720171,34.4595313320996],[-119.709578790112,34.4595136396883],[-119.709590860052,34.4594992646013],[-119.709627069874,34.4594882068404],[-119.709675349636,34.4595567649343],[-119.709735699339,34.4596197941001],[-119.709775932474,34.4596795058974],[-119.709802754564,34.4597126790997],[-119.709832258863,34.4597359003334],[-119.70986712758,34.4597171021923],[-119.70986980979,34.4596839289918],[-119.709865786476,34.4596308518435],[-119.709876515312,34.4595788804365],[-119.70988187973,34.4595346494263],[-119.709879197521,34.4594926299449],[-119.709852375431,34.4594539277723],[-119.709806777878,34.4593953215911],[-119.709767885847,34.4593212344729],[-119.709720947189,34.4592195028005],[-119.709708720088,34.4591478732967],[-119.709710061193,34.4591058536206],[-119.709707378984,34.459079314867],[-119.709652393699,34.4590262373344],[-119.709617524982,34.4589499383221],[-119.709626771268,34.4588695962162],[-119.709683097658,34.4588032491285],[-119.709730036316,34.4587391135603],[-119.709759540615,34.4586993052518],[-119.7097850216,34.4586650258598],[-119.710059948024,34.4587744987075],[-119.710104204473,34.4587932970608],[-119.710128443889,34.4587649224307],[-119.71019415801,34.4587096331253],[-119.710273283176,34.4586731421637],[-119.71031619852,34.4586532379961],[-119.710367160491,34.4586023717685],[-119.710392641477,34.4585747270665],[-119.710432874612,34.4585083797445],[-119.710471766643,34.4584453497398],[-119.710505294256,34.4584165991955],[-119.710575487456,34.4583689119728],[-119.710705574593,34.4583136224052],[-119.710780676446,34.4582627559707],[-119.710839685044,34.4582030431601],[-119.710895995717,34.4581546042213],[-119.710948298793,34.458095997128],[-119.710988531928,34.4580263320391],[-119.711015354018,34.4579511379096],[-119.711011330705,34.4579102234284],[-119.710985849719,34.4578847900921],[-119.710946957688,34.4578715205223],[-119.710779319625,34.4578847900921],[-119.71073908649,34.4578847900921],[-119.7107122644,34.4578604625458],[-119.71069751225,34.4578295002039],[-119.710674713473,34.4578095958352],[-119.710642526965,34.4577996436491],[-119.710614363771,34.457830606002],[-119.71057547174,34.4578571451526],[-119.710539261918,34.4578737321174],[-119.71049500547,34.4578858958895],[-119.710452090125,34.4578836842947],[-119.710413198095,34.4578748379149],[-119.710375647168,34.4578527219614],[-119.710336755138,34.4578350291944],[-119.710299204211,34.4578107016336],[-119.71027506433,34.4577885856631],[-119.710269605616,34.4577886418169],[-119.710240101317,34.4577510446536],[-119.710198527077,34.4576758502763],[-119.710154270628,34.4575984442288],[-119.710112696389,34.4575265671206],[-119.710044300059,34.4574381029023],[-119.709978842634,34.4573543166616],[-119.709966772693,34.4573410470074],[-119.709972137111,34.4573200367174],[-119.70997481932,34.4573023438375],[-119.709973478216,34.4572846509538],[-119.709970796007,34.457259217427],[-119.709931903976,34.4572348896984],[-119.709914469617,34.4572337838924],[-119.709893011945,34.4572171968005],[-119.709884965318,34.4571972922858],[-119.709902232039,34.4571821133624],[-119.70991161977,34.457167737874],[-119.709907596457,34.4571389868898],[-119.709919666397,34.4571235055865],[-119.709922348606,34.4571047068572],[-119.709918325293,34.4570836965077],[-119.709919666397,34.4570648977695],[-119.70992637192,34.4570516280694],[-119.709933077442,34.4570339351326],[-119.709935759651,34.4570151363832],[-119.709927713024,34.4570062899114],[-119.70991161977,34.4570018666751],[-119.709883456576,34.4570040782933]]],"spatialReference":{"wkid":4326,"latestWkid":4326}}"# let routePolyline = try? Polyline.fromJSON(walkingTourPolylineJSON) diff --git a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift index 63aa77071..e1b1245bc 100644 --- a/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift +++ b/Shared/Samples/Set up location-driven geotriggers/SetUpLocationDrivenGeotriggersView.swift @@ -20,31 +20,76 @@ struct SetUpLocationDrivenGeotriggersView: View { /// The view model for the sample. @StateObject private var model = Model() - /// The popup to show the feature information. - @State private var popup: Popup? + /// A Boolean value indicating whether to show an alert. + @State private var isShowingAlert = false + + /// The error shown in the alert. + @State private var error: Error? { + didSet { isShowingAlert = error != nil } + } /// A Boolean value indicating whether to show the popup. - @State var isShowingPopup = false + @State private var isShowingPopup = false + + /// A string for the fence geotrigger notification status. + @State private var fenceGeotriggerText = "" + + /// A string for the display name of the currently nearby feature. + @State private var nearbyFeaturesText = "" + + /// Starts the geotrigger monitors and handles posted notifications. + /// - Parameter geotriggerMonitors: The geotrigger monitors to start. + private func startGeotriggerMonitors(_ geotriggerMonitors: [GeotriggerMonitor]) async throws { + await withThrowingTaskGroup(of: Void.self) { group in + for monitor in geotriggerMonitors { + group.addTask { + try await monitor.start() + for await newNotification in monitor.notifications where newNotification is FenceGeotriggerNotificationInfo { + await model.handleGeotriggerNotification(newNotification as! FenceGeotriggerNotificationInfo) + } + } + } + } + } var body: some View { MapView(map: model.map) .locationDisplay(model.locationDisplay) .task { - // Start geotrigger monitoring once the map loads. do { + // Load the map and its operational layers. try await model.map.load() - model.startGeotriggerMonitoring() + + // Create the geotrigger monitors. + let monitors = model.makeGeotriggerMonitors() + + // Start geotrigger monitoring. + if !monitors.isEmpty { + try await startGeotriggerMonitors(monitors) + } } catch { - model.error = error + self.error = error + } + } + .task(id: model.fenceGeotriggerStatus) { + // Set fence geotrigger text. + fenceGeotriggerText = model.fenceGeotriggerStatus.label + + // Set nearby features text. + let features = model.nearbyFeatures + if features.isEmpty { + nearbyFeaturesText = "No nearby features." + } else { + nearbyFeaturesText = String(format: "Nearby: %@", ListFormatter.localizedString(byJoining: features.keys.sorted())) } } .overlay(alignment: .top) { // Status text overlay. VStack { - Text(model.fenceGeotriggerText) + Text(fenceGeotriggerText) .frame(maxWidth: .infinity, alignment: .leading) - Text(model.nearbyFeaturesText) + Text(nearbyFeaturesText) .foregroundColor(.orange) .frame(maxWidth: .infinity, alignment: .leading) } @@ -52,19 +97,16 @@ struct SetUpLocationDrivenGeotriggersView: View { .background(.thinMaterial, ignoresSafeAreaEdges: .horizontal) } .toolbar { - // Bottom button toolbar. ToolbarItemGroup(placement: .bottomBar) { Button("Current Section") { - let sectionFeature = model.nearbyFeatures[model.currentSectionName!]! - popup = Popup(geoElement: sectionFeature) + model.setSectionPopup() isShowingPopup = true } .disabled(!model.hasCurrentSection) .opacity(isShowingPopup ? 0 : 1) Button("Point of Interest") { - let poiFeature = model.nearbyFeatures[model.nearbyPOINames.first!]! - popup = Popup(geoElement: poiFeature) + model.setPOIPopup() isShowingPopup = true } .disabled(!model.hasPointOfInterest) @@ -77,8 +119,7 @@ struct SetUpLocationDrivenGeotriggersView: View { isPresented: $isShowingPopup ) { Group { - // Feature info popup. - if let popup = popup { + if let popup = model.popup { PopupView(popup: popup, isPresented: $isShowingPopup) .showCloseButton(true) } @@ -86,13 +127,35 @@ struct SetUpLocationDrivenGeotriggersView: View { .padding() } .task(id: isShowingPopup) { - // Stop location updates when the popup is showing. if isShowingPopup { + // Stop location updates when the popup is showing. await model.locationDisplay.dataSource.stop() } else { + // Start location updates when no popup is showing. try? await model.locationDisplay.dataSource.start() } } - .alert(isPresented: $model.isShowingAlert, presentingError: model.error) + .alert(isPresented: $isShowingAlert, presentingError: error) + } +} + +extension SetUpLocationDrivenGeotriggersView { + /// The status of a fence geotrigger monitor. + enum FenceGeotriggerStatus: Equatable { + case notSet + case entered(featureName: String) + case exited(featureName: String) + + /// A human-readable label for the geotrigger status. + var label: String { + switch self { + case .notSet: + return "Fence geotrigger info will be shown here." + case .entered(featureName: let featureName): + return "Entered the geofence of \(featureName)" + case .exited(featureName: let featureName): + return "Exited the geofence of \(featureName)" + } + } } } From bdffdad83fe32a8574349ee958eef0ab65912190 Mon Sep 17 00:00:00 2001 From: Caleb Rasmussen Date: Mon, 3 Jul 2023 12:52:38 -0700 Subject: [PATCH 28/29] Update Shared/Samples/Set up location-driven geotriggers/README.md Co-authored-by: Ting --- Shared/Samples/Set up location-driven geotriggers/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared/Samples/Set up location-driven geotriggers/README.md b/Shared/Samples/Set up location-driven geotriggers/README.md index de529133d..cb46a4b9f 100644 --- a/Shared/Samples/Set up location-driven geotriggers/README.md +++ b/Shared/Samples/Set up location-driven geotriggers/README.md @@ -39,7 +39,7 @@ Observe a virtual walking tour of the Santa Barbara Botanic Garden. Information ## About the data -This sample uses the [Santa Barbara Botanic Garden Geotriggers Sample](https://arcgisruntime.maps.arcgis.com/home/item.html?id=6ab0e91dc39e478cae4f408e1a36a308) ArcGIS Online Web Map which includes a georeferenced map of the garden as well as select polygon and point features to denote garden sections and points of interest. Description text and attachment images in the feature layers were provided by the Santa Barbara Botanic Garden and more information can be found on the [Garden Sections & Displays](https://www.sbbg.org/explore-garden/garden-sections-displays) portion of their website. All assets are used with permission from the Santa Barbara Botanic Garden. For more information, visit the [Santa Barbara Botanic Garden](https://www.sbbg.org) website. +This sample uses the [Santa Barbara Botanic Garden Geotriggers Sample](https://www.arcgis.com/home/item.html?id=6ab0e91dc39e478cae4f408e1a36a308) ArcGIS Online Web Map which includes a georeferenced map of the garden as well as select polygon and point features to denote garden sections and points of interest. Description text and attachment images in the feature layers were provided by the Santa Barbara Botanic Garden and more information can be found on the [Garden Sections & Displays](https://www.sbbg.org/explore-garden/garden-sections-displays) portion of their website. All assets are used with permission from the Santa Barbara Botanic Garden. For more information, visit the [Santa Barbara Botanic Garden](https://www.sbbg.org) website. ## Tags From 632b85792fb7a3b316659aff55b74c521bdf6f3b Mon Sep 17 00:00:00 2001 From: CalebRas Date: Mon, 3 Jul 2023 12:53:59 -0700 Subject: [PATCH 29/29] Sort after conflict merge. --- Samples.xcodeproj/project.pbxproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Samples.xcodeproj/project.pbxproj b/Samples.xcodeproj/project.pbxproj index 7d6315303..c5d32e49c 100644 --- a/Samples.xcodeproj/project.pbxproj +++ b/Samples.xcodeproj/project.pbxproj @@ -133,10 +133,10 @@ D75362D32A1E8C8800D83028 /* ApplyUniqueValueRendererView.swift in Copy Source Code Files */ = {isa = PBXBuildFile; fileRef = D75362D12A1E886700D83028 /* ApplyUniqueValueRendererView.swift */; }; D754E3232A1D66820006C5F1 /* StylePointWithPictureMarkerSymbolsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D754E3222A1D66820006C5F1 /* StylePointWithPictureMarkerSymbolsView.swift */; }; D754E3242A1D66C20006C5F1 /* StylePointWithPictureMarkerSymbolsView.swift in Copy Source Code Files */ = {isa = PBXBuildFile; fileRef = D754E3222A1D66820006C5F1 /* StylePointWithPictureMarkerSymbolsView.swift */; }; - D769C2122A29019B00030F61 /* SetUpLocationDrivenGeotriggersView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D769C2112A29019B00030F61 /* SetUpLocationDrivenGeotriggersView.swift */; }; - D769C2132A29057200030F61 /* SetUpLocationDrivenGeotriggersView.swift in Copy Source Code Files */ = {isa = PBXBuildFile; fileRef = D769C2112A29019B00030F61 /* SetUpLocationDrivenGeotriggersView.swift */; }; D7634FAF2A43B7AC00F8AEFB /* CreateConvexHullAroundGeometriesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7634FAE2A43B7AC00F8AEFB /* CreateConvexHullAroundGeometriesView.swift */; }; D7634FB02A43B8B000F8AEFB /* CreateConvexHullAroundGeometriesView.swift in Copy Source Code Files */ = {isa = PBXBuildFile; fileRef = D7634FAE2A43B7AC00F8AEFB /* CreateConvexHullAroundGeometriesView.swift */; }; + D769C2122A29019B00030F61 /* SetUpLocationDrivenGeotriggersView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D769C2112A29019B00030F61 /* SetUpLocationDrivenGeotriggersView.swift */; }; + D769C2132A29057200030F61 /* SetUpLocationDrivenGeotriggersView.swift in Copy Source Code Files */ = {isa = PBXBuildFile; fileRef = D769C2112A29019B00030F61 /* SetUpLocationDrivenGeotriggersView.swift */; }; D77570C02A2942F800F490CD /* AnimateImagesWithImageOverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D77570BF2A2942F800F490CD /* AnimateImagesWithImageOverlayView.swift */; }; D77570C12A2943D900F490CD /* AnimateImagesWithImageOverlayView.swift in Copy Source Code Files */ = {isa = PBXBuildFile; fileRef = D77570BF2A2942F800F490CD /* AnimateImagesWithImageOverlayView.swift */; }; D77572AE2A295DDE00F490CD /* PacificSouthWest2 in Resources */ = {isa = PBXBuildFile; fileRef = D77572AD2A295DDD00F490CD /* PacificSouthWest2 */; settings = {ASSET_TAGS = (AnimateImagesWithImageOverlay, ); }; }; @@ -402,8 +402,8 @@ D752D95E2A3BCE06003EB25E /* DisplayMapFromPortalItemView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DisplayMapFromPortalItemView.swift; sourceTree = ""; }; D75362D12A1E886700D83028 /* ApplyUniqueValueRendererView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApplyUniqueValueRendererView.swift; sourceTree = ""; }; D754E3222A1D66820006C5F1 /* StylePointWithPictureMarkerSymbolsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StylePointWithPictureMarkerSymbolsView.swift; sourceTree = ""; }; - D769C2112A29019B00030F61 /* SetUpLocationDrivenGeotriggersView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SetUpLocationDrivenGeotriggersView.swift; sourceTree = ""; }; D7634FAE2A43B7AC00F8AEFB /* CreateConvexHullAroundGeometriesView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CreateConvexHullAroundGeometriesView.swift; sourceTree = ""; }; + D769C2112A29019B00030F61 /* SetUpLocationDrivenGeotriggersView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SetUpLocationDrivenGeotriggersView.swift; sourceTree = ""; }; D77570BF2A2942F800F490CD /* AnimateImagesWithImageOverlayView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnimateImagesWithImageOverlayView.swift; sourceTree = ""; }; D77572AD2A295DDD00F490CD /* PacificSouthWest2 */ = {isa = PBXFileReference; lastKnownFileType = folder; path = PacificSouthWest2; sourceTree = ""; }; D78666AC2A2161F100C60110 /* FindNearestVertexView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FindNearestVertexView.swift; sourceTree = ""; };