字段计算允许托管要素图层所有者或组织管理员更改图层属性表中单个字段每一行的值。
例如,如果您具有一个用于存储房产销售相关信息的托管要素图层 - 其中包括房产所在地的销售价格及税率 - 则您可以向该图层 添加一个字段 用来存储估计的房产税。 要填充 estimated_property_taxes 字段,请为该字段定义一个计算表达式,该表达式取用 sale_price 字段中的值并将其与 tax_rate 值相乘。
在托管要素图层图层中的字段内编写计算表达式时,有两个选项可供使用:
您必须在图层上启用编辑才能使用 Arcade 进行计算,但是图层无法启用同步。 有关更改编辑和同步设置的详细信息,请参阅 管理托管要素图层 。
以下部分将介绍如何在托管要素图层的项目页面中计算字段的值。 后续部分将提供常见计算的示例。
请按照上述步骤计算字段中的字符串、数字或日期字段值。
您也可以根据 Map Viewer 经典版 中的表来执行上述步骤。
如果托管要素图层已启用同步或已被配置为追踪要素创建者和更新者,则不会显示此页面, 而将显示 SQL 窗口。
完成计算所需的时间取决于表达式的复杂程度以及图层中的要素数。
以下部分提供了在 ArcGIS Enterprise 中执行常见计算的示例语法或方法。
可以执行的最常见计算之一是根据要素图层中的现有值来得到新数值。 例如,可以将所有商店某一年的销售总额减去另一年的销售总额,以了解从某一年到下一年的利润变化,或者可以将 18 岁以下的居民总数除以总人口数,以确定 18 岁以下人口的比重。
计算两个数值字段 Sales2016 和 Sales2017 的值的差值,以填充数值字段。
$feature.Sales2016 - $feature.Sales2017
使用数值字段 (SalesDifference) 的计算功能以了解数值字段 Sales2016 和 Sales2017 之间的差值。
Sales2016 - Sales2017
使用小数来填充数值字段,该小数是计算 18 岁以下人口比重的结果。
PopUnder18/TotalPop
用于填充新字段的另一个计算涉及对现有字符串字段中的值进行组合。 例如,对于酒店中的房间位置,您可能拥有两个字符串字段 Floor 和 Room,并且您希望将其组合到一个同时包含两者的字符串字段中。
在以下示例中,会将 Floor 和 Room 字段的值组合到单个字段中。
Concatenate($feature.room,$feature.floor)
CONCAT(Floor,Room)
在正在进行编辑的字段中键入或粘贴值时,可能会出错,在文本中留下尾随空格或前导空格。 可以通过对值进行修剪来清除这些错误。
在这些示例中,假设您已知编辑者在将 New Hampshire 粘贴到用于存储州名称的字段中时添加了尾随空格,因此您需要从字符串末尾修剪此空格。
Trim('New Hampshire ')
Trim(TRAILING ' ' FROM 'New Hampshire ')
有时,您希望添加至字段的值会根据要素以及相同要素的其他值而发生变化。 例如,可以将一个字符串字段添加到要素图层,以存储用于描述另一个字段中的数值或缩写字符串值的文本。 由于 SQL 计算接口不支持此功能,因此对于这些类型的计算,请使用 Arcade 。
以下示例根据图层中另一字段中的数字 (HowMany),在不同条件下将不同的字符串值(None、Low、High 或 Other)写入文本字段。
When( $feature.HowMany == 0, "None", $feature.HowMany == 1, "Low", $feature.HowMany == 2, "High", "Other")
如果您不想使用 Arcade 表达式,则可以对地图中的图层应用过滤器、计算已过滤要素的值、移除该过滤器、根据不同的值应用另一个过滤器以及计算这些字段的值。 下面的步骤对此过程进行了描述。
例如,如果您拥有一个数值字段,该字段使用代码(3、2 和 1)来记录商店类型,并且您希望使用一个字符串字段来拼写出这些代码所表示的内容(连锁店、专营店和独立门店),则可以向图层添加一个字符串字段,将图层添加到地图,对每个代码值进行过滤,然后计算字符串字段的值。
在商店类型示例中,新字段名称为 TypeFull 。
对于商店示例,应用过滤器,该过滤器仅返回 StoreCode 字段值为 3 的要素。
对于本示例,单击 TypeFull 名称,然后单击 计算 。
对于 StoreCode 值为 3 的所有要素,输入 'chain’ 以填充 TypeFull 字段。
对于商店示例,定义 StoreCode 为 2 的过滤器,然后计算 TypeFull 以存储 'franchise’ 。 移除该过滤器,定义 StoreCode 为 1 的新过滤器,然后计算 TypeFull 以存储 'independent’ 。
如果需要将现有值替换为另一个值(例如,您表示某个特定值的方式已更改,或者您需要更正输错的值),则可以查找字段的所有现有值,然后将其替换为新值。 由于 SQL 计算接口不支持此功能,因此对于这些类型的计算,请使用 Arcade 。
计算将立即保存到要素图层。 如果您错误地覆盖了现有值,则将需要重新计算以将值更改回来。
本示例将使用 Replace 函数将英式拼写(彩色)更改为美式拼写。
Replace($feature.color, 'colour', 'color')
与根据另一字段中的值填充字段的方式类似,您可以对地图中的图层应用过滤器,以仅返回包含要替换的字段值的要素。 接下来,设置过滤字段等于新值以更新字段值。
例如,如果需要更正输错的值或将单词转换为缩写,则可以过滤需要更改的文本字符串,然后设置字段等于新值。
您必须是图层所有者或门户管理员。
例如,如果已知大量要素的 StreetType 字段包含 Crt 值,则可以应用过滤器,该过滤器仅返回 StreetType 字段值为 Crt 的要素。
对于本示例,单击 StreetType 字段,然后单击 计算 。
输入 'Ct' ,以使用 Court 的正确缩写来填充过滤的 StreetType 字段。
要计算某区域内一个属性的密度,请使用 Arcade 表达式,原因在于您无法在计算接口中对空间字段执行 SQL 计算。
本示例通过将总人口值 (TotalPop) 除以面要素的面积(以平方英里为单位)来确定每个要素的人口密度:
$feature.TotalPop / Area ($feature, 'square-miles')
可以使用 Arcade 表达式,以在仅包含点的托管要素图层中返回空间字段的经度和纬度。
计算接口不支持对空间字段进行此类型的计算。
本示例使用 Geometry 函数来计算点图层中每个点的 x 坐标字段。
Geometry($feature).x
您可能需要增加或减去日期字段或日期文本值中的时间,以生成更新的日期字段。 例如,可通过向日期中添加时间来计算日后检查或验证的日期。
本示例使用 DateAdd 函数将日期增加七天,以获得以下周的日期。
var startDate = Date($feature.dateField); var oneWeekLater = DateAdd(startDate, 7, 'days'); return oneWeekLater;
使用间隔查询增加或减去日期字段中的时间,如以下计算所示。 第一个示例在日期中增加三天,以生成新日期。 第二个示例从时间戳字段中减去三天。
<DateField> + INTERVAL '3'DAY = updated date
<DateField> - INTERVAL '3 00:00:60' DAY TO SECOND = updated date
可以使用以下日期和时间值的间隔:
您可能希望计算两个日期间的时间长度。 例如,如果您同时掌握了电表的安装日期和检查日期,则您可以计算两个日期之间的差值,以验证安装和检查之间的时间长度是否符合允许的标准。 计算结果为数字字段而非日期字段。
以下示例使用 DateDiff 函数,以通过求出当前日期 ( endDate ) 与某人的出生日期 ( startDate ) 的差值来计算其年龄:
var startDate = Date($feature.startDateField); var endDate = Date($feature.endDateField); var age = DateDiff(endDate, startDate, 'years'); return age;
可使用任意日期字段和日期文本的组合来计算两个日期间的时间长度。 下面的第一种计算使用日期字段,而第二种计算使用日期文本。 第三种和第四种计算同时使用日期字段和日期文本。
<DateField1> - <DateField2> = number of days in between
DATE'<SQL-supported Date Literal>' - DATE'< SQL-supported Date Literal>' = number of days in between
<DateField1> - DATE'<SQL-supported Date Literal>' = number of days in between
DATE'<SQL-supported Date Literal>' - <DateField2> = number of days in between
其结果为从一个日期字段或文本中减去另一个日期字段或文本计算得出的数字字段。 该数字结果(以天为单位)既可以是整数也可以包含小数 - 例如,1.5 表示一天半或 36 小时。
在上文中的电表检查示例中,可使用以下任一种计算来计算安装日期 6/1/2015 与检查日期 10/1/2015 之间的时间长度。 第一种计算使用日期字段,第二种计算使用日期文本,第三种和第四种计算同时使用日期字段和日期文本。
<InspectionDateField> - <InstallationDateField> = 122 (days)
DATE'10/1/2015' - DATE'6/1/2015' = 122 (days)
<InspectionDateField> - DATE'6/1/2015' = 122 (days)
DATE'10/1/2015' - <InstallationDateField> = 122 (days)
在编写 SQL 表达式以计算字段值时,使用标准化 SQL。 本部分提供了适用于 ArcGIS Enterprise 中 SQL 计算的运算符和 SQL 函数的列表。
在创建 SQL 表达式之后,单击 计算 按钮。 如果出现任何错误,则对话框底部将显示一条错误消息。 更正表达式语法,然后重新计算。
在 计算字段 对话框中,可使用加减乘除等运算符来构建简单 SQL 表达式。 使用这些运算符的示例和提示如下:
除了使用运算符的简单表达式以外,您也可以使用函数来组建 SQL 表达式。 函数适用于字段名称、文本和其他函数。 例如,假设您需要将一个双精度字段的值换算成 TOTALPOP 除以 POP18 。 如果任意要素的 POP18 等于零,计算将引发一个除数为零的错误。 您可以使用 NULLIF 函数来避免发生此类错误,如下所示。 表达式为 TOTALPOP / NULLIF(POP18, 0) 。
函数接受参数。 在下表中,任一参数都可为以下内容:
出于举例说明的目的,下表描述列中的示例大多使用文本参数。 您可以用字段名称或其他函数来代替这些参数。
可根据日期字段进行一系列计算。 例如,您可以增加或减去日期字段中的时间,或计算两个日期字段间的差值。
在使用日期字段之前,请阅读以下 重要的注意事项 。
计算日期字段时可以使用任意日期和数字字段以及文本的组合。 使用日期文本时,必须使用支持 SQL 的日期格式。
可用的日期函数如下:
CURRENT_DATE
以 UTC 时间返回当前日期。
客户端中显示的内容取决于您正在使用的客户端。 在门户网站中,将以浏览器的时区来显示日期。
以下示例将返回 inspection_date 字段中日期晚于今天的日期的所有值:
inspection_date > CURRENT_DATE
CURRENT_TIMESTAMP
返回当前 UTC 日期和时间(小时、分钟、秒)。
客户端中显示的内容取决于您正在使用的客户端。 在门户网站中,将以浏览器的本地时间来显示时间。
在本示例中,将针对 appointments 字段返回所有早于今天的日期和当前时间(UTC 格式)的时间戳值。
appointments < CURRENT_TIMESTAMP
EXTRACT(<unit> FROM '<date>')
返回指定 <date> 的单个部分 ( <unit> )。 可能的 <unit> 值包括但不限于年、月、日、小时和分钟。
示例包括以下内容:
ABS(<number>)
返回所指定数值的绝对(正)值。
CEILING(<number>)
返回大于或等于指定数值的最小整数。
示例
COS(<number>)
返回 <number> (假设其为以弧度为单位的角)的三角余弦值。
CAST(<number> AS FLOAT | INT)
将 number 转换为其他类型。 FLOAT 可将指定数值转换为双精度型,而 INT 可将其转换为整型。
FLOOR(<number>)
返回小于或等于指定数值的最大整数。
LN(<number>,<decimal_place>)
指定数值的自然对数。
LOG(<number>,<decimal_place>)
指定数值以 10 为底的对数。
MOD(<number>, <n>)
返回被除数 (<number>) 除以除数 <n> 后的余数。 <n> 和 <number> 必须均为整型。
NULLIF(<number>, <value>)
若指定数值等于指定值,则返回 null 。 NULLIF 通常用于防止出现因将 <value> 设置为 0 而产生的除数为零的错误。
只要计算中任意参数出现 null 字段值,计算结果即为 null 。
例如,假设您需要将一个双精度字段的值换算成 TOTALPOP 除以 POP18 。 如果任意要素的 POP18 值等于零,则计算将导致一个除数为零的错误。 您可以创建一个 过滤器 来隐藏 POP18 为零的那些记录,然后执行计算。 也可以使用快捷方式 NULLIF 。
POWER(<number> , <y>)
返回指定数值的指定幂的值 ( <y> )。
ROUND(<number> , <length>)
将所指定数值四舍五入至指定长度。
如果 <length> 使用正数,则数值将舍入到由 <length> 指定的小数位。 如果 <length> 为负数,则指定的 <number> 将舍入到小数点左侧的相应位置。
SIN(<number>)
返回指定 <number> (假设其为以弧度为单位的角)的三角正弦值。
TAN(<number>)
返回指定 <number> (假设其为以弧度为单位的角)的正切值。
TRUNC(<number>,<decimal_place>)
在指定 <decimal_place> 处截断 <number> 。
正的 <decimal_place> 将截断至指定的小数位。 若 <decimal_place> 为负数,将在小数点左侧的相应位置截断 <number> 。
CHAR_LENGTH(<string>)
返回指定字符串的字符数。 结果为整数。
CONCAT(<string1>, <string2>)
连接两个字符串值。
只能提供两个字符串。 要连接两个以上的字符串,需嵌套连续的 CONCAT 函数,如下所示。
空值会转换成空字符串。
POSITION(<substring> in <string>)
返回所指定字符串中指定子字符串第一次出现时的位置。 如果没有找到指定的子字符串,则结果为 0。
SUBSTRING(<string>, <start>, <length>)
返回部分字符串值; <start> 是一个整数索引,用于指定所返回字符的起始位置, <length> 则为返回的字符数。
TRIM(BOTH | LEADING | TRAILING ' ' FROM <string>)
返回从所指定字符串中移除所有前导或尾随空格后的字符串。
请注意,第二个参数是由空格连接的两个单引号。
UPPER(<string>)
返回所有字符转换成大写后的字符串。
LOWER(<string>)
返回所有字符转换成小写后的字符串。