fix: 修复 TIF 缺失 CRS 时 fallback 到 WGS84 导致掩膜擦除全部像元的 bug
问题: step11 日志反复出现: '栅格 TIF 缺失坐标系,默认按 WGS84 渲染' '擦除后有效像元: 0/15300' 根因: step10 生成的 GeoTIFF 缺少 CRS (可能是 PROJ 异常时生成的)。 visualize_raster 中当 crs_obj 为 None 时无条件回退到 EPSG:4326 (WGS84), 但 transform 实际是 UTM 米坐标 (e.g. x≈470000, y≈2200000)。 UTM 度坐标的掩膜被 reproject 到 WGS84 后, 与仍在 UTM 米坐标的 transform 彻底错位 → geometry_mask 全部为 False → 0 个有效像元。 修复: 当 crs_obj 为 None 且 boundary 有投影 CRS 时, 检查 transform 的 X 坐标量级: 若 >180 则必定是投影坐标 (UTM 等), 直接使用 boundary 的 CRS 而非 WGS84 回退。 仅当坐标量级 <180 时才回退到 WGS84 (真经纬度)。
This commit is contained in:
@ -2402,7 +2402,23 @@ class ContentMapper:
|
|||||||
f"默认按 WGS84 (EPSG:4326) 处理 ({Path(boundary_shp_path).name})。")
|
f"默认按 WGS84 (EPSG:4326) 处理 ({Path(boundary_shp_path).name})。")
|
||||||
boundary_gdf = boundary_gdf.set_crs(epsg=4326)
|
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:
|
||||||
|
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:
|
if crs_obj is None:
|
||||||
crs_obj = CRS.from_epsg(4326)
|
crs_obj = CRS.from_epsg(4326)
|
||||||
print(f"[visualize_raster] 警告: 栅格 TIF 缺失坐标系,"
|
print(f"[visualize_raster] 警告: 栅格 TIF 缺失坐标系,"
|
||||||
|
|||||||
Reference in New Issue
Block a user