fix: CRS 比较改用 GDAL osr.IsSame() 语义比对, 消除 WKT 格式差异误报

问题: 两组不同数据的 .hdr 文件由不同软件生成,
  同一 UTM 投影的 WKT 字符串格式不同 (PROJCS 命名/参数精度),
  原 validate_projections 用字符串比较会误报 CRS 不一致。

修复: 改用 gdal.osr.SpatialReference.IsSame() 语义比对:
  - 同一定义 → 通过 (即使 WKT 格式不同)
  - 真正不同 → 报错
  - osr 解析失败 → 回退字符串比较
This commit is contained in:
duxin
2026-07-09 09:37:50 +08:00
parent 1d051c9fec
commit 9fa60e2995

View File

@ -146,20 +146,32 @@ def validate_projections(proj_a: Optional[str],
proj_b: Optional[str],
label_a: str = "栅格A",
label_b: str = "栅格B") -> None:
"""验证两个投影坐标系 (WKT) 一致
"""验证两个投影坐标系语义一致(非字符串比较)
使用 GDAL SpatialReference.IsSame() 做语义比对。
同一坐标系但 WKT 格式不同(不同软件生成)不会误报。
空字符串视为"无投影",不验证。
Raises:
SpatialAlignmentError: 投影不一致时
SpatialAlignmentError: 投影语义不一致时
"""
if not proj_a or not proj_b:
return # 至少一方无投影,跳过
# 标准化比较(去除空白差异)
try:
from osgeo import osr
sr_a = osr.SpatialReference(proj_a)
sr_b = osr.SpatialReference(proj_b)
if sr_a.IsSame(sr_b):
return # 语义相同OK
except Exception:
# osr 解析失败 → 回退到字符串标准化比较
norm_a = " ".join(proj_a.split())
norm_b = " ".join(proj_b.split())
if norm_a != norm_b:
if norm_a == norm_b:
return
raise SpatialAlignmentError.from_projection_mismatch(
label_a, label_b, proj_a, proj_b
)