问题概述 (Bug Description)
在项目的预处理流程中,functions_config.py 脚本里的 multibandsincoprate 函数存在一个严重的逻辑错误。该函数本应将HLS数据文件夹中所有唯一日期场景(scenes)的独立波段文件融合成对应的多波段GeoTIFF影像。
然而,由于其循环结构设计不当,该函数虽然能正确识别出所有的场景,但在处理过程中,相关变量(如文件名列表 bands 和场景名 filename)在每次迭代中都会被覆盖。最终,只有循环中最后一个场景的信息被用于执行文件读写操作。这导致无论输入文件夹包含多少个场景,最终都只会生成一个多波段影像和一个对应的Fmask文件,即最后一个被处理的场景。
复现步骤 (Steps to Reproduce)
- 准备一个HLS数据文件夹,其中必须包含 至少两个或以上不同日期(场景) 的影像波段文件。
- 调用
_Flood_Mapping_HLS.py 主脚本,并确保执行数据预处理步骤,该步骤会调用 functions_config.py 中的 multibandsincoprate 函数。
- 检查指定的输出目录 (例如
1_HLS 和 Fmask 文件夹)。
实际行为 (Actual Behavior)
- 预处理步骤执行完毕后,在输出目录中仅生成一个多波段合成影像和一个Fmask文件。
- 生成的文件对应的是在
scenes 集合中按迭代顺序最后处理的一个场景。之前的所有场景都被静默忽略,没有生成任何文件。
- 这直接导致后续的语义分割步骤 (
water_extraction.py) 因缺少输入文件而无法处理被忽略的场景。
预期行为 (Expected Behavior)
multibandsincoprate 函数应该为输入文件夹中识别出的每一个唯一场景都成功生成一个对应的6波段合成GeoTIFF影像。
- 对于每一个生成的影像,都应有一个对应的Fmask文件被复制到指定目录。
- 输出目录中的文件数量应与输入数据中的唯一场景数量完全匹配,从而确保所有数据都能进入后续的洪水制图流程。
根本原因分析 (Root Cause Analysis)
问题根源在于 functions_config.py 中 multibandsincoprate 函数的实现方式。
# functions_config.py
def multibandsincoprate(RootPath, TIFFPath, CloudPath):
# ...
scenes = set()
for file in files:
# ... 此处正确地将所有唯一场景添加到了 `scenes` 集合中
scenes.add((datam, days))
# !!! BUG所在 !!!
# 这个循环仅仅是反复覆盖 `filename` 和 `bands` 变量
for datam, days in scenes:
filename = f"{datam}.{days}"
is_sentinel = datam.split('_')[-1] == 'S'
bands = [
# ... band list generation
]
# 所有文件I/O操作都在循环之外执行
# 此时,`filename` 和 `bands` 变量的值是最后一次迭代所赋的值
tiff = gdal.Open(os.path.join(RootPath, bands[0]))
# ...
in_bands = [gdal.Open(os.path.join(RootPath, band)).ReadAsArray() for band in bands]
# ...
out_ds = gtif_driver.Create(os.path.join(TIFFPath, f"{filename}.tif"), x, y, 6, datatype)
# ...
shutil.copyfile(cloud_dir,Fmask_dir)
如代码所示,所有用于读取、合成和写入文件的关键逻辑都位于 for datam, days in scenes: 循环之后。正确的做法是将这些文件处理逻辑移入循环体内,以确保对每个识别出的场景都执行一次完整的文件生成流程。
问题概述 (Bug Description)
在项目的预处理流程中,
functions_config.py脚本里的multibandsincoprate函数存在一个严重的逻辑错误。该函数本应将HLS数据文件夹中所有唯一日期场景(scenes)的独立波段文件融合成对应的多波段GeoTIFF影像。然而,由于其循环结构设计不当,该函数虽然能正确识别出所有的场景,但在处理过程中,相关变量(如文件名列表
bands和场景名filename)在每次迭代中都会被覆盖。最终,只有循环中最后一个场景的信息被用于执行文件读写操作。这导致无论输入文件夹包含多少个场景,最终都只会生成一个多波段影像和一个对应的Fmask文件,即最后一个被处理的场景。复现步骤 (Steps to Reproduce)
_Flood_Mapping_HLS.py主脚本,并确保执行数据预处理步骤,该步骤会调用functions_config.py中的multibandsincoprate函数。1_HLS和Fmask文件夹)。实际行为 (Actual Behavior)
scenes集合中按迭代顺序最后处理的一个场景。之前的所有场景都被静默忽略,没有生成任何文件。water_extraction.py) 因缺少输入文件而无法处理被忽略的场景。预期行为 (Expected Behavior)
multibandsincoprate函数应该为输入文件夹中识别出的每一个唯一场景都成功生成一个对应的6波段合成GeoTIFF影像。根本原因分析 (Root Cause Analysis)
问题根源在于
functions_config.py中multibandsincoprate函数的实现方式。如代码所示,所有用于读取、合成和写入文件的关键逻辑都位于
for datam, days in scenes:循环之后。正确的做法是将这些文件处理逻辑移入循环体内,以确保对每个识别出的场景都执行一次完整的文件生成流程。