Skip to content

Commit 2d3c0d0

Browse files
Rachael-ERachael Ellen
andauthored
[New sample] Set up location driven geotriggers (#657)
* initial sample set up * add polyline data for walking tour * Update SetUpLocationDrivenGeotriggersController.java * mvp sample working * Update SetUpLocationDrivenGeotriggersController.java * store poi names in a list * vertical styling and code refactor * neaten up UI * tidy up * add metadata * add image * tidy up * update css and get feature table from map * configure UI for compatibility with sample viewer * Update SetUpLocationDrivenGeotriggersController.java * Update SetUpLocationDrivenGeotriggersController.java * update python script to ignore case for Geotriggers * Update README.metadata.json * update following review comments * remove unused import * move viewInsets outside listener and add status changed listener * Update SetUpLocationDrivenGeotriggersController.java * update UI when sample opens * update following Mark's review * Update SetUpLocationDrivenGeotriggersController.java Co-authored-by: Rachael Ellen <[email protected]>
1 parent 6fd5e9e commit 2d3c0d0

File tree

16 files changed

+1700
-1
lines changed

16 files changed

+1700
-1
lines changed

.github/scripts/ci/readme_metadata_style_check/README_style_checker.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
'Web Mercator',
2020
'ArcGIS Pro',
2121
'GeoPackage',
22+
'Geotriggers'
2223
'loadStatus',
2324
'Integrated Windows Authentication',
2425
'GeoElement',
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# Set up location driven Geotriggers
2+
3+
Create a notification every time a given location data source has entered and/or exited a set of features or graphics.
4+
5+
![Geotriggers](SetUpLocationDrivenGeotriggers.png)
6+
7+
## Use case
8+
9+
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.
10+
11+
## How to use the sample
12+
13+
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.
14+
15+
## How it works
16+
17+
1. Create a `LocationGeotriggerFeed` with a `SimulatedLocationDataSource`.
18+
2. Create `FeatureFenceParameters` from a `ServiceFeatureTable`, and an optional buffer distance at which to monitor each feature.
19+
3. Create a `FenceGeotrigger` with the location geotrigger feed, a `FenceRuleType.ENTER_OR_EXIT`, the feature fence parameters, an Arcade Expression, and a name for the specific geotrigger.
20+
4. Create a `GeotriggerMonitor` with the fence geotrigger and call `.startAsync()` on it to begin listening for events that meet the `FenceRuleType`.
21+
5. When a `GeotriggerMonitorNotificationEvent` emits, capture the `GeotriggerNotificationInfo`.
22+
6. For more information about the feature that triggered the notification, cast the `GeotriggerNotificationInfo` to a `FenceGeotriggerNotificationInfo` and call `fenceGeotriggerNotificationInfo.getFenceGeoElement()` to get the fence feature, casting the geoelement as an `ArcGISFeature`.
23+
7. Depending on the geotrigger notification info's `FenceNotificationType()` display (on notification type `ENTERED`) or hide (on notification type `EXITED`) information about the feature on the UI.
24+
25+
## Relevant API
26+
27+
* ArcadeExpression
28+
* FeatureFenceParameters
29+
* FenceGeotrigger
30+
* FenceGeotriggerNotificationInfo
31+
* FenceNotificationType
32+
* FenceRuleType
33+
* Geotrigger
34+
* GeotriggerFeed
35+
* GeotriggerMonitor
36+
* GeotriggerNotificationInfo
37+
* SimulatedLocationDataSource
38+
39+
## About the data
40+
41+
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://sbbg.org) website.
42+
43+
## Tags
44+
45+
alert, arcade, fence, geofence, geotrigger, location, navigation, notification, notify, routing, trigger
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
{
2+
"category": "Map view",
3+
"description": "Create a notification every time a given location data source has entered and/or exited a set of features or graphics.",
4+
"ignore": false,
5+
"images": [
6+
"SetUpLocationDrivenGeotriggers.png"
7+
],
8+
"keywords": [
9+
"alert",
10+
"arcade",
11+
"fence",
12+
"geofence",
13+
"geotrigger",
14+
"location",
15+
"navigation",
16+
"notification",
17+
"notify",
18+
"routing",
19+
"trigger",
20+
"ArcadeExpression",
21+
"FeatureFenceParameters",
22+
"FenceGeotrigger",
23+
"FenceGeotriggerNotificationInfo",
24+
"FenceNotificationType",
25+
"FenceRuleType",
26+
"Geotrigger",
27+
"GeotriggerFeed",
28+
"GeotriggerMonitor",
29+
"GeotriggerNotificationInfo",
30+
"SimulatedLocationDataSource"
31+
],
32+
"redirect_from": "",
33+
"relevant_apis": [
34+
"ArcadeExpression",
35+
"FeatureFenceParameters",
36+
"FenceGeotrigger",
37+
"FenceGeotriggerNotificationInfo",
38+
"FenceNotificationType",
39+
"FenceRuleType",
40+
"Geotrigger",
41+
"GeotriggerFeed",
42+
"GeotriggerMonitor",
43+
"GeotriggerNotificationInfo",
44+
"SimulatedLocationDataSource"
45+
],
46+
"snippets": [
47+
"src/main/java/com/esri/samples/set_up_location_driven_geotriggers/SetUpLocationDrivenGeotriggersController.java",
48+
"src/main/java/com/esri/samples/set_up_location_driven_geotriggers/SetUpLocationDrivenGeotriggersSample.java",
49+
"src/main/resources/set_up_location_driven_geotriggers/main.fxml"
50+
],
51+
"title": "Set up location driven Geotriggers"
52+
}
647 KB
Loading
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
plugins {
2+
id 'application'
3+
id 'org.openjfx.javafxplugin' version '0.0.8'
4+
}
5+
6+
group = 'com.esri.samples'
7+
8+
ext {
9+
arcgisVersion = '100.12.0'
10+
}
11+
12+
javafx {
13+
version = "11.0.2"
14+
modules = [ 'javafx.controls', 'javafx.fxml' ]
15+
}
16+
17+
compileJava.options.encoding = 'UTF-8'
18+
19+
repositories {
20+
mavenCentral()
21+
maven {
22+
url 'https://esri.jfrog.io/artifactory/arcgis'
23+
}
24+
maven {
25+
url 'https://olympus.esri.com/artifactory/arcgisruntime-repo'
26+
}
27+
}
28+
29+
configurations {
30+
natives
31+
}
32+
33+
dependencies {
34+
implementation 'commons-io:commons-io:2.4'
35+
implementation "com.esri.arcgisruntime:arcgis-java:$arcgisVersion"
36+
natives "com.esri.arcgisruntime:arcgis-java-jnilibs:$arcgisVersion"
37+
natives "com.esri.arcgisruntime:arcgis-java-resources:$arcgisVersion"
38+
// handle SLF4J http://www.slf4j.org/codes.html#StaticLoggerBinder
39+
runtimeOnly 'org.slf4j:slf4j-nop:1.7.32'
40+
}
41+
42+
task createGradlePropertiesAndWriteApiKey {
43+
description = "Creates a new gradle.properties file with an empty API key variable in the user home ./gradle folder, if the file doesn't already exist."
44+
group = "build"
45+
def propertiesFile = new File("${System.properties.getProperty("user.home")}/.gradle/gradle.properties")
46+
if (!propertiesFile.exists()) {
47+
print("Go to " + new URL("https://developers.arcgis.com/dashboard") + " to get an API key.")
48+
print(" Add your API key to ${System.properties.getProperty("user.home")}\\.gradle\\gradle.properties.")
49+
propertiesFile.write("apiKey = ")
50+
}
51+
}
52+
53+
task copyNatives(type: Copy) {
54+
description = "Copies the arcgis native libraries into the project build directory for development."
55+
group = "build"
56+
configurations.natives.asFileTree.each {
57+
from(zipTree(it))
58+
}
59+
// store native libraries in a common location shared with other samples
60+
into "${System.properties.getProperty("user.home")}/.arcgis/$arcgisVersion"
61+
}
62+
63+
run {
64+
doFirst {
65+
// sets the API key from the gradle.properties file as a Java system property
66+
systemProperty 'apiKey', apiKey
67+
}
68+
dependsOn copyNatives
69+
mainClassName = 'com.esri.samples.set_up_location_driven_geotriggers.SetUpLocationDrivenGeotriggersLauncher'
70+
}
71+
72+
jar {
73+
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
74+
manifest {
75+
attributes("Main-Class": "$mainClassName")
76+
}
77+
from {
78+
configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
79+
}
80+
81+
// exclude signing files that come from dependencies
82+
exclude "META-INF/*.SF"
83+
exclude "META-INF/*.DSA"
84+
exclude "META-INF/*.RSA"
85+
}
86+
87+
task productionZip(type: Zip) {
88+
group = 'distribution'
89+
from copyNatives
90+
from jar.destinationDirectory
91+
into (project.name)
92+
archiveBaseName = project.name
93+
}
94+
95+
wrapper {
96+
gradleVersion = '7.0.2'
97+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
distributionBase=GRADLE_USER_HOME
2+
distributionPath=wrapper/dists
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip
4+
zipStoreBase=GRADLE_USER_HOME
5+
zipStorePath=wrapper/dists
Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
#!/usr/bin/env sh
2+
3+
##############################################################################
4+
##
5+
## Gradle start up script for UN*X
6+
##
7+
##############################################################################
8+
9+
# Attempt to set APP_HOME
10+
# Resolve links: $0 may be a link
11+
PRG="$0"
12+
# Need this for relative symlinks.
13+
while [ -h "$PRG" ] ; do
14+
ls=`ls -ld "$PRG"`
15+
link=`expr "$ls" : '.*-> \(.*\)$'`
16+
if expr "$link" : '/.*' > /dev/null; then
17+
PRG="$link"
18+
else
19+
PRG=`dirname "$PRG"`"/$link"
20+
fi
21+
done
22+
SAVED="`pwd`"
23+
cd "`dirname \"$PRG\"`/" >/dev/null
24+
APP_HOME="`pwd -P`"
25+
cd "$SAVED" >/dev/null
26+
27+
APP_NAME="Gradle"
28+
APP_BASE_NAME=`basename "$0"`
29+
30+
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
31+
DEFAULT_JVM_OPTS='"-Xmx64m"'
32+
33+
# Use the maximum available, or set MAX_FD != -1 to use that value.
34+
MAX_FD="maximum"
35+
36+
warn () {
37+
echo "$*"
38+
}
39+
40+
die () {
41+
echo
42+
echo "$*"
43+
echo
44+
exit 1
45+
}
46+
47+
# OS specific support (must be 'true' or 'false').
48+
cygwin=false
49+
msys=false
50+
darwin=false
51+
nonstop=false
52+
case "`uname`" in
53+
CYGWIN* )
54+
cygwin=true
55+
;;
56+
Darwin* )
57+
darwin=true
58+
;;
59+
MINGW* )
60+
msys=true
61+
;;
62+
NONSTOP* )
63+
nonstop=true
64+
;;
65+
esac
66+
67+
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
68+
69+
# Determine the Java command to use to start the JVM.
70+
if [ -n "$JAVA_HOME" ] ; then
71+
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
72+
# IBM's JDK on AIX uses strange locations for the executables
73+
JAVACMD="$JAVA_HOME/jre/sh/java"
74+
else
75+
JAVACMD="$JAVA_HOME/bin/java"
76+
fi
77+
if [ ! -x "$JAVACMD" ] ; then
78+
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
79+
80+
Please set the JAVA_HOME variable in your environment to match the
81+
location of your Java installation."
82+
fi
83+
else
84+
JAVACMD="java"
85+
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
86+
87+
Please set the JAVA_HOME variable in your environment to match the
88+
location of your Java installation."
89+
fi
90+
91+
# Increase the maximum file descriptors if we can.
92+
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
93+
MAX_FD_LIMIT=`ulimit -H -n`
94+
if [ $? -eq 0 ] ; then
95+
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
96+
MAX_FD="$MAX_FD_LIMIT"
97+
fi
98+
ulimit -n $MAX_FD
99+
if [ $? -ne 0 ] ; then
100+
warn "Could not set maximum file descriptor limit: $MAX_FD"
101+
fi
102+
else
103+
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
104+
fi
105+
fi
106+
107+
# For Darwin, add options to specify how the application appears in the dock
108+
if $darwin; then
109+
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
110+
fi
111+
112+
# For Cygwin, switch paths to Windows format before running java
113+
if $cygwin ; then
114+
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
115+
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
116+
JAVACMD=`cygpath --unix "$JAVACMD"`
117+
118+
# We build the pattern for arguments to be converted via cygpath
119+
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
120+
SEP=""
121+
for dir in $ROOTDIRSRAW ; do
122+
ROOTDIRS="$ROOTDIRS$SEP$dir"
123+
SEP="|"
124+
done
125+
OURCYGPATTERN="(^($ROOTDIRS))"
126+
# Add a user-defined pattern to the cygpath arguments
127+
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
128+
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
129+
fi
130+
# Now convert the arguments - kludge to limit ourselves to /bin/sh
131+
i=0
132+
for arg in "$@" ; do
133+
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
134+
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
135+
136+
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
137+
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
138+
else
139+
eval `echo args$i`="\"$arg\""
140+
fi
141+
i=$((i+1))
142+
done
143+
case $i in
144+
(0) set -- ;;
145+
(1) set -- "$args0" ;;
146+
(2) set -- "$args0" "$args1" ;;
147+
(3) set -- "$args0" "$args1" "$args2" ;;
148+
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
149+
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
150+
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
151+
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
152+
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
153+
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
154+
esac
155+
fi
156+
157+
# Escape application args
158+
save () {
159+
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
160+
echo " "
161+
}
162+
APP_ARGS=$(save "$@")
163+
164+
# Collect all arguments for the java command, following the shell quoting and substitution rules
165+
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
166+
167+
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
168+
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
169+
cd "$(dirname "$0")"
170+
fi
171+
172+
exec "$JAVACMD" "$@"

0 commit comments

Comments
 (0)