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:
@ -53,8 +53,11 @@ def geo_to_pixel(x_geo, y_geo, geotransform, dataset_srs=None):
|
|||||||
Returns:
|
Returns:
|
||||||
pixel_x, pixel_y: 像元坐标(int)
|
pixel_x, pixel_y: 像元坐标(int)
|
||||||
"""
|
"""
|
||||||
success, inv_gt = gdal.InvGeoTransform(geotransform)
|
# ★ GDAL 2.x 起 InvGeoTransform 直接返回 6 元组逆变换矩阵,求逆失败时返回 None;
|
||||||
if not success:
|
# 旧的 (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("无法对影像的仿射变换矩阵求逆,请检查影像地理元数据。")
|
raise ValueError("无法对影像的仿射变换矩阵求逆,请检查影像地理元数据。")
|
||||||
|
|
||||||
# 全仿射逆变换(含旋转项):px = inv_gt[0]+inv_gt[1]*x+inv_gt[2]*y,y 方向同理
|
# 全仿射逆变换(含旋转项):px = inv_gt[0]+inv_gt[1]*x+inv_gt[2]*y,y 方向同理
|
||||||
@ -603,6 +606,10 @@ def get_spectral_in_coor(imgpath, coorpath, outpath, radius=0, flare_path=None,
|
|||||||
|
|
||||||
# 打开影像数据集
|
# 打开影像数据集
|
||||||
dataset = gdal.Open(imgpath)
|
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_width = dataset.RasterXSize # 栅格矩阵的列数
|
||||||
im_height = dataset.RasterYSize # 栅格矩阵的行数
|
im_height = dataset.RasterYSize # 栅格矩阵的行数
|
||||||
num_bands = dataset.RasterCount # 栅格矩阵的波段数
|
num_bands = dataset.RasterCount # 栅格矩阵的波段数
|
||||||
|
|||||||
Reference in New Issue
Block a user