引言
Google旗下Earth Engine平臺的用戶越來越多,高效雲計算贏得了衆多學術科研人員的青睞。熟悉這個平臺的讀者應該都知道,如果使用代碼var ndvi = image.normalizedDifference(['B5', 'B4']).rename('NDVI')
得到一個圖像,並將其下載到本地,使用常用的遙感軟件ENVI是無法讀取到rename修改後的波段名的。
簡介
基於以上原因,我使用Python3+GDAL寫了一段簡單的代碼,可以通過輸入tif圖像,輸出其對應的hdr頭文件,這樣就可以使用ENVI讀取出它的波段名了。
代碼
包括兩個函數,getInfo
實現讀取波段數和波段名,wHDR
實現寫入相應的hdr頭文件。
# -*- coding:utf-8 -*-
import os.path as path
import sys
from osgeo import gdal
from gdalconst import *
#獲取波段數和波段名的函數
#參數ifn:輸入TIFF文件名
#返回包括波段數和波段名的list
def getInfo(ifn):
info = []
ds = gdal.Open(ifn, GA_ReadOnly)
if ds is None:
print("Unable to open this file.")
return -1
else:
n_band = ds.RasterCount
info.append(n_band)
for idx in range(n_band):
band_idx = ds.GetRasterBand(idx + 1)
name_idx = band_idx.GetDescription()
if name_idx == "":
name_idx = "Band " + str(idx + 1)
info.append(name_idx)
return info
#寫入ENVI頭文件的函數
#參數ofn:寫入的頭文件名,與ifn對應
#參數info:getInfo獲取的數據
#返回1
def wHDR(ofn, info):
line_1 = "ENVI\n"
line_2 = "bands = " + str(info[0]) + "\n"
line_3 = "band names = {"
for idx in range(info[0]):
if idx < info[0] - 1:
line_3 += info[idx + 1] + ", "
elif idx == info[0] - 1:
line_3 += info[idx + 1]
line_3 += "}"
hdrText = line_1 + line_2 + line_3
with open(ofn, "w") as f_txt:
f_txt.write(hdrText)
return 1
#主函數
if __name__ == "__main__":
ifn = sys.argv[-1]
info = getInfo(ifn)
ofn = path.splitext(ifn)[0]
ofn += ".hdr"
if wHDR(ofn, info) == 1:
print("Done!")
"""
deserts Tsung, CUIT
2019-09-28
"""
使用
- 如果計算機有Python3+GDAL,可以將代碼保存爲py文件,通過拖曳tif到py文件完成。
- 如果計算機沒有Python3+GDAL,可以下載打包的exe文件,然後還是通過拖曳tif到exe程序完成。
示例
下圖是通過Earth Engine下載的原始tif,ENVI無法讀取波段名。
下圖是通過添加頭文件後使用ENVI打開的截圖,可以識別波段名(爲了測試,我只修改了B2和B5的波段名,其他均爲默認的波段名)。