diff --git a/src/postprocessing/map.py b/src/postprocessing/map.py index 1b0658b..e7fffc5 100644 --- a/src/postprocessing/map.py +++ b/src/postprocessing/map.py @@ -2402,11 +2402,27 @@ class ContentMapper: f"默认按 WGS84 (EPSG:4326) 处理 ({Path(boundary_shp_path).name})。") boundary_gdf = boundary_gdf.set_crs(epsg=4326) - # 兜底:如果栅格 TIF 缺失坐标系,默认也赋予 WGS84(CRS 顶部已导入,无需局部 import) + # 兜底:如果栅格 TIF 缺失坐标系 + # ★ 关键修复:不能盲目回退到 WGS84 (EPSG:4326) + # transform 的坐标值如果是数十万~数百万量级,一定是投影坐标(UTM 等), + # 而非 WGS84 经纬度(-180~180)。此时应使用掩膜的 CRS 作为正确参考, + # 否则 geometry_mask 的空间坐标与 transform 完全错位 → 全部像元被擦除。 if crs_obj is None: - crs_obj = CRS.from_epsg(4326) - print(f"[visualize_raster] 警告: 栅格 TIF 缺失坐标系," - f"默认按 WGS84 渲染 ({Path(raster_tif_path).name})。") + if (boundary_gdf.crs is not None + and boundary_gdf.crs.is_projected + and transform is not None): + # transform 坐标量级检测:UTM 坐标通常在 10^5~10^7 范围 + x_magnitude = max(abs(transform.c), abs(transform.c + transform.a * array.shape[1])) + if x_magnitude > 180.0: + crs_obj = boundary_gdf.crs + print(f"[visualize_raster] 栅格 TIF 缺失坐标系," + f"根据 transform 坐标量级 (x≈{x_magnitude:.0f}) " + f"判定为投影坐标系,使用掩膜 CRS ({crs_obj.to_epsg()}) " + f"({Path(raster_tif_path).name})") + if crs_obj is None: + crs_obj = CRS.from_epsg(4326) + print(f"[visualize_raster] 警告: 栅格 TIF 缺失坐标系," + f"默认按 WGS84 渲染 ({Path(raster_tif_path).name})。") # 坐标系对齐到当前栅格的 CRS(不是 self.output_crs,必须与 transform 保持一致) if boundary_gdf.crs != crs_obj: