请参阅特定 Arcade 配置文件的属性规则,以了解有关使用方法、配置文件变量、返回类型等的更多信息。
有关属性规则的更多 Arcade 脚本表达式示例,请参阅 Esri GitHub 资料档案库。
计算属性规则示例
约束属性规则示例
验证属性规则示例
所有规则类型的示例
计算属性规则示例
在变压器要素类中的 assetID 字段上创建实时计算规则,并在插入编辑操作时触发该规则。 在创建变压器时,NextSequenceValue Arcade 函数将查询数据库,以通过使用 assetid_seq 的 inputSequenceName 来获取下一个序列值。 插入要素的 assetID 字段由前缀 "Tx-" 和返回的序列值填充。
要在属性规则中创建引用序列,请使用创建数据库序列工具。
在文件地理数据库中使用名为 assetid_seq 的序列的脚本表达式:
return "Tx-" + NextSequenceValue ('assetid_seq')
使用企业级地理数据库中名为 assetid_seq 的地图用户拥有的序列的脚本表达式:
return "Tx-" + NextSequenceValue ('map.assetid_seq')
在脚本表达式中使用序列时,请确保从应用程序评估中排除选项设置为 true。 对于企业级地理数据库,请在脚本表达式中使用序列的完全限定名称,例如 owner.sequencename。
在某些情况下,您希望计算规则在不满足条件时返回自定义错误消息作为故障。 在此示例中,创建了实时计算规则以根据相交的变电站填充 (FacilityID) 字段。 规则由插入和更新操作触发。 如果您尝试在变电站中创建变压器,则 Arcade 表达式将获取变电站的名称并使用变压器的 assetID 值来构建完整的 FacilityID 字段 (SubstationName-AssetID)。 如果在变电站外创建或移动变压器,则脚本将使用 errorMessage 关键字返回自定义错误消息。
//On Insert or Update, set FacilityID = SubstationName - AssetID use intersect to get the substation name
//If no substation (fail with error message dictionary, must create in substation.)
var fsStructureBoundary = FeatureSetByName($datastore, "Substation", ["name"], true)
var fsSubstation = Intersects(fsStructureBoundary, Geometry($feature))
var substation = First (fsSubstation)
var subname = ""
if (substation == null)
return {"errorMessage": "Transformers must be created in a substation."}
else
subname = substation.name
return subname + " - " + $feature.assetid;
您可以创建一个计算规则,用于将其他要素标记为需要计算或验证。 在执行计算时,可以在字典中使用 calculationRequired 或 validationRequired 关键字来重置一个或多个要素的验证状态属性。 当要素类取决于其他要素类时,此项非常有用。 在此示例中,Transformer 要素类中的 assetID 字段取决于相交的 Substation 要素类。 将在 Substation 要素类的 yearName 字段上创建计算规则。 更新变电站名称时,新名称和当前年份将存储在 yearName 字段中。 作为该逻辑的一部分,变压器要素类中与变电站相交的所有变压器均将标记为需要计算。 Transformer 类上存在批处理计算规则,用于在下次评估规则时计算 Transformer assetID 值,以反映变电站的新名称和年份。
//Updating the substation name marks its transformers as requiring calculation and updates the yearName to the new name and year.
//To recalculate the facility id on all transformers, mark all associated transformers as requiring calculation.
var fsDevice = FeatureSetByName($datastore, "Transformer", ["globalid"], false)
var fsDeviceIntersects = Intersects (fsDevice, Geometry($feature))
var transformers = [];
var count = 0;
for (var i in fsDeviceIntersects)
transformers[count++] = i.globalid;
var newName = $feature.name + " " + Year(Now())
return {
'result': newName,
'calculationRequired':
[
{
'className':"Transformer",
'globalIDs': transformers
}
]
}
您可以使用属性规则并凭借 edit 字典关键字对其他要素类执行插入、更新和删除操作。 以下示例是有关区域边界要素类的文本字段的计算规则。 在编辑区域边界要素类中的面时,此属性规则将使用区域名称来更新任何相交的地址点。
var fsAddress = FeatureSetByName($datastore, "Address_pnts", ["globalid"], false)
var fsListAddpnts = Intersects(fsAddress, $feature)
var AddList = []
var counter = 0
var noAddress = Count(fsListAddpnts)
if (noAddress > 0) {
for (var address in fsListAddpnts) {
AddList[counter] = {
'globalid': address.globalid,
'attributes': {
'add_district_name': $feature.DistrictName
}
}
counter++
}
return {
'result': noAddress + ' addresses found in the district.',
'edit': [{
'className': 'Address_pnts',
'updates': AddList
}]
}
} else {
return 'No address points in district.'
}
在数据集的形状字段上创建计算规则,以对要素的几何进行修改。 在此脚本示例中,将点要素几何修改为与 pointClass1 中的第一个要素相距 5 个公制单位。
警告:
返回的几何的空间参考必须与包含属性规则的数据集的空间参考相匹配。
//This calculation attribute rule is added to the shape field of a point feature class called pointClass2
var centerFeature = First(FeatureSetByName($datastore, "pointClass1"))
//Get the x and y values of the feature in the pointClass1
var x0 = Geometry(centerFeature).x
var y0 = Geometry(centerFeature).y
//Get the x and y values of the current feature in the pointClass2
var x1 = Geometry($feature).x;
var y1 = Geometry($feature).y;
var x2 = 0;
var y2 = 0;
var d = 5
//Calculate the Euclidean distance from feature in pointClass1 and current feature in pointClass2
var d1 = sqrt((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0))
//Calculate the new x and y to be within 5 metric units while maintaining slope
x2 = (x1 - x0) * d / d1 + x0;
y2 = (y1 - y0) * d / d1 + y0;
//Create a point geometry from the new x and y values
var pointA = Point({
"x": x2,
"y": y2,
"z": 0,
"spatialReference": Geometry(centerFeature).spatialReference
});
return pointA
在参与与检查表的一对多关系类的电线杆要素类中的 InspectionCount 字段上创建计算规则。 FeatureSetByName 函数可用于直接读取检查等级并检索更新时的相关记录。 使用此 Arcade 函数需要了解关系类字段。 对于此关系类,原始主键是电线杆要素类的 globalID 字段,原始外键是检查独立表的 poleguid 字段。//A calculation rule that returns the count of a pole inspection records.
//When a pole feature is updated, the calculation rule reads all its related inspections records from the comments field and returns the total inspection count for that feature.
Var fs = FeatureSetByName($datastore, “Inspection”, [“comments”], false)
Var poleGuid = $feature.poleguid
Var fsinspected = Filter(fs, “POLEGUID= @poleguid”);
Return count(fsinspected)
可以使用 FeatureSetRelationshipName 函数重写用于读取关系类的相关记录的相同脚本。 使用此函数,您不必知道外键,只需要知道关系名称,pole_inspection。
警告:
使用此函数创建属性规则时,请确保从应用程序评估中排除选项已设置为真。
//A calculation rule that returns the count of a pole inspection records.
//When a pole feature is updated, the calculation rule reads all its related inspections records from the comments field and returns the total inspection count for that feature.
Var fsinspected = FeatureSetByRelationshipName($feature, “pole_inspection”, [“comments”], false)
Return count(fsinspected)
可以使用 FeatureSetByRelationshipClass 函数重写用于从关系类读取相关记录的相同脚本。 使用此函数,您不必知道外键,只需要知道关系名称,pole_inspection。 该函数支持服务器端和客户端执行,因此使用该函数的属性规则可以在应用程序本地执行。//A calculation rule that returns the count of a pole inspection records.
//When a pole feature is updated, the calculation rule reads all its related inspections records from the comments field and returns the total inspection count for that feature.
Var fsinspected = FeatureSetByRelationshipClass ($feature, “pole_inspection”, [“comments”], false)
Return count(fsinspected)
当用户更新电线杆注释字段时,使用计算规则来创建新的相关记录。 在此表达式中,如果注释字段发生更改,则使用编辑字典关键字创建新的检查记录。 同样,您可以更新或删除相关记录。 有关详细信息,请参阅属性规则字典关键字。//A calculation rule that triggers on an update event when the pole comment field is edited.
//The expression first checks if the comment field changed and creates a new related record.
If ($originalfeature.comment != $feature.comment)
{
Return {
“edit”: [{
“className”: “inspection”,
“adds”: [{ “attributes”: { “comments”: $feature.comment } }]
}]
}
Return;
约束属性规则示例
将在变电站类上创建此约束属性规则,并在插入和更新操作时触发该规则。 如果变电站名称为空,则此表达式将返回 false 并失败。 如果变电站名称不为空,则此表达式将返回 true 并允许继续进行编辑。
if ($feature.name == null)
return false;
else
return true;
//another way of writing it
return !($feature.name == null)
在某些情况下,您希望约束属性规则以根据条件返回不同的错误消息。 在以下示例中,如果变电站的 name 或 installationDate 值为空,则将返回自定义错误。
if ($feature.name == null)
return {"errorMessage": "Substation must have a valid name."}
else if ($feature.installationDate == null)
return {"errorMessage": "Substation must have a valid installation date."}
else
return true;
除非将 lifecyclestatus 字段设置为停用,否则此约束属性规则可以防止删除要素。 如果 lifecyclestatus 值不等于停用,则将返回自定义错误消息,并且编辑将失败。 在执行删除操作时触发规则。
if ($feature.lifecyclestatus == 'retired')
{
return true;
}
return {'errorMessage': 'You are not allowed delete a feature until it is retired'};
验证属性规则示例
验证规则最适用于要检测损坏数据,但是您又不希望通过使用约束规则来阻止编辑者完成其工作的情况。 您可以评估规则并为违反规则的要素创建错误。 以下是超过最大千伏安值并标记为错误的变电站示例(将创建面错误)。var fsTransformer = FeatureSetByName($datastore, "L1Electric_Distribution_Device", ["objectid"], true)
var fsTransformerSubset = Intersects(fsTransformer, Geometry($feature))
var totalKva = 0;
for (var t in fsTransformerSubset)
totalKva += t.kva
if (totalKva > $feature.maxKva)
return false
else
return true
以下示例是在电线杆要素类上创建的验证规则,用于确保当 structureheight 值等于或大于 65 英尺时,材料必须为钢制。 如果不满足以上条件,则将生成一个错误要素。if ($feature.structureheight >= 65)
{
If (DomainName($feature, 'Material') == 'Steel')
{ return true; }
else
{ return false; }
}
Else
{ return true; }
所有规则类型的示例
可以使用 $originalfeature 变量来引用进行编辑之前的要素属性。 可以使用 Arcade 对 $originalfeature 和 $feature 进行比较,以确定要素的属性是否已更改。
使用 $originalfeature 来确定属性是否已更改的 Arcade 语法示例。
if ($feature.field == $originalfeature.field) {
//code if field attribute hasn't changed
} else {
//code if field attribute has changed.
}
使用 Arcade$originalfeature 语法示例。
if (Equals(Geometry($feature), Geometry($originalfeature))) {
//code if geometry hasn't changed
} else {
//code if geometry has changed
}
使用 Arcade$originalfeature 语法示例。
if ($originalfeature.field == 0) {
//code to avoid calculating change if $originalfeature.field was zero
} else {
var percent_change = Abs(($feature.field - $originalfeature.field) / $originalfeature.field) * 100
if (percent_change >= 50) {
//code if percent change is by 50% or more
} else {
//code if percent change is less than 50%
}
}
可以使用 $editcontext 全局变量以在 Arcade 逻辑中引用 edit type。 由此可创建一个启用了所有触发事件的属性规则,且可以根据编辑的类型添加条件。
使用 $editcontext 确定编辑类型的 Arcade 语法示例。
if ($editContext.editType == "INSERT") {
//code if the edit is an insert
} else if ($editContext.editType == "UPDATE") {
//code if the edit is an update
} else if ($editContext.editType == "DELETE") {
//code if the edit is a delete
} else if ($editContext.editType == "NA") {
//code when edit type is not applicable, for example batch calculation or validation rules
}