Skip To Content

通过 GeoAnalytics 工具 使用缓冲区表达式

GeoAnalytics 工具 工具箱中提供以下工具以应用表达式:

使用表达式的 GeoAnalytics 工具 具有不同的目的,并且会限制表达式的应用对象。在 ArcGIS 10.6 版本中,GeoAnalytics 中使用的所有表达式都支持 Arcade。

了解有关 Arcade 函数的详细信息

重新构建轨迹和创建缓冲区

缓冲区表达式用于重新构建轨迹创建缓冲区工具。

常见的是使用常量或字段值输入缓冲区大小。但是,输入值并不是使用 GeoAnalytics 工具 指定缓冲区大小的唯一方法。某些情况下,您可能希望通过执行数学计算来设置缓冲区大小。该计算会应用于每个分析要素。在 ArcGIS GeoAnalytics Server 上运行分析时会执行计算。

以下部分包含缓冲区表达式示例。

数学运算符和函数示例

缓冲区表达式将以数学方式处理数字。下表显示了可用运算的示例。

了解有关 Arcade 中可用数学运算和函数的详细信息

运算符说明示例结果

a + b

a 加 b。

fieldname 包含数值 1.5

$feature["fieldname"] + 2.5

4.0

a - b

a 减 b。

fieldname 包含数值 3.3

$feature["fieldname"]- 2.2

1.1

a * b

a 乘以 b。

fieldname 包含数值 2.0

$feature["fieldname"] * 2.2

4.4

a / b

a 除以 b。

fieldname 包含数值 4.0

$feature["fieldname"] / 1.25

3.2

abs( a )

返回 a 的绝对(正)值。

fieldname 包含数值 -1.5

abs($feature["fieldname"])

1.5

log( a )

返回 a 的自然对数(以 E 为底)。

fieldname 包含数值 1

log($feature["fieldname"])

0

sin( a )

返回 a 的三角正弦值。假设输入为以弧度为单位的角。

fieldname 包含数值 1.5707

sin($feature["fieldname"])

1

cos( a )

返回 a 的三角余弦值。假设输入为以弧度为单位的角。

fieldname 包含数值 0

cos($feature["fieldname"])

1

tan( a )

返回 a 的正切值。假设输入为以弧度为单位的角。

fieldname 包含数值 0

tan($feature["fieldname"])

0

sqrt( a )

返回 a 的平方根。

fieldname 包含数值 9

sqrt($feature["fieldname"])

3

min( a, b )

返回 a 和 b 间的最小数值。

fieldname 包含数值 1.5 和 -3

min($feature["fieldname"], -3)

-3

max( a, b )

返回 a 或 b 间的最大数值。

fieldname1 包含数值 1.5,fieldname2 包含数值 -3

max($feature["fieldname1"], $feature["fieldname2"])

1.5

constrain(<value>,<low>,<high>)

如果结果在限制范围内,则返回输入值。如果输入值小于低值,则返回低值。如果输入值大于高值,则返回高值。

constrain($feature["distance"], 0, 10)

constrain($feature['Store dist'], 6, distance)

如果 distance 小于 0,则返回 0,如果 distance 大于 10,则返回 10,其余情况下返回 distance

如果 Store dist 小于 6,则返回 6,如果 distance 大于 Store dist,则返回 distance,其余情况下返回 Store dist

缓冲区表达式的乘法示例

$feature["Distance"] * 2

As 距离函数示例

as distance 函数将数值转换为线性距离,然后将其用于数学表达式中。重新构建轨迹创建缓冲区工具可以使用 as distance 函数。如果使用数值,而未使用 as distance 函数,则系统将假定单位为米。

功能说明示例结果

as_meters( <value> )

应用假设输入值以米为单位的计算。

as_meters( $feature["fieldname"] )

as_meters(150)

结果按 150 米进行缓冲。

as_kilometers( <value> )

应用假设输入值以千米为单位的计算。

as_kilometers( $feature["fieldname"] )

as_kilometers(150)

结果按 150 千米进行缓冲。

as_feet( <value> )

应用假设输入值以英尺为单位的计算。

as_feet( $feature["fieldname"] )

as_feet(150)

结果按 150 英尺进行缓冲。

as_yards( <value> )

应用假设输入值以码为单位的计算。

as_yards( $feature["fieldname"] )

as_yards(150)

结果按 150 码进行缓冲。

as_nautical_miles( <value> )

应用假设输入值以海里为单位的计算。

as_nautical_miles( $feature["fieldname"] )

as_nautical_miles(150)

结果按 150 海里进行缓冲。

as_miles( <value> )

应用假设输入值以英里为单位的计算。

as_miles( $feature["fieldname"] )

as_miles(150)

结果按 150 英里进行缓冲。

为每个要素乘以字段 Distance(假设以千米为单位),然后为缓冲区表达式加上 10 米。

as_kilometers($feature["Distance"]) * 3 + as_meters(10)

条件运算符

条件语句可使用以下运算符:

运算符说明示例结果

a > b

a < b

a 大于 b

a 小于 b

10 > 2

False

a >= b

a <= b

a 大于或等于 b

a 小于或等于 b

abs(-10) >= 10

True

a != b

a 不等于 b

abs(-3) != -3

True

a == b

a 等于 b

abs(-5) == 5

True

<condition1> || <condition2>

满足条件 1 或条件 2。

(abs(-5) == 5) || (10 < 2)

True

<condition1> && <condition2>

满足条件 1 和条件 2。

(abs(-5) == 5) && (10 < 2)

False

使用高级函数和条件的缓冲区表达式示例

iff(field1 > field2, iff(field2 = 0, field3, field4), 0)

连接条件的乘法示例

iff(field1 > field2, iff(field2 = 0, field3, field4), 0) > $join["Distance"] * 2

逻辑运算符示例

除了条件运算符之外,还可以使用如下表所示的更高级的逻辑运算符来创建缓冲区。

了解有关 Arcade 中可用逻辑函数的详细信息

函数说明示例结果

iff(<condition>,<true value>,<false value>)

如果条件评估为 true,则返回一个值,如果条件评估为 false,则返回另外一个值。

<true value><false value> 可为以下内容:

  • 数值字段。如果字段名称中含有空格,请使用方括号。
  • 数值。
  • 函数。

iff($feature["field1"] > $feature["field2"], $feature["field1"], 0)

iff($feature["field1"] > $feature["field2"], iff($feature["field2"] = 0, $feature["field3"], $feature["field4"]), 0)

如果 field1 大于 field1,则返回 field2,其余情况下返回 0

如果 iff 大于 field1,则返回第二个 field2 函数的结果,其余情况下返回 0

when(<expression1> , <result1> , <expression2> , <result2> , ... , <expressionN> , <resultN>, <default>)

按顺序评估一系列表达式,直至一个表达式评估为 true

  • expression - 表达式。
  • result - 表达式的结果。可以为数值或字段。
  • default - 表达式均不匹配时的可选值。

when(($feature["field1"] + 10) > 1, 1,($feature["field2"] + 10) > 2 , 2, $feature["field3"])

如果 field1 + 10 大于 1,则返回 1。否则,检查 field2 + 10 是否大于 2。如果是,则返回 2。否则,返回 field3

decode(<conditional val> , <case1> , <result1>, <case2>, <result2>, ... <caseN>, <resultN>, <defaultValue> )

将对表达式进行评估,并将其值与后续参数进行比较。如果表达式匹配,则返回下一个参数值。如果均不匹配,则可以选择将最后一个参数作为默认返回值。

  • conditional val - 条件值。可以为字段或表达式。
  • case - 要与 conditional val 进行对比的值。
  • result - 相应实例与 conditional val 匹配时的结果。
  • defaultValue - 其他值均不是 true 时的可选值。

decode($feature["field1"] + 3 , $feature["field1"], 1, $feature["field2"], 2, 0)

比较条件 val field1 + 3 和 case1 field1 是否相等。如果 true,则返回 1。如果 false,则比较 field1 + 3field2 是否相等。如果 true,则返回 2;否则,返回 0。

跟踪感知型示例

在 ArcGIS 10.6.1 中,重新构建轨迹可以使用 Arcade 中的跟踪感知型方程,如下表所示:

功能说明示例结果

$track.field["fieldname"].history(<value1>)

在指定字段中返回指定时间索引的值数组。

  • 一个正数返回一个从给定索引开始直到当前要素的数组。
  • 负数返回当前时间步长和之前的 <value1> - 1 时间步长值。

MyField 已对 [10, 20, 30, 40, 50, 60, 70, 80] 的值进行排序。值 10 位于索引 0 处,值 80 位于索引 7 处。表达式在每个索引处求值,示例概述了用于示例的索引。n 表示序列中的要素数,k 表示正在求值的索引。

示例 1:$track.field["MyField"].history(3))

示例 2:$track.field["MyField"].history(-3)

示例 3:mean($track.field["MyField"].history(-2))

示例 4:$track.field["MyField"].history(-3)[0]

当示例 1 在索引 k 处求值时,它将返回索引 3 到 k 的值数组。如果在索引 6 处求值 (70),将返回索引 [3,4,5,6] 处的值数组,因此,数组为 [40, 50, 60, 70]

示例 2 返回的值数组,其计算方法为索引 k 减去给定值再减 1 (k-2)。如果在索引 6 (value = 70) 处求值,将返回 k-2k-1k 的值 [50, 60, 70]

示例 3 返回位于索引 k-1 处和 k 处的值的平均数。如果在索引 4 (value = 50) 处求值,会发现 value 50 (索引 3) 和 value 60 (索引 4) 的平均值等于 65。如果在索引 7 处求值,结果将为 70 和 80 的平均值,即 75

示例 4 返回在示例 2 中创建的数组的首个项目(索引 0):50

$track.field["fieldname"].history(<value1>, <value2>)

返回起自 index1 (<value1>) 终至 index2 (<value2>) 的值数组。

MyField已对 [10, 20, 30, 40, 50, 60, 70, 80] 的值按顺序排列。10 位于索引 0 处,80 位于索引 7 处。本例的表达式求值结果位于索引 7 (80) 处。

示例 1:$track.field["MyField"].history(-3, -2))

示例 2:$track.field["MyField"].history(-5, -2))

示例 1:[60]

示例 2:[40, 50, 60]

$track.time.start

计算轨迹的起始时间,以从新纪元开始的微秒为单位。

使用 2017 年 1 月 2 日起始的轨迹。

$track.time.start

1483315200000

$track.time.duration

计算轨迹从起始到当前时间步长的持续时间,以微秒为单位。

使用 2017 年 1 月 2 日起始、当前时间为 2017 年 1 月 4 日的轨迹。

$track.time.duration

172800000

$track.time.current

计算轨迹的当前时间。

使用发生于 2017 年 1 月 3 日 9:00 a.m. 的要素。

$track.time.current

1483434000000

$track.index

返回正在计算的要素的时间索引。

根据轨迹中的第一个要素计算此值。

$track.index

0

$track.T(<value>, "<units>")

返回要素时间以及使用数字 <value> 和给定 <units> 创建的时间。

  • value - 要添加到要素时间的数值。
  • units - 数值 <value> 的单位。受支持的单位类型为毫秒、秒、分钟、小时、天、月和年。默认值为毫秒。

使用 2017 年 1 月 2 日 2 p.m. 的要素。

示例 1:$track.T(1, "hours")

示例 2:$track.T(-2, "days")

示例 1:返回 1 月 2 日 3 p.m.:1483369200000

示例 2:返回 12 月 31 日 2 p.m.:1483192800000

$track.field["fieldname"].window(<value1>, <value2>)

在指定字段中返回指定时间索引的值数组。窗口功能可用于前进和后退时间。表达式在轨迹的各个要素处求值。

  • 当前要素位于索引 0 处。
  • 正值代表当前值后的未来发生的要素。例如,位置 1 是数组中的下一个值。
  • 负值代表上一要素之前发生的要素。例如,-1 是数组中的上一个值。

窗口功能可用于 ArcGIS Enterprise 10.6.1 版本。

MyField 已对 [10, 20, 30, 40, 50] 的值进行排序。表达式在轨迹的各个要素处求值。返回的结果包括开始要素,但不包括结尾要素。

示例 1:$track.field["MyField"].window(-1,2)

示例 2:$track.field["MyField"].window(-2,0)[0]

示例 3:$track.field["MyField"].window(0,3)[2]

示例 1:在各个要素处求值时,表格显示以下结果。

求值的要素

结果

10

[10,20]

20

[10, 20, 30]

30

[20,30,40]

40

[30,40,50]

50

[40, 50]

示例 2:在索引 2(值为 30)处求值时,返回:10

示例 3:在索引 2(值为 30)处求值时,返回:50

$track.geometry.window(<value1>, <value2>)

返回表示指定时间索引几何的值数组。窗口功能可用于前进和后退时间。表达式在轨迹的各个要素处求值。

  • 当前要素位于索引 0 处。
  • 正值代表当前值后的未来发生的要素。例如,位置 1 是数组中的下一个值。
  • 负值代表上一要素之前发生的要素。例如,-1 是数组中的上一个值。

窗口功能可用于 ArcGIS Enterprise 10.6.1 版本。

MyField 已对 [10, 20, 30, 40, 50] 的值进行排序。这些要素几何是 [{x: 1, y: 1},{x: 2, y: 2} ,{x: null, y: null},{x: 4, y: 4}, {x: 5, y: 5}]表达式在轨迹的各个要素处求值。返回的结果包括开始要素,但不包括结尾要素。

示例 1:$track.geometry.window(-1,2)

示例 2:折线数据集上的 $track.geometry.window(0,1)[0]

示例 3:折线数据集上的 $track.geometry.window(0,1)[0]

示例 4:查找上一点的 X 值 $track.geometry.window(-1,0)[0]["x"]

示例 1:在各个要素处求值时,表格显示以下结果。

求值的要素

结果

10

[{x: 1, y: 1},{x: 2, y: 2}]

20

[{x: 1, y: 1},{x: 2, y: 2} ,{x: null, y: null}]

30

[{x: 2, y: 2} ,{x: null, y: null},{x: 4, y: 4}]

40

[{x: null, y: null},{x: 4, y: 4}, {x: 5, y: 5}]

50

[{x: 4, y: 4}, {x: 5, y: 5}]

示例 2:以下列格式返回折线: [{"paths":[[[-180,-22.88],[-177.6,-23.6]],[[180,-18.099999999999994],[179.7,-18.4],[179.4,-18.7],[178.9,-18.9],[178.5,-19.3],[178.2,-19.7],[178.4,-20],[178.8,-20.2],[178.9,-21.8],[179,-22.2],[179.4,-22.7],[180,-22.88]],[[-178,-17],[-178.8,-17.3],[-179.2,-17.5],[-179.6,-17.8],[-179.9,-18],[-180,-18.099999999999994]]]}]

示例 3:以下列格式返回面:[{"rings":[[[-7882559.1197999995,6376090.883500002],[-7893142.474300001,6042715.216800004],[-8544018.775999999,6045361.0554000065],[-8544018.775999999,6376090.883500002],[-7882559.1197999995,6376090.883500002]]]}]

示例 4:在索引 2(值为 20)处求值:1

$track.window(<value1>, <value2>)

返回表示指定时间索引几何和所有属性的值数组。窗口功能可用于前进和后退时间。

  • 当前要素位于索引 0 处。
  • 正值代表当前值后的未来发生的要素。例如,位置 1 是数组中的下一个值。
  • 负值代表上一要素之前发生的要素。例如,-1 是数组中的上一个值。

窗口功能可用于 ArcGIS Enterprise 10.6.1 版本。

除了 objectIDglobalIDinstant_datetime 字段之外,MyField 也对 [10, 20, 30, 40, 50] 的值进行排序。这些要素几何是 [{x: 1, y: 1},{x: 2, y: 2} ,{x: null, y: null},{x: 4, y: 4}, {x: 5, y: 5}]表达式在轨迹的各个要素处求值。返回的结果包括开始要素,但不包括结尾要素。

示例 1:$track.window(-1,0)[0]

示例 2:geometry($track.window(-1,0)[0]["x"]

示例 1:在各个要素处求值时,表格显示以下结果。

求值的要素

结果

10

20

[{"geometry": {x: 1, y: 1}},{"attributes": {"MyField" : 10, "trackName":"ExampleTrack1"}}]

30

[{"geometry": {x: 2, y: 2}},{"attributes": {"MyField" : 20, "trackName":"ExampleTrack1"}}]

40

[{"geometry": {x: null, y: null}},{"attributes": {"MyField" : 30, "trackName":"ExampleTrack1"}}]

50

[{"geometry": {x: 4, y: 4}},{"attributes": {"MyField" : 40, "trackName":"ExampleTrack1"}}]

示例 2:在索引 2(值为 20)处求值:1