第五章 使用栅格数据
1.列出栅格数据
ListRasters函数是以python列表的形式返回工作空间中的栅格数据,该函数语法如下:
raster_type通过栅格数据类型限制返回的结果。
以下为示例代码:
import arcpy
from arcpy import env
env.workspace="D:/PythonforArcGIS/study/raster/test.png"
rasterlist=arcpy.ListRasters()
for i in rasterlist:
print i
当workspace为一个栅格文件时,输出为该栅格文件的信息
当workspace为一个文件夹时,输出为该工作空间内的各个栅格文件
此外,还可以通过对ListRaster的参数进行修改,来达到对数据的过滤,当我们把上面代码的第四行进行修改:
import arcpy
from arcpy import env
env.workspace="D:/PythonforArcGIS/study/raster/1991"
rasterlist=arcpy.ListRasters("*","TIF")
for i in rasterlist:
print i
可以发现这里输出的均为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来进行查看,但前提是影像有包含该类信息
如这里我查看了3个信息,但实际上只显示了两个(如下图),这可能是由于该影像并未储存相关属性。
针对栅格波段数据,还有很多其特有的属性如下:
(1)height——行数
(2)width——列数
(3)isInteger——表明波段中的数据是否为整型
(4)meanCellheight——栅格单元在y坐标方向上的大小
(5)meanCellwidth——栅格单元在x坐标方向上的大小
(6)noDataValue——栅格波段中的NoData
(7)pixeltype——像元类型,如八进制、十六进制、单精度浮点型等
(8)primaryField——字段索引
(9)tableType——表的类别名称
结果为下图所示,其中这个高和宽相当于分辨率,这幅影响为30x30m分辨率的影像。
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工具库中,而如果没有这一步就会导致其报错。
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