栅格代数运算类。用于提供对一个或多个栅格数据集的数学运算及函数运算。

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

语法

C#
public static class MathAnalyst

备注

栅格代数运算的思想是运用代数学的观点对地理特征和现象进行空间分析。实质上,是对多个栅格数据集(DatasetGrid)进行数学运算以及函数运算。运算结果栅格的像元值是由输入的一个或多个栅格同一位置的像元的值通过代数规则运算得到的。

栅格分析中很多功能都是基于栅格代数运算的,作为栅格分析的核心内容,栅格代数运算用途十分广泛,能够帮助我们解决各种类型的实际问题。如建筑工程中的计算填挖方量,将工程实施前的 DEM 栅格与实施后的 DEM 栅格相减,就能够从结果栅格中得到施工前后的高程差,将结果栅格的像元值与像元所代表的实际面积相乘,就可以得知工程的填方量与挖方量;又如,想要提取2000年全国范围内平均降雨量介于20毫米和50毫米的地区,可以通过“20<年平均降雨量<50”关系运算表达式,对年平均降雨量栅格数据进行运算而获得。

通过该类的方法进行栅格代数运算主要有以下两种途径:

  1. 使用该类提供的基础运算方法。该类提供了六个用于进行基础运算的方法,包括 Plus(加法运算)、Minus(减法运算)、Multiply(乘法运算)、Divide(除法运算)、ToInt(取整运算)和 ToFloat(浮点运算)。使用这几个方法可以完成一个或多个栅格数据对应栅格值的算术运算。对于相对简单的运算,可以通过多次调用这几个方法来实现,如 (A/B)-(A/C)。
  2. 执行运算表达式。使用表达式不仅可以对一个或多个栅格数据集实现运算符运算,还能够进行函数运算。运算符包括算术运算符、关系运算符和布尔运算符,算术运算主要包括加法(+)、减法(-)、乘法(*)、除法(/);布尔运算主要包括和(And)、或(Or)、异或(Xor)、非(Not);关系运算主要包括 =、<、>、<>、>=、<=。注意,对于布尔运算和关系运算均有三种可能的输出结果:真=1、假=0及无值(只要有一个输入值为无值,结果即为无值)。此外,还支持 21 种常用的函数运算,如下图所示:
  3. 通过运算表达式执行栅格代数运算有两种方式,一种是使用 Execute 方法直接输入运算表达式来计算,另一种是使用 ExecuteFromXML 方法从存储有运算表达式的 XML 文件中读取并执行表达式。该类的 ToXMLFile 方法用于将运算表达式及相关参数写入 XML 文件中,也可以手动建立该文件。

注意:

  • 有关栅格代数运算表达式应遵循的规则,请参见 Execute 方法的介绍。
  • 参与运算的两个数据集,如果其像素类型(PixelFormat)不同,则运算的结果数据集的像素类型与二者中精度较高者保持一致。例如,一个为32位整型,一个为单精度浮点型,那么进行加法运算后,结果数据集的像素类型将为单精度浮点型。
  • 对于栅格数据集中的无值数据,如果忽略无值,则无论何种运算,结果仍为无值;如果不忽略无值,意味着无值将参与运算。例如,两栅格数据集 A 和 B 相加,A 某单元格为无值,值为-9999,B 对应单元格值为3000,如果不忽略无值,则运算结果该单元格值为-6999。
  • 该类支持栅格分析环境设置。通过 AnalystSetting 属性设置相应的栅格分析环境设置对象(GridAnalystSetting)来使栅格分析环境设置生效。如使用栅格分析环境中的设置,那么在调用该类的方法时需要将对应的参数设置为 null,否则将优先使用方法中参数的设置。
  • 示例

    以下代码示范了如何进行栅格代数运算,包括使用基础运算方法进行运算、执行运算表达式、输出运算表达式到 XML 文件以及从 XML 文件中读取并执行运算表达式。

    假设已存在一个工作空间(Workspace),并在该工作空间中打开一个名为 m_datasource 的数据源(Datasource),该数据源中包含 grid_a、grid_b 和 grid_c 三个栅格数据集。

    CopyC#
    private void MathAnalystExample()
    {
        DatasetGrid grid_a = m_datasource.Datasets["grid_a"] as DatasetGrid;
        DatasetGrid grid_b = m_datasource.Datasets["grid_b"] as DatasetGrid;
        DatasetGrid grid_c = m_datasource.Datasets["grid_c"] as DatasetGrid;
    
        //使用 Plus、Divide 等基础运算方法计算(grid_a + grid_b)/grid_c
        DatasetGrid result_ab_plus=MathAnalyst.Plus(grid_a, grid_b, null, m_datasource, "result_ab_plus");
        DatasetGrid resultGridBasic = MathAnalyst.Divide(result_ab_plus, grid_c, null, m_datasource, "result_basic");
        if (resultGridBasic != null)
        {
            Console.WriteLine("(grid_a + grid_b)/grid_c 计算完毕!");
        }
    
        //使用 Execute 方法执行运算表达式
        String expression = "cos([" + m_datasource.Alias + "." + grid_a.Name + "])*Con([" + m_datasource.Alias + "." + grid_b.Name + "]<200,0,1)";
        DatasetGrid resultGridExpression = MathAnalyst.Execute(expression, null, PixelFormat.Double, false, true, m_datasource, "result_expression");
        if (resultGridExpression != null)
        {
            Console.WriteLine("执行运算表达式完毕!");
        }
    
        //将上一步中的运算表达式输出到XML文件中
        String xmlFileName = @"D:\expression.xml";
        Boolean isSuccessful = MathAnalyst.ToXMLFile(xmlFileName, expression, null, PixelFormat.Double, false, true);
        if (isSuccessful)
        {
            Console.WriteLine("导出运算表达式到XML文件成功!");
        }
    
        //从XML文件中读取运算表达式及相关参数并执行
        DatasetGrid resultGridXML = MathAnalyst.ExecuteFromXML(xmlFileName, m_datasource, "result_fromXML");
        if (resultGridXML != null)
        {
            Console.WriteLine("从XML执行运算表达式完毕!");
        }
    }

    继承层次

    System..::.Object
      SuperMap.Analyst.SpatialAnalyst..::.MathAnalyst

    请参见