程序集: SuperMap.Analyst.SpatialAnalyst (in SuperMap.Analyst.SpatialAnalyst)
版本: dll
语法
C# |
---|
public static DatasetVector DissolveRouteEvents( RouteEventsParameter inputEventsParameter, string[] dissolveFields, EventDissolveType eventDissolveType, Datasource outputDatasource, string outputDatasetName, RouteEventsParameter resultEventsParameter, string[] statisticFields, StatisticsType[] statisticModes, double tolerance ) |
参数
- inputEventsParameter
- Type: SuperMap.Analyst.SpatialAnalyst..::.RouteEventsParameter
指定的输入事件参数设置。
- dissolveFields
- Type: array<
System..::.String
>[]()[]
指定的融合字段集合。只有这些属性值相同的事件才会被融合。支持除(LongBinary)二进制以外的所有字段类型(FieldType)。
- eventDissolveType
- Type: SuperMap.Analyst.SpatialAnalyst..::.EventDissolveType
指定的事件融合类型。
- outputDatasource
- Type: SuperMap.Data..::.Datasource
指定的用于存储结果事件表的数据源。如果设为 null,则将结果事件表输出到输入数事件所在的数据源。
- outputDatasetName
- Type: System..::.String
指定的结果数据集的名称。
- resultEventsParameter
- Type: SuperMap.Analyst.SpatialAnalyst..::.RouteEventsParameter
指定的融合结果事件参数设置。
- statisticFields
- Type: array<
System..::.String
>[]()[]
指定的统计字段集合,即事件表融合之后,除融合字段外,需进行重新取值的字段。指定为一个零长度数组表示不对任何字段进行统计。只支持数值型的字段。
- statisticModes
- Type: array<
SuperMap.Analyst.SpatialAnalyst..::.StatisticsType
>[]()[]
指定的统计字段类型集合。
- tolerance
- Type: System..::.Double
指定的融合容限。单位与进行融合的事件表的刻度值单位相同。
返回值
融合结果数据集,融合失败则返回 null。备注
- 什么是融合事件表?
- 使用事件表融合去除冗余数据。
- 使用事件表融合拆分事件表。
- 融合事件表的方式
- 连接:将两个具有相同路由 ID 和融合字段值,并且首尾相连的事件合并为一个事件写入结果事件表中。
- 交叠:将两个具有相同路由 ID 和融合字段值的事件的交叠部分作为结果事件写入结果事件表中。
- 说明:
- 调用该方法时,需要分别对输入事件和结果事件的参数进行设置,因此需要构造两个 RouteEventsParameter 对象并设置其对应的属性。
- 方法中的 dissolveFields 参数用于指定一个或多个融合字段。只有融合字段值相同的同一条路由上的两个事件才可能被融合。如果设置多个融合字段,则要求两事件所有融合字段的值均对应相同。如将城市道路交通状况的事件表中,存储了拥堵状况信息的字段作为融合字段,可以将一条道路上拥堵状态相同(如均为通畅)的路段进行融合。
- 事件融合可能使两个或者多个事件被连接或者取交叠部分,生成一个新的事件。而这些输入事件的某些属性字段的值可能不同,通过 statisticFields 参数可以指定这些字段,并通过一定的统计方法(statisticModes 参数)取值。统计方法由 StatisticsType 枚举类型定义,有取最大值(Max)、最小值(Min)、取和(Sum)、取平均值(Mean)、取第一个值(First)和取最后一个值(Last)等方法。注意,统计字段集合与统计方法集合是按照数组元素索引值按顺序对应的。
- 该方法中的 tolerance 参数允许用户设置一个值,称为“融合容限”,当事件之间的刻度小于该值时,两个事件将被融合。融合容限的度量单位与进行融合的事件表的刻度值的一致。
事件表的融合是指对一个事件表进行的操作,将具有相同路由 ID 和融合字段值(该值用于标识哪些事件可以融合,具有相同融合字段值的事件才能融合)按照一定方式进行合并,可以达到去除冗余信息或依据不同属性信息对事件表进行拆分的目的。
如下图所示,在一份高速公路限速事件表中,使用 Speed 字段记录了不同路段的最高限速值,其中相邻的路段可能限速相同,但却使用了两个事件来表示,造成了数据的冗余。这时就可以通过连接的方式对事件表进行融合以去除冗余的事件。同样,如果这些事件在位置上有交叠,也可通过交叠的方式融合来去除多余的数据。
事件表中可能使用多个属性字段记录了事件的多个特性,通过指定不同的融合字段,对事件表进行多次融合,可以将一个事件表按照不同描述属性拆分为多个事件表。如下图所示,在一份交通状况事件表中,分别使用 Block 和 Lane 字段记录了不同路段的路宽和某一时刻的道路拥堵状况。可以分别指定 Block 和 Lane 字段为融合字段,对该事件表进行两次融合,可以将其拆分出两个事件表,一个描述某时刻道路的拥堵状况,一个记录了道路的宽度。
事件表的融合有两种方式,由 EventDissolveType 枚举类型定义,分别是连接(EventConcatenate)和交叠(EventOverlap)。
事件表的融合支持线事件融合和点事件表融合。可以结合下面两幅图来帮助理解事件表的连接和交叠。示意图中事件具有相同的路由ID,线事件或点事件的标号代表其融合字段的值,从图中可看出,融合字段相同的事件才被融合。
从图中可以看出,对点事件表融合时,无论是连接还是交叠,其融合的结果都是一样的。
示例
以下代码示范了如何进行事件表的融合。
使用本示例代码,请确保在您的项目中存在一个名为 mapControl 的地图控件(MapControl),并声明一个名为 m_workspace 的工作空间(Workspace)变量,打开位于安装目录\SampleData\LinearReferencing 目录下的工作空间 LinearReferencing.smwu,并将地图控件与工作空间关联。
private void EventTableDissolveExample() { //获取要融合的事件表,这里获取一个线事件表 Datasource datasource = m_workspace.Datasources["LinearReferencing"]; DatasetVector eventTable = datasource.Datasets["LineEventTab"] as DatasetVector; //构造一个 RouteEventsParameter 对象并设置输入事件参数 RouteEventsParameter inputParameter = new RouteEventsParameter(); inputParameter.EventDataset = eventTable; inputParameter.RouteIDField = "RouteID"; inputParameter.MeasureStartField = "StartMeasure"; inputParameter.MeasureEndField = "EndMeasure"; //构造一个 RouteEventsParameter 对象并设置融合结果参数 RouteEventsParameter resultParameter = new RouteEventsParameter(); resultParameter.RouteIDField = "RouteID"; resultParameter.MeasureStartField = "StartMeasure"; resultParameter.MeasureEndField = "EndMeasure"; //指定事件表中的融合字段 String[] dissolveFields = { "RATING" }; //指定事件表中的统计字段及统计方法 String[] statisticsFields = { "ADT" }; StatisticsType[] statisticsModes = { StatisticsType.Mean }; String outputDatasetName = "DissolvedTab"; if (datasource.Datasets.Contains("DissolvedTab")) { //判断该数据集是否存在动态分段关系,如存在则删除关系 DatasetVector dynamicDataset = datasource.Datasets["DissolvedTab"] as DatasetVector; DynamicSegmentInfo[] infos = DynamicSegmentManager.GetDynamicSegmentInfos(dynamicDataset); if (infos.Length != 0) { DynamicSegmentManager.RemoveDynamicSegmentInfos(dynamicDataset); } datasource.Datasets.Delete("DissolvedTab"); } //调用 DissolveRouteEvents 方法实现事件表的融合,融合类型设置为”连接“ DatasetVector resultDissolveTable = LinearReferencing.DissolveRouteEvents(inputParameter, dissolveFields, EventDissolveType.EventConcatenate, datasource, outputDatasetName, resultParameter, statisticsFields, statisticsModes, 0.001); if (resultDissolveTable != null) { MessageBox.Show("融合成功!"); } }