属性规则可改善地理数据库数据集的编辑体验并提高数据完整性。
这些规则均为用户定义的规则,可用于自动填充属性、在编辑操作期间限制无效编辑,以及对现有要素执行质量保证检查。
属性规则分为3类:计算、约束和验证。
这一篇介绍计算规则,计算规则可用于对字段值进行自动计算。
一、如何打开属性规则
属性规则开启方法:点击图层后,在【数据】标签下,点击【属性规则】,打开属性规则对话框:
选择【计算】标签,点击【添加规则】,选择【添加实时计算规划】。(批处理计算规则待研究):
打开规则栏后,输入要计算的字段、表达式以及触发器这3个参数,其它参数可以随意填或不填。
点击【保存】,正常情况下无法保存,可以看到这样的错误:
原因是少了全局ID。刚开始我也很懵,后来在系统工具里找了个【添加全局ID】的工具,直接给它用上:
工具执行后,查看属性表,多了一个【GlobalID】字段,再保存属性规则就不会报错了。
后面最主要的工作就是写表达式了,下面看几个有意思的例子。
二、计算规则示例
计算规则的触发器都设置为【插入+更新】。
1、简单计算
最简单的字段计算,比如目标字段根据另外两个字段的值进行赋值:
$feature.DLBM + $feature.DLMC
修改DLBM或DLMC时,目标字段会自动更新:
2、字段属性映射
比如说在一个字段里输入DLBM,结果字段里生成DLMC。
这需要你准备一个【DLBM和DLMC】一一对应的字典,也就是属性映射表,写到代码里:
(对照表我只写了一小段示例而已,需要自行补充完整)
var key = $feature.DLBM
var dic = Dictionary('0101', '水田', '0102', '水浇地', '0103', '旱地');
if(HasKey(dic, key)){
return dic[key]
}
修改DLBM时,DLMC会自动更新:
3、计算要素的属性
Arcade可以直接计算出要素的的一些属性,基本等效于【计算几何属性】工具。
这个示例计算面要素的部件数,是否有Z值、M值。其它属性的计算类似。
// 部件数
var partCount = Count(Geometry($feature)["rings"])
// Z、M值
var hasZ = Decode(Geometry($feature)["hasZ"],true,"有Z值","无Z值")
var hasM = Decode(Geometry($feature)["hasM"],true,"有M值","无M值")
return `部件数:${partCount},${hasZ},${hasM}`
在编辑中修改或创建要素时,目标字段会自动更新:
4、计算地块容积率
一般情况下,要计算地块容积率需要地块面积以及地块范围内建筑的总面积,这2个数据位于2个要素内,正常做法是用【空间连接】工具将2个要素关联起来再计算。
Arcade可以直接引用同一数据库的数据,这就意味着可以在地块图斑上直接计算。
首先准备数据:
在表达式中输入:
// 获取建筑要素
var features = FeatureSetByName($datastore, "建筑", ["建筑面积"], true);
// 获取相关部分
var int_geo = Intersects($feature,features);
// 计算相交部分总建筑面积【shape_area*层数】
var total_area = Sum(int_geo,"建筑面积")
// 计算容积率
var f = round(total_area/$feature.Shape_Area,2)
return f
在编辑中修改或创建要素时,目标字段会自动更新: