You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现卫星影像按传感器及场景分组的问题求助

卫星影像按传感器与场景分组解决方案

问题概述

我正在编写Python脚本处理卫星影像:读取文件夹内所有影像文件,先按传感器分类,再将同传感器的文件按场景(特定位置+时间的影像集合,每个场景含8-12个波段文件)分组。

已完成传感器分类的核心代码:

# 获取目标影像文件
sat_bands = glob(path, recursive=True)
sat_bands.sort()

# 按传感器分类
LC08_list = []
# ... 其他传感器的空列表初始化

for i in sat_bands:
    if "LC08" in i:
        LC08_list.append(i)
    # ... 其他传感器的判断逻辑

当前遇到的问题:尝试用正则表达式和for循环对LC08_list按场景分组时,结果出现大量重复的场景列表,无法得到预期的“每个场景对应一个含8个波段路径的列表”结构,添加索引变量还触发越界错误。

文件名示例(前两个为同一场景,最后一个为另一场景):

'Dados/Sat_Img\\LC08_L2SP_203033_20200819_20200904_02_T1\\LC08_L2SP_203033_20200819_20200904_02_T1_ST_B10.TIF'
'Dados/Sat_Img\\LC08_L2SP_203033_20200819_20200904_02_T1\\LC08_L2SP_203033_20200819_20200904_02_T1_SR_B3.TIF'
'Dados/Sat_Img\\LC08_L2SP_203033_20201123_20210315_02_T1\\LC08_L2SP_203033_20201123_20210315_02_T1_SR_B7.TIF'

可行解决方案

方案1:利用目录结构分组(最可靠)

同一场景的所有波段文件都存放在同一个子目录下,直接提取文件所在目录作为分组依据:

import os
from collections import defaultdict

# 初始化分组字典
scene_groups = defaultdict(list)

for file_path in LC08_list:
    # 获取文件所属的场景目录
    scene_dir = os.path.dirname(file_path)
    scene_groups[scene_dir].append(file_path)

# 转换为预期的列表格式:每个元素是一个场景的所有波段路径
LC08_scenes = list(scene_groups.values())

方案2:正则提取场景ID分组

从文件名中提取场景唯一标识(波段后缀_ST_Bxx/_SR_Bxx之前的部分),以此分组:

import re
from collections import defaultdict

scene_groups = defaultdict(list)
# 正则匹配场景ID:捕获到_ST或_SR之前的字符串
scene_pattern = re.compile(r'(.*?)_[ST]R_')

for file_path in LC08_list:
    match_result = scene_pattern.search(file_path)
    if match_result:
        scene_id = match_result.group(1)
        scene_groups[scene_id].append(file_path)

LC08_scenes = list(scene_groups.values())

方案3:优化手动循环分组

若坚持用基础for循环,先提取所有唯一场景ID,再逐个匹配文件:

import re

# 第一步:提取所有唯一的场景ID
scene_pattern = re.compile(r'(.*?)_[ST]R_')
unique_scene_ids = set()

for file_path in LC08_list:
    match_result = scene_pattern.search(file_path)
    if match_result:
        unique_scene_ids.add(match_result.group(1))

# 第二步:按场景ID分组
LC08_scenes = []
for scene_id in unique_scene_ids:
    current_scene_files = [f for f in LC08_list if scene_id in f]
    LC08_scenes.append(current_scene_files)

关键说明

  • 方案1利用目录天然的场景划分,无需正则,代码简洁且不易出错,优先推荐。
  • 避免手动索引循环的核心原因是:手动维护索引容易出现越界、重复添加等问题,用字典/集合自动处理分组逻辑更高效可靠。

内容的提问来源于stack exchange,提问作者Marcelo Silva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 05:55:25