refactor: 中间层消除硬编码波段号+CRS动态探测

- GlintRemovalStep/handler/service 全部改为传递波长参数而非波段索引
- ContentMapper 移除 EPSG:32651 硬编码, 新增 _ensure_crs() + _probe_crs_from_file()
- _prepare_shared_context 在 read_csv_data 前先探测边界文件 CRS
- GUI QSpinBox→QDoubleSpinBox,默认值改为波长(nm),placeholder 提示自动探测
- 消除 38/36/49/47/25/37/65/91 等所有魔法数字
This commit is contained in:
duxin
2026-07-27 14:52:23 +08:00
parent f6d61693e3
commit 99aeab3076
14 changed files with 263 additions and 275 deletions

View File

@ -649,65 +649,41 @@ class PipelineExecutor(QObject):
if max_band <= 0:
return True
# 波长驱动改造后,波段号由 find_band_number() 从 HDR 元数据中
# 动态解析,不再需要波段索引越界检查。仅对极端波长值做合理性提醒。
method = step3_cfg.get('method', 'goodman')
if method == 'goodman':
band_fields = [
('nir_lower', 'nir_lower', 65, 'NIR下波段'),
('nir_upper', 'nir_upper', 91, 'NIR上波段'),
]
elif method == 'kutser':
band_fields = [
('oxy_band', 'oxy_band', 38, '氧吸收波段'),
('lower_oxy', 'lower_oxy', 36, '下氧吸收波段'),
('upper_oxy', 'upper_oxy', 49, '上氧吸收波段'),
('nir_band', 'nir_band', 47, 'NIR波段'),
]
elif method == 'hedley':
band_fields = [
('hedley_nir_band', 'hedley_nir_band', 47, 'NIR波段'),
]
else:
_wavelength_fields = {
'goodman': [
('nir_lower_wavelength', 'nir_lower_wavelength', 641.93, 'NIR下界波长(nm)'),
('nir_upper_wavelength', 'nir_upper_wavelength', 751.49, 'NIR上界波长(nm)'),
],
'kutser': [
('oxy_wavelength', 'oxy_wavelength', 760.6, '氧吸收波长(nm)'),
('lower_wavelength', 'lower_wavelength', 742.39, '下氧吸收波长(nm)'),
('upper_wavelength', 'upper_wavelength', 860.48, '上氧吸收波长(nm)'),
('nir_wavelength', 'nir_wavelength', 842.36, 'NIR波长(nm)'),
],
'hedley': [
('hedley_nir_wavelength', 'hedley_nir_wavelength', 842.36, 'NIR波长(nm)'),
],
}.get(method, [])
# SUGAR 等方法无波长参数,跳过
if not _wavelength_fields:
return True
for cfg_key, panel_attr, recommended, label in band_fields:
for cfg_key, panel_attr, recommended, label in _wavelength_fields:
requested = step3_cfg.get(cfg_key)
if requested is None or requested <= max_band:
if requested is None:
continue
global_event_bus.publish('LogMessage', {
'message': f'⚠ step3 波段越界:{label}={requested} > 影像波段数 {max_band}',
'level': 'warning',
})
dlg = BandConfirmDialog(
self.parent(),
requested_band=requested,
max_band=max_band,
recommended_band=recommended,
method_label=label,
)
result = dlg.exec_()
if result == QDialog.Rejected:
# 波长驱动:仅对异常波长做软警告(find_band_number 会自动处理)
if requested < 300 or requested > 3000:
global_event_bus.publish('LogMessage', {
'message': '✗ 用户取消运行(step3 波段越界未解决)',
'message': f'⚠ step3 波长异常:{label}={requested}nm(合理范围 300-3000nm)',
'level': 'warning',
})
return False
new_band = dlg.selected_band()
try:
spin = getattr(step3_panel, panel_attr)
spin.setValue(new_band)
except AttributeError:
global_event_bus.publish('LogMessage', {
'message': f'⚠ step3 panel 缺控件 {panel_attr},跳过回写',
'level': 'warning',
})
continue
global_event_bus.publish('LogMessage', {
'message': f'✓ {label}:{requested} → {new_band}(影像最多 {max_band} 波段)',
'level': 'info',
})
continue
return True
return True