修改日志
2025.4.12 第一次修改
修正ERA5的数据裁剪后经纬度异常的问题
鸣谢
感谢优快云博友:2301_81644139
提出的BUG修改意见
前言
Hello大家好呀,最近正好需要用到多个SHP去裁剪NC,按照我以前的两种办法(办法1和办法2)操作的话,我自己都会破防,在偶然的情况下发现了rioxarray这个库。这个库可以将坐标信息直接写入到NC之中,从而直接使用shp裁剪,比原先的方法更为简单明了。
实例数据
本次测试数据采用2m气温数据,下载链接:点我直接下载;
NC数据打开后如下图所示,该数据为逐月的三维数据。
SHP数据我就直接采用NOAA公开的海岸线数据吧,主要是涉及到中国的SHP极大可能性会被平台封文章。下载链接:点我直接下载。数据如下图所示,我用的文件是GSHHS_i_L1.shp
代码部分
需要的库
本次我们需要用到以下四个库,这几个库都可以直接用pip安装比较方便。
import xarray as xr
import rioxarray
import geopandas as gpd
from shapely.geometry import mapping
加载文件
# 读取数据集
ds = xr.open_dataset(r'air.2m.mon.mean.nc')
if ds.lon.max() > 180:
ds.coords['lon'] = (ds.coords['lon'] + 180) % 360 - 180
ds = ds.sortby(ds.lon)
写入地理信息
shp = gpd.read_file(r"gshhg-shp-2.3.7/GSHHS_shp/i/GSHHS_i_L1.shp")
ds.rio.write_crs("epsg:4326", inplace=True)
ds.rio.set_spatial_dims(x_dim="lon", y_dim="lat", inplace=True)
裁剪&保存NC
ds = ds.rio.clip(shp.geometry.apply(mapping), shp.crs, drop=False)
ds.to_netcdf(r'air.2m.mon.mean_clip.nc')
结果
完整代码奉上
import xarray as xr
import rioxarray
import geopandas as gpd
from shapely.geometry import mapping
# 读取数据集
ds = xr.open_dataset(r'air.2m.mon.mean.nc')
if ds.lon.max() > 180:
ds.coords['lon'] = (ds.coords['lon'] + 180) % 360 - 180
ds = ds.sortby(ds.lon)
# 读取形状文件
shp = gpd.read_file(r"gshhg-shp-2.3.7/GSHHS_shp/i/GSHHS_i_L1.shp")
ds.rio.write_crs("epsg:4326", inplace=True)
ds.rio.set_spatial_dims(x_dim="lon", y_dim="lat", inplace=True)
ds = ds.rio.clip(shp.geometry.apply(mapping), shp.crs, drop=False)
ds.to_netcdf(r'air.2m.mon.mean_clip.nc') # 保存NC文件