代码实战 | python实现台风警戒区绘制
前言
我们经常可以在台风预报网站看到24小时警戒线和48小时警戒线。那么具体如何绘制呢,小编在网上找到相关文件,如图
image1. 导入必要的库
import numpy as npfrom shapely.geometry import Polygon, Pointimport geopandas as gpdimport matplotlib.pyplot as pltfrom matplotlib.patches import Polygon as MplPolygonimport matplotlib.patches as mpatchesimport cartopy.crs as ccrs# 导入 meteva 库用于绘制中国地图from meteva.base.tool.plot_tools import add_china_map_2basemap# 设置中文字体plt.rcParams['font.sans-serif'] = ['SimHei', 'DejaVu Sans']plt.rcParams['axes.unicode_minus'] = Falseprint('所有库导入完成!')
所有库导入完成!
2. 定义闭合边界(扩大范围版)
# 定义警戒线边界点 (纬度, 经度)# 注意:这些是折线(polyline),不是闭合多边形# 24小时警戒线 - 实线# 从图片说明:(0°N,105°E;4.5°N,113°E;11°N,119°E;18°N,119°E;22°N,127°E;34°N,127°E)boundary_points_24h = [ (0, 105), (4.5, 113), (11, 119), (18, 119), (22, 127), (34, 127)]# 48小时警戒线 - 虚线# 从图片说明:(0°N,105°E;0°N,120°E;15°N,132°E;34°N,132°E)boundary_points_48h = [ (0, 105), (0, 120), (15, 132), (34, 132)]MAP_EXTENT = {'lon_min': 100, # 东经100度'lon_max': 150, # 东经180度'lat_min': 0, # 北纬0度'lat_max': 55# 北纬55度}print('24小时警戒线边界点(实线):')for i, point in enumerate(boundary_points_24h): print(f' 点{i+1}: ({point[0]}°N, {point[1]}°E)')print('\n48小时警戒线边界点(虚线):')for i, point in enumerate(boundary_points_48h): print(f' 点{i+1}: ({point[0]}°N, {point[1]}°E)')print(f'\n绘图范围:')print(f' 经度: {MAP_EXTENT["lon_min"]}°E - {MAP_EXTENT["lon_max"]}°E')print(f' 纬度: {MAP_EXTENT["lat_min"]}°N - {MAP_EXTENT["lat_max"]}°N')
24小时警戒线边界点(实线): 点1: (0°N, 105°E) 点2: (4.5°N, 113°E) 点3: (11°N, 119°E) 点4: (18°N, 119°E) 点5: (22°N, 127°E) 点6: (34°N, 127°E)48小时警戒线边界点(虚线): 点1: (0°N, 105°E) 点2: (0°N, 120°E) 点3: (15°N, 132°E) 点4: (34°N, 132°E)绘图范围: 经度: 100°E - 150°E 纬度: 0°N - 55°N
3. 使用 Meteva 绘制中国地图 + 多边形可视化
defplot_with_meteva_china_map(boundary_points_24h, boundary_points_48h, title='台风编号和定位警戒区图'):""" 使用 meteva 绘制中国地图背景 + 24小时和48小时警戒线 参考标准台风警戒区图样式 """# 创建图形 fig = plt.figure(figsize=(18, 12)) ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())# 使用 meteva 添加中国地图 add_china_map_2basemap(ax, name="nation", edgecolor='k', lw=0.8, encoding='gbk', grid0=None) # 国界 add_china_map_2basemap(ax, name="province", edgecolor='gray', lw=0.3, encoding='gbk', grid0=None) # 省界# 绘制48小时警戒线(虚线)- 折线,不闭合 polygon_x_48h = [p[1] for p in boundary_points_48h] # 经度 polygon_y_48h = [p[0] for p in boundary_points_48h] # 纬度 ax.plot(polygon_x_48h, polygon_y_48h, 'k--', linewidth=2.5, label='48小时警戒线', zorder=5)# 绘制24小时警戒线(实线)- 折线,不闭合 polygon_x_24h = [p[1] for p in boundary_points_24h] # 经度 polygon_y_24h = [p[0] for p in boundary_points_24h] # 纬度 ax.plot(polygon_x_24h, polygon_y_24h, 'k-', linewidth=2.5, label='24小时警戒线', zorder=6)# 设置坐标范围 ax.set_xlim(MAP_EXTENT['lon_min'], MAP_EXTENT['lon_max']) ax.set_ylim(MAP_EXTENT['lat_min'], MAP_EXTENT['lat_max'])# 添加经纬网格 gl = ax.gridlines(draw_labels=True, linewidth=0.5, color='gray', alpha=0.5, linestyle=':') gl.top_labels = False gl.right_labels = False gl.xlabel_style = {'size': 10} gl.ylabel_style = {'size': 10}# 设置标签 ax.set_xlabel('经度', fontsize=12) ax.set_ylabel('纬度', fontsize=12) ax.set_title(title, fontsize=14, fontweight='bold', pad=20)# 添加图例from matplotlib.lines import Line2D legend_elements = [ Line2D([0], [0], color='black', linestyle='-', linewidth=2.5, label='24小时警戒线'), Line2D([0], [0], color='black', linestyle='--', linewidth=2.5, label='48小时警戒线') ] ax.legend(handles=legend_elements, loc='lower left', fontsize=10, framealpha=0.9) plt.tight_layout() plt.show()return fig, ax# 调用函数绘制plot_with_meteva_china_map(boundary_points_24h, boundary_points_48h, '台风编号和定位警戒区图')
<Figure size 1800x1200 with 1 Axes>
(<Figure size 1800x1200 with 1 Axes>, <GeoAxes: title={'center': '台风编号和定位警戒区图'}, xlabel='经度', ylabel='纬度'>)
image小结
本项目展示了如何绘制台风警戒线,虽然是属于咬打火机的水平,大家如有困惑的问题也可评论区发出,如果小编有能力做会出一期文章。