ERA5全球GRIB风场数据绘图及多米尼克区域提取技术问题
解决ERA5 GRIB数据内核崩溃+多米尼克岛风场绘图问题
内核重启的根本原因
你手里的全球逐小时ERA5 GRIB数据包含912个变量,直接加载全量数据会瞬间耗尽Jupyter内核的内存,导致内核强制重启,自然无法输出图像。核心解决逻辑是先裁剪出多米尼克岛的目标区域,再处理数据,绝对不能碰全量全球数据。
修正后的可运行代码
使用xarray配合cfgrib加载数据时直接完成区域裁剪,从根源避免内存爆炸:
import xarray as xr import matplotlib.pyplot as plt import cartopy.crs as ccrs import cartopy.feature as cfeature # 多米尼克岛边界框:[南, 北, 西, 东] dominica_bbox = [14.78, 15.88, -62.21, -60.68] # 加载数据时直接裁剪区域+筛选层级,规避全量数据 # 提前安装依赖:pip install cfgrib xarray cartopy ds = xr.open_dataset( "你的2017年9月ERA5风场数据.grib", engine="cfgrib", backend_kwargs={ "filter_by_keys": {"typeOfLevel": "surface"}, # 仅加载近地面层,减少冗余变量 "indexpath": "" # 避免生成临时索引文件 } ).sel( latitude=slice(dominica_bbox[1], dominica_bbox[0]), # ERA5纬度按北→南排序,切片需反序 longitude=slice(dominica_bbox[2], dominica_bbox[3]) ) # 提取10米风场(若变量名不是u10/v10,运行print(ds.data_vars)查看实际名称) u10 = ds["u10"] v10 = ds["v10"] # 选择某一小时的数据绘图(示例:2017年9月1日0点) plot_time = "2017-09-01T00:00:00" u_plot = u10.sel(time=plot_time) v_plot = v10.sel(time=plot_time) # 绘图设置 fig, ax = plt.subplots(figsize=(10,8), subplot_kw={"projection": ccrs.PlateCarree()}) ax.set_extent(dominica_bbox, crs=ccrs.PlateCarree()) # 添加地图基础元素 ax.add_feature(cfeature.COASTLINE, linewidth=1) ax.add_feature(cfeature.LAND, color="#f0f0f0") ax.add_feature(cfeature.BORDERS, linestyle=":") # 绘制风场箭头 q = ax.quiver( u_plot.longitude, u_plot.latitude, u_plot.values, v_plot.values, scale=120, color="#2c3e50" ) # 添加风场图例 plt.quiverkey(q, 0.92, 0.95, 10, "10 m/s", labelpos="E") # 设置标题 plt.title(f"多米尼克岛近地面风场 - {plot_time}") # JupyterLab中强制触发图像显示 plt.show()
关键优化细节
- 先裁剪再加载:通过
sel()在数据加载阶段就切出目标区域,完全规避全量全球数据的内存占用,从根源解决内核重启问题。 - 筛选冗余变量:用
filter_by_keys仅加载需要的层级(比如近地面),不用处理912个变量中的冗余数据。 - 单时间步绘图:逐小时数据包含744个时间节点,仅选择单个时间点绘图,进一步降低内存压力。
踩坑提示
- 若风场变量名不是
u10/v10,运行print(ds.data_vars)查看所有变量,替换为实际的风场变量名称。 - 若仍出现内存不足,可按天加载数据(比如
sel(time=slice("2017-09-01", "2017-09-01")))后再裁剪区域。 - 必须安装
cfgrib库,否则xarray无法读取GRIB格式文件。
内容的提问来源于stack exchange,提问作者Swagatalaxmi Das
相关产品推荐
相关产品推荐

