要了解制图表达在版本化的环境中的工作原理,必须先对版本化的知识原理以及要素类制图表达在地理数据库中的存储方式有一个透彻的了解。
制图表达在版本化的环境中的工作原理是什么?
在版本化的环境中,具有制图表达的要素类的使用频率与不具有制图表达的要素类的使用频率几乎相同。下面是您需要考虑的一些关键因素:
- 创建制图表达是一种方案变更行为 - 由于无法对方案变更进行版本化,因此添加到某一版本化要素类中的制图表达将会在所有版本中可见。同样,移除某一要素类中的制图表达也会在所有版本中反映出来。而且,您只能在非编辑状态下创建制图表达。 由于制图表达的规则信息存储在非版本化的系统表中,因此规则信息是跨数据库存在的。
- 变更或创建制图表达规则是一种方案变更行为 - 任何附加的制图表达规则或对制图表达规则的结构、属性值或字段映射所做出的任何变更,都是一种方案变更并会在所有版本中立即反映出来。由于制图表达的规则信息存储在非版本化的系统表中,因此规则信息是跨数据库存在的。而且,您只能在非编辑状态下更改制图表达规则。
- 为要素指定制图表达规则是一种属性变更行为 - 制图表达规则是通过 Rule ID 字段指定给要素的。为要素指定其他规则(或将要素设置为空规则)是一种属性变更。此类变更只会在当前版本中反映出来。您可使用标准的协调和后处理程序解决冲突。
- 形状覆盖是一种属性变更行为 - 在执行协调和后处理操作之前,形状覆盖只会在当前版本中反映出来。
- 覆盖制图表达规则的属性是一种属性变更行为 - 覆盖只会在当前版本中反映出来。您可使用标准的协调和后处理程序解决冲突。
- 将要素制图表达转换为自由式制图表达是一种属性变更行为 - 自由式制图表达的创建过程将触发 Rule ID 字段和 Override 字段的变更。当要素制图表达是一个自由式制图表达时,Rule ID 的值始终为 -1。您可使用标准的协调和后处理程序解决冲突。
在版本化的环境中使用制图表达的推荐工作流程
方案 1
- 父版本(目标版本)将某个要素制图表达的制图表达 RuleID 从 R 更改为 R*。
- 子版本(编辑版本)编辑同一个要素制图表达,但却在 Override 字段中添加了一个存储为 O* 的属性覆盖。
- 子版本是根据父版本进行协调的。根据冲突的定义方式不同,您也将获得不同的结果。
- 行级别:因为是在两个版本中同时编辑同一个要素,故而会检测到冲突。优先使用哪个版本解决冲突,具体将视首选项而定。这样,最终的制图表达将具有 RuleID R 和 Override O* 或 RuleID R* 和 Override O。这两种结果是一致的。
- 列级别:尽管编辑的是同一要素制图表达,但由于编辑操作是在两个独立的字段或属性(即 RuleID 和 Override)中进行的,因此并不会检测到冲突。版本协调时,要素制图表达会具有一个等于 R* 的 RuleID 和属性覆盖 O*。同时,要素制图表达中的一个未用于表示制图表达的制图表达规则的属性会具有一个属性覆盖。最终结果将会不一致。
- 为避免出现此种情况,请您使用 row_level 选项。
方案 2
- 父版本(目标版本)更改某一要素制图表达的形状,或在 Override 字段中添加存储为 O* 的形状覆盖。
- 子版本(编辑版本)编辑同一个要素制图表达,但却在 Override 字段中添加了一个存储为 O** 的属性覆盖。
- 子版本根据父版本进行协调。无论优先选择使用哪个版本来解决冲突,所得到的结果都是一样的。
- 行级别或列级别:同一个要素制图表达会在两个版本中进行编辑。而且,编辑内容会作用于同一属性覆盖。尽管形状覆盖和属性覆盖是两个独立的实体,但是编辑这些实体时仍会将两个覆盖结果保存到同一个 Override 字段中。这种情况下,将会检测到冲突,您必须保存其中的一项编辑内容(O* 或 O**)。
- 解决办法:将属性编辑内容存储在显式字段而非 Override 字段中。协调冲突时,如果选择的是列级别定义,将不会发生任何冲突,因为编辑是在两个独立的字段(Override 字段和显式字段)中进行的。因此,您可以同时保存这两项编辑内容。
方案 3
- 父版本(目标版本)为要素制图表达创建一个属性覆盖。Override 字段被更新为 O*。
- 子版本(编辑版本)编辑同一个要素制图表达,但却将要素制图表达转换为自由式制图表达。RuleID 值变为 -1,而且一个图形对象被引入 Override 字段。最终此步骤会将 RuleID 字段和 Override 字段分别更改为 R* 和 O**。
- 子版本根据父版本进行协调。
- 行级别和列级别:存在一个冲突。如果选择优先使用父(目标)版本解决冲突,则结果将会不一致。属性覆盖 O* 将与等于 -1 或 R* 的 RuleID 值一起存在。
- 解决办法:选择优先使用子版本来解决冲突可以避免产生不一致的结果。在这种情况下,保存由子版本做出的更改,并忽略由父版本进行的任何编辑。但是应该注意,由父版本进行的编辑在这种情况下则会丢失。
方案 4
如果有多个地图产品共同基于同一要素类上的多个要素类制图表达,则请使用多个项目方案来编辑这些地图产品。例如,为每个地图产品创建一个单独的版本:M1、M2、M3 等。在编辑这些版本之后,使用列级别定义的父版本(或 SDE.Default)进行协调和后处理,并优先使用编辑版本解决冲突。如果想要将属性覆盖写入到显式字段而非 Override 字段,则请为每个地图产品创建单独的显式字段。
最佳做法
- 为什么在覆盖两个不同版本的同一要素的两个不同属性时会发生列级别冲突?
两个不同版本的两个独立属性被同时覆盖时可能会发生混淆。当两个覆盖内容被存储在一个作为所有覆盖内容默认存储位置的 Override 字段中时,通常会发生冲突。例如,某个要素遵循版本 1 和版本 2 中的“Cart Track”规则。在版本 1 中,该要素的轨迹符号的线宽度被覆盖。而在版本 2 中,只有该要素的轨迹符号的颜色被覆盖,但线宽度要素仍然遵循 Cart Track 规则。由于两个更改内容都保存在 Override 字段中,因此在同时使用行级别和列级别的冲突解决方案进行协调即时会发生版本冲突(即使更改内容并未真正发生冲突)。要避免这种情况,一种较好的做法是:将那些很可能会被覆盖的属性映射至显式字段。这样便可将更改内容分离到唯一字段,以使列级别检查不会检测到它们。
- 我有一个包含多个版本和长数据志的大型生产数据库。我是否必须在启用制图表达之前将要素类取消注册为版本化要素类?
创建新的要素类制图表达时会向所有版本的要素类表中添加两个新字段(Rule ID 和 Override)。如果您是通过转换符号化图层来生成制图表达,那么只会在当前版本中增加 Rule ID 字段。要素类制图表达本身也会出现在所有其他版本中,但这些版本中的 Rule ID 值将全部为空。在这种情况下,更新数据库的所有版本的 Rule ID 将非常麻烦。如果工作流程允许,建议您在将数据库注册为版本化数据库之前创建制图表达。这要比在版本化要素类上创建制图表达快一些,因为不必填充增量表。如果所有编辑内容均已提交到 DEFAULT 版本(或者为了保留编辑内容已将数据库压缩),则请在创建新的要素类制图表达之前将数据取消注册为版本化数据。创建新的制图表达会随之生成两个新的字段 - RuleID 和 Override(方案变更),并将相应的值填充到 RuleID 字段中。如果是在子版本/后代版本中创建了新的要素类制图表达,则即便您在所有其他版本中都创建了这个新字段,祖先版本也不会将相应的值填充到 RuleID 字段中。比较好的做法是:在 SDE.Default 版本中创建新的要素类制图表达,以使存在于 RuleID 字段中的制图表达规则值被传递到所有后代版本。
为注册为版本化的要素类创建新的制图表达会比较缓慢,因为需要更新所有要素的 RuleID 字段,从而也需要更新增量表。该过程是一个非常耗时的过程,并且所消耗的时间量直接取决于数据库的大小。