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

常见问题及参考博客

在处理从USGS网站下载的Landsat 8/9 C2L2数据时,常会遇到将MTL.txt文件直接导入ENVI或打开Metadata数据文件时提示错误的情况。相关问题及解决方案可参考文章:ENVI 5.3/6.0打开Landsat 8/9 C2L2级别数据(带有Metadata),附常见问题_envi怎么打开landsat8数据-CSDN博客

问题现象

尝试将从USGS网站下载的Landsat 8/9 C2L2数据的MTL.txt文件直接导入ENVI或打开Metadata数据文件时,会出现错误提示。

在这里插入图片描述

解决方案

手动解决方法

Landsat 8数据

对于Landsat 8数据,可通过以下步骤修改MTL.txt文件解决问题:

  1. 将文件第一行的GROUP = LANDSAT_METADATA_FILE修改为GROUP = L1_METADATA_FILE
  2. 删除文件中第183行GROUP = LEVEL1_PROCESSING_RECORD与第227行END_GROUP = LEVEL1_PROCESSING_RECORD之间的内容。完成上述修改后,即可在ENVI中直接打开该数据文件。
Landsat 9数据

在Landsat 8数据处理的基础上,Landsat 9数据还需额外进行以下操作:

  1. 将文件第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)的内容。
Python脚本代码
import os

def process_mtl_files(root_folder):
    for root, dirs, files in os.walk(root_folder):
        for file in files:
            if file.endswith("MTL.txt"):
                file_path = os.path.join(root, file)
                try:
                    with open(file_path, 'r', encoding='utf-8') as f:
                        lines = f.readlines()

                    print(f"正在处理文件:{file_path}")
                    if len(lines) > 0:
                        lines[0] = lines[0].replace("GROUP = LANDSAT_METADATA_FILE",
                                                    "GROUP = L1_METADATA_FILE")
                    if len(lines) > 53:
                        land_index = lines[53].rfind('9')
                        if land_index != -1:
                            lines[53] = lines[53].replace("    SPACECRAFT_ID = \"LANDSAT_9\"",
                                                          "    SPACECRAFT_ID = \"LANDSAT_8\"")

                    if len(lines) >= 227:
                        if lines[182].rfind('GROUP = LEVEL1_PROCESSING_RECORD') != -1:
                            del lines[182:227]  # 182对应第183行,226对应第227行
                    else:
                        print(f"文件 {file} 行数不足,无法删除指定行")

                    # 写入修改后的内容
                    with open(file_path, 'w', encoding='utf-8') as f:
                        f.writelines(lines)
                    print(f"成功处理文件:{file_path}")
                except Exception as e:
                    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)
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐