使用ENVI讀取Earth Engine下載的圖像波段名的方法

引言

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無法讀取波段名。
before
下圖是通過添加頭文件後使用ENVI打開的截圖,可以識別波段名(爲了測試,我只修改了B2和B5的波段名,其他均爲默認的波段名)。after

參考博客

GDAL讀寫多光譜影像的波段名稱

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章