从tiff 影像中提取多个点的像素值

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()
posted @   GeoRepublic  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示