Raster栅格对象

常用方法

打开栅格数据

  1. Raster(inRaster) #数据类型:Raster
  2. # 例子
  3. r = Raster("c:/data/dem") # 绝对路径
  4. r = Raster("19960909.img") #相对路径,当不是ArcGIS的栅格数据时,要加上后缀

保存栅格数据

  1. rasterObj.save(path) #使用:Raster对象.save(路径字符串)
  2. # 例子
  3. r.save("c:/data/dem_1") # 绝对路径保存

列出工作目录下的所有栅格

  1. arcpy.ListRasters({wild_card},{raster_type})
  2. # 例子:列出工作空间中的Grid栅格名称
  3. import arcpy
  4. arcpy.env.workspace = "c:/data/DEMS"
  5. rasters = arcpy.ListRasters("*","GRID")
  6. for raster in rasters:
  7. print raster
参数 说明 数据类型
wild_card 通配符可限制返回的结果,例如匹配前面有A的文件名(“A*”) String
raster_type 栅格格式 String

栅格转换为NumPy数组

使用例子:https://blog.csdn.net/summer_dew/article/details/78867410

转换成NumPy便于我们对像元进行操作,详细请点我

  1. RasterToNumPyArray (in_raster, {lower_left_corner}, {ncols}, {nrows}, {nodata_to_value})

RasterToNumPyArray支持将多波段栅格直接转换成多维数组(ndarray)

  1. 如果输入Raster实例基于多波段栅格,则会返回 ndarry,其中第一维的长度表示波段数。ndarray 将具有维度(波段、行、列)
  2. 如果输入Raster实例基于单个栅格或多波段栅格中的特定波段,则会返回含维度(行、列)的二维数组。

转换时隐含规则:

  1. 如果数组的定义(左下角以及行数和列数)超出 in_raster 的范围,则数组值将分配为 NoData
  2. 如果 lower_left_corner 与像元角不重合,则会自动捕捉到最近像元角的左下角,该捕捉方法采用的规则与“捕捉栅格”环境设置中的规则相同。RasterToNumPy 函数内的捕捉操作不会与“捕捉栅格”环境设置相混淆;该函数只使用相同的交互

属性

属性 说明 数据类型 属性 说明 数据类型
bandCount 波段数量 Integer pixelType 像素类型(U32:Unsigned 32 bit integers) String
name 数据名称 String spatialReference 空间参考 SpatialReference
path 完整路径和名称 String catalogPath 全路径和名称的字符串 String
compressionType 压缩类型 String format 数据格式 String
extent 栅格数据的范围 Extent hasRAT 存在关联的属性表 Boolean
height 行数 Integer width 列数 Integer
isInteger 数据具有整数类型 Boolean isTemporary 数据是临时的 Boolean
maximum 最大值 Double minimum 最小值 Double
mean 平均值 Double standardDeviation 标准差 Double
uncompressedSize 磁盘大小 Double noDataValue 在数据中NoData的值 Double

操作

【官方文档】

  1. out_raster=in_raster1*in_raster2 #直接运算
  2. out_raster = Slope("dem") #指定函数:参数为字符串,全路径或相对路径
  3. out_raster = Con(in_raster >= 2, 1, 0) #栅格计算器中的函数
  4. outStats = CellStatistics(["inraster1", "inraster2", "inraster3"], "MEAN", "DATA") #平均值

案例

名称 说明
多个栅格文件相加 创建一个相同范围,像元值都为0的栅格文件aoi_value_0,递归相加,保存

镶嵌(求多幅影像的平均值)

  1. def mosaic(in_dir, out_fp):
  2. # input
  3. in_datas = []
  4. fns = os.listdir(in_dir)
  5. for fn in fns:
  6. if fn.endswith("tif"):
  7. fp = os.path.join(in_dir, fn)
  8. in_datas.append(fp)
  9. print "\t[data] {}".format(fp)
  10. if len(in_datas) == 0:
  11. print "\t[No data] {}".format(in_dir)
  12. return None
  13. else:
  14. print "\t[find data] {}".format(len(fns) )
  15. # copy out_data
  16. print "\t[new] create the out file"
  17. first_data = in_datas[0]
  18. out_raster = Raster(first_data)
  19. out_raster.save(out_fp)
  20. # Mosaic
  21. print "\t[doing]"
  22. arcpy.Mosaic_management(in_datas[1:], out_fp, "MEAN")
  23. print "\t[done]"
  24. return out_fp

求多幅影像的平均值(去除最大值、最小值)

  1. def mosaic_nomaxmin(in_dir, out_fp):
  2. # input
  3. env.workspace = in_dir
  4. env.extent = "MAXOF"
  5. in_datas = []
  6. fns = os.listdir(in_dir)
  7. for fn in fns:
  8. if fn.endswith("tif"):
  9. in_datas.append(fn)
  10. print "\t[data] {}".format(fn)
  11. if len(in_datas) == 0:
  12. print "\t[No data] {}".format(in_dir)
  13. return None
  14. else:
  15. print "\t[find data] {}".format(len(fns))
  16. # max and min raster
  17. sum_raster = CellStatistics(in_datas, "SUM", "DATA")
  18. max_raster = CellStatistics(in_datas, "MAXIMUM", "DATA")
  19. min_raster = CellStatistics(in_datas, "MINIMUM", "DATA")
  20. # the number of Data
  21. cnt_raster = Con(IsNull(sum_raster), 0, 0)
  22. for data in in_datas:
  23. cnt_raster = Con( IsNull(data), cnt_raster, cnt_raster+1 )
  24. # cnt_raster.save(r"F:\out\cnt.tif")
  25. # compute
  26. print "\t[doing]"
  27. raster = (sum_raster - max_raster - min_raster) / ( cnt_raster - 2)
  28. raster.save(out_fp)
  29. print "\t[done]"
  30. return out_fp

求多幅影像的中值

  1. def mosaic_median(in_dir, out_fp):
  2. # input
  3. env.workspace = in_dir
  4. env.extent = "MAXOF"
  5. in_datas = []
  6. fns = os.listdir(in_dir)
  7. for fn in fns:
  8. if fn.endswith("tif"):
  9. in_datas.append(fn)
  10. print "\t[data] {}".format(fn)
  11. if len(in_datas) == 0:
  12. print "\t[No data] {}".format(in_dir)
  13. return None
  14. else:
  15. print "\t[find data] {}".format(len(fn))
  16. # compute
  17. print "\t[doing]"
  18. raster = CellStatistics(in_datas, "MEDIAN", "DATA")
  19. raster.save(out_fp)
  20. print "\t[done]"
  21. return out_fp

错误集合

运行py文件出错

运行py文件出错,没有为脚本提供授权

错误:

  1. Traceback (most recent call last):
  2. File "G:/workspace/python/arcpy/arcgis_running/file_add.py", line 6, in <module>
  3. out = Raster('19990101.img') + Raster('19990111.img')
  4. File "D:\Program Files (x86)\ArcGIS\Desktop10.2\arcpy\arcpy\sa\Functions.py", line 4143, in Plus
  5. in_raster_or_constant2)
  6. File "D:\Program Files (x86)\ArcGIS\Desktop10.2\arcpy\arcpy\sa\Utils.py", line 47, in swapper
  7. result = wrapper(*args, **kwargs)
  8. File "D:\Program Files (x86)\ArcGIS\Desktop10.2\arcpy\arcpy\sa\Functions.py", line 4140, in Wrapper
  9. ["Plus", in_raster_or_constant1, in_raster_or_constant2])
  10. RuntimeError

栅格Raster - 图1
栅格Raster - 图2

解决:
添加授权:arcpy.CheckOutExtension("spatial")

  1. import arcpy
  2. from arcpy import env
  3. from arcpy.sa import *
  4. arcpy.CheckOutExtension("spatial")
  5. env.workspace = "E:/user/Desktop/date"
  6. out = Raster('19990101.img') + Raster('19990111.img')

统计多个栅格的平均值 报错

【代码】

  1. def mosaic_median(in_dir, out_fp):
  2. # input
  3. env.workspace = in_dir
  4. # env.extent = "MAXOF"
  5. in_datas = []
  6. fns = os.listdir(in_dir)
  7. for fn in fns:
  8. if fn.endswith("tif"):
  9. in_datas.append(fn)
  10. print "\t[data] {}".format(fn)
  11. if len(in_datas) == 0:
  12. print "\t[No data] {}".format(in_dir)
  13. return None
  14. else:
  15. print "\t[find data] {}".format(len(fn))
  16. # compute
  17. print "\t[doing]"
  18. raster = CellStatistics(in_datas, "MEDIAN", "DATA")
  19. raster.save(out_fp)
  20. print "\t[done]"
  21. return out_fp

【报错】

  1. Traceback (most recent call last):
  2. File "D:/mycode/GISandPython/2Arcpy/ArcGISTools/2MOD04-L2/process.py", line 223, in <module>
  3. mosaic_all(ret, case)
  4. File "D:/mycode/GISandPython/2Arcpy/ArcGISTools/2MOD04-L2/process.py", line 216, in mosaic_all
  5. mosaic_median(month_dir, out_fp)
  6. File "D:/mycode/GISandPython/2Arcpy/ArcGISTools/2MOD04-L2/process.py", line 189, in mosaic_median
  7. raster = CellStatistics(in_datas, "MEDIAN", "DATA")
  8. File "C:\Program Files (x86)\ArcGIS\Desktop10.5\ArcPy\arcpy\sa\Functions.py", line 3149, in CellStatistics
  9. ignore_nodata)
  10. File "C:\Program Files (x86)\ArcGIS\Desktop10.5\ArcPy\arcpy\sa\Utils.py", line 53, in swapper
  11. result = wrapper(*args, **kwargs)
  12. File "C:\Program Files (x86)\ArcGIS\Desktop10.5\ArcPy\arcpy\sa\Functions.py", line 3145, in Wrapper
  13. [function] + Utils.flattenLists(in_rasters_or_constants))
  14. RuntimeError: <exception str() failed>

【错误分析】多个栅格的范围不一致导致的错误
【解决】多加一句环境配置
env.extent = "MAXOF"