测试修改

This commit is contained in:
DXC
2026-06-25 15:50:02 +08:00
parent 67aaaaa6b2
commit 43f50ec07b
16 changed files with 1098 additions and 1029 deletions

View File

@ -41,6 +41,8 @@ import os
import re
from typing import Callable, Dict, List, Optional
import numpy as np # P0 修复: 写盘前 inf/-inf 替换与极值截断需要
class WaterIndexCsvProcessor:
"""
@ -200,6 +202,24 @@ class WaterIndexCsvProcessor:
for i, name in enumerate(targets):
try:
per_idx = results_df[name]
# ===== P0 防御: 写盘前清洗(防 Step 11 Kriging / TIN 碎玻璃)=====
# 1) inf / -inf → NaN:pandas 默认会把 inf 写成字面 "Infinity",
# 下游 ContentMapper 严格按位置读第 3 列时会原样拿到 inf,
# Kriging 变差函数被单一 inf 点拉飞、TIN 出现极长退化三角形。
# 2) 物理范围截断 ±10:保守大窗,覆盖几乎所有经验公式的合法值域
# (NDCI 类 ∈ [-1,1]、比值类 ∈ [0,2]、浓度反演类 ∈ [0, ∞))。
# 注:保留所有行(包括 NaN),让下游 Step 11 把它当 missing marker;
# dropna 会破坏行号对齐,故不在此调用;如确需剔除 NaN 行,
# 在面板 / service 层读取后自行 .dropna(subset=[col])。
n_inf = int(np.isinf(per_idx.values).sum())
per_idx = (
per_idx
.replace([np.inf, -np.inf], np.nan)
.clip(lower=-10.0, upper=10.0)
)
if n_inf > 0:
print(f"[WaterIndexCsvProcessor] {name}: 替换 {n_inf} 个 inf/-inf → NaN")
# ===== P0 防御结束 =====
out_df = pd.DataFrame({
"longitude": df["longitude"].values,
"latitude": df["latitude"].values,

View File

@ -51,7 +51,10 @@ class Step12KrigingHandler(BaseStepHandler):
output_image_path=output_image_path,
resolution=config.get('resolution', 30),
input_crs=config.get('input_crs', 'EPSG:32651'),
output_crs=config.get('output_crs', 'EPSG:4326'),
# ★★★ 强制 output_crs = input_crs,避免 ContentMapper 把栅格重投影到 EPSG:4326 ★★★
# 旧实现:output_crs=config.get('output_crs', 'EPSG:4326')
# 重投影会让栅格和基于投影坐标的掩膜在 visualize_raster 叠加时发生仿射变换撕裂
output_crs=config.get('input_crs', 'EPSG:32651'),
show_sample_points=config.get('show_sample_points', False),
base_map_tif=config.get('base_map_tif'),
use_distance_diffusion=config.get('use_distance_diffusion', True),

View File

@ -16,11 +16,14 @@ class MappingStep:
@staticmethod
def generate_distribution_map(
prediction_csv_path: str,
boundary_shp_path: str,
boundary_shp_path: Optional[str] = None, # ★★★ Plan C: None = 不依赖水域掩膜 ★★★
output_image_path: Optional[str] = None,
resolution: float = 30,
input_crs: str = "EPSG:32651",
output_crs: str = "EPSG:4326",
# ★★★ 强制默认 output_crs = input_crs,禁止重投影到 EPSG:4326 ★★★
# 历史默认值 'EPSG:4326' 会让 ContentMapper 将插值栅格从投影坐标系转到经纬度坐标系,
# 与基于 EPSG:32651 的水域掩膜叠加时发生仿射变换撕裂(栅格错位、坐标轴扭曲)。
output_crs: str = "EPSG:32651",
show_sample_points: bool = False,
base_map_tif: Optional[str] = None,
use_distance_diffusion: bool = True,
@ -31,13 +34,14 @@ class MappingStep:
expand_ratio: float = 0.05,
output_dir: Union[str, Path] = "./14_visualization",
callback: Optional[Callable] = None,
output_format: str = 'tif', # ⭐ 新增:'tif' (默认, 写 GeoTIFF) / 'png'
) -> str:
"""
根据采样点的坐标和反演的实测参数,通过插值方法得到水质参数可视化分布图
Args:
prediction_csv_path: 预测结果CSV文件路径(前两列为经纬度,第三列为预测值)
boundary_shp_path: 边界shapefile文件路径
boundary_shp_path: 边界/掩膜文件路径(.shp/.dat/.bsq/.tif 等)。None 时跳过水域掩膜约束。
output_image_path: 输出图片路径(如果为None,自动生成)
resolution: 插值网格分辨率(米)
input_crs: 输入坐标系
@ -89,6 +93,7 @@ class MappingStep:
"diffusion_power": diffusion_power,
"diffusion_n_neighbors": diffusion_n_neighbors,
"expand_ratio": expand_ratio,
"output_format": output_format, # ⭐ 透传给 ContentMapper.process_data
}
optional_kwargs = {