import rasterio
import pandas as pd
def extract_values_from_tif(df: pd.DataFrame, tif_path: str, keys: list) -> pd.DataFrame:
"""
从 TIFF 影像中提取多个点的像素值,仅提取 keys 指定的波段,并处理 NaN 值。
参数:
df (pd.DataFrame): 包含经纬度信息的 DataFrame,列名需包含 'longitude' 和 'latitude'。
tif_path (str): 栅格文件路径。
keys (list): 需要提取的波段名称列表(如 ['Band_1', 'Band_3'])。
返回:
pd.DataFrame: 在原始 DataFrame 基础上添加指定波段的像素值列。
"""
with rasterio.open(tif_path) as src:
# 获取波段名称,如果 descriptions 为空,则用默认索引名
band_names = src.descriptions if src.descriptions else [f'Band_{i+1}' for i in range(src.count)]
# 确保 keys 在 band_names 里
valid_keys = [key for key in keys if key in band_names]
if not valid_keys:
raise ValueError(f"提供的 keys {keys} 不在影像的波段 {band_names} 中")
# 获取 keys 对应的波段索引(rasterio 以 1 开始计数)
band_indices = [band_names.index(key) + 1 for key in valid_keys]
# 采样点坐标
points = list(zip(df["longitude"], df["latitude"]))
# 采样数据
sampled_values = np.array(list(src.sample(points, indexes=band_indices)))
sampled_values = np.nan_to_num(sampled_values, nan=0)
df[valid_keys] = sampled_values
return df.copy()