动态分段 |
事件表用属性表的方式记录了点或者线事件发生所在的路由、刻度、事件的描述信息(如交通事故发生地的天气状况、驾驶者的酒精含量、当时的车速、路面宽度、铺设材料等)。如图 10‑1所示,生成空间数据就是根据路由数据集,将事件表中的事件定位到空间上,生成相应的点或者线数据,并建立和存储三者间的动态分段关系的过程。其中点事件对应生成点数据集,线事件表对应生成的线数据为路由数据集。动态分段关系隐含存储在数据集中,记录了路由数据集、事件表与生成的空间数据三者间的对应关系,是进行联动修改(即修改三者中的一个,其他两个根据规则自动进行修改)也就是动态分段的依据。
|
图 10‑1 生成空间数据 |
生成空间数据涉及三个角色:路由数据集、事件表和空间数据。生成空间数据时,系统会建立并存储三者的动态分段关系,即根据路由ID、刻度值字段等信息建立起三者的对应关系。动态分段关系主要用于实现三个角色间的联动修改,详细介绍请阅读10.3一节。这里需要强调的是,建立动态分段关系的三个数据集必须在同一数据源中。
在动态分段关系中,路由数据集与事件表为一对多的关系,路由数据集与空间数据为一对多的关系,事件表与空间数据为一对一的关系。如图 10‑2所示,在数据源LinearReferencing中,数据集Route为路由数据集,SpatialData_1、SpatialData_2、SpatialData_3分别为事件表Event_1、Event_2、Event_3与Route所生成的空间数据,那么该数据源中存在的动态分段关系有三个,如图 10‑2(右)所示。也就是说,路由数据集可以被多个事件表共用从而生成多个空间数据,但一个事件表只能对应一个空间数据。
|
图 10‑2 某数据源及其中存在动态分段关系的数据集组合 |
SuperMap提供了动态分段关系管理(DynamicSegmentManager)类,用于对动态分段关系进行检查和删除。通过该类,可以查询某一数据集是否存在于一个动态分段关系中,如果存在,将返回一个动态分段信息(DynamicSegmentInfo)集合,从DynamicSegmentInfo对象中,可以得到更具体的动态分段信息,例如数据集的动态分段角色、指定角色的数据集等。表 10.1列出了DynamicSegmentManager类的方法列表。
表 10.1 DynamicSegmentManager类的方法列表
类型 |
名称 |
描述 |
DynamicSegmentInfo[] |
GetDynamicSegmentInfos |
根据指定的数据集,查询出所有包含该数据集的动态分段关系的动态分段关系对象集合。 |
DynamicSegmentInfo[] |
GetAllDynamicSegmentInfos |
获取指定目标数据源中所有的动态分段关系。 |
Boolean |
RemoveDynamicSegmentInfos |
根据指定的数据集,删除所有包含该数据集的动态分段关系,并且从数据库中删除。 |
Boolean |
RemoveAllDynamicSegmentInfos |
删除指定目标数据源中所有的动态分段关系。 |
建立了动态分段关系后,在进行以下操作时必须遵守一定的流程或注意事项:
l 删除数据集:如果删除一个存在动态分段关系的数据集(路由数据集、事件表或空间数据),会抛出异常,必须将动态分段关系删除,才能将该数据集删除。
l 生成空间数据:由于事件表与空间数据为一对一关系,因此,如果某事件表已经具有了一个动态分段关系,则不能再次用于生成空间数据,除非将其关系删除。详细内容请阅读10.2一节。
l 校准、事件表融合、线参考点刻度生成路由时,如果使用的数据集包含动态分段关系,则可能引起不必要的联动修改,导致之后的分析出现错误的结果。因此建议不要直接使用包含动态分段关系的数据集,可以拷贝该数据集,或先删除该数据集的动态分段关系(需谨慎执行此步骤,因为一旦删除动态分段关系,该关系的三个角色间将不存在关联,不能再进行联动修改)。关于联动修改的详细内容请阅读10.3一节。
LinearReferencing类的GenerateSpatialData方法用于从事件表生成空间数据。用于生成空间数据的事件表中必须包含路由标识字段和刻度字段(点事件包含刻度字段,线事件包含起始刻度字段和终止刻度字段)。路由标识字段的值用于将事件对应的点或线定位到正确的路由上,并会写入到生成的空间数据属性表中,刻度字段的值使事件对应的点或线最终正确定位。
需要注意,在SuperMap中,由于事件表与空间数据为一对一的关系,因此生成空间数据时必须确保用于生成空间数据的事件表不存在动态分段关系。如图 10‑3所示为实现生成空间数据功能时的流程。首先,在生成空间数据前,应先检查该事件表是否已经存在于一个动态分段关系中,如果存在则需要将关系删除,如果不删除将抛出异常并且不会生成空间数据。因此,在调用GenerateSpatialData方法前,应先使用DynamicSegmentManager类的GetDynSegInfos方法检查事件表是否存在动态分段关系,如果存在则调用RemoveDynSegInfos方法删除关系。
|
图 10‑3 生成空间数据的流程 |
在确定用于生成空间数据的事件表不存在任何动态分段关系后,即可调用该GenerateSpatialData方法来生成空间数据,系统会将结果数据集自动存储到事件表所在的数据源中。该方法包含一个参数:生成空间数据参数设置对象(GenerateSpatialDataParameter)。通过该对象,可以设置生成空间数据时需要设置的参数,包括用于生成空间数据的路由数据集及其路由标识字段,事件表及其路由标识字段、刻度字段、刻度偏移字段和错误信息字段,结果数据集的名称、数据源。具体参数如表 10.1所示。使用该方法生成的空间数据,事件表中的路由标识字段、刻度字段及其他描述事件的属性,都会写入生成的空间数据的属性表中。
表 10.2 GenerateSpatialDataParameter类的属性列表
类型 |
名称 |
描述 |
DatasetVector |
EventTable |
获取或设置用于生成空间数据的事件表。 |
String |
EventRouteIDField |
获取或设置用于生成空间数据的事件表的路由标识字段。 |
DatasetVector |
ReferenceLineM |
获取或设置用于生成空间数据的路由数据集。 |
String |
RouteIDField |
获取或设置用于生成空间数据的路由数据集的路由标识字段。 |
String |
MeasureField |
获取或设置用于生成空间数据的事件表的刻度字段,只当事件为点事件的时候该属性才有意义。 |
String |
MeasureStartField |
获取或设置用于生成空间数据的事件表的起始刻度字段,只当事件为线事件的时候该属性才有意义。 |
String |
MeasureEndField |
获取或设置用于生成空间数据的事件表的终止刻度字段,只当事件为线事件的时候该属性才有意义。 |
String |
MeasureOffsetField |
获取或设置刻度偏移量字段。 |
String |
ErrorInfoField |
获取或设置错误信息字段,直接写入原事件表,用于描述事件未能生成对应的点或线的错误信息。 |
String |
OutputDatasetName |
获取或设置结果数据集名称。 |
i注意 |
对于路由标识字段和刻度值字段,SuperMap对路由ID字段的字段类型有所限制,请参见表 6.2。如果通过相关属性设置的字段类型不被支持,会导致生成空间数据失败。 |
刻度偏移字段(MeasureOffsetField)
通过该属性可以指定事件表中的一个字段作为偏移字段(字段类型需为值类型)。对该事件表生成空间数据时,系统会根据该字段的值(称为偏移量)对生成的空间数据(点或路由对象)进行位置上的偏移。
偏移的方向与偏移量的正负和路由的方向有关。如果偏移量为正值,生成的空间数据会向路由的左方偏移;如果为负值,则向路由的右方偏移。偏移时,系统会将偏移量在X、Y方向上分别投影,按投影长度分别在X、Y方向上移动。有关几何对象的偏移请参见Geometry.Offset方法的介绍。图 10‑3展示了生成空间数据时不指定和指定偏移量的效果。
|
图 10‑4 偏移效果 |
错误信息字段(ErrorInfoField)
并非所有的事件都可以成功生成空间数据,在生成空间数据时,通常有几种未能成功定位的错误类型。如果通过该属性设置了错误信息字段名,则在事件表生成空间数据之后,系统会在事件表中自动生成该字段并写入错误信息。字段值为空表示没有错误。表 10.2和表 10.3列出了点事件和线事件未能成功生成点或线的错误信息种类。
注意,通过GenerateSpatialData方法生成空间数据时,生成的结果是点数据还是线数据,是由指定的参数决定的。在生成空间数据参数设置(GenerateSpatialDataParameter)对象中,只要通过MeasureField属性指定了事件表中有效的刻度值字段,则生成的空间数据为点数据。因此,如果想要生成线数据,就需要指定有效的起始刻度字段(MeasureStartField)和终至刻度字段(MeasureEndField),并且注意不能同时指定刻度值字段(MeasureField)。
表 10.3 点事件生成空间数据时的错误信息类型
序号 |
点事件错误信息 |
说明 |
1 |
无对应路由 |
在路由数据集中不存在与该点事件的路由ID相同的路由对象。 |
2 |
小于最小刻度 |
该点事件的刻度值小于对应路由对象的最小刻度值。 |
3 |
大于最大刻度 |
该点事件的刻度值大于对应路由对象的最大刻度值。 |
4 |
间隙点 |
位于路由子对象的间隔上且不在容限范围内的点称为间隙点。间隙点不能用于生成路由的计算。 |
表 10.4 线事件生成空间数据时的错误信息类型
序号 |
线事件错误信息 |
说明 |
1 |
无对应路由 |
在路由数据集中不存在与该线事件的路由ID相同的路由对象。 |
2 |
部分匹配 |
该线事件的一部分位于对应路由上。 注意,位于路由上的部分事件会生成对应的空间数据,不在路由上的部分不会生成空间数据。 |
3 |
完全不匹配 |
该线事件不在对应路由上。即线事件的起始刻度和终止刻度值不在对应路由对象的刻度值范围内。 |
4 |
首尾刻度相同 |
该线事件的起始刻度和终止刻度值相同,即零长度事件。零长度事件不会生成对应的空间数据。 |
5 |
折线非法 |
该线事件对应的路由对象的刻度值不是单调的。单调是指路由上的刻度值递增或递减,也可以保持不变。 |
将生成的空间数据与原始路由数据(或原始线数据)叠加,可以呈现出动态分段的结果。图 10‑2展现了动态分段的一个实例,过程是根据点和线事件表生成矢量点和线数据后,根据其某一属性制作专题图,并叠加于原始路由之上。其中淡紫色的线是原始路由数据。
|
图 10‑5 动态分段结果的呈现 |
我们知道,当点或线的属性发生变化时,按照传统GIS的空间数据组织结构,就要求对线数据进行重新打断或生成新的点数据。而动态分段的优势就在于在属性变化后不需要制作新的数据,它是动态显示属性信息的。生成空间数据之后,用于生成空间数据的路由数据集、事件表与生成的空间数据之间就建立了动态分段关系。有了该关系,在修改三者中的一个时,按照约定,其他两者会自动发生相应的变化,SuperMap称之为联动修改,是动态分段功能的重要特征。
注意,生成空间数据时,系统会在结果数据集中添加一个名为"Event_SMID"的字段,用于存储事件表中对应事件的 SMID。特别需要注意的是,不能修改该字段,否则可能导致联动的结果错误。
目前,SuperMap支持以下几种联动:
l 场景一:事件的描述信息发生变化。这种情况在事件表与空间数据之间发生联动。
修改事件的描述信息,是指修改除路由标识字段和刻度字段之外的一般属性字段,如公路限速信息可能由于天气、施工等原因会做临时性修改。如果修改事件表中的描述信息,从该事件表生成的空间数据的属性信息也会自动进行相应的修改。同样的,修改空间数据属性表中的一般属性字段时,其对应的事件表也会动态改变。
l 场景二:事件发生的路由位置发生变化。这种情况在事件表与空间数据之间发生动态变化。
修改事件发生的位置,是指修改事件表或空间数据中的刻度值字段。如果修改事件表中某条记录(事件)的刻度值,那么对应的空间数据中该事件对应的点或者线对象的几何信息和属性表中对应记录的刻度字段也会做相应修改;如果修改生成的空间数据的属性表中的刻度字段的值,对应的该对象的几何信息也会修改,事件表中的相关联的事件的刻度字段的值也会动态发生同等变化。如果是线事件,可以修改起始刻度或者终止刻度,事件的长度和位置可能发生变化。如图 10‑4所示,是生成空间数据之后,将对应事件表中第一条事件的起始刻度和终止刻度由(20.78,79.37)修改为(150.00,180.00)前后,对应空间数据中对应该事件的线的变化,可以看出,当事件的刻度值发生变化后,对应的空间数据也自动进行对应的修改。
需要注意:如果修改后线事件的起始或终止 M 值超出了它所对应的路由的 M 值范围,则修改无效,对应的空间数据也不会发生变化。例如,修改事件表中某线事件的起始刻度和终止刻度为 18、60,而对应路由的 M 值范围为 3 到 20,则该条记录以及空间数据的几何信息都不会改变。
|
图 10‑6 修改事件表中事件的刻度值 |
l 场景三:事件发生的路由改变。这种情况下,空间数据会根据路由数据集的修改发生变化,而修改空间数据时,对应的路由数据不会发生变化;事件表与空间数据之间会发生联动修改。
这种情况适用于由于数据错误或者变更导致事件所发生的路由需要修改的情形,具体分为以下三种情形:
n 修改路由对象的空间几何信息,对应的空间数据中相关对象的几何信息也会自动修改。如果发生事件的路由的位置和刻度值发生变化,如管道维修后走向发生了变化,它的形状和刻度值可能都需要修改。这时就需要对路由对象本身的空间几何信息进行修改,如旋转、移动,修改刻度值等。修改后,对应的空间数据中相关对象的几何信息会作相应的变化,即对应的事件和空间数据将重新定位。
n 如果修改的是事件表的中某记录的路由ID,则空间数据中与之关联的对象的几何信息和属性表中的路由ID字段也会随之动态改变。如图 10‑5中的事件表及其对应的空间数据,将事件表中第一条记录的路由ID由1改为2之后,该记录对应的空间数据也发生了变化,被定位到了ID为2的路由上面,正如图 10‑5(下)所展示的一样。
n 如果修改的是生成的空间数据的路由ID,则事件表中对应记录的路由ID值也会改变,同时,空间数据的几何信息也会根据修改后对应的路由而进行修改。
注意:如果修改路由数据集属性表中路由ID字段的值,该属性表可以修改成功,但对应的事件表和空间数据不会发生变化。
|
图 10‑7 修改事件表中事件发生的路由 |
目前,使用GenerateSpatialData方法生成空间数据后,不支持增加或删除事件表记录的联动。但LinearReferencing类提供了RebuildSpatialData方法,用于当事件表的记录被修改时,重新生成对应的同名空间数据,而不必删除动态分段关系。
语法:
public static Boolean RebuildSpatialData( DatasetVector eventTable )
参数说明:
eventTable:指定的要重新生成空间数据的事件表。
返回值说明:
返回一个布尔值,代表是否生成成功。如果成功,返回 true,否则返回 false。
该方法适用于下面的情形:
事件表E已经根据路由数据集R生成了对应的空间数据D,此时三者建立了动态分段关系。当事件表E的记录发生变化,如增加、删除、修改记录等(注意不包括对字段的增删改),应用该方法可以根据修改后的事件表E生成新的空间数据D,并自动覆盖原来的空间数据,从而不需要先删除动态分段关系再删除空间数据D,然后再生成同名的空间数据D。当上一次生成的空间数据正在使用不允许删除时,使用此方法更新动态分段的结果非常有用。
注意,使用该方法的前提是指定的事件表存在动态分段关系。生成空间数据使用的参数与该事件表上一次生成空间数据时相同,生成的结果将直接覆盖事件表上一次生成的空间数据。