fix: 智能坐标列检测 — proj_x/proj_y 优先 + 双列名输出
问题: CSV 中 UTM 米坐标被命名为 longitude/latitude, 列名与实际内容不符, 容易引发 CRS 配置错误。 修复: 1. map.py read_csv_data: 优先级智能列检测 proj_x/proj_y → longitude/latitude → lon/lat → x_coord/y_coord → 终极回退按位置[0][1]。新旧文件全部兼容。 2. csv_processor.py: 输出双列名 proj_x + proj_y (新标准, 优先) longitude + latitude (旧标准, 兼容) 值完全相同, 新旧代码都能正确读取
This commit is contained in:
@ -233,6 +233,8 @@ class WaterIndexCsvProcessor:
|
|||||||
print(f"[WaterIndexCsvProcessor] {name}: 替换 {n_inf} 个 inf/-inf → NaN")
|
print(f"[WaterIndexCsvProcessor] {name}: 替换 {n_inf} 个 inf/-inf → NaN")
|
||||||
# ===== P0 防御结束 =====
|
# ===== P0 防御结束 =====
|
||||||
out_df = pd.DataFrame({
|
out_df = pd.DataFrame({
|
||||||
|
"proj_x": df["longitude"].values,
|
||||||
|
"proj_y": df["latitude"].values,
|
||||||
"longitude": df["longitude"].values,
|
"longitude": df["longitude"].values,
|
||||||
"latitude": df["latitude"].values,
|
"latitude": df["latitude"].values,
|
||||||
name: per_idx.values,
|
name: per_idx.values,
|
||||||
|
|||||||
@ -876,16 +876,41 @@ class ContentMapper:
|
|||||||
print("正在读取CSV文件...")
|
print("正在读取CSV文件...")
|
||||||
df = pd.read_csv(csv_file, encoding='utf-8')
|
df = pd.read_csv(csv_file, encoding='utf-8')
|
||||||
|
|
||||||
# 假设前三列分别是经度、纬度、含量
|
|
||||||
if df.shape[1] < 3:
|
if df.shape[1] < 3:
|
||||||
raise ValueError("CSV文件必须至少包含3列:经度、纬度、含量")
|
raise ValueError("CSV文件必须至少包含3列:经度、纬度、含量")
|
||||||
|
|
||||||
# 获取列名
|
# ── 智能坐标列检测:按优先级匹配,兼容新旧格式 ──
|
||||||
lon_col = df.columns[0]
|
# 优先级: proj_x/proj_y > longitude/latitude > x_coord/y_coord
|
||||||
lat_col = df.columns[1]
|
_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
|
||||||
|
|
||||||
|
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]
|
content_col = df.columns[2]
|
||||||
|
|
||||||
print(f"检测到列名:经度({lon_col}),纬度({lat_col}),含量({content_col})")
|
print(f"检测到列名:X({lon_col}),Y({lat_col}),含量({content_col})")
|
||||||
|
|
||||||
# 自动检测不确定性列
|
# 自动检测不确定性列
|
||||||
if uncertainty_col is None:
|
if uncertainty_col is None:
|
||||||
|
|||||||
Reference in New Issue
Block a user