我们经常可以在台风预报网站看到24小时警戒线和48小时警戒线。那么具体如何绘制呢,小编在网上找到相关文件,如图

image
import numpy as np
from shapely.geometry import Polygon, Point
import geopandas as gpd
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon as MplPolygon
import matplotlib.patches as mpatches
import 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'] = False
print('所有库导入完成!')
所有库导入完成!
# 定义警戒线边界点 (纬度, 经度)
# 注意:这些是折线(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
def plot_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
本项目展示了如何绘制台风警戒线,虽然是属于咬打火机的水平,大家如有困惑的问题也可评论区发出,如果小编有能力做会出一期文章。