大家好,我是木木。
今天给大家分享一个【地理投影与地图制图】的 Python 库,cartopy。
cartopy
cartopy 是面向地图绘制和地理投影的 Python 库,常和 Matplotlib、NumPy、GeoPandas 一起使用。它真正解决的问题不是“画一个背景地图”,而是把经纬度坐标、投影坐标、地图要素和坐标轴变换放进同一套模型里管理。做气象、海洋、遥感、区域统计可视化时,Cartopy 能让图形更接近地理语义,而不是只在普通二维坐标上贴一张底图。
项目地址:https://github.com/SciTools/cartopy
官方文档:https://scitools.org.uk/cartopy/docs/latest/
三大特点
投影清楚
CRS 对象负责坐标系统和变换,适合在图上混合经纬度、墨卡托等坐标。
要素可控
Natural Earth 要素可按类别和比例尺组织,便于控制海岸线、陆地等素材。
生态兼容
和 Matplotlib 配合紧密,适合把科学计算结果落到地图视图里。
最佳实践
安装方式:pip install cartopy。建议先从坐标参考系统开始,不要一上来就下载高分辨率底图。先确认投影、范围和数据坐标都正确,再加入海岸线、行政边界和网格线。
第一段代码解决的问题是:确认最小投影对象是否可用,并检查当前安装版本。
fromimportlib.metadataimportversionimportcartopy.crsasccrsproj=ccrs.PlateCarree()print("cartopy:",version("Cartopy"))print("projection:",proj.__class__.__name__)print("threshold:",round(proj.threshold,3))
第二段代码解决的问题是:把经纬度点转换到 Web/墨卡托类坐标,验证数据坐标能进入目标投影。
importnumpyasnpimportcartopy.crsasccrssrc=ccrs.PlateCarree();dst=ccrs.Mercator()pts=dst.transform_points(src,np.array([0,120]),np.array([0,30]))fmt=lambdarow:[float(round(v,2))forvinrow[:2]]print("points:",pts.shape)print("x0/y0:",fmt(pts[0]))print("x1/y1:",fmt(pts[1]))
环境与版本信息
本文示例使用 Python 3.11,本地真实运行并截图。涉及 GIS 的示例会显式固定坐标参考和运行依赖;涉及数值计算的示例会优先打印 shape、版本和关键返回值,方便复现和排查。
高级功能
Cartopy 的进阶价值在坐标变换。很多地图错误不是配色问题,而是数据坐标、展示投影和底图素材不在同一个参考体系里。先把 CRS 关系写清楚,后续叠加栅格、散点和边界才不容易错位。
进阶代码解决的问题是:定义 Natural Earth 地图要素,后续可交给 Matplotlib 轴对象渲染。
importcartopy.featureascfeatureland=cfeature.NaturalEarthFeature("physical","land","110m")print("feature:",land.name)print("category:",land.category)print("scale:",land.scale)
适用场景
适合气象图、遥感辅助图、海洋航线、区域统计地图和需要投影控制的科研可视化。
不适用场景
不适合只想快速在网页里拖动地图的场景;这类需求通常 Leaflet、Mapbox 或 Folium 更直接。
上线检查
- 固定 Python、核心库和系统依赖版本,避免环境漂移。
- 用小样本覆盖输入边界、空值、异常值和坐标/数组维度。
总结
cartopy 适合认真处理地图投影。它让地理图从“像地图”变成“坐标上可靠”。