生成事件表。

命名空间:  SuperMap.Analyst.SpatialAnalyst
程序集:  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,并将地图控件与工作空间关联。

CopyC#
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("生成事件表成功!");
    }
}

版本信息

SuperMap iObjects .NET


请参见