解决ENVI无法打开Landsat8/9 C2L2数据的问题:Python脚本实现
- 常见问题
- 问题及参考博客
- 问题现象
- 解决方案
- 手动解决方法
- Python脚本实现批量处理
常见问题
问题及参考博客
在处理从USGS网站下载的Landsat8/9 C2 L2数据时,常常会遇到将MTL.txt 文件直接拉入ENVI或直接打开Metadata数据文件时提示错误的情况。对于该问题的常见问题及解决方案,可以参考文章:
https://blog.csdn.net/zbh13859825167/article/details/139309431。
问题现象
当尝试将从USGS网站下载的Landsat8/9 C2 L2数据的MTL.txt 文件直接导入ENVI或者直接打开Metadata数据文件时,会出现如下错误提示:
解决方案
手动解决方法
Landsat8数据
对于Landsat8数据,可通过修改下载的MTL.txt 文件来解决问题。具体步骤如下:
将文件第一行的GROUP = LANDSAT_METADATA_FILE修改为GROUP = L1_METADATA_FILE。
删除文件中第183行GROUP = LEVEL1_PROCESSING_RECORD与第227行END_GROUP = LEVEL1_PROCESSING_RECORD之间的内容(Landsat 9具体行号位置可能有变化,也在183行附近,注意这几个名称就行。 )。完成上述修改后,即可在ENVI中直接打开该数据文件。
Landsat9数据
Landsat9数据的处理在Landsat8数据处理的基础上,还需要额外增加一步:将文件第53行的SPACECRAFT_ID = "LANDSAT_9"改为SPACECRAFT_ID = "LANDSAT_8"。完成这些修改后,也可以在ENVI中直接打开数据文件。
Python脚本实现批量处理
为了更高效地处理多个数据文件,我们可以使用Python编写一个脚本实现批量处理。以下是具体的脚本设计原理、思路及代码:
脚本设计原理与思路
脚本会遍历指定文件夹及其子文件夹中的所有MTL.txt 文件,对每个文件按照上述手动处理的规则进行修改。具体来说,脚本会完成以下操作:
- 将文件第一行的
GROUP = LANDSAT_METADATA_FILE替换为GROUP = L1_METADATA_FILE。 - 检查文件第53行,如果包含
SPACECRAFT_ID = "LANDSAT_9",则将其替换为SPACECRAFT_ID = "LANDSAT_8"。 - 删除文件中第183 - 227行(Python索引从0开始,对应索引为182 - 226)的内容。
脚本代码
importosdefprocess_mtl_files(root_folder):forroot,dirs,filesinos.walk(root_folder):forfileinfiles:iffile.endswith("MTL.txt"):file_path=os.path.join(root,file)try:withopen(file_path,'r',encoding='utf-8')asf:lines=f.readlines()print(f"正在处理文件:{file_path}")iflen(lines)>0:lines[0]=lines[0].replace("GROUP = LANDSAT_METADATA_FILE","GROUP = L1_METADATA_FILE")land_index=lines[53].rfind('9')ifland_index!=-1:lines[53]=lines[53].replace(" SPACECRAFT_ID = \"LANDSAT_9\""," SPACECRAFT_ID = \"LANDSAT_8\"")iflen(lines)>=227:#判断是否删除过183行到227行之间内容iflines[182].rfind('GROUP = LEVEL1_PROCESSING_RECORD')!=-1:dellines[182:227]# 182对应第183行,226对应第227行else:print(f"文件{file}行数不足,无法删除指定行")# 写入修改后的内容withopen(file_path,'w',encoding='utf-8')asf:f.writelines(lines)print(f"成功处理文件:{file_path}")exceptExceptionase:print(f"处理文件{file_path}时出错:{str(e)}")else:print(f"{root_folder}文件夹下没有可处理的文件")if__name__=="__main__":target_folder=r"C:/Users/79877/Downloads/EdgeDownload/test"# 替换为实际文件所在文件夹路径process_mtl_files(target_folder)