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

@ -64,14 +64,18 @@ class Step3View(BaseView):
# Goodman 参数组
self.goodman_group = QGroupBox("Goodman方法参数")
goodman_layout = QFormLayout()
self.nir_lower = QSpinBox()
self.nir_lower.setRange(0, 200)
self.nir_lower.setValue(65)
goodman_layout.addRow("NIR下波段索引:", self.nir_lower)
self.nir_upper = QSpinBox()
self.nir_upper.setRange(0, 200)
self.nir_upper.setValue(91)
goodman_layout.addRow("NIR上波段索引:", self.nir_upper)
self.nir_lower_wavelength = QDoubleSpinBox()
self.nir_lower_wavelength.setDecimals(2)
self.nir_lower_wavelength.setRange(300.0, 3000.0)
self.nir_lower_wavelength.setValue(641.93)
self.nir_lower_wavelength.setSuffix(" nm")
goodman_layout.addRow("NIR下界波长:", self.nir_lower_wavelength)
self.nir_upper_wavelength = QDoubleSpinBox()
self.nir_upper_wavelength.setDecimals(2)
self.nir_upper_wavelength.setRange(300.0, 3000.0)
self.nir_upper_wavelength.setValue(751.49)
self.nir_upper_wavelength.setSuffix(" nm")
goodman_layout.addRow("NIR上界波长:", self.nir_upper_wavelength)
self.goodman_a = QDoubleSpinBox()
self.goodman_a.setDecimals(6)
self.goodman_a.setRange(0, 1)
@ -88,22 +92,30 @@ class Step3View(BaseView):
# Kutser 参数组
self.kutser_group = QGroupBox("Kutser方法参数")
kutser_layout = QFormLayout()
self.oxy_band = QSpinBox()
self.oxy_band.setRange(0, 200)
self.oxy_band.setValue(38)
kutser_layout.addRow("氧吸收波段索引:", self.oxy_band)
self.lower_oxy = QSpinBox()
self.lower_oxy.setRange(0, 200)
self.lower_oxy.setValue(36)
kutser_layout.addRow("下氧吸收波段索引:", self.lower_oxy)
self.upper_oxy = QSpinBox()
self.upper_oxy.setRange(0, 200)
self.upper_oxy.setValue(49)
kutser_layout.addRow("上氧吸收波段索引:", self.upper_oxy)
self.nir_band = QSpinBox()
self.nir_band.setRange(0, 200)
self.nir_band.setValue(47)
kutser_layout.addRow("NIR波段索引:", self.nir_band)
self.oxy_wavelength = QDoubleSpinBox()
self.oxy_wavelength.setDecimals(2)
self.oxy_wavelength.setRange(300.0, 3000.0)
self.oxy_wavelength.setValue(760.60)
self.oxy_wavelength.setSuffix(" nm")
kutser_layout.addRow("氧吸收波长:", self.oxy_wavelength)
self.lower_wavelength = QDoubleSpinBox()
self.lower_wavelength.setDecimals(2)
self.lower_wavelength.setRange(300.0, 3000.0)
self.lower_wavelength.setValue(742.39)
self.lower_wavelength.setSuffix(" nm")
kutser_layout.addRow("左肩波长:", self.lower_wavelength)
self.upper_wavelength = QDoubleSpinBox()
self.upper_wavelength.setDecimals(2)
self.upper_wavelength.setRange(300.0, 3000.0)
self.upper_wavelength.setValue(860.48)
self.upper_wavelength.setSuffix(" nm")
kutser_layout.addRow("右肩波长:", self.upper_wavelength)
self.nir_wavelength = QDoubleSpinBox()
self.nir_wavelength.setDecimals(2)
self.nir_wavelength.setRange(300.0, 3000.0)
self.nir_wavelength.setValue(842.36)
self.nir_wavelength.setSuffix(" nm")
kutser_layout.addRow("NIR参考波长:", self.nir_wavelength)
self.kutser_group.setLayout(kutser_layout)
self.kutser_group.setVisible(False)
layout.addWidget(self.kutser_group)
@ -111,10 +123,12 @@ class Step3View(BaseView):
# Hedley 参数组
self.hedley_group = QGroupBox("Hedley方法参数")
hedley_layout = QFormLayout()
self.hedley_nir_band = QSpinBox()
self.hedley_nir_band.setRange(0, 200)
self.hedley_nir_band.setValue(47)
hedley_layout.addRow("NIR波段索引:", self.hedley_nir_band)
self.hedley_nir_wavelength = QDoubleSpinBox()
self.hedley_nir_wavelength.setDecimals(2)
self.hedley_nir_wavelength.setRange(300.0, 3000.0)
self.hedley_nir_wavelength.setValue(842.36)
self.hedley_nir_wavelength.setSuffix(" nm")
hedley_layout.addRow("NIR参考波长:", self.hedley_nir_wavelength)
self.hedley_group.setLayout(hedley_layout)
self.hedley_group.setVisible(False)
layout.addWidget(self.hedley_group)
@ -210,17 +224,17 @@ class Step3View(BaseView):
method = self.method.currentData()
if method == "goodman":
config["nir_lower"] = self.nir_lower.value()
config["nir_upper"] = self.nir_upper.value()
config["nir_lower_wavelength"] = self.nir_lower_wavelength.value()
config["nir_upper_wavelength"] = self.nir_upper_wavelength.value()
config["goodman_A"] = self.goodman_a.value()
config["goodman_B"] = self.goodman_b.value()
elif method == "kutser":
config["oxy_band"] = self.oxy_band.value()
config["lower_oxy"] = self.lower_oxy.value()
config["upper_oxy"] = self.upper_oxy.value()
config["nir_band"] = self.nir_band.value()
config["oxy_wavelength"] = self.oxy_wavelength.value()
config["lower_wavelength"] = self.lower_wavelength.value()
config["upper_wavelength"] = self.upper_wavelength.value()
config["nir_wavelength"] = self.nir_wavelength.value()
elif method == "hedley":
config["hedley_nir_band"] = self.hedley_nir_band.value()
config["hedley_nir_wavelength"] = self.hedley_nir_wavelength.value()
elif method == "sugar":
config["sugar_iter"] = self.sugar_iter.value()
config["sugar_sigma"] = self.sugar_sigma.value()