Cartopy 中的地图投影

经典地图制图中使用的投影面有圆柱面、圆锥面或平面等。根据所用投影面,地图投影相对应地可分为圆柱投影、圆锥投影和方位投影。后来又发展出了很多现代地图投影,如伪圆柱、多圆锥等投影办法。在制图时选择合适的地图投影是一件重要的工作。

本文将对 Cartopy 中支持的地图投影进行逐一进行简要介绍,这些投影都是 cartopy.crs 中的类。若要绘制某一类投影的地图,只需将其实例化之后传入 plt.axes() 方法的 projection 参数即可。本文不涉及投影的原理,旨在展示每种地图投影的效果和用法,以便在选择时参考。

圆柱投影

PlateCarree

PlateCarree(可利)投影将地物投影到圆柱面上再展开,常用来绘制世界地图。该类的定义为:

1
class cartopy.crs.PlateCarree(central_longitude=0.0, globe=None)

参数说明:

  • central_longitude:中央经线,默认为 0;
  • globe:椭球定义,默认为 WGS84。

示例:

LambertCylindrical

Lambert cylindrical projection(兰伯特等积投影)也是绘制世界地图的一种常用方案。该类的定义为:

1
class cartopy.crs.LambertCylindrical(central_longitude=0.0)

参数说明:

  • central_longitude:中央经线,默认为 0。

示例:

Mercator

Mercator(墨卡托)投影,属于正轴等角割圆柱投影。经纬线为相互垂直的平行直线,图上无角度变形,但面积变形较大。该投影常用于制作航海图或赤道附近区域的地图。其类定义为:

1
2
class cartopy.crs.Mercator(central_longitude=0.0, min_latitude=-80.0, max_latitude=84.0,
latitude_true_scale=0.0, globe=None)

参数说明:

  • central_longitude:中央经线,默认为 0;
  • min_latitude:显示的最小纬线(最南端),默认为 -80;
  • max_latitude:显示的最大纬线(最北端),默认为 84;
  • latitude_true_scale:长度不变形的纬线,默认为 0;
  • globe:椭球定义,默认为 WGS84。

示例:

Miller

Miller(米勒)投影。其类定位为:

1
class cartopy.crs.Miller(central_longitude=0.0)

参数说明:

  • central_longitude:中央经线,默认为 0。

示例:

TransverseMercator

TransverseMercator(横轴墨卡托)投影是对标准墨卡托投影的一种变换。其类定义为:

1
2
3
class cartopy.crs.TransverseMercator(central_longitude=0.0, central_latitude=0.0,
false_easting=0.0, false_northing=0.0,
scale_factor=1.0, globe=None)

参数说明:

  • central_longitude:中央经线,默认为 0;
  • central_latitude:中央纬线,默认为 0;
  • false_easting:平面上 X 轴坐标(东方向)的偏移量,以米为单位;
  • false_northing:平面上 Y 轴坐标(北方向)的偏移量,以米为单位;
  • scale_factor:中央经线处的长度变形因子,默认为 1;
  • globe:椭球定义,默认为 WGS84。

示例:

UTM

UTM(通用横轴墨卡托投影),制图中最常用的一种投影方法之一。在 UTM 中,地球上的主要陆地被划分为一个个的网格区间。对于纬度,从南纬 80° 开始,每 8° 被划分为一个区间,自南向北由从 “C” 至 “X” 的字母表示(为包含北极附近的陆地,最北的区间包含 12°);对于经度,从零度子午线开始每隔 6° 向东编排,其带好以数字 01-60 表示。该类的定义为:

1
class cartopy.crs.UTM(zone, southern_hemisphere=False, globe=None)

参数说明:

  • zone:所绘地区的 6° 经度区间带号;
  • southern_hemisphere:投影带是否在南半球;
  • globe:椭球定义,默认为 WGS84。

示例:

RotatedPole

RotatedPole(旋转极)投影,常被用于天气预测模型中。该类的定义为:

1
2
class cartopy.crs.RotatedPole(pole_longitude=0.0, pole_latitude=90.0,
central_rotated_longitude=0.0, globe=None)

参数说明:

  • pole_longitude:旋转极的经度;
  • pole_latitude:旋转极的纬度;
  • central_rotated_longitude:旋转的经度;
  • globe:椭球定义,默认为 WGS84。

示例:

OSGB

OSGB(Ordnance Survey of Great Britain),英国军用测量大地网,用于测量大不列颠岛的一种区域等距圆锥投影。

示例:

EuroPP

EuroPP,用于绘制欧洲地图的一种等距圆锥投影。

示例:

OSNI

OSNI(Ordnance Survey of Northern Ireland),一种区域性质的等距圆锥投影,用于测绘北爱尔兰岛。

示例:

圆锥投影

AlbersEqualArea

AlbersEqualArea(阿尔伯斯等面积)投影。其类定义为:

1
2
3
class cartopy.crs.AlbersEqualArea(central_longitude=0.0, central_latitude=0.0,
false_easting=0.0, false_northing=0.0,
standard_parallels=(20.0, 50.0), globe=None)

参数说明:

  • central_longitude:中央经线,默认为 0;
  • central_latitude:中央纬线,默认为 0;
  • false_easting:平面上 X 轴坐标(东方向)的偏移量,以米为单位;
  • false_northing:平面上 Y 轴坐标(北方向)的偏移量,以米为单位
  • standard_parallels:长度不变形的纬线,默认为 (20, 50)
  • globe:椭球定义,默认为 WGS84。

示例:

LambertConformal

LambertConformal(兰伯特正形)投影。其类定义为:

1
2
3
4
class cartopy.crs.LambertConformal(central_longitude=-96.0, central_latitude=39.0,
false_easting=0.0, false_northing=0.0,
secant_latitudes=None, standard_parallels=None,
globe=None, cutoff=-30)

参数说明:

  • central_longitude:中央经线,默认为 -96;
  • central_latitude:中央纬线,默认为 39;
  • false_easting:平面上 X 轴坐标(东方向)的偏移量,以米为单位;
  • false_northing:平面上 Y 轴坐标(北方向)的偏移量,以米为单位
  • secant_latitudes:割线的纬度;
  • standard_parallels:长度不变形的纬线,默认为 (33, 45)
  • cutoff:显示的纬度边界,默认为 -30;
  • globe:椭球定义,默认为 WGS84。

示例:

方位投影

Orthographic

Orthographic(正射)投影,视点在无穷远处,常用于表现某个半球。该类的定义为:

1
class cartopy.crs.Orthographic(central_longitude=0.0, central_latitude=0.0, globe=None)

参数说明:

  • central_longitude:中央经线,默认为 0;
  • central_latitude:中央纬线,默认为 0;
  • globe:椭球定义,默认为 WGS84。

示例:

AzimuthalEquidistant

AzimuthalEquidistant(正方位等距)投影,在切点辐射的方向上没有长度变形,有角度和面积变形。该类的定义为:

1
2
class cartopy.crs.AzimuthalEquidistant(central_longitude=0.0, central_latitude=0.0,
false_easting=0.0, false_northing=0.0, globe=None)

参数说明:

  • central_longitude:中央经线,默认为 0;
  • central_latitude:中央纬线,默认为 0;
  • false_easting:平面上 X 轴坐标(东方向)的偏移量,以米为单位;
  • false_northing:平面上 Y 轴坐标(北方向)的偏移量,以米为单位
  • globe:椭球定义,默认为 WGS84。

示例:

Stereographic

Stereographic(球极平面)投影,这也是一种等角投影,其视点在球面上。但这种投影会造成较大的长度和面积变形,且离切点愈远,其变形幅度愈大。其类定义为:

1
2
3
class cartopy.crs.Stereographic(central_latitude=0.0, central_longitude=0.0,
false_easting=0.0, false_northing=0.0,
true_scale_latitude=None, globe=None)

参数说明:

  • central_longitude:中央经线,默认为 0;
  • central_latitude:中央纬线,默认为 0;
  • false_easting:平面上 X 轴坐标(东方向)的偏移量,以米为单位;
  • false_northing:平面上 Y 轴坐标(北方向)的偏移量,以米为单位
  • true_scale_latitude:长度不变形的纬线;
  • globe:椭球定义,默认为 WGS84。

示例:

Geostationary

Geostationary(地球同步卫星)视角,视点在赤道上空某一点处。这种投影好像在地球同步(GEO)卫星上观察到的地球。其类定义为:

1
2
class cartopy.crs.Geostationary(central_longitude=0.0, satellite_height=35785831,
false_easting=0, false_northing=0, globe=None)

参数说明:

  • central_longitude:中央经线,默认为 0;
  • satellite_height:卫星高度,默认为 35785831 米,这是 GEO 卫星的高度;
  • false_easting:平面上 X 轴坐标(东方向)的偏移量,以米为单位;
  • false_northing:平面上 Y 轴坐标(北方向)的偏移量,以米为单位
  • globe:椭球定义,默认为 WGS84。

示例:

NearsidePerspective

NearsidePerspective(驾驶员)视角,视点在地球外某一点处。这种投影好像在高空中某处宇宙飞船驾驶员的视角。其类定义为:

1
2
3
class cartopy.crs.NearsidePerspective(central_longitude=0.0, central_latitude=0.0,
satellite_height=35785831, false_easting=0,
false_northing=0, globe=None)

参数说明:

  • central_longitude:中央经线,默认为 0;
  • central_latitude:中央纬线,默认为 0;
  • satellite_height:卫星高度,默认为 35785831 米,即 GEO 卫星的高度;
  • false_easting:平面上 X 轴坐标(东方向)的偏移量,以米为单位;
  • false_northing:平面上 Y 轴坐标(北方向)的偏移量,以米为单位
  • globe:椭球定义,默认为 WGS84。

示例:

LambertAzimuthalEqualArea

LambertAzimuthalEqualArea(兰伯特方位等积)投影,具有等积性质,但在靠近边缘的地方长度和角度变形较大。其类定义为:

1
2
class cartopy.crs.LambertAzimuthalEqualArea(central_longitude=0.0, central_latitude=0.0,
false_easting=0.0, false_northing=0.0, globe=None)

参数说明:

  • central_longitude:中央经线,默认为 0;
  • central_latitude:中央纬线,默认为 0;
  • satellite_height:卫星高度,默认为 35785831 米,即 GEO 卫星的高度;
  • false_easting:平面上 X 轴坐标(东方向)的偏移量,以米为单位;
  • false_northing:平面上 Y 轴坐标(北方向)的偏移量,以米为单位
  • globe:椭球定义,默认为 WGS84。

示例:

Gnomonic

Gnomonic(球心)投影,将地球想象为一个水面透明的玻璃球,这种投影好像从地心光源将陆地的影子投射到墙上的景象。该类定义为:

1
class cartopy.crs.Gnomonic(central_longitude=0.0, central_latitude=0.0, globe=None)

参数说明:

  • central_longitude:中央经线,默认为 0;
  • central_latitude:中央纬线,默认为 0;
  • globe:椭球定义,默认为 WGS84。

示例:

NorthPolarStereo

NorthPolarStereo(北极极射)投影。该类的定义为:

1
class cartopy.crs.NorthPolarStereo(central_longitude=0.0, globe=None)

参数说明:

  • central_longitude:中央经线,默认为 0;
  • globe:椭球定义,默认为 WGS84。

示例:

SouthPolarStereo

SouthPolarStereo(南极极射)投影。该类的定义为:

1
class cartopy.crs.SouthPolarStereo(central_longitude=0.0, globe=None)

参数说明:

  • central_longitude:中央经线,默认为 0;
  • globe:椭球定义,默认为 WGS84。

示例:

其他投影方式

Mollweide

Mollweide(摩尔威特)投影,一种正轴等积性质的伪圆柱投影,由德国人摩尔威特(K.B.Mollweide)所创,常用于绘制世界地图或东西半球图。中央经线为直线,距离中央经线东西相差 90° 的经线构成一个大圆,其面积等于地球表面积的1/2,其余经线为椭圆。Cartopy 中对应的类为:

1
class cartopy.crs.Mollweide(central_longitude=0, globe=None)

参数说明:

  • central_longitude:中央经线,默认为 0;
  • globe:椭球定义,默认为 WGS84。

示例:

Robinson

Robinson(罗宾逊)投影也是一种伪圆柱投影,主要为了克服圆柱投影形状拉伸过大,希望获得角度和面积变形均最小的世界地图投影。Cartopy 中对应的类为:

1
class cartopy.crs.Robinson(central_longitude=0, globe=None)

参数说明:

  • central_longitude:中央经线,默认为 0;
  • globe:椭球定义,默认为 WGS84。

示例:

Sinusoidal

Sinusoidal(正弦)投影是一种伪圆柱等积投影,由法国人桑逊(N.Sanson)所创,有时候也被称为桑逊投影或墨卡托等积投影。这是一种等积性质的伪圆柱投影,纬线为间隔相等的平行直线,经线为对称于中央经线的正弦曲线。Cartopy 中对应的类为:

1
2
class cartopy.crs.Sinusoidal(central_longitude=0.0, false_easting=0.0,
false_northing=0.0, globe=None)

参数说明:

  • central_longitude:中央经线,默认为 0;
  • globe:椭球定义,默认为 WGS84。

示例:

InterruptedGoodeHomolosine

InterruptedGoodeHomolosine(分瓣正弦古德)投影,一种伪圆柱、等积投影。该投影中,全图被分为几瓣,各瓣之间通过赤道连接,这样可使得各大洲陆地部分表现得更完好。其缺点也显而易见:地图的连续性被破坏殆尽。Cartopy 中对应的类为:

1
class cartopy.crs.InterruptedGoodeHomolosine(central_longitude=0, globe=None)

参数说明:

  • central_longitude:中央经线,默认为 0;
  • globe:椭球定义,默认为 WGS84。

示例:

总结

对于上文提到的 false_eastingfalse_northing 两个变量的含义与用途,有些读者可能会有困惑。这里说一下我的理解。在某些局部地区的坐标系中,为了避免坐标值出现负数,通常会在可能出现负数的坐标上加上一个较大的常数。例如,我国普遍采用高斯投影的平面直角坐标系,以赤道和中央子午线作为坐标轴,由于我国位于北半球,因此南北方向不会出现负数,但是东西方向上会出现负数(中央子午线以西的点)。此时通常的解决办法就是为所有的东西方向的坐标加上 500 km。这里的 500 km 就是 false_easting 的值。

当制图范围较小时,无论什么投影方式都无太大变形;对于范围广大的世界地图、半球地图、大洲地图、大国地图等,则需要慎重考虑。对表现大块区域常用的投影方式可总结为:

  • 世界地图:正圆柱、伪圆柱和多圆锥投影;
  • 东、西半球:常选用横轴方位投影;
  • 南、北半球:常采用正轴方位投影;
  • 水、陆半球:一般选用斜轴方位投影;
  • 极地——正轴方位投影;
  • 赤道附近——横轴方位投影或正轴圆柱投影;
  • 中纬地区——正轴圆锥投影或斜轴方位投影。

最后,生成本文示例图片的代码开放下载,你可以自由选择独立脚本Jupyter Notebook笔记本。

使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏