#!/usr/bin/env python # -*- coding: utf-8 -*- """ Step4 处理器:预测采样点生成 将原 WaterQualityInversionPipeline.step4_sampling() 方法 剥离为独立的 Step4SamplingHandler。 """ import time from typing import Any, Dict from src.core.handlers.base import BaseStepHandler, PipelineContext from src.core.steps.prediction_step import PredictionStep class Step4SamplingHandler(BaseStepHandler): """步骤4:生成预测采样点并提取光谱。 对应 config key: 'step4_sampling' 委托类: PredictionStep.generate_sampling_points() """ step_key = 'step4_sampling' def execute(self, context: PipelineContext, config: dict) -> Dict[str, Any]: step_start_time = time.time() deglint_img_path = self._resolve_path( config.get('deglint_img_path'), context.deglint_img_path, 'deglint_img' ) water_mask_path = self._resolve_path( config.get('water_mask_path'), context.water_mask_path, 'water_mask' ) glint_mask_path = self._resolve_path( config.get('glint_mask_path'), context.glint_mask_path, 'glint_mask' ) try: result = PredictionStep.generate_sampling_points( deglint_img_path=deglint_img_path, interval=config.get('interval', 50), sample_radius=config.get('sample_radius', 5), chunk_size=config.get('chunk_size', 1000), water_mask_path=water_mask_path, glint_mask_path=glint_mask_path, output_dir=str(context.sampling_dir), use_adaptive_sampling=config.get('use_adaptive_sampling', True), ) step_end_time = time.time() context.record_step_time( "步骤4: 生成预测采样点", step_start_time, step_end_time ) return {'sampling_csv_path': result} except Exception as e: step_end_time = time.time() context.record_step_time( "步骤4: 生成预测采样点", step_start_time, step_end_time, status="failed", error=str(e) ) raise