fix: 修复 Step 6 光谱提取的 GDAL API 误用与空数据集崩溃

geo_to_pixel: gdal.InvGeoTransform 在 GDAL 2.x 起直接返回 6 元组逆矩阵、失败时返回 None,(success, inv_gt) 双元组写法是 GDAL 1.x API,执行到 Step 6 会抛 ValueError: too many values to unpack (expected 2)。改为 None 判定,与 src/utils/sampling.py 的既有写法统一。

get_spectral_in_coor: gdal.Open 失败返回 None 而非抛异常,原代码直接访问 dataset.RasterXSize,影像打不开时抛 'NoneType' object has no attribute 'RasterXSize' 掩盖真实原因,补 None 校验并给出明确报错。
This commit is contained in:
duxin
2026-09-16 10:01:49 +08:00
parent c4c1e6db36
commit c90f0ade06

View File

@ -53,8 +53,11 @@ def geo_to_pixel(x_geo, y_geo, geotransform, dataset_srs=None):
Returns:
pixel_x, pixel_y: 像元坐标int
"""
success, inv_gt = gdal.InvGeoTransform(geotransform)
if not success:
# ★ GDAL 2.x 起 InvGeoTransform 直接返回 6 元组逆变换矩阵,求逆失败时返回 None
# 旧的 (success, inv_gt) 双元组写法属于 GDAL 1.x API在 2.x 上会抛
# "too many values to unpack (expected 2)"。与 src/utils/sampling.py 的写法保持一致。
inv_gt = gdal.InvGeoTransform(geotransform)
if inv_gt is None:
raise ValueError("无法对影像的仿射变换矩阵求逆,请检查影像地理元数据。")
# 全仿射逆变换含旋转项px = inv_gt[0]+inv_gt[1]*x+inv_gt[2]*yy 方向同理
@ -603,6 +606,10 @@ def get_spectral_in_coor(imgpath, coorpath, outpath, radius=0, flare_path=None,
# 打开影像数据集
dataset = gdal.Open(imgpath)
if dataset is None:
# ★ GDAL 打开失败返回 None而非抛异常不校验会在下一行 RasterXSize
# 处抛 'NoneType' object has no attribute 'RasterXSize',掩盖真实原因
raise ValueError(f"无法打开影像文件,请检查路径与地理元数据: {imgpath}")
im_width = dataset.RasterXSize # 栅格矩阵的列数
im_height = dataset.RasterYSize # 栅格矩阵的行数
num_bands = dataset.RasterCount # 栅格矩阵的波段数