diff --git a/src/core/algorithms/waterindex_inversion/csv_processor.py b/src/core/algorithms/waterindex_inversion/csv_processor.py index 53d3824..3573f8b 100644 --- a/src/core/algorithms/waterindex_inversion/csv_processor.py +++ b/src/core/algorithms/waterindex_inversion/csv_processor.py @@ -233,6 +233,8 @@ class WaterIndexCsvProcessor: print(f"[WaterIndexCsvProcessor] {name}: 替换 {n_inf} 个 inf/-inf → NaN") # ===== P0 防御结束 ===== out_df = pd.DataFrame({ + "proj_x": df["longitude"].values, + "proj_y": df["latitude"].values, "longitude": df["longitude"].values, "latitude": df["latitude"].values, name: per_idx.values, diff --git a/src/postprocessing/map.py b/src/postprocessing/map.py index 1f8fa65..7651c65 100644 --- a/src/postprocessing/map.py +++ b/src/postprocessing/map.py @@ -876,16 +876,41 @@ class ContentMapper: print("正在读取CSV文件...") df = pd.read_csv(csv_file, encoding='utf-8') - # 假设前三列分别是经度、纬度、含量 if df.shape[1] < 3: raise ValueError("CSV文件必须至少包含3列:经度、纬度、含量") - # 获取列名 - lon_col = df.columns[0] - lat_col = df.columns[1] - content_col = df.columns[2] + # ── 智能坐标列检测:按优先级匹配,兼容新旧格式 ── + # 优先级: proj_x/proj_y > longitude/latitude > x_coord/y_coord + _COORD_CANDIDATES = [ + ('proj_x', 'proj_y'), + ('longitude', 'longitude'), # 单数形式 + ('longitude', 'latitude'), + ('lon', 'lat'), + ('x_coord', 'y_coord'), + ] + lon_col, lat_col = None, None + for x_cand, y_cand in _COORD_CANDIDATES: + if x_cand in df.columns and y_cand in df.columns: + lon_col, lat_col = x_cand, y_cand + break - print(f"检测到列名:经度({lon_col}),纬度({lat_col}),含量({content_col})") + if lon_col is None: + # 终极回退:按位置取前两列 + lon_col, lat_col = df.columns[0], df.columns[1] + print(f" ⚠ 未识别到标准坐标列名,按位置回退: " + f"X={lon_col}, Y={lat_col}") + + # 含量列:跳过坐标列后的第一列 + coord_cols = {lon_col, lat_col} + content_col = None + for c in df.columns: + if c not in coord_cols and not c.startswith('pixel_'): + content_col = c + break + if content_col is None: + content_col = df.columns[2] + + print(f"检测到列名:X({lon_col}),Y({lat_col}),含量({content_col})") # 自动检测不确定性列 if uncertainty_col is None: