经典地图制图中使用的投影面有圆柱面、圆锥面或平面等。根据所用投影面,地图投影相对应地可分为圆柱投影、圆锥投影和方位投影。后来又发展出了很多现代地图投影,如伪圆柱、多圆锥等投影办法。在制图时选择合适的地图投影是一件重要的工作。
本文将对 Cartopy 中支持的地图投影进行逐一进行简要介绍,这些投影都是 cartopy.crs 中的类。若要绘制某一类投影的地图,只需将其实例化之后传入 plt.axes()
方法的 projection
参数即可。本文不涉及投影的原理,旨在展示每种地图投影的效果和用法,以便在选择时参考。
PlateCarree(可利)投影将地物投影到圆柱面上再展开,常用来绘制世界地图。该类的定义为:
class cartopy.crs.PlateCarree(central_longitude=0.0, globe=None)
参数说明:
central_longitude
:中央经线,默认为 0;globe
:椭球定义,默认为 WGS84。示例:
Lambert cylindrical projection(兰伯特等积投影)也是绘制世界地图的一种常用方案。该类的定义为:
class cartopy.crs.LambertCylindrical(central_longitude=0.0)
参数说明:
central_longitude
:中央经线,默认为 0。示例:
Mercator(墨卡托)投影,属于正轴等角割圆柱投影。经纬线为相互垂直的平行直线,图上无角度变形,但面积变形较大。该投影常用于制作航海图或赤道附近区域的地图。其类定义为:
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(米勒)投影。其类定位为:
class cartopy.crs.Miller(central_longitude=0.0)
参数说明:
central_longitude
:中央经线,默认为 0。示例:
TransverseMercator(横轴墨卡托)投影是对标准墨卡托投影的一种变换。其类定义为:
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 中,地球上的主要陆地被划分为一个个的网格区间。对于纬度,从南纬 80° 开始,每 8° 被划分为一个区间,自南向北由从 “C” 至 “X” 的字母表示(为包含北极附近的陆地,最北的区间包含 12°);对于经度,从零度子午线开始每隔 6° 向东编排,其带好以数字 01-60 表示。该类的定义为:
class cartopy.crs.UTM(zone, southern_hemisphere=False, globe=None)
参数说明:
zone
:所绘地区的 6° 经度区间带号;southern_hemisphere
:投影带是否在南半球;globe
:椭球定义,默认为 WGS84。示例:
RotatedPole(旋转极)投影,常被用于天气预测模型中。该类的定义为:
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(Ordnance Survey of Great Britain),英国军用测量大地网,用于测量大不列颠岛的一种区域等距圆锥投影。
示例:
EuroPP,用于绘制欧洲地图的一种等距圆锥投影。
示例:
OSNI(Ordnance Survey of Northern Ireland),一种区域性质的等距圆锥投影,用于测绘北爱尔兰岛。
示例:
AlbersEqualArea(阿尔伯斯等面积)投影。其类定义为:
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(兰伯特正形)投影。其类定义为:
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(正射)投影,视点在无穷远处,常用于表现某个半球。该类的定义为:
class cartopy.crs.Orthographic(central_longitude=0.0, central_latitude=0.0, globe=None)
参数说明:
central_longitude
:中央经线,默认为 0;central_latitude
:中央纬线,默认为 0;globe
:椭球定义,默认为 WGS84。示例:
AzimuthalEquidistant(正方位等距)投影,在切点辐射的方向上没有长度变形,有角度和面积变形。该类的定义为:
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(球极平面)投影,这也是一种等角投影,其视点在球面上。但这种投影会造成较大的长度和面积变形,且离切点愈远,其变形幅度愈大。其类定义为:
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(地球同步卫星)视角,视点在赤道上空某一点处。这种投影好像在地球同步(GEO)卫星上观察到的地球。其类定义为:
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(驾驶员)视角,视点在地球外某一点处。这种投影好像在高空中某处宇宙飞船驾驶员的视角。其类定义为:
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(兰伯特方位等积)投影,具有等积性质,但在靠近边缘的地方长度和角度变形较大。其类定义为:
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(球心)投影,将地球想象为一个水面透明的玻璃球,这种投影好像从地心光源将陆地的影子投射到墙上的景象。该类定义为:
class cartopy.crs.Gnomonic(central_longitude=0.0, central_latitude=0.0, globe=None)
参数说明:
central_longitude
:中央经线,默认为 0;central_latitude
:中央纬线,默认为 0;globe
:椭球定义,默认为 WGS84。示例:
NorthPolarStereo(北极极射)投影。该类的定义为:
class cartopy.crs.NorthPolarStereo(central_longitude=0.0, globe=None)
参数说明:
central_longitude
:中央经线,默认为 0;globe
:椭球定义,默认为 WGS84。示例:
SouthPolarStereo(南极极射)投影。该类的定义为:
class cartopy.crs.SouthPolarStereo(central_longitude=0.0, globe=None)
参数说明:
central_longitude
:中央经线,默认为 0;globe
:椭球定义,默认为 WGS84。示例:
Mollweide(摩尔威特)投影,一种正轴等积性质的伪圆柱投影,由德国人摩尔威特(K.B.Mollweide)所创,常用于绘制世界地图或东西半球图。中央经线为直线,距离中央经线东西相差 90° 的经线构成一个大圆,其面积等于地球表面积的1/2,其余经线为椭圆。Cartopy 中对应的类为:
class cartopy.crs.Mollweide(central_longitude=0, globe=None)
参数说明:
central_longitude
:中央经线,默认为 0;globe
:椭球定义,默认为 WGS84。示例:
Robinson(罗宾逊)投影也是一种伪圆柱投影,主要为了克服圆柱投影形状拉伸过大,希望获得角度和面积变形均最小的世界地图投影。Cartopy 中对应的类为:
class cartopy.crs.Robinson(central_longitude=0, globe=None)
参数说明:
central_longitude
:中央经线,默认为 0;globe
:椭球定义,默认为 WGS84。示例:
Sinusoidal(正弦)投影是一种伪圆柱等积投影,由法国人桑逊(N.Sanson)所创,有时候也被称为桑逊投影或墨卡托等积投影。这是一种等积性质的伪圆柱投影,纬线为间隔相等的平行直线,经线为对称于中央经线的正弦曲线。Cartopy 中对应的类为:
class cartopy.crs.Sinusoidal(central_longitude=0.0, false_easting=0.0,
false_northing=0.0, globe=None)
参数说明:
central_longitude
:中央经线,默认为 0;globe
:椭球定义,默认为 WGS84。示例:
InterruptedGoodeHomolosine(分瓣正弦古德)投影,一种伪圆柱、等积投影。该投影中,全图被分为几瓣,各瓣之间通过赤道连接,这样可使得各大洲陆地部分表现得更完好。其缺点也显而易见:地图的连续性被破坏殆尽。Cartopy 中对应的类为:
class cartopy.crs.InterruptedGoodeHomolosine(central_longitude=0, globe=None)
参数说明:
central_longitude
:中央经线,默认为 0;globe
:椭球定义,默认为 WGS84。示例:
对于上文提到的 false_easting
和 false_northing
两个变量的含义与用途,有些读者可能会有困惑。这里说一下我的理解。在某些局部地区的坐标系中,为了避免坐标值出现负数,通常会在可能出现负数的坐标上加上一个较大的常数。例如,我国普遍采用高斯投影的平面直角坐标系,以赤道和中央子午线作为坐标轴,由于我国位于北半球,因此南北方向不会出现负数,但是东西方向上会出现负数(中央子午线以西的点)。此时通常的解决办法就是为所有的东西方向的坐标加上 500 km。这里的 500 km 就是 false_easting
的值。
当制图范围较小时,无论什么投影方式都无太大变形;对于范围广大的世界地图、半球地图、大洲地图、大国地图等,则需要慎重考虑。对表现大块区域常用的投影方式可总结为: