import pandas as pd
import xarray as xr
from cnmaps import get_adm_maps, clip_contours_by_map, draw_maps
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
import matplotlib.colors as mcolors
import matplotlib.patches as mpatches
# 读取数据
ds = xr.open_dataset("Z_RADA_C_BABJ_20250302000942_P_DOR_YN_FHCR_SC_1KM_20250302_000000.nc")
print(ds)
sm_data = ds["CREF"] # 根据实际变量名调整
lat = ds["Lat"]
lon = ds["Lon"]
time_coverage=ds["time"]
minu_group = ds.groupby("time.minute")
for group_name, group_ds in minu_group:
# 当第一个循环结束时,停止遍历
minu_group
print(group_name)
break
group_ds
list_group = list(minu_group)
list_group
def time_mean(a):
return a.mean(dim="time")
monthsst = minu_group.map(time_mean)
monthsst
# 常量
startLon = 98
endLon = 100.15
startLat = 24
endLat = 26
# 使用cnmaps获取保山市边界
baoshan = get_adm_maps(city="保山市", level='市') # level可选'市','县','乡'
# 地图白化
fig = plt.figure(figsize=(16, 8))
ax = fig.add_subplot(111, projection=ccrs.PlateCarree())
ax.set_extent([startLon, endLon, startLat, endLat], crs=ccrs.PlateCarree())
colorlevel=[-100,-50,-25,0,25,50,100,]#气温等级
colordict=['#ff0000', '#ff9628','#ffff00','#afff00','#00beff','#800040']#颜色列表
rain_map=mcolors.ListedColormap(colordict)#产生颜色映射
norm=mcolors.BoundaryNorm(colorlevel,rain_map.N)#生成索引
# 绘制土壤湿度数据
cs1= ax.contourf(lon,lat,monthsst,levels=colorlevel,cmap=rain_map,norm=norm,transform=ccrs.PlateCarree(),extend='both')
labels=['<-50','-50~-25','-25~0', '0~25','25~50','>90']
#labels=['重旱','中旱', '轻旱','无旱','渍涝']
myLegend=[mpatches.Rectangle((0, 0), 1, 2, facecolor=c) for c in colordict]
ax.legend(myLegend, labels,fontsize=9,frameon=False,title='图例',ncol=1,
loc='lower left', bbox_to_anchor=(0, -0.01), fancybox=True)
# 画县
map_with_country = get_adm_maps(province='云南省', city="保山市", level="县")
print(map_with_country)
draw_maps(map_with_country, linewidth=0.8, color='#5f5f5f')
# 县区
stationIds = pd.read_csv("保山市县区.csv", encoding="gbk")
name = stationIds['Sta']
lon = stationIds['Lon']
lat = stationIds['Lat']
lonlat = zip(lon, lat)
mapname = dict(zip(name, lonlat))
for key, value in mapname.items():
print("==================", value[0], value[1])
ax.scatter(value[0], value[1], marker='.', s=10, color="k", zorder=3)
ax.text(value[0] - 0.04, value[1] + 0.01, key, fontsize=10, color="k")
# 添加网格和标注
gl = ax.gridlines(draw_labels=True,linewidth=0.5, color='gray', alpha=0)#网格线颜色、宽度、
gl.xformatter = LONGITUDE_FORMATTER
gl.yformatter = LATITUDE_FORMATTER
gl.top_labels = False
gl.right_labels = False
#装饰
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定中文字体(如黑体)
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
ax.set_title("保山市3月16日土壤干旱分布图", loc="center", fontsize=14,pad=10)
#def add_department_watermark(fig,text):
ax.text(0.98, 0.05, "制作单位:保山市气象科技服务中心\n",ha='right', va='bottom', fontsize=8, color='black',transform=ax.transAxes)
#fig.text(0.98, 0.02, "制作单位:保山市气象科技服务中心\n",ha='right', va='bottom', fontsize=8, color='black')
#fig.text(0.95, 0.03,"Produced by: Energy Analytics Dept | Confidential",ha='right',fontsize=9,color='#666666',alpha=0.7)
#切图
bs_map_outline = get_adm_maps(province='云南省',city="保山市", record='first', only_polygon=True)
clip_contours_by_map(cs1, bs_map_outline)
#map_polygon=get_adm_maps(province='云南省',city="保山市", record='first', only_polygon=True)
#clip_contours_by_map(bs, bs_map_outline)
#map_polygon = get_adm_maps(province='云南省',city="保山市",record='first', only_polygon=True)
plt.savefig('baoshan_soil_moisture_cnmap.png', dpi=800, bbox_inches='tight')
plt.show()
print("工作完成.")
此代码显示TypeError: cannot directly convert an xarray.Dataset into a numpy array. Instead, create an xarray.DataArray first, either with indexing on the Dataset or by invoking the `to_array()` method.请问怎么解决