| 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: |
| |
| band_names = src.descriptions if src.descriptions else [f'Band_{i+1}' for i in range(src.count)] |
| |
| |
| valid_keys = [key for key in keys if key in band_names] |
| if not valid_keys: |
| raise ValueError(f"提供的 keys {keys} 不在影像的波段 {band_names} 中") |
| |
| |
| 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() |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!