Python+Cartopy实战:5分钟搞定气象数据可视化地图(附frykit避坑指南)
气象数据可视化是气象分析、地理信息处理乃至环境科学研究的核心环节。过去,我们可能需要依赖专业的GIS软件,或者编写冗长复杂的代码来处理地图投影、边界裁剪、坐标转换等问题。现在,借助Python生态中的Cartopy库,以及一些优秀的第三方工具包,我们完全可以在几分钟内,从原始数据生成一张专业、准确且美观的地图。这篇文章,我将从一个实际项目经验出发,为你梳理一条从零开始、高效绘制气象地图的路径,并重点分享如何利用frykit这个“神器”来规避中国地图绘制中的诸多常见陷阱。
1. 环境搭建与核心库选择:告别依赖地狱
开始之前,一个干净、可控的Python环境至关重要。我强烈推荐使用conda来管理你的地理绘图环境,因为它能很好地处理像cartopy这类对底层C库(如GEOS、PROJ)有依赖的包。
# 创建一个新的conda环境
conda create -n geo_viz python=3.10 -y
conda activate geo_viz
# 通过conda-forge频道安装cartopy及其核心依赖
conda install -c conda-forge cartopy -y
为什么是conda-forge?它提供了预编译好的二进制包,能最大程度避免在Windows或macOS上从源码编译PROJ、GEOS等库时可能遇到的令人头疼的编译错误。安装完成后,我们还需要几个关键的辅助库:
# 数据处理与科学计算基石
conda install -c conda-forge numpy pandas xarray netCDF4 -y
# 可视化核心
conda install -c conda-forge matplotlib -y
# 空间插值(例如克里金插值)
conda install -c conda-forge scipy pykrige -y
# 中国地图绘制的“瑞士军刀”
pip install frykit
这里重点说一下frykit。它是一个由国内开发者基于Cartopy封装的工具包,专门用于简化中国地图的绘制。它内置了符合规范的中国国界、省界、市界数据,并提供了诸如“九段线”自动添加、地图裁剪(白化)、指北针、比例尺等实用功能。对于需要频繁绘制中国区域地图的气象或地信工作者来说,它能节省大量寻找、处理shapefile数据的时间,并确保地图的规范性。
注意:
frykit的安装目前主要通过pip从PyPI获取。如果遇到网络问题,可以考虑使用国内镜像源,例如pip install frykit -i https://pypi.tuna.tsinghua.edu.cn/simple。
2. 绘制第一张标准中国地图:从轮廓到细节
环境就绪,让我们立刻动手画一张基础的中国地图。这个过程将展示Cartopy结合frykit的核心工作流。
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
import frykit.plot as fplt
import frykit.shp as fshp
import numpy as np
# 1. 创建图形和地图坐标系
fig = plt.figure(figsize=(12, 8))
# 使用兰勃特等角圆锥投影,这是绘制中纬度地区(如中国)的常用投影
map_proj = ccrs.LambertConformal(central_longitude=105, standard_parallels=(25, 47))
ax = fig.add_subplot(1, 1, 1, projection=map_proj)
# 2. 设置地图显示范围(大致为中国区域)
main_extent = [73, 136, 18, 54] # [西经, 东经, 南纬, 北纬]
ax.set_extent(main_extent, crs=ccrs.PlateCarree())
# 3. 添加基础地理特征(使用frykit简化操作)
# 添加陆地与海洋填充,提升地图的可读性
ax.add_feature(cfeature.LAND.with_scale('50m'), facecolor='lightgray', alpha=0.3)
ax.add_feature(cfeature.OCEAN.with_scale('50m'), facecolor='lightblue', alpha=0.5)
# 一键添加中国省界,线宽和颜色可自定义
fplt.add_cn_province(ax, lw=0.6, ec='darkred')
# 一键添加“九段线”,这是frykit的一大亮点,确保了地图的规范性
fplt.add_nine_line(ax, lw=1.2, ec='black')
# 4. 添加地图装饰元素
# 添加网格线
ax.gridlines(draw_labels=True, linewidth=0.5, color='gray', alpha=0.5, linest


被折叠的 条评论
为什么被折叠?



