文章目录

  • 一、功能介绍
  • 二、脚本代码
  • 三、工具参数
  • 四、用例
  • 4.1 批量单位换算
  • 4.2 批量计算植被覆盖度
  • 4.3 批量填充空值


系列文章目录:

ArcGIS自定义脚本工具


一、功能介绍

arcgis中python批量计算GDB中某字段值总和 arcgis字段计算器python脚本_栅格

  • 功能
    将多个栅格文件按照某以代数表达式执行栅格计算器(Raster Calculator) 工具,并将输出栅格文件保存至指定的文件夹中。该工具接受代数表达式的动态输入。通过修改代数表达式可以实现批量对栅格执行四则运算(加、减、乘、除)、计算掩膜、填充空值(固定值、插值)、设为空等操作。
  • 关于代数表达式
    提供的代数表达式需要满足栅格计算器工具代数表达式的基本语法,并且包含字符串"{A}“,字符串”{A}"代表输入栅格在代数表达式中的位置。在用例章节提供了几个案例。

二、脚本代码

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import arcpy
import os
import time

rasters = arcpy.GetParameterAsText(0)
expression = arcpy.GetParameterAsText(1) # expression including {A}
out_path = arcpy.GetParameterAsText(2)
prefix = arcpy.GetParameterAsText(3)

rasters = rasters.split(";")
nums = len(rasters)
num = 1
for raster in rasters:
    raster_path = raster.replace("'","")
    raster_dir,raster_name = os.path.split(raster_path)
    arcpy.env.workspace = raster_dir
    out_raster = os.path.join(out_path, prefix + raster_name)
    exp = expression.replace('{A}', r'"{0}"'.format(raster_name))
    arcpy.AddMessage(exp)
    if not os.path.exists(out_raster):
        try:
            arcpy.gp.RasterCalculator_sa(exp, out_raster)
            arcpy.AddMessage("%d/%d | %s completed" % (num, nums, out_raster))
        except Exception as err:
            arcpy.AddMessage("%d/%d | %s errored, %s" % (num, nums, out_raster, err))
    else:
        arcpy.AddMessage("%d/%d | %s already exists" % (num, nums, out_raster))
    num = num + 1

三、工具参数

arcgis中python批量计算GDB中某字段值总和 arcgis字段计算器python脚本_arcgis_02


arcgis中python批量计算GDB中某字段值总和 arcgis字段计算器python脚本_字符串_03

Parameter

Explanation

Data type

rasters

待执行栅格计算器的多个栅格文件

Raster Dataset

expression

栅格计算器工具要执行的代数表达式。该表达式需要满足栅格计算器工具中代数表达式的基本语法,并且包含字符串"{A}“,字符串”{A}"代表输入栅格在代数表达式中的位置。

String

out_path

输出栅格文件的文件夹

Folder

prefix

输出栅格文件的文件名前缀,该栅格的文件名为"prefix_<旧文件名>.tif",该参数默认为"cal_"

String

关于参数expression,提供了一些常用的示例

1.加

{A} + 10

2.减

{A} - 273.15

3.乘

{A} * 0.0001

4.除

{A} / 10000

5.四则运算

({A} * 3 + 4)/5

6.条件函数-计算掩膜

Con({A} > 0,1,0})

7.条件函数-计算植被覆盖度

Con({A}<0.1,0,Con({A}>=0.8,1,({A}-0.1)/0.7))

8.条件函数-固定值填充空值

Con(IsNull({A}), 0, {A})

9.条件函数-插值填充空值

Con(IsNull({A}), FocalStatistics({A}, NbrRectangle(5,5, "CELL"), "MEAN"), {A})

10.设为空-将满足条件的栅格赋值为空值

SetNull({A}<0,{A})

四、用例

通过修改参数expression,对栅格批量执行某一代数表达式。

4.1 批量单位换算

  • 输入文件:某区域的陆面温度(LST)栅格数据,单位为开氏温度
  • 处理目标:批量将输入文件的单位换算为摄氏温度
{A} - 273.15

arcgis中python批量计算GDB中某字段值总和 arcgis字段计算器python脚本_字符串_04


arcgis中python批量计算GDB中某字段值总和 arcgis字段计算器python脚本_arcgis_05

4.2 批量计算植被覆盖度

  • 输入文件:某区域的植被指数(NDVI)栅格数据
  • 处理目标:基于像元二分模型,批量根据NDVI估算植被覆盖度
    关于估算植被覆盖度的说明可以看这篇:【MODIS数据处理#10】例五:用NDVI估算植被覆盖度

假设我们根据NDVI的累计频率分布,已经确定了像元二分模型中的两个阈值分别为0.1、0.85。则可以通过将该工具中的expression设置为:

Con({A}<0.1,0,Con({A}>=0.85,1,({A}-0.1)/0.75))

arcgis中python批量计算GDB中某字段值总和 arcgis字段计算器python脚本_arcgis_06


arcgis中python批量计算GDB中某字段值总和 arcgis字段计算器python脚本_栅格_07

4.3 批量填充空值

  • 输入文件:某区域的净初级生产力NPP栅格数据
  • 处理目标:将NPP的缺失值区域填充为0
Con(IsNull({A}), 0, {A})

arcgis中python批量计算GDB中某字段值总和 arcgis字段计算器python脚本_arcgis_08


arcgis中python批量计算GDB中某字段值总和 arcgis字段计算器python脚本_字符串_09


还可以选择根据空白区域周围的有效像元插值进行填充,表达式可以参考

Con(IsNull({A}), FocalStatistics({A}, NbrRectangle(5,5, "CELL"), "MEAN"), {A})

关于上述表达式的说明,可以参考

缺失像元处的值就用以其为中心的5*5的矩形窗口内所有的有效像元的值平均后得到

FOCALMEAN中的长方形的尺寸可以被编辑以适应数据的需求。编辑"5,5"的值的大小可以改变长方形的尺寸。可能需要改成更大或者更小,这取决于数据。
原理是利用邻域均值代替空缺值。
可用的不同类型的邻域:
NbrAnnulus,NbrCircle,NbrRectangle,NbrWedge, NbrIrregular,和NbrWeight。默认邻域是正方形NbrRectangle,其宽度和高度为3个单元格。
要计算的统计类型:
MEAN(平均值)—计算附近单元格的平均值(平均值)。
MAJORITY —计算附近的单元格的多数(最常出现的值)。
MAXIMUM —计算附近的像元的最大值(最大值)。
MEDIAN —计算附近单元格的中位数。
MINIMUM —计算附近的像元的最小值(最小值)。
MINORITY-计算邻域中的单元格的少数(最少出现的值)。
RANGE(范围)—计算附近单元格的范围(最大值与最小值之间的差)。
STD —计算附近单元格的标准差。
SUM —计算附近单元格的总和(所有值的总和)。
VARIETY(变异度)—计算附近单元格的变异度(唯一值的数量)。
默认的统计类型是MEAN。
如果输入栅格为浮点,则只有MEAN,MAXIMUM,MINIMUM,RANGE,STD和SUM统计类型可用。

举个例子,对于上文使用的存在缺失区域的NPP栅格,使用相邻有效像元的值进行填充

arcgis中python批量计算GDB中某字段值总和 arcgis字段计算器python脚本_字符串_10


arcgis中python批量计算GDB中某字段值总和 arcgis字段计算器python脚本_arcgis_11