摘要
定义迭代器对象,以迭代一个或多个栅格的像元。
输入是包含单个或多个 Raster 对象(并可选择包含填充因子)的字典。此外,还可以指定迭代期间将被跳过其 NoData 像元的 Raster 对象列表。
说明
RasterCellIterator 对象将枚举循环中给定 Raster 对象的行和列对。行和列对可在 [行,列] 指数记法中与 Raster 对象搭配使用,以读取或写入像元值。
在迭代器中使用多个栅格时,列表中的第一个栅格将定义迭代器的栅格分析环境。列表中的所有其他栅格都应在空间参考、像元大小和范围方面与第一个栅格相匹配。如果此列表中第二个栅格及后续栅格的属性与第一个栅格不匹配,则系统会将第一个栅格的分析环境应用于它们。建议您使用第一个栅格的 RasterInfo 对象来创建所有输出栅格,以便这些输出栅格继承其空间参考、像元大小和范围。
有关如何使用 RasterCellIterator 执行自定义栅格分析的详细信息,请参阅使用栅格像元迭代器的快速浏览。
语法
RasterCellIterator (*args)
参数 | 说明 | 数据类型 |
*args | 按照以下格式定义栅格和填充的字典:{'rasters': [in_rasterobj1, in_rasterobj2, ...], 'padding': padding_factor, 'skipNoData': [in_rasterobj1, in_rasterobj2, ...]} rasters 键将表示为 Raster 对象列表。每个 Raster 对象必须均为 arcpy.Raster 类的实例。 可选的 padding 键将以整数表示。填充因子可按照指定的值扩展栅格对象的内部像素块大小。 可选的 skipNoData 键表示为指定要由迭代器跳过的像元的栅格列表。对于任何给定的像元,如果此列表中的一个或多个栅格具有 NoData 值,则迭代器将跳过该像元。 skipNoData 列表中的栅格必须是或等于 rasters 列表的子集。 | Dictionary |
代码示例
使用 RasterCellIterator 从输入栅格读取每个像元值并将其写入输出栅格,从而将栅格移动一个像元。
# Import system modules
import arcpy
from arcpy.sa import *
# Create inRaster raster object
inRaster = arcpy.Raster("C:/arcpyExamples/inputs/elevation.tif")
# Get the raster info object from inRaster
rasInfo = inRaster.getRasterInfo()
# Create a new raster dataset
outRaster = arcpy.Raster(rasInfo)
# The following code shifts inRaster by one cell and writes to outRaster
with arcpy.sa.RasterCellIterator({"rasters":[inRaster, outRaster], "padding":1}) as rci:
for r, c in rci:
# Read cell value from inRaster (at upper left corner of the current location)
v = inRaster[r-1, c-1]
# Check for NoData
if math.isnan(v):
# Write NoData to outRaster
outRaster[r, c] = math.nan
else:
# Write v to outRaster
outRaster[r, c] = v
# Save the output
outRaster.save("C:/arcpyExamples/outputs/outras01.tif")
使用 RasterCellIterator 将行(或列)号分配给新栅格上的每个像元。
# Import system modules
import arcpy
from arcpy.sa import *
# Create a raster info object
rasInfo = arcpy.RasterInfo()
# Create a spatial reference object
spRef = arcpy.SpatialReference(32145)
# Create an extent object
ext = arcpy.Extent(471090.082572495, 208342.353396819, 494670.082572495, 231352.353396819, 0, 0, 0, 0, spRef)
# Initialize raster info object properties
# Set the spatial reference property
rasInfo.setSpatialReference(spRef)
# Set the extent property
rasInfo.setExtent(ext)
# Set the cell size property
rasInfo.setCellSize((30, 30))
# Set the pixel type property
rasInfo.setPixelType("S32")
# Create a new raster dataset
outRaster = arcpy.Raster(rasInfo)
# The following code will create a row (or column) raster
with RasterCellIterator({"rasters":[outRaster], "padding":1}) as rci:
for r, c in rci:
# Assign 'r' to outRaster will result in a row raster
# Assign 'c' to outRaster will result in a column raster.
outRaster[r, c] = r
# Save the output
outRaster.save("C:/arcpyExamples/outputs/outras02.tif")
使用 RasterCellIterator 获取流的流向。
# Import system modules
import arcpy
from arcpy.sa import *
# Create inRaster raster object
inStreamRas = arcpy.Raster("C:/arcpyExamples/inputs/streamras.tif")
inFlowDirRas = arcpy.Raster("C:/arcpyExamples/inputs/flowdir.tif")
# Get the raster info object from inRaster
rasInfo = inFlowDirRas.getRasterInfo()
# Create a new raster dataset
outRaster = arcpy.Raster(rasInfo)
# Get flow directions along a stream network
with arcpy.sa.RasterCellIterator({"rasters":[inStreamRas, inFlowDirRas, outRaster], "padding":1, "skipNoData":[inStreamRas]}) as rci:
for r, c in rci:
v = inFlowDirRas[r, c]
outRaster[r, c] = v
# Save the output
outRaster.save("C:/arcpyExamples/outputs/outras03.tif")