Python是一门动态类型的、面向对象的语言的内存管理方式,在用2版本的时候很容易发生内存溢出情况,为此,除了垃圾回收机制来释放内存,还可以直接升级到3版本。
在用反演拟合算法进行AOD处理的时候,一般的Aqa和Terr在100M+,利用arcpy.RasterToNumPyArray函数得出的矩阵大小为(3000–5000,6000–9000)左右,极容易造成数组溢出
Memory error
aq = arcpy.RasterToNumPyArray(inpath_aq)
te = arcpy.RasterToNumPyArray(inpath_te)
Python用的是32位的,那么pandas和Numpy也只能是32位的,当内存使用超过2G时,就会自动终止内存.
将python版本升级到3并导入GDAL和geopandas,其具有和Arcpy相类似的功能
其中,geopandas的安装较为复杂,在下篇博客将会详细的介绍geopandas的安装过程。
下面介绍利用GDAL处理TIF的相关代码
# -*- coding: utf-8 -*-
from osgeo import gdal
#读图像文件
def read_img(filename):
dataset = gdal.Open(filename) #打开文件
width = dataset.RasterXSize #栅格矩阵的行列数
height = dataset.RasterYSize
bands = dataset.RasterCount #波段数
geotrans = dataset.GetGeoTransform() #仿射矩阵
project = dataset.GetProjection() #地图投影信息
data = dataset.ReadAsArray(0,0,width,height)
del dataset
return width, height, bands, project, geotrans, data
一般GDAL的数据类型分为以下几种
#gdal数据类型
#gdal.GDT_Byte,
#gdal .GDT_UInt16, gdal.GDT_Int16, gdal.GDT_UInt32, gdal.GDT_Int32,
#gdal.GDT_Float32, gdal.GDT_Float64
接来下是对图像的保存
# -*- coding: utf-8 -*-
from osgeo import gdal
#写GeoTiff文件
def write_img(filename, project, geotrans, data):
#判断栅格数据的数据类型`在这里插入代码片`
if 'int8' in data.dtype.name:
datatype = gdal.GDT_Byte
elif 'int16' in data.dtype.name:
datatype = gdal.GDT_UInt16
else:
datatype = gdal.GDT_Float32
#判读数组维数
if len(data.shape) == 3:
bands, height, width = data.shape
else:
bands, (height, width) = 1, data.shape
#创建文件
driver = gdal.GetDriverByName("GTiff")
dataset = driver.Create(filename, width, height, bands, datatype)
dataset.SetGeoTransform(geotrans) #写入仿射变换参数
dataset.SetProjection(project) #写入投影
if bands == 1:
dataset.GetRasterBand(1).WriteArray(data) #写入数组数据
else:
for i in range(bands):
dataset.GetRasterBand(i+1).WriteArray(data[i])
del dataset
经过上述对python版本的更新和新工具包的导入,完美的解决了数据量太大溢出的问题,而且也提高了工作效率。