隐阳勒布朗 气象水文科研猫 2022-01-07 21:00 模仿中央气象台: # # # # # # # # # # # # # # # # ## 本文作者:CSDN_weixin_52405084# # # # # # # # # # # # # # # # #import configparserimport matplotlibimport matplotlib.patches as mpatchesimport matplotlib.pyplot as plt# import reader as readerimport shapely.geometry as sgeomimport cartopy.io.shapereader as shpreaderimport cartopy.crs as ccrsimport cartopy.feature as cfeatfrom cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTERfrom cartopy.io.shapereader import Readerimport matplotlib.pyplot as pltimport matplotlib.ticker as mtickerimport shapefileimport jsonimport osimport redef map_generate(dic): # 中文字体设置,防止中文乱码 # 指定默认字体 matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # 创建活动数据字典 proj = ccrs.AlbersEqualArea() fig = plt.figure(figsize=(3, 3), dpi=800) # 创建画布 ax = fig.subplots(1, 1, subplot_kw={'projection': proj}) # 创建子图 # 将地图的范围限制在中国范围内。 ax.set_extent([-2767962, 2327067, -1911822, 2244950], crs=proj) # 添加背景蓝色矩形 polygon = sgeom.Polygon([(-2767962, -1911822), (-191182, 22327067), (-2767962, 2244950), (2327067, 2244950)]) ax.add_geometries([polygon], proj, facecolor='#97DBF2') # 读取世界边界信息 shp_path = r'F:/Rpython/lp36/data/basedata/world_albers.shp' reader = Reader(shp_path) enshicity = cfeat.ShapelyFeature(reader.geometries(), proj, edgecolor='#686868', facecolor='w') ax.add_feature(enshicity, linewidth=0.25) # 读取国家面 shp_path = r'F:/Rpython/lp36/data/basedata/国界(面).shp' reader = Reader(shp_path) enshicity = cfeat.ShapelyFeature(reader.geometries(), proj, edgecolor='#686868', facecolor='w') ax.add_feature(enshicity, linewidth=0.25) # 读取国境线 shp_path = r'F:/Rpython/lp36/data/basedata/guojie_buffer5km.shp' reader = Reader(shp_path) enshicity = cfeat.ShapelyFeature(reader.geometries(), proj, edgecolor='#000000', facecolor='none') ax.add_feature(enshicity, linewidth=0.15) # 读取省分界线 shp_path = r'F:/Rpython/lp36/data/basedata/省界.shp' reader = Reader(shp_path) enshicity = cfeat.ShapelyFeature(reader.geometries(), proj, edgecolor='#686868', facecolor='none') ax.add_feature(enshicity, linewidth=0.2) # 在地图上按照经纬度标识出省会城市 f = open(r'F:/Rpython/lp36/data/basedata/省会.json', encoding='utf-8') shenghui = json.loads(f.read()) f.close() for point in shenghui: cord = point['cord'] ax.text(cord[0], cord[1], point['NAME'], verticalalignment='center', horizontalalignment='center',transform=proj, fontsize=3, color='k', family='Simsun') # 在画布中添加南海诸岛白色背景矩形 polygon = sgeom.Polygon([(-2710000, -1861822), (-2011822, -1861822), (-2011822, -980000), (-2710000, -980000)]) ax.add_geometries([polygon], proj, facecolor='white', edgecolor='#000000', linewidth=0.1) # 读取南海诸岛信息,并在左下角小画布中展出 shp_path = r'F:/Rpython/lp36/data/basedata/SouthSea_L.shp' reader = Reader(shp_path) enshicity = cfeat.ShapelyFeature(reader.geometries(), proj, edgecolor='#000000', facecolor='none') ax.add_feature(enshicity, linewidth=0.2) # 读取河流信息,将河流画出 shp_path = r'F:/Rpython/lp36/data/basedata/一级河流5.shp' reader = Reader(shp_path) enshicity = cfeat.ShapelyFeature(reader.geometries(), proj, edgecolor='b', facecolor='none') ax.add_feature(enshicity, linewidth=0.15) # 在画布中添加矩形 polygon = sgeom.Polygon([(-1867962, -1851822), (-1011822, -1851822), (-1011822, -1100000), (-1867962, -1100000)]) ax.add_geometries([polygon], proj, facecolor='white', edgecolor='#000000', linewidth=0.2) # 添加图例中矩形色块 red_polygon = sgeom.Polygon([(-1837962, -1351822), (-1590000, -1351822), (-1590000, -1240000), (-1837962, -1240000)]) ax.add_geometries([red_polygon], proj, facecolor='r') orange_polygon = sgeom.Polygon([(-1837962, -1501822), (-1590000, -1501822), (-1590000, -1390000), (-1837962, -1390000)]) ax.add_geometries([orange_polygon], proj, facecolor='#FFAA01') y_polygon = sgeom.Polygon([(-1837962, -1651822), (-1590000, -1651822), (-1590000, -1540000), (-1837962, -1540000)]) ax.add_geometries([y_polygon], proj, facecolor='#FFFF00') b_polygon = sgeom.Polygon([(-1837962, -1801822), (-1590000, -1801822), (-1590000, -1690000), (-1837962, -1690000)]) ax.add_geometries([b_polygon], proj, facecolor='b') # 添加图例中文字内容 plt.text(x=-1847962,y=-1200000,s='图 例',fontdict=dict(fontsize=3,color='k',family='Simsun')) plt.text(x=-1557962,y=-1340000,s='风险很高',fontdict=dict(fontsize=3,color='k',family='Simsun')) plt.text(x=-1557962,y=-1490000,s='风险高',fontdict=dict(fontsize=3,color='k',family='Simsun')) plt.text(x=-1557962,y=-1640000,s='风险较高',fontdict=dict(fontsize=3,color='k',family='Simsun')) plt.text(x=-1557962,y=-1790000,s='有一定风险',fontdict=dict(fontsize=3,color='#000000',family='Simsun')) # 添加大标题和小标题 plt.text(x=-1907962,y=1900000,s=dic['first_title'],fontdict=dict(fontsize=6,color='k',family='Simsun')) plt.text(x=-1117962,y=1609000,s=dic['second_title'],fontdict=dict(fontsize=4.5,color='k',family='Simsun')) plt.text(x=-557962,y=1259000,s=dic['third_title'],fontdict=dict(fontsize=6,color='r',family='SimHei')) # 发布时间信息 plt.text(x=1211822,y=-1544950,s=dic['date'] + '发布',fontdict=dict(fontsize=3,color='r',family='Simsun'), bbox={'facecolor': 'w', # 填充色 'edgecolor': 'w', # 外框色 'alpha': 1, # 框透明度 'pad': 1, # 本文与框周围距离 }) # 南海诸岛文字展示 plt.text(x=-2300000,y=-1209000,s='南',fontdict=dict(fontsize=3,color='#151515',family='Microsoft YaHei')) plt.text(x=-2360000,y=-1389000,s='海',fontdict=dict(fontsize=3,color='#151515',family='Microsoft YaHei')) plt.text(x=-2440000,y=-1549000,s='诸',fontdict=dict(fontsize=3,color='#151515',family='Microsoft YaHei')) plt.text(x=-2540000,y=-1689000,s='岛',fontdict=dict(fontsize=3,color='#151515',family='Microsoft YaHei')) # 在画布中添加线 line = sgeom.LineString([(1815000, -1090000), (1815000, -1003000)]) ax.add_geometries([line], proj, facecolor='k', edgecolor='k', linewidth=0.2) line = sgeom.LineString([(1800000, -1280000), (1760000, -1373000)]) ax.add_geometries([line], proj, facecolor='k', edgecolor='k', linewidth=0.2) line = sgeom.LineString([(1600000, -1630000), (1560000, -1743000)]) ax.add_geometries([line], proj, facecolor='k', edgecolor='k', linewidth=0.2) return plt, ax, projif __name__ == '__main__': shp_path = r'F:/Rpython/lp36/data/basedata/县级数据.shp' file = shapefile.Reader(shp_path, encoding='gbk') srs = file.shapeRecords() dic={'first_title':'省级风险拼图产品(中小河流洪水)','date':'2022年1月7日','second_title':'1月7日21时-1月7日21时','third_title':'中央气象台'} plt, ax, proj = map_generate(dic) f = open(r'F:/Rpython/lp36/data/basedata/x_albers_map.json',encoding='utf-8') xian_albers = json.loads(f.read()) f.close() cf = configparser.ConfigParser() cf.read("F:/Rpython/lp36/data/basedata/config.cfg", 'UTF-8') # file_prefix = cf.get("file_path", "WARNING_PUZZLE_save_prefix") # plt.savefig(file_prefix+'/map.png') # plt.savefig("C:\工作\图片生成\map.png") # plt.show() plt.savefig('F:/Rpython/lp36/plot150.png',dpi=800,bbox_inches='tight',pad_inches=0) plt.show() |
|