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

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

语法

C#
public static DistanceAnalystResult StraightDistance(
	DistanceAnalystParameter parameter
)

参数

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

返回值

直线距离栅格分析的结果。

备注

该方法用于对源数据集生成相应的直线距离栅格、直线方向栅格(可选)和直线分配栅格(可选),三个结果数据集的区域范围与源数据集的范围一致。生成直线距离栅格的源数据可以是矢量数据(点、线、面),也可以是栅格数据。对于栅格数据,要求除标识源以外的单元格为无值。

  • 直线距离栅格的值代表该单元格到最近的源的欧氏距离(即直线距离)。最近源是当前单元格到达所有源中直线距离最短的一个源。对于每个单元格,它的中心与源的中心相连的直线即为单元格到源的距离,计算的方法是通过二者形成的直角三角形的两条直角边来计算,因此直线距离的计算只与单元格大小(即分辨率)有关。下图为直线距离计算的示意图,其中源栅格的单元格大小(CellSize)为10。
  • 那么第三行第三列的单元格到源的距离L为:

  • 直线方向栅格的值表示该单元格到最近的源的方位角,单位为度。以正东方向为90度,正南为180度,正西为270度,正北为360度,顺时针方向旋转,范围为0-360度,并规定对应源的栅格值为0度。
  • 直线分配栅格的值为单元格的最近源的值(源为栅格时,为最近源的栅格值;源为矢量对象时,为最近源的 SMID),因此从直线分配栅格中可以得知每个单元格的最近的源是哪个。

下图为生成直线距离的示意图。单元格大小均为2。

直线距离栅格通常用于分析经过的路线没有障碍或等同耗费的情况,例如,救援飞机飞往最近的医院时,空中没有障碍物,因此采用哪条路线的耗费均相同,此时通过直线距离栅格就可以确定从救援飞机所在地点到周围各医院的距离;根据直线分配栅格可以获知离救援飞机所在地点最近的医院;由直线方向栅格可以确定最近的医院在救援飞机所在地点的方位。

然而,在救援汽车开往最近医院的实例中,因为地表有各种类型的障碍物,采用不同的路线的耗费不尽相同,这时,就需要使用耗费距离栅格来进行分析。有关耗费距离栅格请参见 CostDistance 方法。

下图为生成直线距离栅格的一个实例,其中源数据集为点数据集,生成了直线距离栅格、直线方向栅格和直线分配栅格。

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

注意:当数据集的最小外接矩形(Bounds)为某些特殊情形时,结果数据集的 Bounds 按以下规则取值:

  1. 当源数据集的 Bounds 的高和宽均为 0 (如只有一个矢量点)时,结果数据集的 Bounds 的高和宽,均取源数据集 Bounds 的左边界值(Left)和下边界值(Right)二者绝对值较小的一个。
  2. 当源数据集的 Bounds 的高为 0 而宽不为 0 (如只有一条水平线)时,结果数据集的 Bounds 的高和宽,均等于源数据集 Bounds 的宽。
  3. 当源数据集的 Bounds 的宽为 0 而高不为 0 (如只有一条竖直线)时,结果数据集的 Bounds 的高和宽,均等于源数据集 Bounds 的高。

示例

以下代码示范了如何生成直线距离栅格。

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

    //设置距离栅格分析参数
    DistanceAnalystParameter parameter = new DistanceAnalystParameter();
    parameter.CellSize = 0.1;
    parameter.MaxDistance = 100.0;
    parameter.SourceDataset = sourceDataset;
    parameter.TargetDatasource = targetDatasource;
    parameter.AllocationGridName = "allocationGrid";
    parameter.DirectionGridName = "directionGrid";
    parameter.DistanceGridName = "distanceGrid";

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

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

请参见