記事のディレクトリ
0背景と構成環境
0.1背景
GDAL(地理空間データ抽象ライブラリ)X / MITライセンス契約におけるオープンソースラスタ空間データ変換ライブラリです。これは、抽象データモデルを使用することでサポートされているさまざまなファイル形式で表現されます。また、データ変換して処理するためのコマンドラインツールのシリーズがあります。
他の多くの言語でこのオープンソースラスタ空間データ変換およびデータベース・インターフェース、Python用に、彼は、対応するサードパーティ製のパッケージGDALを持って、すでに以前の記事で述べダウンロードしてインストールします。
目的:バッチ処理を容易にするため、データを読み書きGDALを検出:Pythonはのサードパーティ製のパッケージを使用することができます。
0.2構成環境
コンピュータシステム:Win7x64
Pythonのバージョン:3.6.4
GDALのバージョン:2.3.2
1を読みます
1.1 TIFF形式
タグ付けされたイメージファイル形式(タグイメージファイル形式、TIFF略す)は、主に図を含む写真、技術、などの画像を格納するために使用される柔軟なビットマップ形式です。もともとはアルダスとMicrosoftが開発したPostScriptで印刷しました。人気の高いカラー画像形式のTIFFやJPEGとPNG。
tifファイル拡張子を持つTIFFファイル。
def tif_read(tifpath, bandnum):
"""
Use GDAL to read data and transform them into arrays.
:param tifpath:tif文件的路径
:param bandnum:需要读取的波段
:return:该波段的数据,narray格式。len(narray)是行数,len(narray[0])列数
"""
image = gdal.Open(tifpath) # 打开该图像
if image == None:
print(tifpath + "该tif不能打开!")
return
lie = image.RasterXSize # 栅格矩阵的列数
hang = image.RasterYSize # 栅格矩阵的行数
im_bands = image.RasterCount # 波段数
im_proj = image.GetProjection() # 获取投影信息
im_geotrans = image.GetGeoTransform() # 仿射矩阵
print('该tif:{}个行,{}个列,{}层波段, 取出第{}层.'.format(hang, lie, im_bands, bandnum))
band = image.GetRasterBand(bandnum) # Get the information of band num.
band_array = band.ReadAsArray(0,0,lie,hang) # Getting data from zeroth rows and 0 columns
# band_df = pd.DataFrame(band_array)
del image # 减少冗余
return band_array, im_proj, im_geotrans
2書き込み
2.1 TIFF形式
TIFF形式のデータ形式:Byete、INT16、uint16の、INT32 、UINT32、のfloat32、float64型以上の7種類。
まず、あなたはオンデマンドで書き込むデータの形式を決定する必要があります。
def tif_write(self, filename, im_data, im_proj, im_geotrans):
"""
gdal数据类型包括
gdal.GDT_Byte,
gdal.GDT_UInt16, gdal.GDT_Int16, gdal.GDT_UInt32, gdal.GDT_Int32,
gdal.GDT_Float32, gdal.GDT_Float64
:param filename: 存出文件名
:param im_data: 输入数据
:param im_proj: 投影信息
:param im_geotrans: 放射变换信息
:return: 0
"""
if 'int8' in im_data.dtype.name: # 判断栅格数据的数据类型
datatype = gdal.GDT_Byte
elif 'int16' in im_data.dtype.name:
datatype = gdal.GDT_UInt16
else:
datatype = gdal.GDT_Float32
# 判读数组维数
if len(im_data.shape) == 3:
im_bands, im_height, im_width = im_data.shape
else:
im_bands, (im_height, im_width) = 1,im_data.shape # 多维或1.2维
#创建文件
driver = gdal.GetDriverByName("GTiff") #数据类型必须有,因为要计算需要多大内存空间
dataset = driver.Create(filename, im_width, im_height, im_bands, datatype)
dataset.SetGeoTransform(im_geotrans) #写入仿射变换参数
dataset.SetProjection(im_proj) #写入投影
if im_bands == 1:
dataset.GetRasterBand(1).WriteArray(im_data) #写入数组数据
else:
for i in range(im_bands):
dataset.GetRasterBand(i+1).WriteArray(im_data[i])
del dataset
3つのショー
3.1 TIFF形式
# 这个展示的效果并不是太好,当做示意图用
def tif_display(self,im_data):
"""
:param im_data: 影像数据,narray
:return: 展出影像
"""
# plt.imshow(im_data,'gray') # 必须规定为显示的为什么图像
plt.imshow(im_data) # 必须规定为显示的为什么图像
plt.xticks([]), plt.yticks([]) # 隐藏坐标线
plt.show() # 显示出来,不要也可以,但是一般都要了