程序集: SuperMap.Analyst.SpatialAnalyst (in SuperMap.Analyst.SpatialAnalyst)
版本: dll
语法
C# |
---|
public static DatasetVector OverlayRouteEvents( RouteEventsParameter inputEventsParameter, RouteEventsParameter overlayEventParameter, EventOverlayType eventOverlayType, Datasource outputDatasource, string outputDatasetName, RouteEventsParameter resultEventsParameter, double tolerance, bool isKeepField, bool isKeepZeroLengthEvents ) |
参数
- inputEventsParameter
- Type: SuperMap.Analyst.SpatialAnalyst..::.RouteEventsParameter
指定的输入事件参数设置。
- overlayEventParameter
- Type: SuperMap.Analyst.SpatialAnalyst..::.RouteEventsParameter
指定的叠加事件参数设置。
- eventOverlayType
- Type: SuperMap.Analyst.SpatialAnalyst..::.EventOverlayType
指定的事件叠加的类型。
- outputDatasource
- Type: SuperMap.Data..::.Datasource
指定的用于存储结果事件表的数据源。如果设为 null,则将结果事件表输出到输入事件所在的数据源。
- outputDatasetName
- Type: System..::.String
指定的结果数据集的名称。
- resultEventsParameter
- Type: SuperMap.Analyst.SpatialAnalyst..::.RouteEventsParameter
指定的叠加结果事件参数设置。
- tolerance
- Type: System..::.Double
指定的容限,用于判断生成的线事件是否为零长度事件。单位与结果事件表的刻度值单位相同。
- isKeepField
- Type: System..::.Boolean
指定是否保留属性字段。如果为 true 则会将输入事件表和叠加事件表中除系统字段外的属性字段写入结果事件表,名称以“_in”结尾的字段表示来自输入事件表,以“_over”结尾的字段表示来自叠加事件表;指定为 false 则不写入。
- isKeepZeroLengthEvents
- Type: System..::.Boolean
指定是否保留零长度线事件。如果为 true,则叠加产生的零长度事件会写入结果事件表中,false 则不会写入。
返回值
叠加结果数据集,叠加失败则返回 null。备注
- 什么是叠加事件表?
- 叠加事件表的方式
- 事件求交集:事件求交集的叠加方式会将具有相同路由 ID 的事件的交叠的部分输出到结果事件表中。
- 事件求并集:事件求并集的叠加方式较为复杂,首先计算出事件的交集,这部分将写入结果事件表中,然后使用交集对所有事件(包括输入和叠加事件)进行分割,将处于交集范围外的事件和写入结果事件表中(可结合下面关于“线线叠加”和“点线叠加”中的图示来帮助理解)。
- 线线叠加
- 点线(线点)叠加
- 点点叠加
- 说明
- 调用该方法时,需要分别对输入事件、叠加事件和结果事件的参数进行设置,因此需要构造三个 RouteEventsParameter 对象并设置其对应的属性。
- 该方法中的 tolerance 参数所指定的容限值用于判断叠加结果产生的线事件是否为零长度事件。如果结果线事件的起始刻度和终止刻度的差的绝对值小于设置的容限,就认为它是零长度事件。
- 如果设置 isKeepField 参数为 true,则输入事件和叠加事件表中除系统字段、路标识字段和刻度字段之外的属性字段会写入到结果事件表中,并分别在原字段名后加“_in”和“_over”来命名,字段值将根据结果事件是由哪个输入事件和叠加事件生成来确定。
- 输入事件表和叠加事件表中的刻度字段记录了事件发生的刻度值,刻度值的单位与事件表数据的来源有关,可能不相同。但在进行事件表叠加时,二者的单位应该统一,例如,描述高速公路上发生的事件的两个事件表中,分别有表示里程的刻度字段,它们的度量单位应一致,如都是千米或者英里,如果不一致,需要使用者对数据进行处理,否则分析的结果可能不正确。用于判断零长度事件的容限的单位与事件表的刻度值单位一致。
- 导致叠加失败的可能的原因
- 事件表参数没有被正确设置。例如,点事件的刻度字段为空。
- 只读打开数据源。该方法会在结果数据源中创建数据集,需要数据源可写。
- 字段非法。例如,路由标识字段的类型为 Text。
事件表的叠加需要输入两个事件表,将第一个事件表中的所有事件(称为输入事件)分别与第二个事件表中的所有事件(称为叠加事件)进行求交或求并的操作,结果会生成一个新的事件表。叠加的前提是输入事件和叠加事件具有相同的路由 ID,也就是说,具有相同路由 ID 的输入事件和叠加事件进行叠加才能产生结果。
对事件表叠加的结果事件表进行分析,可以帮助我们解决一些传统空间分析技术不能解决的问题。例如,在一份交通事故数据中,有两个事件表分别记录了事故发生时的路面宽度(Lane)和车速(Speed),将这两个事件表进行叠加求交,结果事件表中则是同时记录了路宽和车速两个信息的交通事故事件。从结果事件表中,可以快速获知交通事故的综合信息,如发生在路面宽度小于10米,且事故发生时车速大于70km/h的交通事故有哪些。如果是叠加求并,则可用于查找路面宽度小于10米,或车速大于70,以及宽度小于10米且车速大于70的交通事故事件。
事件表的叠加有两种方式,由 EventOverlayType 枚举类型定义,分别是事件求交集(EventIntersect)和事件求并集(EventUnion)。
事件表的叠加支持线线叠加(两个线事件表进行叠加),点线(线点)叠加(一个点事件与一个线事件叠加)和点点叠加(两个点事件叠加)。
线线叠加的结果为一个新的线事件表。下图为线线叠加的示意图,在这里输入事件与叠加事件具有相同的路由 ID。需要注意,一个输入线事件与一个叠加线事件成首尾相连状态时(如下图中的事件 a与 A),会产生一个零长度事件。
点事件表与线事件表以求交方式叠加产生一个新的点事件表,而使用求并方式叠加产生一个新的线事件表。点线叠加与线点叠加的结果事件表类型相同。下图为一个点事件表和一个线事件表叠加的示意图。采用求并方式叠加时,点事件处和点事件与线事件的相交处会产生零长度事件,比如图中的点事件2与线事件 a 叠加产生零长度事件 2a。
两个点事件表叠加的结果为一个点事件表。由于其分析的意义不大,因此在实际应用中较少用到。用户可根据实际研究的需要来使用,在此不做赘述。
示例
以下代码示范了如何进行事件表的叠加。
使用本示例代码,请确保在您的项目中存在一个名为 mapControl 的地图控件(MapControl),并声明一个名为 m_workspace 的工作空间(Workspace)变量,打开位于安装目录\SampleData\LinearReferencing 目录下的工作空间 LinearReferencing.smwu,并将地图控件与工作空间关联。
private void EventTableOverlayExample() { //获取进行叠加的两个事件表,这里获取一个点事件表和一个线事件表 Datasource datasource = m_workspace.Datasources["LinearReferencing"]; DatasetVector eventTablePoint = datasource.Datasets["PointEventTab"] as DatasetVector; DatasetVector eventTableLine = datasource.Datasets["LineEventTab"] as DatasetVector; //构造一个 RouteEventsParameter 对象并设置输入事件参数 RouteEventsParameter inputEventParameter = new RouteEventsParameter(); inputEventParameter.EventDataset = eventTablePoint; inputEventParameter.RouteIDField = "ROUTEID"; inputEventParameter.MeasureField = "MEASURE"; //构造一个 RouteEventsParameter 对象并设置叠加事件参数 RouteEventsParameter overlayEventParameter = new RouteEventsParameter(); overlayEventParameter.EventDataset = eventTableLine; overlayEventParameter.RouteIDField = "ROUTEID"; overlayEventParameter.MeasureStartField = "STARTMEASURE"; overlayEventParameter.MeasureEndField = "ENDMEASURE"; //构造一个 RouteEventsParameter 对象并设置结果事件参数 RouteEventsParameter resultEventParameter = new RouteEventsParameter(); resultEventParameter.RouteIDField = "ROUTEID"; resultEventParameter.MeasureField = "MEASURE"; resultEventParameter.MeasureStartField = "STARTMEASURE"; resultEventParameter.MeasureEndField = "ENDMEASURE"; //调用 OverlayRouteEvents 方法实现事件表的叠加,叠加类型设置为”求交“ DatasetVector resultOverlayEventTable = LinearReferencing.OverlayRouteEvents(inputEventParameter, overlayEventParameter, EventOverlayType.EventIntersect, datasource, "EventOverlayResult", resultEventParameter, 0.0, true, false); if (resultOverlayEventTable != null) { MessageBox.Show("事件表叠加成功!"); } }