有关属性规则的更多 Arcade 脚本表达式示例,请参阅 Esri GitHub 资料档案库。
计算属性规则示例
约束属性规则示例
验证属性规则示例
所有规则类型的示例
计算属性规则示例
在某些情况下,您希望计算规则在不满足条件时返回自定义错误消息作为故障。在此示例中,创建了实时计算规则以根据相交的变电站填充 (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
约束属性规则示例
将在变电站类上创建此约束属性规则,并在插入和更新操作时触发该规则。如果变电站名称为空,则此表达式将返回 false 并失败。如果变电站名称不为空,则此表达式将返回 true 并允许继续进行编辑。
if ($feature.name == null) return false;
else return true;
//another way of writing it return !($feature.name == null)
在某些情况下,您希望约束属性规则以根据条件返回不同的错误消息。在以下示例中,如果变电站的名称或 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
以下示例是在电线杆要素类上创建的验证规则,用于确保当结构高度等于或大于 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.
}
使用 $originalfeature 来检查几何是否已更改的 Arcade 语法示例。
if (Equals(Geometry($feature), Geometry($originalfeature))) {
//code if geometry hasn't changed
} else {
//code if geometry has changed
}
使用 $originalfeature 来检查属性是否已更改 50% 的 Arcade 语法示例。
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
}