程序集: SuperMap.Analyst.SpatialAnalyst (in SuperMap.Analyst.SpatialAnalyst)
版本: dll
语法
C# |
---|
public static DatasetVector GenerateEventTable( DatasetVector referenceLineM, GenerateEventTableParameter parameter ) |
参数
- referenceLineM
- Type: SuperMap.Data..::.DatasetVector
指定的用于生成事件表的参考路由数据集。要求数据集的类型为路由数据集,指定其他类型的数据集将导致生成事件表失败并返回 null。
- parameter
- Type: SuperMap.Analyst.SpatialAnalyst..::.GenerateEventTableParameter
指定的生成事件表参数设置。
返回值
一个属性表数据集,即事件表。备注
- 事件表和事件表的类型
- 如何获取事件表
- 一种是人工建立一个属性表,添加路由标识字段、刻度字段和其他属性字段,并输入相应的属性信息来生成事件表。这种方式虽然简单但往往需要耗费较多的人力物力。
- 另一种方式是通过点或线空间数据(称为事件数据)和用于参考的路由数据来自动生成事件表。生成的事件的刻度值和位于哪条路由需要从该路由数据中获得。
- 根据点或线数据生成事件表
- 点事件表的生成
- 线事件表的生成
事件表实际上就是一个属性表,其中的每一条记录代表了一个事件,除了必须包含的路由标识字段、事件在路由上的刻度字段外,还可以包括其他用于描述事件的属性信息。
事件表的类型由其存储的事件类型决定,分为点事件表和线事件表,分别存储了点事件和线事件的集合。有关事件类型请参见 EventType 枚举类型的介绍。
获取事件表有两种方式:
由二维点数据和路由数据集可以生成点事件表。下图是点事件的生成示意图,粉色区域是以给定的查找半径为半径,对路由对象生成的一个缓冲区域,称为查找范围。落在该区域内的点用于生成事件表,每个点将对应一个事件(事件表中的一条记录)。生成的点事件表,除包含系统字段外,还会增加两个属性字段,分别用于存储对应路由的路由 ID 和点到路由的垂足点的位置的 M 值(作为该点事件的刻度值)。而查找范围之外的点不会生成事件(如 p2 点)。
与点事件表的生成类似,如果二维线对象完全落入查找范围内,每条线将会生成一个线事件,属性字段包含路由 ID、线的起点到路由的垂足点位置的 M 值(作为线事件的起始刻度值)和线的终点到路由的垂足点位置的 M 值(作为终止刻度值);未落入或部分落入查找范围的线对象将不会生成线事件。下图是生成线事件表的示意图,线l2到路由的最大直线距离大于查找半径,因此,不会生成对应的事件。
使用该方法生成事件表时,除指定参考的路由数据集外,还需要通过一个 GenerateEventTableParameter 对象来设置其他生成事件表的参数,如事件数据、路由标识字段、查找半径等。
示例
以下代码示范了如何生成点事件表。
使用本示例代码,请确保在您的项目中存在一个名为 mapControl 的地图控件(MapControl),并声明一个名为 m_workspace 的工作空间(Workspace)变量,打开位于安装目录\SampleData\LinearReferencing 目录下的工作空间 LinearReferencing.smwu,并将地图控件与工作空间关联。
private void GenerateEventTableExample() { //获取用于生成事件表的路由和点数据 Datasource datasource = m_workspace.Datasources["LinearReferencing"]; DatasetVector datasetRoute = datasource.Datasets["Roads_M"] as DatasetVector; DatasetVector datasetPoint = datasource.Datasets["PointEvent"] as DatasetVector; //构造一个 GenerateEventTableParameter 对象并设置相关参数 GenerateEventTableParameter parameter = new GenerateEventTableParameter(); parameter.EventDataset = datasetPoint; parameter.RouteIDField = "ROUTEID"; parameter.SearchRadius = 0.001; parameter.RetainingAllFields = true; parameter.OutputDatasetRouteField = "ROUTEID"; parameter.MeasureField = "MEASURE"; parameter.FindingClosestRoute = true; parameter.OutputDatasource = datasource; parameter.OutputDatasetName = "Point_EventTable"; if (datasource.Datasets.Contains("Point_EventTable")) { //判断该数据集是否存在动态分段关系,如存在则删除关系 DatasetVector dynamicDataset = datasource.Datasets["Point_EventTable"] as DatasetVector; DynamicSegmentInfo[] infos = DynamicSegmentManager.GetDynamicSegmentInfos(dynamicDataset); if (infos.Length != 0) { DynamicSegmentManager.RemoveDynamicSegmentInfos(dynamicDataset); } datasource.Datasets.Delete("Point_EventTable"); } //调用 GenerateEventTable 方法来生成事件表 DatasetVector resultTable = LinearReferencing.GenerateEventTable(datasetRoute, parameter); if (resultTable != null) { MessageBox.Show("生成事件表成功!"); } }