动态分段 |
事件表的叠加需要输入两个事件表,将第一个事件表中的所有事件(称为输入事件)分别与第二个事件表中的所有事件(称为叠加事件)进行求交或求并的操作,结果会生成一个新的事件表。叠加的前提是输入事件和叠加事件具有相同的路由ID,也就是说,具有相同路由ID的输入事件和叠加事件进行叠加才能产生结果。
事件表的叠加有两种方式,由EventOverlayType枚举类型定义,分别是事件求交集(EventOverlayType.EventIntersect)和事件求并集(EventOverlayType.EventUnion)。
l 事件求交集的叠加方式会将具有相同路由ID的事件的交叠的部分输出到结果事件表中。
l 事件求并集的叠加方式较为复杂,首先计算出事件的交集,这部分将写入结果事件表中,然后使用交集对所有事件(包括输入和叠加事件)进行分割,将处于交集范围外的事件写入结果事件表中(可结合图 9‑1和图 9‑2来理解)。
事件表的叠加支持线线叠加(两个线事件表进行叠加),点线(线点)叠加(一个点事件与一个线事件叠加)和点点叠加(两个点事件叠加)。
线线叠加
线线叠加的结果为一个新的线事件表。图 9‑1为线线叠加的示意图,在这里输入事件与叠加事件具有相同的路由ID。需要注意,一个输入线事件与一个叠加线事件成首尾相连状态时(如图中的事件a与A),会产生一个零长度事件。
|
图 9‑1 线-线事件的叠加示意图 |
点线(线点)叠加
点事件表与线事件表以求交方式叠加产生一个新的点事件表,而使用求并方式叠加产生一个新的线事件表。点线叠加与线点叠加的结果事件表类型相同。图 9‑2为一个点事件表和一个线事件表叠加的示意图。采用求并方式叠加时,点事件处和点事件与线事件的相交处会产生零长度事件,比如图中的点事件2与线事件a叠加产生零长度事件2a。
|
图 9‑2 点-线事件的叠加示意图 |
点点叠加
两个点事件表叠加的结果为一个点事件表。由于其分析的意义不大,因此在实际应用中较少用到。用户可根据实际研究的需要来使用,在此不做赘述。
对事件表叠加的结果事件表进行分析,可以帮助我们解决一些传统空间分析技术不能解决的问题。
例如,在一份交通事故数据中,有两个事件表分别记录了事故发生时的路面宽度(Lane)和车速(Speed),将这两个事件表进行叠加求交,结果事件表中则是同时记录了路宽和车速两个信息的交通事故事件。从结果事件表中,可以快速获知交通事故的综合信息,如发生在路面宽度小于10米,且事故发生时车速大于70km/h的交通事故有哪些。如果是叠加求并,则可用于查找路面宽度小于10米,或车速大于70,以及宽度小于10米且车速大于70的交通事故事件。
使用LinearReferencing类的OverlayRouteEvents方法可进行事件表的叠加操作。
语法:
public static DatasetVector OverlayRouteEvents( RouteEventsParameter inputEventsParameter,RouteEventsParameter overlayEventParameter, EventOverlayType eventOverlayType,Datasource outputDatasource, String outputDatasetName, RouteEventsParameter resultEventsParameter, Double tolerance, Boolean isKeepField, Boolean isKeepZeroLengthEvents)
参数说明:
inputEventsParameter:指定的输入事件参数设置。
overlayEventParameter:指定的叠加事件参数设置。
eventOverlayType:指定的事件叠加的类型。
outputDatasource:指定的用于存储结果事件表的数据源。如果设为null,则将结果事件表输出到输入数事件所在的数据源。
outputDatasetName:指定的结果数据集的名称。
resultEventsParameter:指定的叠加结果事件参数设置。
tolerance:指定的容限,用于判断生成的线事件是否为零长度事件。
isKeepField:指定是否保留属性字段。如果为true则会将输入事件表和叠加事件表中除系统字段外的属性字段写入结果事件表,名称以"_in"结尾的字段表示来自输入事件表,以"_over"结尾的字段表示来自叠加事件表;指定为false则不写入。
isKeepZeroLengthEvents:指定是否保留零长度线事件。如果为 true,则叠加产生的零长度事件会写入结果事件表中,false 则不会写入。
返回值说明:
返回叠加结果数据集,叠加失败则返回null。
调用OverlayRouteEvents方法时,需要分别对输入事件、叠加事件和结果事件的参数(如表 9.1所示)进行设置,因此需要构造三个RouteEventsParameter对象并设置其对应的属性。通过输入事件参数设置对象和叠加事件参数设置对象,分别设置用于叠加的事件表、路由标识字段和刻度字段,通过结果事件参数设置对象可以设置结果事件表的路由标识字段和刻度字段 ,如果不设置,系统会使用输入事件参数设置中对应的字段名称来命名。
表 9.1 RouteEventsParameter类的属性列表
类型 |
名称 |
描述 |
DatasetVector |
EventDataset |
获取或设置用于叠加的输入事件表或叠加事件表,为一个属性表。 |
String |
RouteIDField |
获取或设置输入事件表或叠加事件表的路由标识字段。 |
String |
MeasureField |
获取或设置当输入事件或叠加事件为点事件时的刻度字段。 |
String |
MeasureStartField |
获取或设置当输入事件或叠加事件为线事件时的起始刻度字段。 |
String |
MeasureEndField |
获取或设置当输入事件或叠加事件为线事件时的终止刻度字段。 |
EventType |
Type |
获取事件表的类型。事件表的类型包括点事件表和线事件表,由EventType枚举类型定义。 |
i注意 |
1. Type属性可以获取输入事件表、叠加事件表和结果事件表的事件类型(点事件和线事件),但不能进行设置。 2. 对于路由标识字段和刻度值字段,SuperMap对路由ID字段的字段类型有所限制,请参见表 6.2。如果通过相关属性设置的字段类型不被支持,会导致生成事件表叠加失败。 |
容限(tolerance)
该方法中的tolerance参数所指定的容限值用于判断叠加结果产生的线事件是否为零长度事件。如果结果线事件的起始刻度和终止刻度的差的绝对值小于设置的容限,就认为它是零长度事件。
是否保留属性字段(isKeepField)
如果设置isKeepField参数为true,则输入事件和叠加事件表中除系统字段、路由标识字段和刻度字段之外的属性字段会写入到结果事件表中,并分别在原字段名后加“_in”和“_over”来命名,字段值将根据结果事件是由哪个输入事件和叠加事件生成来确定。
需要注意的是,输入事件表和叠加事件表中的刻度字段记录了事件发生的刻度值,刻度值的单位与事件表数据的来源有关,可能不相同。但在进行事件表叠加时,二者的单位应该统一,例如,描述高速公路上发生的事件的两个事件表中,分别有表示里程的刻度字段,它们的度量单位应一致,如都是千米或者英里,如果不一致,需要使用者对数据进行处理,否则分析的结果可能不正确。用于判断零长度事件的容限的单位与事件表的刻度值单位一致。
事件表的融合是指对一个事件表进行的操作,将具有相同路由ID和融合字段值(该值用于标识哪些事件可以融合,具有相同融合字段值的事件才能融合)按照一定方式进行合并。
事件表的融合有两种方式,由EventDissolveType枚举类型定义,分别是连接(EventDissolveType.EventConcatenate)和交叠(EventDissolveType.EventOverlap)。
l 连接:将两个具有相同路由ID和融合字段值,并且首尾相连的事件合并为一个事件写入结果事件表中。
l 交叠:如果两个具有相同路由ID和融合字段值的事件有交叠部分,就将这两个事件合并为一个事件写入结果事件表中。
事件表的融合支持线事件融合和点事件表融合。结合图 9‑3和图 9‑4来帮助理解事件表的连接和交叠。示意图中事件具有相同的路由ID,线事件或点事件的标号代表其融合字段的值,从图中可看出,融合字段相同的事件才被融合。
|
图 9‑3 线事件的融合 |
|
图 9‑4 点事件的融合 |
i注意 |
从图 9‑3和图 9‑4中可以看出,对点事件表融合时,无论是连接还是交叠,其融合的结果都是一样的。 |
事件表融合可以将事件表中在同一路由上且具有相同属性(融合字段)在位置上相邻或者相交的事件合并,达到去除冗余信息或依据不同属性信息对事件表进行拆分的目的。
使用事件表融合去除冗余数据
如图 9‑5所示,在一份高速公路限速事件表中,使用Speed字段记录了不同路段的最高限速值,其中相邻的路段可能限速相同,但却使用了两个事件来表示,造成了数据的冗余。这时就可以通过连接的方式对事件表进行融合以去除冗余的事件。同样,如果这些事件在位置上有交叠,也可通过交叠的方式融合来去除多余的数据。
|
图 9‑5 融合事件表以去除冗余信息 |
使用事件表融合拆分事件表
事件表中可能使用多个属性字段记录了事件的多个特性,通过指定不同的融合字段,对事件表进行多次融合,可以将一个事件表按照不同描述属性拆分为多个事件表。如图 9‑6所示,在一份交通状况事件表中,分别使用Block和Lane字段记录了不同路段的路宽和某一时刻的道路拥堵状况。可以分别指定Block和Lane字段为融合字段,对该事件表进行两次融合,可以将其拆分出两个事件表,一个描述某时刻道路的拥堵状况,一个记录了道路的宽度。
|
图 9‑6 通过融合将事件表拆分 |
LinearReferencing类的DissolveRouteEvents方法用于事件表的融合。
语法:
public static DatasetVector DissolveRouteEvents( RouteEventsParameter inputEventsParameter,
String[] dissolveFields, EventDissolveType eventDissolveType, Datasource outputDataSource,
String outputDatasetName, RouteEventsParameter resultEventsParameter, String[] statisticFields,
StatisticsType[] statisticModes, Double tolerance)
参数说明:
inputEventsParameter:指定的输入事件参数设置。
dissolveFields:指定的融合字段集合。只有这些属性值相同的事件才考虑被融合。
eventDissolveType:指定的事件融合类型。
outputDataSource:指定的用于存储结果事件表的数据源。如果设为null,则将结果事件表输出到输入数事件所在的数据源。
outputDatasetName:指定的结果数据集的名称。
resultEventsParameter:指定的融合结果事件参数设置。
statisticFields:指定的统计字段集合,即事件表融合之后,除融合的参照字段外,需进行重新取值的字段。
statisticModes:指定的统计字段的统计类型集合。
tolerance:指定的融合容限。
返回值说明:
返回融合结果数据集,融合失败则返回null。
调用DissolveRouteEvents方法时,需要分别对输入事件和结果事件的参数进行设置,因此需要构造两个RouteEventsParameter对象并设置其对应的属性。输入事件参数需要设置用于融合的事件表、路由标识字段和刻度字段,结果事件参数可以设置结果事件表的路由标识字段和刻度字段,如果不设置,系统会使用输入事件参数中设置的相应字段名称来命名。
融合字段(dissolveFields)
只有融合字段值相同的同一条路由上的两个事件才可能被融合。如果设置多个融合字段,则要求两事件所有融合字段的值均对应相同。如将城市道路交通状况的事件表中,存储了拥堵状况信息的字段作为融合字段,可以将一条道路上拥堵状态相同(如均为通畅)的路段进行融合。
统计字段(statisticFields)和统计方法(statisticModes)
事件融合可能使两个或者多个事件被连接或者取交叠部分,生成一个新的事件。而这些输入事件的某些属性字段的值可能不同,用户可以指定这些字段,并通过一定的统计方式取值。统计方法由StatisticsType枚举类型定义,有取最大值(Max)、最小值(Min)、取和(Sum)、取平均值(Mean)、取第一个值(First)和取最后一个值(Last)等方法。
注意,统计字段集合与统计方法集合是按照数组元素索引值按顺序对应的。
容限(tolerance)
该方法中的tolerance参数允许用户设置一个值,当事件之间的刻度小于该值时,两个事件将被融合。
i注意 |
对于路由标识字段和刻度值字段,SuperMap对路由ID字段的字段类型有所限制,请参见表 6.2。如果通过相关方法设置的字段类型不被支持,会导致事件表融合失败。 |