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

使用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,提问作者王云湖不归

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 18:42:56