Matplotlib+Cartopy绘图为何用crs.PlateCarree()而非crs.Geodetic()
Cartopy中transform参数为何经纬度数据要传PlateCarree而非Geodetic?
核心误区是对两个坐标系的适用场景理解有偏差——你觉得原始经纬度属于Geodetic大地坐标范畴就该传crs.Geodetic(),实际上Cartopy里两个CRS的定位完全不同,具体差异和使用规则如下:
crs.Geodetic()是三维地心大地坐标系,坐标基于参考椭球面定义,虽然坐标值用经纬度表示,但描述的是三维椭球面上的曲面位置,没有内置平面映射规则,无法直接把坐标对应到Matplotlib依赖的二维画布像素坐标系上。这个CRS在Cartopy中仅适用于需要考虑地球曲率的场景,比如计算两点间大圆航线、大范围测地线距离,传入后它会自动把两点连线渲染为沿椭球面的弧线,而非平面上的直线。crs.PlateCarree()是等距圆柱投影,属于标准的平面投影坐标系,它的投影规则没有任何非线性变换:直接把经度值映射为平面X坐标、纬度值映射为平面Y坐标,投影后的平面坐标数值和原始经纬度数值完全一致。我们常用的等经纬度网格温度、降水等气象/遥感数据,本身就是把经纬度直接作为笛卡尔平面XY值排列的规则格点,和PlateCarree的映射规则完全匹配。
为什么不能直接给transform传crs.Geodetic()?
Matplotlib的所有渲染逻辑都基于二维笛卡尔平面,Cartopy的transform参数核心作用,是把原始数据的坐标统一转换为当前地图坐标轴(即创建ax时传入的
projection参数对应坐标系)的二维平面坐标,再交给Matplotlib绘制。
- 如果给格点数据传入
transform=crs.Geodetic(),Cartopy会默认你要绘制的是贴在三维椭球面上的要素,会自动对坐标做曲面到平面的额外转换,不会直接把经纬度对齐为平面XY坐标,最终渲染出来的温度分布会出现位置偏移、格网扭曲的问题。 - 哪怕是手动采集的零散经纬度点位,只要你希望点位直接落在对应经纬度的平面位置上,也应该用PlateCarree作为transform,只有需要绘制跨大范围的曲面测地线路径时,才需要用到Geodetic。
快速使用准则
- 所有按「经度对应X、纬度对应Y」规则存储的规则格点、散点、面状矢量数据,统一用
transform=crs.PlateCarree()即可。 - 仅当需要绘制沿椭球面的测地线、大圆航线等必须考虑地球曲率的线状要素时,才使用
transform=crs.Geodetic()。
内容的提问来源于stack exchange,提问作者Yifeng
相关产品推荐
相关产品推荐

