Rasterio报错:无法将浮点NaN转换为整数,求解决方法
解决栅格采样时的NaN转整数错误
问题场景
运行脚本从栅格提取点对应像素值时,最后一行赋值代码报错:ValueError: cannot convert float NaN to integer,已知栅格的src.nodata返回值为-1(float类型)。
错误原因
- 用
r+模式打开栅格并手动设置src.nodata = int(-1),强制将浮点型nodata转为整数,和栅格原始数据类型不匹配,导致采样时NaN值无法正常转换 src.sample返回的是每个点的像素值元组(单波段栅格为长度1的元组),直接赋值未处理元组结构,同时未处理采样结果中的NaN值
解决方案及修改代码
import pandas as pd import geopandas as gpd import rasterio import numpy as np path = "/Users/mauritskruisheer/Documents/GeoData/WCARO stoytelling/" # 读取水源点数据 waterpoints_Mali = pd.read_excel(path + "DISE-AEP compiles.xlsx", header=1) waterpoints_Mali[['Latitude', 'Longitude']] = waterpoints_Mali[['Latitude', 'Longitude']].astype(float) fn_river_100 = path + "Riverine Floods/inunriver_historical_000000000WATCH_1980_rp00100.tif" fn_aqueduct = path + "y2019m07d11_aqueduct30_annual_v01.csv" # 转成GeoDataFrame gdf = gpd.GeoDataFrame( waterpoints_Mali, geometry=gpd.points_from_xy(waterpoints_Mali.Longitude, waterpoints_Mali.Latitude), crs="EPSG:4326" ) # 只读模式打开栅格,避免修改原文件引发类型冲突 with rasterio.open(fn_river_100, "r") as src: nodata_val = src.nodata # 使用栅格自带的nodata值(已知为-1,float类型) coord_list = [(x, y) for x, y in zip(gdf["geometry"].x, gdf["geometry"].y)] sampled_values = [] for val_tuple in src.sample(coord_list): val = val_tuple[0] # 提取元组中的单个像素值(单波段栅格) # 处理NaN值,替换为nodata对应的整数 if np.isnan(val): sampled_values.append(int(nodata_val)) else: sampled_values.append(val) gdf["value"] = sampled_values
关键修改点
- 改用
r只读模式打开栅格,避免手动修改nodata引发的类型不匹配问题 - 用numpy的
np.isnan()准确判断NaN值,将其替换为nodata对应的整数-1,统一数据类型 - 显式提取采样元组中的单个值,避免元组直接赋值到DataFrame的类型问题
内容的提问来源于stack exchange,提问作者CrossLord
相关产品推荐
相关产品推荐

