You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rasterio报错:无法将浮点NaN转换为整数,求解决方法

解决栅格采样时的NaN转整数错误

问题场景

运行脚本从栅格提取点对应像素值时,最后一行赋值代码报错:ValueError: cannot convert float NaN to integer,已知栅格的src.nodata返回值为-1(float类型)。

错误原因

  1. 用r+模式打开栅格并手动设置src.nodata = int(-1),强制将浮点型nodata转为整数,和栅格原始数据类型不匹配,导致采样时NaN值无法正常转换
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 20:57:28