fix: CRS 比较改用 GDAL osr.IsSame() 语义比对, 消除 WKT 格式差异误报
问题: 两组不同数据的 .hdr 文件由不同软件生成, 同一 UTM 投影的 WKT 字符串格式不同 (PROJCS 命名/参数精度), 原 validate_projections 用字符串比较会误报 CRS 不一致。 修复: 改用 gdal.osr.SpatialReference.IsSame() 语义比对: - 同一定义 → 通过 (即使 WKT 格式不同) - 真正不同 → 报错 - osr 解析失败 → 回退字符串比较
This commit is contained in:
@ -146,23 +146,35 @@ 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 # 至少一方无投影,跳过
|
||||
|
||||
# 标准化比较(去除空白差异)
|
||||
norm_a = " ".join(proj_a.split())
|
||||
norm_b = " ".join(proj_b.split())
|
||||
if norm_a != norm_b:
|
||||
raise SpatialAlignmentError.from_projection_mismatch(
|
||||
label_a, label_b, proj_a, proj_b
|
||||
)
|
||||
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:
|
||||
return
|
||||
|
||||
raise SpatialAlignmentError.from_projection_mismatch(
|
||||
label_a, label_b, proj_a, proj_b
|
||||
)
|
||||
|
||||
|
||||
def validate_spatial_alignment(
|
||||
|
||||
Reference in New Issue
Block a user