第五章 使用栅格数据

1.列出栅格数据

ListRasters函数是以python列表的形式返回工作空间中的栅格数据,该函数语法如下:

python栅格相加 python处理栅格数据_python栅格相加


raster_type通过栅格数据类型限制返回的结果。

python栅格相加 python处理栅格数据_数据_02


以下为示例代码:

import arcpy
from arcpy import env

env.workspace="D:/PythonforArcGIS/study/raster/test.png"
rasterlist=arcpy.ListRasters()
for i in rasterlist:
    print i

当workspace为一个栅格文件时,输出为该栅格文件的信息

python栅格相加 python处理栅格数据_栅格_03


当workspace为一个文件夹时,输出为该工作空间内的各个栅格文件

python栅格相加 python处理栅格数据_栅格_04


此外,还可以通过对ListRaster的参数进行修改,来达到对数据的过滤,当我们把上面代码的第四行进行修改:

import arcpy
from arcpy import env

env.workspace="D:/PythonforArcGIS/study/raster/1991"
rasterlist=arcpy.ListRasters("*","TIF")
for i in rasterlist:
    print i

python栅格相加 python处理栅格数据_数据_05


可以发现这里输出的均为tif文件。

2.描述栅格属性
栅格数据可以使用之前提到的Describe进行描述。该函数将返回指定数据元素的各种属性。此类属性为动态的,即不同的数据类型会有不同的描述属性可供使用。
栅格元素具有三种不同的类型:
(1)栅格数据集——是一种栅格数据模型,它可以存储在磁盘或者地理数据库中。
(2)栅格波段——是栅格数据集中的一个图层,代表电磁光谱某个范围内或波段内的值。
(3)栅格目录——是以表格形式定义的栅格数据集的集合,目录中每条记录表示一个栅格数据集。
下面的例子说明了使用Describe函数对栅格属性的读取并输出:

import arcpy
from arcpy import env

env.workspace="D:/PythonforArcGIS/study/raster/1991"
raster='LT05_L1TP_121044_19911009_20170125_01_T1_B1.tif'
desc=arcpy.Describe(raster)
print desc.dataType

这里dataType返回的实际上为目标数据的数据类型,这很明显为RasterDataset。除此之外,栅格数据集还包含了以下内容:

(1)bandcount——波段数

(2)compressionType——压缩类型

(3)format——栅格数据格式(tif、grid、imagine等)

(4)permanent——表明栅格的状态:False表示临时数据,True则相反

(5)sensorType——获取影像的传感器的类型

可通过desc.bandcount来进行查看,但前提是影像有包含该类信息

python栅格相加 python处理栅格数据_python栅格相加_06


如这里我查看了3个信息,但实际上只显示了两个(如下图),这可能是由于该影像并未储存相关属性。

python栅格相加 python处理栅格数据_栅格数据_07


针对栅格波段数据,还有很多其特有的属性如下:

(1)height——行数

(2)width——列数

(3)isInteger——表明波段中的数据是否为整型

(4)meanCellheight——栅格单元在y坐标方向上的大小

(5)meanCellwidth——栅格单元在x坐标方向上的大小

(6)noDataValue——栅格波段中的NoData

(7)pixeltype——像元类型,如八进制、十六进制、单精度浮点型等

(8)primaryField——字段索引

(9)tableType——表的类别名称

python栅格相加 python处理栅格数据_数据_08

结果为下图所示,其中这个高和宽相当于分辨率,这幅影响为30x30m分辨率的影像。

python栅格相加 python处理栅格数据_python栅格相加_09

3.处理栅格对象
在ArcPy中,有两种方法创建栅格对象
(1)直接引用磁盘上已有的栅格数据
(2)使用地图代数语句。
创建栅格类的语法为:
Raster(inRaster)
下面代码说明通过引用磁盘上已有栅格数据来创建对象

import arcpy
myraster=arcpy.Raster("D:/PythonforArcGIS/study/raster/1991/LT05_L1TP_121044_19911009_20170125_01_T1_B1.tif")

使用地图代数语句创建

import arcpy
outraster=arcpy.sa.Slope("D:/PythonforArcGIS/study/raster/1991/LT05_L1TP_121044_19911009_20170125_01_T1_B1.tif")

栅格对象只有一个方法:save方法。有地图代数语句返回的栅格对象默认为临时数据,这意味它们将在使用结束后被删除。而save方法可以使栅格对象永久保存在磁盘中,如下面这段代码:

import arcpy

arcpy.CheckOutExtension("Spatial")
outraster=arcpy.sa.Slope("D:/PythonforArcGIS/study/raster/1991/LT05_L1TP_121044_19911009_20170125_01_T1_B1.tif")
outraster.save("D:/PythonforArcGIS/study/raster/slope")

这里需要注意第二行代码,这里用到的slope是属于spatial工具库中,而如果没有这一步就会导致其报错。

python栅格相加 python处理栅格数据_栅格数据_10


python栅格相加 python处理栅格数据_栅格_11


4.地图代数

arcpy.sa模块除了可以提供访问工具的接口,还提供了一系列用于执行地图代数的运算符。其中大多数运算符既可以作为工具箱下Math工具集中的工具,也可以作为代码中的运算符。

如代码

outraster=Times(elevraster,"0.348")

可替换为

outraster=elevraster*0.348

又比如

temp1=Plus(f1,f2)
temp2=Plus(temp1,f3)
out=Divide(temp2,"3")

可替换为

out=(f1+f2+f3)/3