ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

解决ENVI无法打开Landsat8/9 C2L2数据的问题:Python脚本实现

解决ENVI无法打开Landsat8/9 C2L2数据的问题:Python脚本实现

解决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 文件,对每个文件按照上述手动处理的规则进行修改。具体来说,脚本会完成以下操作:

  1. 将文件第一行的GROUP = LANDSAT_METADATA_FILE替换为GROUP = L1_METADATA_FILE。
  2. 检查文件第53行,如果包含SPACECRAFT_ID = "LANDSAT_9",则将其替换为SPACECRAFT_ID = "LANDSAT_8"。
  3. 删除文件中第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)
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进