使用GeoPandas绘制NetCDF文件图像时遇形状不匹配错误的解决方法
解决GeoDataFrame创建时的形状不匹配问题
问题根源
你的PRECT.mean(dim='time').values是二维数组(178, 156),对应维度为(纬度数, 经度数);而gpd.points_from_xy(test_data.longitude.values, test_data.latitude.values)仅生成了一维的坐标对,两者长度不匹配(156 vs 178),导致无法对齐。
需要将二维的气象数据展平为一维,同时生成所有经纬度网格点的坐标对(共178*156=27768个点),才能和展平后的PRECT值一一对应。
修正代码
import xarray as xr import geopandas as gpd import matplotlib.pyplot as plt import numpy as np # 读取NetCDF数据(修正原代码笔误:open_set改为open_dataset) data = xr.open_dataset("**.nc") china_PRECT = data.PRECT # 读取河北边界数据 hebei_map = gpd.read_file('hebei.json') hebei_geometry = hebei_map.geometry.unary_union # 1. 生成经纬度网格坐标 lon, lat = np.meshgrid(data.longitude.values, data.latitude.values) # 展平为一维数组,与展平后的PRECT数据匹配 lon_flat = lon.flatten() lat_flat = lat.flatten() # 2. 展平PRECT均值数据 prect_mean_flat = data.PRECT.mean(dim='time').values.flatten() # 3. 创建GeoDataFrame gdf = gpd.GeoDataFrame( {'prect_mean': prect_mean_flat}, # 用字典明确列名与对应数据 geometry=gpd.points_from_xy(lon_flat, lat_flat), crs="EPSG:4326" ) # 可选:筛选出河北范围内的点 gdf_hebei = gdf[gdf.within(hebei_geometry)] # 绘图示例 fig, ax = plt.subplots(figsize=(10, 8)) hebei_map.plot(ax=ax, facecolor='white', edgecolor='black') gdf_hebei.plot(ax=ax, column='prect_mean', cmap='Blues', markersize=20, legend=True) plt.title('河北区域PRECT均值分布') plt.show()
关键说明
np.meshgrid:将一维的经度、纬度转换为二维网格矩阵,确保每个纬度和经度的组合都有对应的坐标点。.flatten():把二维数组转为一维,使PRECT数据和坐标点的数量完全匹配(均为178*156个元素)。- 原代码中
xr.open_set是笔误,修正为xr.open_dataset——这是xarray读取NetCDF文件的标准方法。
内容的提问来源于stack exchange,提问作者王云湖不归
相关产品推荐
相关产品推荐

