arcpy提供了一个函数用于栅格转数组,但是如果影像分辨率过高、数据量过大,经常出现报错而没法进行,因此写了一个分块读取的函数并合并到一起,供参考。
这个函数是针对单波段栅格数据的。
"""Created on Thu May 13 10:23:32 2021
@author: John_Huang
@version:python 2.7"""
import arcpy
from arcpy import env
from arcpy.sa import *
import numpy
def raster_data_to_numpy_array(raster_data, block_size=1024):
'''单波段栅格数据转为numpy数组
由于arcpy库函数RasterToNumPyArray不能一次性转换
这个函数分块读取栅格数据并合并为一个完整数组
raster_data输入栅格数据的绝对路径
block_size分块读取的块大小'''
blocksize = block_size
in_Raster = arcpy.Raster(raster_data)
vi_value_array = numpy.zeros([in_Raster.height, in_Raster.width])
for x in range(0, in_Raster.width, blocksize):
for y in range(0, in_Raster.height, blocksize):
mx = in_Raster.extent.XMin + x * in_Raster.meanCellWidth
my = in_Raster.extent.YMin + y * in_Raster.meanCellHeight
lx = min([x + blocksize, in_Raster.width])
ly = min([y + blocksize, in_Raster.height])
myData = arcpy.RasterToNumPyArray(in_Raster, arcpy.Point(mx, my), lx-x, ly-y)
vi_value_array[y:ly, x:lx] = myData
return vi_value_array