根据给定的参数,生成耗费距离栅格,以及耗费方向栅格和耗费分配栅格。

命名空间:  SuperMap.Analyst.SpatialAnalyst
程序集:  SuperMap.Analyst.SpatialAnalyst (in SuperMap.Analyst.SpatialAnalyst)
版本: dll

语法

C#
public static DistanceAnalystResult CostDistance(
	DistanceAnalystParameter parameter
)

参数

parameter
Type: SuperMap.Analyst.SpatialAnalyst..::.DistanceAnalystParameter
指定的距离栅格分析参数。

返回值

耗费距离栅格分析的结果。

备注

实际应用中,直线距离往往不能满足要求。例如,从 B 到最近源 A 的直线距离与从 C 到最近源 A 的直线距离相同,若 BA 路段交通拥堵,而 CA 路段交通畅通,则其时间耗费必然不同;此外,通过直线距离对应的路径到达最近源时常常是不可行的,例如,遇到河流、高山等障碍物就需要绕行,这时就需要考虑其耗费距离。

该方法根据源数据集和耗费栅格生成相应的耗费距离栅格、耗费方向栅格(可选)和耗费分配栅格(可选)。源数据可以是矢量数据(点、线、面),也可以是栅格数据。对于栅格数据,要求除标识源以外的单元格为无值。关于耗费栅格请参阅 DistanceAnlayst 类。

  • 耗费距离栅格的值表示该单元格到最近源的最小耗费值(可以是各种类型的耗费因子,也可以是各感兴趣的耗费因子的加权)。最近源是当前单元格到达所有的源中耗费最小的一个源。耗费栅格中为无值的单元格在输出的耗费距离栅格中仍为无值。
  • 单元格到达源的耗费的计算方法是,从待计算单元格的中心出发,到达最近源的最小耗费路径在每个单元格上经过的距离乘以耗费栅格上对应单元格的值,将这些值累加即为单元格到源的耗费值。因此,耗费距离的计算与单元格大小和耗费栅格有关。在下面的示意图中,源栅格和耗费栅格的单元格大小(CellSize)均为2,单元格(2,1)到达源(0,0)的最小耗费路线如右图中红线所示:

    那么单元格(2,1)到达源的最小耗费(即耗费距离)为:

  • 耗费方向栅格的值表达的是从该单元格到达最近的源的最小耗费路径的行进方向。在耗费方向栅格中,可能的行进方向共有八个(正北、正南、正西、正东、西北、西南、东南、东北),使用1到8八个整数对这八个方向进行编码,如下图所示。注意,源所在的单元格在耗费方向栅格中的值为0,耗费栅格中为无值的单元格在输出的耗费方向栅格中将被赋值为15。
  • 耗费分配栅格的值为单元格的最近源的值(源为栅格时,为最近源的栅格值;源为矢量对象时,为最近源的 SMID),单元格到达最近的源具有最小耗费距离。耗费栅格中为无值的单元格在输出的耗费分配栅格中仍为无值。
  • 下图为生成耗费距离的示意图。其中,在耗费栅格上,使用蓝色箭头标识了单元格到达最近源的行进路线,耗费方向栅格的值即标示了当前单元格到达最近源的最小耗费路线的行进方向。

下图为生成耗费距离栅格的一个实例,其中源数据集为点数据集,耗费栅格为对应区域的坡度栅格的重分级结果,生成了耗费距离栅格、耗费方向栅格和耗费分配栅格。

通过该方法生成耗费距离栅格,以及耗费方向栅格和耗费分配栅格,需要通过距离栅格分析参数(DistanceAnalystParameter)对象设置相关的参数,需要设置哪些参数请参阅 DistanceAnalystParameter 类。

示例

以下代码示范了如何生成耗费距离栅格。本示例中使用的耗费栅格是将栅格数据集生成坡度图后重分级的结果。

CopyC#
private void CostDistanceByParameter(Dataset sourceDataset, DatasetGrid costGrid, Datasource targetDatasource)
{
    //设置结果栅格数据集(分配栅格数据集、方向栅格数据集、距离栅格数据集)的名称
    //并检查数据源中是否已存在该数据集,如存在则删除
    if (targetDatasource.Datasets.Contains("costAllocationGrid"))
    {
        targetDatasource.Datasets.Delete("costAllocationGrid");
    }
    if (targetDatasource.Datasets.Contains("costDirectionGrid"))
    {
        targetDatasource.Datasets.Delete("costDirectionGrid");
    }
    if (targetDatasource.Datasets.Contains("costDistanceGrid"))
    {
        targetDatasource.Datasets.Delete("costDistanceGrid");
    }

    //设置耗费距离栅格分析参数
    DistanceAnalystParameter parameter = new DistanceAnalystParameter();
    parameter.SourceDataset = sourceDataset;
    parameter.CostGrid = costGrid;
    parameter.TargetDatasource = targetDatasource;
    parameter.AllocationGridName = "costAllocationGrid";
    parameter.DirectionGridName = "costDirectionGrid";
    parameter.DistanceGridName = "costDistanceGrid";
    parameter.MaxDistance = 100.0;
    parameter.CellSize = 0.1;

    //调用CostDistance()方法进行栅格距离分析,并获得距离分析结果对象
    DistanceAnalystResult result = DistanceAnalyst.CostDistance(parameter);

    //从耗费距离栅格分析结果对象中提取耗费距离栅格分析的结果数据集
    DatasetGrid allocationGrid = result.AllocationDatasetGrid;
    DatasetGrid directionGrid = result.DirectionDatasetGrid;
    DatasetGrid distanceGrid = result.DistanceDatasetGrid;
}

请参见