引言
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的波段名,其他均为默认的波段名)。