解决ENVI无法打开Landsat8/9 C2L2数据的问题:Python脚本实现
加载Landsat8/9 C2 L2数据时,常常会遇到将MTL.txt 文件直接拉入ENVI或直接打开Metadata数据文件时提示错误的情况,本文利用python实现批量处理的,程序修改头文件以便于envi对landsat8/9数据的使用和处理。
·
解决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文件解决问题:
- 将文件第一行的
GROUP = LANDSAT_METADATA_FILE修改为GROUP = L1_METADATA_FILE。 - 删除文件中第183行
GROUP = LEVEL1_PROCESSING_RECORD与第227行END_GROUP = LEVEL1_PROCESSING_RECORD之间的内容。完成上述修改后,即可在ENVI中直接打开该数据文件。
Landsat 9数据
在Landsat 8数据处理的基础上,Landsat 9数据还需额外进行以下操作:
- 将文件第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)的内容。
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)
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)