我的代码如下:
import xarray as xr
import geopandas as gpd
import matplotlib.pyplot as plt
# notice : test_data is xr.open_set("**.nc")
data = test_data
china_PRECT = data.PRECT
# use geopandas to get map
hebei_map = gpd.read_file('hebei.json')
hebei_geometry = hebei_map.geometry.unary_union
gdf = gpd.GeoDataFrame(
test_data.PRECT.mean(dim='time').values, geometry=gpd.points_from_xy(test_data.longitude.values, test_data.latitude.values), crs="EPSG:4326"
)
然而上面是错误的: ValueError:形状不匹配:对象无法广播到单个形状。形状 (156,) 的 arg 0 和形状 (178,) 的 arg 1 之间不匹配。
我像这样打印变量:
print(data.PRECT.mean(dim='time').values.shape)
print(test_data.longitude.shape)
print(test_data.latitude.shape)
print(test_data.longitude.attrs)
结果: (178, 156) (156,) (178,) {'standard_name': '经度', 'long_name': '经度', '单位': ' Degrees_east', 'axis': 'X'}
我该如何解决?
问题来自于您的数据是二维的。 在创建
GeoDataFrame
之前,您必须展平数组。
使用 numpy 的
meshgrid
可以帮助做到这一点:
import numpy as np
import geopandas as gpd
longitude_2d, latitude2d = np.meshgrid(test_data.longitude.values, test_data.latitude.values)
prect_flat = test_data.PRECT.mean(dim='time').values.flatten()
longitude_flat = longitude_2d.flatten()
latitude_flat = latitude2d.flatten()
gdf = gpd.GeoDataFrame({
"prect": prect_flat ,
"geometry": gpd.points_from_xy(longitude_flat, latitude_flat)
}, crs="epsg:4326")
希望有帮助!