@[TOC](利用GDAL处理TIF文件)

项目场景:

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版本的更新和新工具包的导入,完美的解决了数据量太大溢出的问题,而且也提高了工作效率。

你可能感兴趣的:(数据库,矩阵,数据挖掘,python,windows)