首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >代码实战 | python实现台风警戒区绘制

代码实战 | python实现台风警戒区绘制

作者头像
用户11172986
发布2026-04-24 19:37:22
发布2026-04-24 19:37:22
740
举报
文章被收录于专栏:气python风雨气python风雨

代码实战 | python实现台风警戒区绘制

前言

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

image
image

image

1. 导入必要的库

代码语言:javascript
复制
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('所有库导入完成!')
代码语言:javascript
复制
所有库导入完成!

2. 定义闭合边界(扩大范围版)

代码语言:javascript
复制
# 定义警戒线边界点 (纬度, 经度)
# 注意:这些是折线(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')

代码语言:javascript
复制
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 绘制中国地图 + 多边形可视化

代码语言:javascript
复制
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, '台风编号和定位警戒区图')

代码语言:javascript
复制
<Figure size 1800x1200 with 1 Axes>
代码语言:javascript
复制
(<Figure size 1800x1200 with 1 Axes>,
 <GeoAxes: title={'center': '台风编号和定位警戒区图'}, xlabel='经度', ylabel='纬度'>)
image
image

image

小结

本项目展示了如何绘制台风警戒线,虽然是属于咬打火机的水平,大家如有困惑的问题也可评论区发出,如果小编有能力做会出一期文章。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-04-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 气python风雨 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 代码实战 | python实现台风警戒区绘制
    • 前言
    • 1. 导入必要的库
    • 2. 定义闭合边界(扩大范围版)
    • 3. 使用 Meteva 绘制中国地图 + 多边形可视化
    • 小结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档