The Join Features tool uses Arcade expressions to specify join conditions. In some cases, you may want to specify a condition to select features that should be included in the join. You can perform simple join conditions (such as field a > field c) as well as advanced conditions. The conditions are tested against each feature to determine what is analyzed. Calculations are performed when the analysis runs on your ArcGIS GeoAnalytics Server
At ArcGIS Enterprise 10.6 and later, expressions are formatted using Arcade. Using Arcade, field names in Join Features are formatted as $target["field name"] and $join["field name"] or $target.fieldname and $jon.fieldname. The first option, $target["field name"] and $join["field name"], is required when a field name includes a space. All examples below use this option.
Note:
Join Features requires two inputs, a target layer and a join layer. Accordingly, any Arcade expression in Join Features must outline which dataset is being used. For example, an operation to calculate whether a field in the target layer named field1 is greater than a field in the join layer named field2 would be expressed as $target["field1"] > $join["field2"]. This is different from expressions in other GeoAnalytics Tools, which use the format $feature["fieldname"].Learn more about Arcade expressions
Arcade expressions are used in GeoAnalytics Server by the following tools:
- Buffer expressions in Reconstruct Tracks
- Buffer expressions in Create Buffers
- Join Features using start and end expressions in Join Features
- Calculate field values in Calculate Field
Mathematical operator and function examples
Expressions are able to mathematically process numbers. The following table shows a sample of available operations.
Learn more about mathematical operations and functions available in Arcade
Operator | Explanation | Example | Result |
---|---|---|---|
a + b | a plus b. | fieldname contains a value of 1.5 $target["fieldname"] + 2.5 | 4.0 |
a - b | a minus b. | fieldname contains a value of 3.3 $target["fieldname"]- 2.2 | 1.1 |
a * b | a times b. | fieldname contains a value of 2.0 $join["fieldname"] * 2.2 | 4.4 |
a / b | a divided by b. | fieldname contains a value of 4.0 $join["fieldname"] / 1.25 | 3.2 |
abs( a ) | Returns the absolute (positive) value of a. | fieldname contains a value of -1.5 abs($target["fieldname"]) | 1.5 |
log( a ) | Returns the natural logarithm (base E) of a. | fieldname contains a value of 1 log($join["fieldname"]) | 0 |
sin( a ) | Returns the trigonometric sine of a. The input is assumed to be an angle in radians. | fieldname contains a value of 1.5707 sin($target["fieldname"]) | 1 |
cos( a ) | Returns the trigonometric cosine of a. The input is assumed to be an angle in radians. | fieldname contains a value of 0 cos($join["fieldname"]) | 1 |
tan( a ) | Returns the tangent of a. The input is assumed to be an angle in radians. | fieldname contains a value of 0 tan($target["fieldname"]) | 0 |
sqrt( a ) | Returns the square root of a. | fieldname contains a value of 9 sqrt($join["fieldname"]) | 3 |
min( a, b ) | Returns the lowest-valued number between a and b. | fieldname contains a value of 1.5 and a value of -3 min($join["fieldname"], -3) | -3 |
max( a, b ) | Returns the highest-valued number between a and b. | fieldname1 contains a value of 1.5, and fieldname2 contains a value of -3 max($target["fieldname1"], $join["fieldname2"]) | 1.5 |
constrain(<value>,<low>,<high>) | Returns the input value if it's within the constraining bounds. If the input value is less than the low value, it returns the low value. If the input value is greater than the high value, it returns the high value. | constrain($target["distance"], 0, 10) constrain($join['Store dist'], 6, distance) | Returns 0 if distance is less than 0, 10 if distance is greater than 10, and distance otherwise. Returns 6 if Store dist is less than 6, distance if Store dist is greater than distance, and Store dist otherwise. |
Multiplication example for a join condition expression using a field from the target dataset.
$target["Distance"] * 2 > $join["DistField"]
Text function examples
Join condition expressions are able to process text. The following table shows a sample of available operations.
Learn more about text functions available in Arcade
Operator | Explanation | Example | Result |
---|---|---|---|
concatenate( <values>, <separator>) | Concatenates values together and returns a string.
| fieldname contains a value of GeoAnalytics Concatenate ([$target["fieldname"], "is", "great!"], ' ') | GeoAnalytics is great! |
find(<searchText>, <text>, <startPos>) | Finds a string within a string. Wildcards are not supported.
| fieldname1 contains a value of 14NorthStreet and fieldname2 contains a value of North find($target["fieldname2"], $join["fieldname1"]) | 2 |
lower(<value>) | Makes a string lowercase.
| fieldname contains a value of GEOANALYTICS lower($join["fieldname"]) | geoanalytics |
Text example using find and lower.
find(("north"), lower("146NorthStreet")) == False
Date function examples
Join expressions are able to process dates. The following table shows a sample of available operations.
Learn more about date functions available in Arcade
In Arcade, month values range from 0 (January) to 11 (December), days from 1 to 31, hours from 0 (12:00 a.m.) to 23 (11:00 p.m.), minutes and seconds from 0 to 59, and milliseconds from 0 to 999. Arcade dates return time values in the location of your GeoAnalytics Server.
Operator | Explanation | Example | Result |
---|---|---|---|
date( <value>, <month>, <day>, <hour>, <minute>) | Parses a value or set of values into a date string.
| fieldname contains a value of 1476987783555 Example 1: Date($target["fieldname"]) Example 2: Date(2017,0,14,0) Example 3: Date() | Example 1: 20 Oct 2016 11:23:03 am Example 2: 14 Jan 2017 12:00:00 am Example 3: Returns the current time |
DateDiff(<date1>, <date2>, <units>) | Subtracts two dates and returns the difference in the specified units.
| Example 1: DateDiff(Date(2017,1,14,0), Date()) Example 2: DateDiff(Date(2017,1,14,0), Date(), "Years") | Result will vary depending on when you run this command. Example 1: -20532129137 Example 2: -0.6546783768647119 |
Year(<dateValue>) | Returns the year of the given date
| Example 1: fieldname is a field of type Date with a value of value of 09 Oct 2017 04:30:43 pm Year($join["fieldname"]) Example 2: fieldname is a string field formatted as an ISO 8601 string with a value of 2012-09-27 Example 2: fieldname is a string field formatted as an ISO 8601 string with a value of Year(Date($target["fieldname"])) | Example 1: 2017 Example 2: 2012 |
Conditional operators
Conditional statements can use the following operators:
Operator | Explanation | Example | Results |
---|---|---|---|
a > b a < b | a is greater than b a is less than b | 10 > 2 | False |
a >= b a <= b | a is greater than or equal to b a is less than or equal to b | abs(-10) >= 10 | True |
a != b | a is not equal to b | abs(-3) != -3 | True |
a == b | a is equal to b | abs(-5) == 5 | True |
<condition1> || <condition2> | Condition 1 or condition 2 is met. | (abs(-5) == 5) || (10 < 2) | True |
<condition1> && <condition2> | Condition 1 and condition 2 are met. | (abs(-5) == 5) && (10 < 2) | False |
Logical operator examples
In addition to the conditional operators, more advanced logical operators can be used to join features.
Learn more about logical functions available in Arcade
Function | Explanation | Example | Result |
---|---|---|---|
constrain(<value>,<low>,<high>) | Returns the input value if it's within the constraining bounds. If the input value is less than the low value, it returns the low value. If the input value is greater than the high value, it returns the high value. | constrain( $target["distance"], 0, 10) constrain($join['Store dist'], 6, distance) | Returns 0 if distance is less than 0, 10 if distance is greater than 10, and distance otherwise. Returns 6 if Store dist is less than 6, distance if Store dist is greater than distance, and Store dist otherwise. |
iif(<condition>,<true value>,<false value>) | Returns one value if a condition evaluates to true and returns another value if the condition evaluates to false. <true value> and <false value> can be the following:
| iif($target["field1"] > $join["field2"], $join["field1"], 0) iif($target["field1"] > $join["field2"], iif($target["field2"] = 0, $join["field3"], $target["field4"]), 0) | Returns field1 if field1 is greater than field2, and 0 otherwise. Returns the result of the second iif function if field1 is greater than field2, and 0 otherwise. |
when(<expression1> , <result1> , <expression2> , <result2> , ... , <expressionN> , <resultN>, <default>) | Evaluates a series of expressions in order until one evaluates to true.
| when(($target["field1"] + 10) > 1, 1,($join["field2"] + 10) > 2 , 2, $target["field3"]) | If field1 + 10 is greater than 1, it returns 1. If not, it checks if field2 + 10 is greater than 2. If it is, it returns 2. If not, it returns field3. |
decode(<conditional val> , <case1> , <result1>, <case2>, <result2>, ... <caseN>, <resultN>, <defaultValue> ) | Evaluates an expression and compares its value with subsequent parameters. If the expression matches, it returns the next parameter value. If none match, there is the option for the last parameter to be a default return value.
| decode($target["field1"] + 3 , $join["field1"], 1, $target["field2"], 2, 0) | Compares equality between the conditional val field1 + 3 and case1 field1. If true, it returns 1. If false, it compares the equality between field1 + 3 and field2. If true, it returns 2; otherwise, it returns 0. |