com.supermap.analyst.spatialanalyst
类 MathAnalyst

java.lang.Object
  继承者 com.supermap.analyst.spatialanalyst.MathAnalyst

public class MathAnalyst
extends java.lang.Object

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

栅格代数运算的思想是运用代数学的观点对地理特征和现象进行空间分析。实质上,是对多个栅格数据集(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 文件中,也可以手动建立该文件。

注意:

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

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

        public void MathAnalystExample() {
                DatasetGrid grid_a = (DatasetGrid) m_datasource.getDatasets().get("grid_a");
                DatasetGrid grid_b = (DatasetGrid) m_datasource.getDatasets().get("grid_b");
                DatasetGrid grid_c = (DatasetGrid) m_datasource.getDatasets().get("grid_c");

                // 使用 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) {
                        System.out.println("(grid_a + grid_b)/grid_c 计算完毕!");
                }

                // 使用 Execute 方法执行运算表达式
                String expression = "cos([" + m_datasource.getAlias() + "."
                                + grid_a.getName() + "])*Con([" + m_datasource.getAlias() + "."
                                + grid_b.getName() + "]<200,2,1)";
                DatasetGrid resultGridExpression = MathAnalyst.execute(expression,
                                null, PixelFormat.DOUBLE, false, true, m_datasource,
                                "result_expression");
                if (resultGridExpression != null) {
                        System.out.println("执行运算表达式完毕!");
                }

                // 将上一步中的运算表达式输出到XML文件中
                String xmlFileName = "D:/expression.xml";
                Boolean isSuccessful = MathAnalyst.toXMLFile(xmlFileName, expression,
                                null, PixelFormat.DOUBLE, false, true);
                if (isSuccessful) {
                        System.out.println("导出运算表达式到XML文件成功!");
                }

                // 从XML文件中读取运算表达式及相关参数并执行
                DatasetGrid resultGridXML = MathAnalyst.executeFromXML(xmlFileName,
                                m_datasource, "result_fromXML");
                if (resultGridXML != null) {
                        System.out.println("从XML执行运算表达式完毕!");
                }
        }
 

方法摘要
static void addSteppedListener(SteppedListener l)
          添加一个进度条事件(SteppedEvent)的监听器。
static DatasetGrid divide(DatasetGrid firstOperand, DatasetGrid secondOperand, GeoRegion userRegion, Datasource targetDatasource, java.lang.String targetDatasetName)
          栅格除法运算。
static DatasetGrid execute(java.lang.String expression, GeoRegion userRegion, PixelFormat pixelFormat, boolean isZip, boolean isIgnoreNoValue, Datasource[] sourceDatasources, Datasource targetDatasource, java.lang.String targetDatasetName)
          执行栅格代数运算表达式。
static DatasetGrid execute(java.lang.String expression, GeoRegion userRegion, PixelFormat pixelFormat, boolean isZip, boolean isIgnoreNoValue, Datasource targetDatasource, java.lang.String targetDatasetName)
          执行栅格代数运算表达式。
static DatasetGrid executeFromXML(java.lang.String xmlFileName, Datasource targetDatasource, java.lang.String targetDatasetName)
          从 XML 文件中读取栅格运算表达式及相关参数并运算。
static GridAnalystSetting getAnalystSetting()
          返回栅格分析的环境设置对象。
static DatasetGrid minus(DatasetGrid firstOperand, DatasetGrid secondOperand, GeoRegion userRegion, Datasource targetDatasource, java.lang.String targetDatasetName)
          栅格减法运算。
static DatasetGrid multiply(DatasetGrid firstOperand, DatasetGrid secondOperand, GeoRegion userRegion, Datasource targetDatasource, java.lang.String targetDatasetName)
          栅格乘法运算。
static DatasetGrid plus(DatasetGrid firstOperand, DatasetGrid secondOperand, GeoRegion userRegion, Datasource targetDatasource, java.lang.String targetDatasetName)
          栅格加法运算。
static void removeSteppedListener(SteppedListener l)
          移除一个进度条事件(SteppedEvent)的监听器。
static void setAnalystSetting(GridAnalystSetting gridAnalystSetting)
          设置栅格分析的环境设置对象。
static DatasetGrid toFloat(DatasetGrid sourceDataset, GeoRegion userRegion, Datasource targetDatasource, java.lang.String targetDatasetName)
          栅格浮点运算。
static DatasetGrid toInt(DatasetGrid sourceDataset, GeoRegion userRegion, Datasource targetDatasource, java.lang.String targetDatasetName)
          栅格取整运算。
static boolean toXMLFile(java.lang.String xmlFileName, java.lang.String expression, GeoRegion userRegion, PixelFormat pixelFormat, boolean isZip, boolean isIgnoreNoValue)
          将自定义栅格运算表达式及相关参数存储为 XML 文件。
 
从类 java.lang.Object 继承的方法
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

方法详细信息

getAnalystSetting

public static GridAnalystSetting getAnalystSetting()
返回栅格分析的环境设置对象。

有关“栅格分析环境设置”请参见 GridAnalystSetting 类的介绍。

返回:
栅格分析的环境设置对象。

setAnalystSetting

public static void setAnalystSetting(GridAnalystSetting gridAnalystSetting)
设置栅格分析的环境设置对象。

有关“栅格分析环境设置”请参见 GridAnalystSetting 类的介绍。

参数:
gridAnalystSetting - 栅格分析的环境设置对象。

plus

public static DatasetGrid plus(DatasetGrid firstOperand,
                               DatasetGrid secondOperand,
                               GeoRegion userRegion,
                               Datasource targetDatasource,
                               java.lang.String targetDatasetName)
栅格加法运算。将输入的两个栅格数据集的栅格值逐个像元地相加。

如果输入两个像素类型(PixelFormat)均为整数类型的栅格数据集,则输出整数类型的结果数据集;否则,输出浮点型的结果数据集。如果输入的两个栅格数据集的像素类型精度不同,则运算的结果数据集的像素类型与二者中精度较高者保持一致。关于栅格加法运算的图示如下:

参数:
firstOperand - 指定的第一栅格数据集。
secondOperand - 指定的第二栅格数据集。
userRegion - 用户指定的有效计算区域。如果为 null,则表示计算全部区域,如果参与运算的数据集范围不一致,将使用所有数据集的范围的交集作为计算区域。
targetDatasource - 指定的存储结果数据集的数据源。若设置为 null,则如果在栅格分析环境(GridAnalystSetting)中设置了输出数据源,分析结果将存储到该数据源中,否则存储到与输入数据源中。
targetDatasetName - 指定的结果数据集。
返回:
栅格加法运算结果,是一个栅格数据集。
示例:
请参见 MathAnalyst 类的示例。

minus

public static DatasetGrid minus(DatasetGrid firstOperand,
                                DatasetGrid secondOperand,
                                GeoRegion userRegion,
                                Datasource targetDatasource,
                                java.lang.String targetDatasetName)
栅格减法运算。逐个像元地从第一个栅格数据集的栅格值中减去第二个数据集的栅格值。

进行此运算时,输入栅格数据集的顺序很重要,顺序不同,结果通常也是不相同的。

如果输入两个像素类型(PixelFormat)均为整数类型的栅格数据集,则输出整数类型的结果数据集;否则,输出浮点型的结果数据集。如果输入的两个栅格数据集的像素类型精度不同,则运算的结果数据集的像素类型与二者中精度较高者保持一致。关于栅格减法运算的图示如下:

参数:
firstOperand - 指定的第一栅格数据集。
secondOperand - 指定的第二栅格数据集。
userRegion - 用户指定的有效计算区域。如果为 null,则表示计算全部区域,如果参与运算的数据集范围不一致,将使用所有数据集的范围的交集作为计算区域。
targetDatasource - 指定的存储结果数据集的数据源。若设置为 null,则如果在栅格分析环境(GridAnalystSetting)中设置了输出数据源,分析结果将存储到该数据源中,否则存储到与输入数据源中。
targetDatasetName - 指定的结果数据集。
返回:
栅格减法运算结果,是一个栅格数据集。 请参见 MathAnalyst 类的示例。

multiply

public static DatasetGrid multiply(DatasetGrid firstOperand,
                                   DatasetGrid secondOperand,
                                   GeoRegion userRegion,
                                   Datasource targetDatasource,
                                   java.lang.String targetDatasetName)
栅格乘法运算。将输入的两个栅格数据集的栅格值逐个像元地相乘。

如果输入两个像素类型(PixelFormat)均为整数类型的栅格数据集,则输出整数类型的结果数据集;否则,输出浮点型的结果数据集。如果输入的两个栅格数据集的像素类型精度不同,则运算的结果数据集的像素类型与二者中精度较高者保持一致。关于栅格乘法运算的图示如下:

参数:
firstOperand - 指定的第一栅格数据集。
secondOperand - 指定的第二栅格数据集。
userRegion - 用户指定的有效计算区域。如果为 null,则表示计算全部区域,如果参与运算的数据集范围不一致,将使用所有数据集的范围的交集作为计算区域。
targetDatasource - 指定的存储结果数据集的数据源。若设置为 null,则如果在栅格分析环境(GridAnalystSetting)中设置了输出数据源,分析结果将存储到该数据源中,否则存储到与输入数据源中。
targetDatasetName - 指定的结果数据集。
返回:
栅格乘法运算结果,是一个栅格数据集。

divide

public static DatasetGrid divide(DatasetGrid firstOperand,
                                 DatasetGrid secondOperand,
                                 GeoRegion userRegion,
                                 Datasource targetDatasource,
                                 java.lang.String targetDatasetName)
栅格除法运算。将输入的两个栅格数据集的栅格值逐个像元地相除。

如果输入两个像素类型(PixelFormat)均为整数类型的栅格数据集,则输出整数类型的结果数据集;否则,输出浮点型的结果数据集。如果输入的两个栅格数据集的像素类型精度不同,则运算的结果数据集的像素类型与二者中精度较高者保持一致。关于栅格除法运算的图示如下:

参数:
firstOperand - 指定的第一栅格数据集。
secondOperand - 指定的第二栅格数据集。
userRegion - 用户指定的有效计算区域。如果为 null,则表示计算全部区域,如果参与运算的数据集范围不一致,将使用所有数据集的范围的交集作为计算区域。
targetDatasource - 指定的存储结果数据集的数据源。若设置为 null,则如果在栅格分析环境(GridAnalystSetting)中设置了输出数据源,分析结果将存储到该数据源中,否则存储到与输入数据源中。
targetDatasetName - 指定的结果数据集。
返回:
栅格除法运算结果,是一个栅格数据集。

execute

public static DatasetGrid execute(java.lang.String expression,
                                  GeoRegion userRegion,
                                  PixelFormat pixelFormat,
                                  boolean isZip,
                                  boolean isIgnoreNoValue,
                                  Datasource targetDatasource,
                                  java.lang.String targetDatasetName)
执行栅格代数运算表达式。支持自定义表达式栅格运算,通过自定义表达式可以进行算术运算、条件运算、逻辑运算、函数运算(常用函数、三角函数)以及复合运算。

栅格代数运算表达式的组成需要遵循以下规则:

  1. 运算表达式应为一个形如下式的字符串:
  2. [DatasourceAlias1.Raster1] + [DatasourceAlias2.Raster2]

    使用“ [数据源别名.数据集名] ”来指定参加运算的栅格数据集;注意要使用方括号把名字括起来。

  3. 栅格代数运算支持四则运算符("+" 、"-" 、"*" 、"/" )、条件运算符(">" 、">=" 、"<" 、"<=" 、"<>" 、"==" )、逻辑运算符("|" 、"&" 、"Not()" 、"^" )和一些常用数学函数("abs()" 、"acos()" 、"asin()" 、"atan()" 、"acot()" 、"cos()" 、"cosh()" 、"cot()" 、"exp()" 、"floor()" 、"mod(,)" 、"ln()" 、"log()" 、"pow(,)" 、"sin()" 、"sinh()" 、"sqrt()" 、"tan()" 、"tanh()" 、"Isnull()" 、"Con(,,)" 、"Pick(,,,..)" )。
  4. 代数运算的表达式中各个函数之间可以嵌套使用,直接用条件运算符计算的栅格结果都为二值(如大于、小于等),即满足条件的用1代替,不满足的用0代替,若想使用其他值来表示满足条件和不满足条件的取值,可以使用条件提取函数Con(,,)。例如:"Con(IsNull([SURFACE_ANALYST.Dem3] ) ,100,Con([SURFACE_ANALYST.Dem3] > 100,[SURFACE_ANALYST.Dem3] ,-9999) ) " ,该表达式的含义是:栅格数据集 Dem3 在别名为 SURFACE_ANALYST 的数据源中,将其中无值栅格变为 100,剩余栅格中,大于100 的,值保持不变,小于等于 100 的,值改成 -9999。
  5. 如果栅格计算中有小于零的负值,注意要加小括号,如:[DatasourceAlias1.Raster1] - ([DatasourceAlias2.Raster2])。
  6. 表达式中,运算符连接的操作数可以是一个栅格数据集,也可以是数字或者数学函数。
  7. 数学函数的自变量可以为一个数值,也可以为某个数据集,或者是一个数据集或多个数据集的运算表达式。
  8. 表达式必须是没有回车的单行表达式。
  9. 表达式中必须至少含有一个输入栅格数据集。
  10. 参数:
    expression - 自定义的栅格运算表达式。
    userRegion - 用户指定的有效计算区域。如果为 null,则表示计算全部区域,如果参与运算的数据集范围不一致,将使用所有数据集的范围的交集作为计算区域。
    pixelFormat - 指定的结果数据集的像素格式。注意,如果指定的像素类型的精度低于参与运算的栅格数据集像素类型的精度,运算结果可能不正确。
    isZip - 是否对结果数据集进行压缩处理。true 表示压缩。压缩编码方式由被压缩的数据集的像素格式决定,二者对应关系可参考 EncodeType 类。
    isIgnoreNoValue - 是否忽略无值栅格数据。true 表示忽略无值数据,即无值栅格不参与运算。
    targetDatasource - 指定的存储结果数据集的数据源。若设置为 null,则如果在栅格分析环境(GridAnalystSetting)中设置了输出数据源,分析结果将存储到该数据源中,否则存储到与输入数据源中。
    targetDatasetName - 指定的结果数据集。
    返回:
    执行运算表达式的运算结果,是一个栅格数据集。

toInt

public static DatasetGrid toInt(DatasetGrid sourceDataset,
                                GeoRegion userRegion,
                                Datasource targetDatasource,
                                java.lang.String targetDatasetName)
栅格取整运算。提供对输入的栅格数据集的栅格值进行取整运算。

取整运算的结果是去除栅格值的小数部分,只保留栅格值的整数。如果输入栅格值为整数类型,进行取整运算后的结果与输入栅格值相同。关于栅格取整运算的图示如下:

参数:
sourceDataset - 指定的要取整的栅格数据集。
userRegion - 用户指定的有效的计算区域。如果为 null,则表示计算全部区域,如果参与运算的数据集范围不一致,将使用所有数据集的范围的交集作为计算区域。
targetDatasource - 指定的存储结果数据集的数据源。若设置为 null,则如果在栅格分析环境(GridAnalystSetting)中设置了输出数据源,分析结果将存储到该数据源中,否则存储到与输入数据源中。
targetDatasetName - 指定的结果数据集。
返回:
栅格取整运算结果,是一个栅格数据集。

toFloat

public static DatasetGrid toFloat(DatasetGrid sourceDataset,
                                  GeoRegion userRegion,
                                  Datasource targetDatasource,
                                  java.lang.String targetDatasetName)
栅格浮点运算。将输入的栅格数据集的栅格值转换成浮点型。

如果输入的栅格值为双精度浮点型,进行浮点运算后的结果栅格值也转换为单精度浮点型。关于栅格浮点运算的图示如下:

参数:
sourceDataset - 指定的要转换为浮点型的栅格数据集。
userRegion - 用户指定的有效计算区域。如果为 null,则表示计算全部区域,如果参与运算的数据集范围不一致,将使用所有数据集的范围的交集作为计算区域。
targetDatasource - 指定的存储结果数据集的数据源。若设置为 null,则如果在栅格分析环境(GridAnalystSetting)中设置了输出数据源,分析结果将存储到该数据源中,否则存储到与输入数据源中。
targetDatasetName - 指定的结果数据集。
返回:
栅格浮点运算结果,是一个栅格数据集。

executeFromXML

public static DatasetGrid executeFromXML(java.lang.String xmlFileName,
                                         Datasource targetDatasource,
                                         java.lang.String targetDatasetName)
从 XML 文件中读取栅格运算表达式及相关参数并运算。

该 XML 文件可以手动编辑获得,也可通过 toXMLFile 方法生成。关于 XML 文件的格式要求和标签含义请参见 toXMLFile 方法。

参数:
xmlFileName - 存储了栅格运算表达式及相关参数的 XML 文件。
targetDatasource - 指定的存储结果数据集的数据源。若设置为 null,则如果在栅格分析环境(GridAnalystSetting)中设置了输出数据源,分析结果将存储到该数据源中,否则存储到与输入数据源中。
targetDatasetName - 指定的结果数据集。
返回:
执行运算表达式的运算结果,是一个栅格数据集。

toXMLFile

public static boolean toXMLFile(java.lang.String xmlFileName,
                                java.lang.String expression,
                                GeoRegion userRegion,
                                PixelFormat pixelFormat,
                                boolean isZip,
                                boolean isIgnoreNoValue)
将自定义栅格运算表达式及相关参数存储为 XML 文件。

将自定义的栅格运算表达式及相关参数存储到 XML 文件中,以后需要再次运算时可以通过 executeFromXML 方法直接从该 XML 文件中读取表达式并完成运算,而不必重新编写表达式和设置参数。当然,也可以用来对需要进行相同运算的数据集进行批量处理,但需要注意,表达式中明确指定了参与运算的数据源和数据集的名称,使用时可以根据实际情况修改。

下图为通过该方法生成的存储了运算表达式及参数的 XML 文件,图中标示了每个标签的含义:

参数:
xmlFileName - 指定的用于存储栅格运算表达式及相关参数的 XML 文件。
expression - 自定义的栅格运算表达式。
userRegion - 用户指定的有效计算区域。如果为 null,则表示计算全部区域,如果参与运算的数据集范围不一致,将使用所有数据集的范围的交集作为计算区域。
pixelFormat - 指定的结果数据集的像素格式。注意,如果指定的像素类型的精度低于参与运算的栅格数据集像素类型的精度,运算结果可能不正确。
isZip - 是否对结果数据集进行压缩处理。true 表示压缩。压缩编码方式由被压缩的数据集的像素格式决定,二者对应关系可参考 EncodeType 类。
isIgnoreNoValue - 是否忽略无值栅格数据。true 表示忽略无值数据,即无值栅格不参与运算。
返回:
一个布尔值,表示读取是否成功,如果读取成功,返回 true,否则返回 false。

execute

public static DatasetGrid execute(java.lang.String expression,
                                  GeoRegion userRegion,
                                  PixelFormat pixelFormat,
                                  boolean isZip,
                                  boolean isIgnoreNoValue,
                                  Datasource[] sourceDatasources,
                                  Datasource targetDatasource,
                                  java.lang.String targetDatasetName)
执行栅格代数运算表达式。

有关栅格代数运算表达式应遵循的规则,请参见 execute 方法的介绍。

参数:
expression - 自定义的栅格运算表达式。
userRegion - 用户指定的有效计算区域。如果为 null,则表示计算全部区域,如果参与运算的数据集范围不一致,将使用所有数据集的范围的交集作为计算区域。
pixelFormat - 指定的结果数据集的像素格式。注意,如果指定的像素类型的精度低于参与运算的栅格数据集像素类型的精度,运算结果可能不正确。
isZip - 是否对结果数据集进行压缩处理。true 表示压缩。压缩编码方式由被压缩的数据集的像素格式决定,二者对应关系可参考 EncodeType 类。
isIgnoreNoValue - 是否忽略无值栅格数据。true 表示忽略无值数据,即无值栅格不参与运算。
sourceDatasources - 需要进行栅格代数运算的数据源集合。
targetDatasource - 指定的存储结果数据集的数据源。若设置为 null,则如果在栅格分析环境(GridAnalystSetting)中设置了输出数据源,分析结果将存储到该数据源中,否则存储到与输入数据源中。
targetDatasetName - 指定的结果数据集。
返回:
执行运算表达式的运算结果,是一个栅格数据集。

addSteppedListener

public static void addSteppedListener(SteppedListener l)
添加一个进度条事件(SteppedEvent)的监听器。

参数:
l - 一个用于接收进度条事件的监听器。

removeSteppedListener

public static void removeSteppedListener(SteppedListener l)
移除一个进度条事件(SteppedEvent)的监听器。

参数:
l - 一个用于接收进度条事件的监听器。