RasterCellIterator

摘要

定义迭代器对象,以迭代一个或多个栅格的像元。

输入是包含单个或多个 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 示例 1

使用 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 示例 2

使用 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 示例 3

使用 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")

相关主题