环境;ArcGIS、Python 2.7

ArcGIS栅格计算器介绍

ArcGIS中的工具箱有栅格计算器工具,它提供的时地图代数功能,可以实现很多复杂的栅格代数运算处理,但栅格计算器工具专门用于 ArcGIS for Desktop 应用程序(仅作为 GP 工具对话框)或模型构建器。它不适用于脚本的编写,而且也不能用于 ArcPy Spatial Analyst 模块

在这里插入图片描述
为此,通过查看ArcGIS 工具箱中的空间分析模块(Spatial Analyst简称sa),发现其中有很多数学分析运算(我们主要用到的多为三角函数和逻辑运算)(见下图)
在这里插入图片描述
因此,为了更好地利用Arcpy中的空间分析工具来进行栅格数据的地图代数运算,需要首先在Python的py文件中导入ArcPy和Spatial Analysis模块,见下面的代码:

#-*- coding: UTF-8 -*-
import arcpy
from arcpy import env
from arcpy.sa import *

# Check out the ArcGIS Spatial Analyst extension license
arcpy.CheckOutExtension("Spatial")

Arcpy对栅格文件的读取、创建和写入

Arcpy读取栅格:

inRaster = arcpy.Raster("D:\\test\\myinputraster.tif")#读取tif文件

Arcpy可以创建 常量栅格、正态栅格 和 随机栅格:

outConstRaster = CreateConstantRaster(12.7, "FLOAT", 2, Extent(0, 0, 250, 250))#常量栅格创建
outNormalRaster = CreateNormalRaster(2, Extent(0, 0, 150, 150))#正态栅格创建
outRandRaster = CreateRandomRaster(100, 2, Extent(0, 0, 150, 150))#随机栅格创建

在这里插入图片描述
Arcpy保存栅格:

OutputRaster.save("D:\\test\\myoutputraster.tif")#保存tif文件

Arcpy进行栅格数学分析的三角函数和逻辑运算归纳总结

三角函数运算对应代码作用
SinoutSinRaster = Sin(inRaster)计算栅格中像元的正弦
CosoutCosRaster = Cos(inRaster)计算栅格中像元的余弦
TanoutTanRaster = Tan(inRaster)计算栅格中像元的正切
SinHoutSinHRaster = SinH(inRaster)计算栅格中像元的双曲正弦
CosHoutCosHRaster = CosH(inRaster)计算栅格中像元的双曲余弦
TanHoutTanHRaster = TanH(inRaster)计算栅格中像元的双曲正切
ASinoutASinRaster = ASin(inRaster)计算栅格中各像元的反正弦
ACosoutACosRaster = ACos(inRaster)计算栅格中像元的反余弦
ATanoutATanRaster = ATan(inRaster)计算栅格中各像元的反正切
ATan2outATan2Raster = ATan2(inRaster1, inRaster2)计算栅格中各像元的反正切(基于 x、y)
ASinHoutASinHRaster = ASinH(inRaster)计算栅格中各像元的反双曲正弦
ACosHoutACosHRaster = ACosH(inRaster)计算栅格中各像元的反双曲余弦
ATanHoutATanHRaster = ATanH(inRaster)计算栅格中各像元的反双曲正切

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

逻辑运算对应代码作用图片
outPlus = Plus(inRaster1, inRaster2)逐个像元地将两个栅格的值相加(求和)
outMinus = Minus(inRaster1, inRaster2)逐个像元地从第一个输入栅格的值中减去第二个输入栅格的值
outTimes = Times(inRaster, inConstant)将两个栅格的值逐个像元地相乘
outDivide = Divide(inRaster01, inRaster02)将两个栅格的值逐个像元地相除
平方outSquare = Square(inRaster)计算栅格中像元值的平方值
平方根outSQRT = SquareRoot(inRaster)计算栅格中像元值的平方根
outPower = Power(inRaster1, inRaster2)对栅格中的像元值进行乘方运算,结果为在另一个栅格中找到的值
取反outNegate = Negate(inRaster)逐个像元地更改输入栅格的像元值符号(乘以 -1)
绝对值outAbs = Abs(inRaster)计算栅格中像元的绝对值
ExpoutExp = Exp(inRaster)计算栅格中各像元以 e 为底的指数
Exp2outExp2 = Exp2(inRaster)计算栅格中各像元以 2 为底的指数
Exp10outExp10 = Exp10(inRaster)计算栅格中各像元以 10 为底的指数
LnoutLn = Ln(inRaster)计算栅格中各像元的自然对数(以 e 为底)
Log2outLog2 = Log2(inRaster)计算栅格中各像元以 2 为底的对数
Log 10outLog10 = Log10(inRaster)计算栅格中各像元以 10 为底的对数
上舍入outRoundURaster = RoundUp(inRaster)返回栅格中每个像元的最近的较大整数,但表示为浮点型
下舍入outRoundDRaster = RoundDown(inRaster)返回栅格中每个像元的最近的较小整数,但表示为浮点型
求模outMod = Mod(inRaster1, inRaster2)逐个像元地求出第一个栅格数据除以第二个栅格数据的余数(模)
转为整型outInt = Int(inRaster)通过截断将栅格的每个像元值转换为整型
转为浮点型outFloat = Float(inRaster)将每个栅格像元的值转换为浮点型表达形式

实例及运行结果

        由于Arcpy对一些简单的栅格加、减、乘、除等运算进行了符号重载,因此可以直接用+、-、*、/等运算符来进行栅格和常量、栅格与栅格之间的数学运算,PyCharm中的计算NPP的具体实例如下所示:

// ArcPy计算NPP代码-Python by jjg
#-*- coding: UTF-8 -*-
import arcpy
from arcpy import env
from arcpy.sa import *

# Check out the ArcGIS Spatial Analyst extension license
arcpy.CheckOutExtension("Spatial")
#读取NPP模型的输入数据
NDVI_Raster = arcpy.Raster("H:\\CASA_Model_200101\\200101输入数据\\NDVI\\MOD13Q1.A200101.hdf.250m_16_days_NDVI_projected1_mask(0-1).tif")#读取tif文件
SOL_Raster = arcpy.Raster("H:\\CASA_Model_200101\\200101输入数据\\sun_radiation\\Y2001M1_sun_radi.img")#读取tif文件
ET_Raster = arcpy.Raster("H:\\CASA_Model_200101\\200101输入数据\\ET\\MOD16A2.200101ET_500m_MVC_Projected_mask.tif")#读取tif文件
PET_Raster = arcpy.Raster("H:\\CASA_Model_200101\\200101输入数据\\PET\\MOD16A2.A200101.hdf.PET_500m_MVC_projected_mask.tif")#读取tif文件
T_Raster = arcpy.Raster("H:\\CASA_Model_200101\\200101输入数据\\TAVG_CORR\\Y2001M1_TAVG_CORR.img")#读取tif文件
SRmin = 0.5
SRmax = 1.5
FPARmin = 0.001
FPARmax = 0.95
T_opt = 26
e_max = 0.389

SR = (1 + NDVI_Raster) / (1 - NDVI_Raster)
FPAR = FPARmin + (FPARmax - FPARmin) * ((SR - SRmin) / (SRmax - SRmin))
APAR = SOL_Raster * FPAR * 0.5
def func(a):
    if a > -10:
        return 0.8 + 0.02 * a - 0.0005 * a * a
    else:
        return 0

T1 = func(T_opt)
T2 = (1.184/(1+Exp(0.2*(T_opt-10-T_Raster))))*(1/(1+Exp(0.3*(T_Raster -10-T_opt))))
W = 0.5 +0.5* ET_Raster / PET_Raster
e = T1 *T2 * W *e_max
NPP = APAR * e
NPP.save("H:\\CASA_Model_200101\\NPP\\NPP.tif")

运行结果如下:
在这里插入图片描述
掩膜提取后:
在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐