打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Python绘制中国地图(模仿中央气象台)

 隐阳勒布朗 气象水文科研猫 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()


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
【Python基础绘图】Cartopy可视化Sentinel卫星影像
桑基图还能在地图上绘制?!这个可视化技巧超常用~~
Python白化南海小地图(文末附数据和完整代码)
Python最强地理可视化库Cartopy安装教学
移动的台风:论matplotlib和cartopy配合的地图动画漫游
matplotlib cartopy geopandas,实现专业地图可视化!
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服