python gdal読み書きBIP、BSQデータフォーマットtifおよび相互変換
2469 ワード
言語pyhton 3.6
ツールgdal 2.3.3
一.BIP BSQ BIL
ツールgdal 2.3.3
一.BIP BSQ BIL
BIPの記憶フォーマットは帯域がピクセル交差フォーマットである.BSQの記憶フォーマットは帯域順序フォーマットである.BILの記憶形式は帯域が行交差形式である.
メモリ(tifの読み取りに使用されることが多い)とディスク(tifの書き込みに使用されることが多い)はどのように記憶されているか:多次元ベクトルは最終的に1~nの仮定に格納される...のスペース
1
2
3
...
...
n
...
BIPは、まず第1の帯域の第1の画素を画素別に保存し、その後、第2の帯域の第1の画素を保存し、順次保存する.BSQは、1つの帯域が保存された後に第2の帯域が保存される帯域である.BIL(band interleaved by line format)は行ごとに保存され、1番目の帯域の1行目を保存した後、2番目の帯域の1行目を保存し、順次類推される.
参照先:https://www.cnblogs.com/gisyang/p/4650475.html
二.BIP、BSQ変換
方法1:gdal_を借りるtranslateツール.srcpath = r"***"
despath = r"***"
#toBSQ
gdal.Translate(despath , srcpath , creationOptions=["INTERLEAVE=BAND"])
#toBIP
gdal.Translate(despath , srcpath , creationOptions=["INTERLEAVE=PIXEL"])
方式2:gdalでメモリを読み込みcreate関数で変換する# test
dataset = gdal.Open(despath)
if dataset == None:
print(despath + " ")
im_width = dataset.RasterXSize #
im_height = dataset.RasterYSize #
im_bands = dataset.RasterCount #
im_geotrans = dataset.GetGeoTransform() #
im_pro = dataset.GetProjection()
im_data = dataset.ReadAsArray(0, 0, im_width, im_height) #
# band1 = dataset.GetRasterBand(1)
# band2 = dataset.GetRasterBand(2)
# band3 = dataset.GetRasterBand(3)
# band4 = dataset.GetRasterBand(4)
# im_data1 = band1.ReadAsArray(0, 0, im_width, im_height) #
# im_data2 = band2.ReadAsArray(0, 0, im_width, im_height) #
# im_data3 = band3.ReadAsArray(0, 0, im_width, im_height) #
# im_data4 = band4.ReadAsArray(0, 0, im_width, im_height) #
driver = gdal.GetDriverByName("GTiff")
datatype = gdal.GDT_UInt16
dataset = driver.Create(despath + "_combine.tif", im_width, im_height, im_bands, datatype,
options=["INTERLEAVE=BAND"])
if (dataset != None and im_geotrans != None and im_pro != None):
dataset.SetGeoTransform(im_geotrans) #
dataset.SetProjection(im_pro) #
for i in range(im_bands):
dataset.GetRasterBand(i+1).WriteArray(im_data[i])
# dataset.GetRasterBand(1).WriteArray(im_data1)
# dataset.GetRasterBand(2).WriteArray(im_data2)
# dataset.GetRasterBand(3).WriteArray(im_data3)
# dataset.GetRasterBand(4).WriteArray(im_data4)
del dataset
gdalのデフォルトの読み書きtifのデータフォーマットはBIPですが、BSQフォーマットを読み取ることもできます.両方の結果は同じです.
リファレンスhttps://blog.csdn.net/t46414704152abc/article/details/77482747
方法1:gdal_を借りるtranslateツール.
srcpath = r"***"
despath = r"***"
#toBSQ
gdal.Translate(despath , srcpath , creationOptions=["INTERLEAVE=BAND"])
#toBIP
gdal.Translate(despath , srcpath , creationOptions=["INTERLEAVE=PIXEL"])
方式2:gdalでメモリを読み込みcreate関数で変換する
# test
dataset = gdal.Open(despath)
if dataset == None:
print(despath + " ")
im_width = dataset.RasterXSize #
im_height = dataset.RasterYSize #
im_bands = dataset.RasterCount #
im_geotrans = dataset.GetGeoTransform() #
im_pro = dataset.GetProjection()
im_data = dataset.ReadAsArray(0, 0, im_width, im_height) #
# band1 = dataset.GetRasterBand(1)
# band2 = dataset.GetRasterBand(2)
# band3 = dataset.GetRasterBand(3)
# band4 = dataset.GetRasterBand(4)
# im_data1 = band1.ReadAsArray(0, 0, im_width, im_height) #
# im_data2 = band2.ReadAsArray(0, 0, im_width, im_height) #
# im_data3 = band3.ReadAsArray(0, 0, im_width, im_height) #
# im_data4 = band4.ReadAsArray(0, 0, im_width, im_height) #
driver = gdal.GetDriverByName("GTiff")
datatype = gdal.GDT_UInt16
dataset = driver.Create(despath + "_combine.tif", im_width, im_height, im_bands, datatype,
options=["INTERLEAVE=BAND"])
if (dataset != None and im_geotrans != None and im_pro != None):
dataset.SetGeoTransform(im_geotrans) #
dataset.SetProjection(im_pro) #
for i in range(im_bands):
dataset.GetRasterBand(i+1).WriteArray(im_data[i])
# dataset.GetRasterBand(1).WriteArray(im_data1)
# dataset.GetRasterBand(2).WriteArray(im_data2)
# dataset.GetRasterBand(3).WriteArray(im_data3)
# dataset.GetRasterBand(4).WriteArray(im_data4)
del dataset
gdalのデフォルトの読み書きtifのデータフォーマットはBIPですが、BSQフォーマットを読み取ることもできます.両方の結果は同じです.
リファレンスhttps://blog.csdn.net/t46414704152abc/article/details/77482747