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

使用rioxarray裁剪NetCDF:如何缩小输出文件至流域区域尺寸?

问题:裁剪NetCDF后仍保留全球尺寸,如何仅保留流域所在区域缩小文件体积?

我尝试用一份流域Shapefile裁剪全球降水NetCDF文件,所用代码如下:

import geopandas as gpd
import rioxarray
import xarray as xr
import matplotlib.pyplot as plt
from shapely.geometry import mapping

# Load shapefile
shapefile_path = "my_shapefile.shp"
shapefile = gpd.read_file(shapefile_path, crs="epsg:4326")

# Load NetCDF file
netcdf_path = "my_netcdffile.nc"
ds = xr.open_dataset(netcdf_path)

pre = ds["pre"] # selecting precipitation

# clipping
pre.rio.set_spatial_dims(x_dim="lon", y_dim="lat", inplace=True)
pre.rio.write_crs("epsg:4326", inplace=True)
clipped_nc = pre.rio.clip(
    shapefile.geometry.apply(mapping), pre.rio.crs, drop=False
)

clipped_nc.to_netcdf("clipped_netcdf.nc") # saving nc file

裁剪后输出的clipped_netcdf.nc仍保留原始全球文件的尺寸,仅流域区域有有效数据。如何让输出文件仅包含流域所在区域,从而缩小文件体积?


解决方案

1. 修改rio.clip的drop参数

问题出在你调用rio.clip时设置了drop=False,这个参数会强制保留原始数据的所有空间维度(即全球范围的经纬度),即使大部分区域是NaN。只需将其改为drop=True,rioxarray就会自动删除全为NaN的行和列,只保留包含有效数据的区域:

修改后的裁剪代码片段:

clipped_nc = pre.rio.clip(
    shapefile.geometry.apply(mapping), pre.rio.crs, drop=True
)

2. 先预切片NetCDF再裁剪(推荐大文件使用)

如果你的全球NetCDF文件非常大,先通过Shapefile的边界范围对数据进行预切片,再执行裁剪操作,能大幅提升效率并进一步缩小输出文件体积:

完整代码示例:

import geopandas as gpd
import rioxarray
import xarray as xr
from shapely.geometry import mapping

# Load shapefile
shapefile_path = "my_shapefile.shp"
shapefile = gpd.read_file(shapefile_path, crs="epsg:4326")

# 获取流域的经纬度边界
min_lon, min_lat, max_lon, max_lat = shapefile.total_bounds

# Load NetCDF file并预切片到流域范围
netcdf_path = "my_netcdffile.nc"
ds = xr.open_dataset(netcdf_path)
pre = ds["pre"].sel(
    lon=slice(min_lon - 0.1, max_lon + 0.1),  # 留少量缓冲避免边界数据丢失
    lat=slice(min_lat - 0.1, max_lat + 0.1)
)

# 设置空间维度和CRS
pre.rio.set_spatial_dims(x_dim="lon", y_dim="lat", inplace=True)
pre.rio.write_crs("epsg:4326", inplace=True)

# 执行裁剪并丢弃无效区域
clipped_nc = pre.rio.clip(
    shapefile.geometry.apply(mapping), pre.rio.crs, drop=True
)

# 保存结果
clipped_nc.to_netcdf("clipped_netcdf.nc")

这里给边界加了0.1的缓冲,是为了避免因为Shapefile和NetCDF的网格对齐问题,导致流域边缘的有效数据被误删,你可以根据数据的分辨率调整缓冲值。


内容的提问来源于stack exchange,提问作者jei L

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 09:05:24