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],
|
proj_b: Optional[str],
|
||||||
label_a: str = "栅格A",
|
label_a: str = "栅格A",
|
||||||
label_b: str = "栅格B") -> None:
|
label_b: str = "栅格B") -> None:
|
||||||
"""验证两个投影坐标系 (WKT) 一致
|
"""验证两个投影坐标系语义一致(非字符串比较)
|
||||||
|
|
||||||
|
使用 GDAL SpatialReference.IsSame() 做语义比对。
|
||||||
|
同一坐标系但 WKT 格式不同(不同软件生成)不会误报。
|
||||||
|
|
||||||
空字符串视为"无投影",不验证。
|
空字符串视为"无投影",不验证。
|
||||||
|
|
||||||
Raises:
|
Raises:
|
||||||
SpatialAlignmentError: 投影不一致时
|
SpatialAlignmentError: 投影语义不一致时
|
||||||
"""
|
"""
|
||||||
if not proj_a or not proj_b:
|
if not proj_a or not proj_b:
|
||||||
return # 至少一方无投影,跳过
|
return # 至少一方无投影,跳过
|
||||||
|
|
||||||
# 标准化比较(去除空白差异)
|
try:
|
||||||
norm_a = " ".join(proj_a.split())
|
from osgeo import osr
|
||||||
norm_b = " ".join(proj_b.split())
|
sr_a = osr.SpatialReference(proj_a)
|
||||||
if norm_a != norm_b:
|
sr_b = osr.SpatialReference(proj_b)
|
||||||
raise SpatialAlignmentError.from_projection_mismatch(
|
if sr_a.IsSame(sr_b):
|
||||||
label_a, label_b, proj_a, proj_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(
|
def validate_spatial_alignment(
|
||||||
|
|||||||
Reference in New Issue
Block a user