地球椭球体(Ellipsoid)

众所周知我们的地球表面是一个凸凹不平的表面,而对于地球测量而言,地表是一个无法用数学公式表达的曲面,这样的曲面不能作为测量和制图的基准面。假想一个扁率极小的椭圆,绕大地球体短轴旋转所形成的规则椭球体称之为地球椭球体。地球椭球体表面是一个规则的数学表面,可以用数学公式表达,所以在测量和制图中就用它替代地球的自然表面。因此就有了地球椭球体的概念。
地球椭球体有长半径和短半径之分,长半径(a)即赤道半径,短半径(b)即极半径。f=(a-b)/a为椭球体的扁率,表示椭球体的扁平程度。由此可见,地球椭球体的形状和大小取决于a、b、f 。因此,a、b、f被称为地球椭球体的三要素。
对地球椭球体而言,其围绕旋转的轴叫地轴。地轴的北端称为地球的北极,南端称为南极;过地心与地轴垂直的平面与椭球面的交线是一个圆,这就是地球的赤道;过英国格林威治天文台旧址和地轴的平面与椭球面的交线称为本初子午线。以地球的北极、南极、赤道和本初子午线等作为基本要素,即可构成地球椭球面的地理坐标系统。

A geographic coordinate system (GCS) uses a three-dimensional spherical surface to define locations on the earth. A GCS includes an angular unit of measure, a prime meridian, and a datum (based on a spheroid).

可以看出地理坐标系统是球面坐标系统,以经度/维度(通常以十进制度或度分秒(DMS)的形式)来表示地面点位的位置。地理坐标系统以本初子午线为基准(向东,向西各分了180°),之东为东经其值为正,之西为西经其值为负;以赤道为基准(向南、向北各分了90°),之北为北纬其值为正,之南为南纬其值为负。

大地基准面(Geodetic datum)

大地基准面,设计用为最密合部份或全部大地水准面的数学模式。它由椭球体本身及椭球体和地表上一点视为原点间之关系来定义。此关系能以 6个量来定义,通常(但非必然)是大地纬度、大地经度、原点高度、原点垂线偏差之两分量及原点至某点的大地方位角。

地图坐标系由大地基准面和地图投影确定,大地基准面是利用特定椭球体对特定地区地球表面的逼近,因此每个国家或地区均有各自的大地基准面。北京54坐标系、西安80坐标系指的是我国的两个大地基准面。我国参照前苏联从1953年起采用克拉索夫斯基(Krassovsky)椭球体建立了我国的北京54坐标系,54坐标系统普遍低于我国的大地水准面,平均误差为29米左右。

1978年采用国际大地测量协会推荐的IAG75地球椭球体建立了我国新的大地坐标系–西安80坐标系,目前GPS定位所得出的结果都属于WGS84坐标系统,WGS84基准面采用WGS84椭球体,它是一地心坐标系,即以地心作为椭球体中心的坐标系。因此相对同一地理位置,不同的大地基准面,它们的经纬度坐标是有差异的。

椭球体与大地基准面之间的关系是一对多的关系,也就是基准面是在椭球体基础上建立的,但椭球体不能代表基准面,同样的椭球体能定义不同的基准面,如前苏联的Pulkovo 1942、非洲索马里的Afgooye基准面都采用了Krassovsky椭球体,但它们的大地基准面显然是不同的。基准面是在椭球体基础上建立的,同样的椭球体能定义不同的基准面。在目前的GIS商用软件中,大地基准面都通过当地基准面向WGS84的转换7参数来定义,即三个平移参数ΔX、ΔY、ΔZ表示两坐标原点的平移值;三个旋转参数εx、εy、εz表示当地坐标系旋转至与地心坐标系平行时,分别绕Xt、Yt、Zt的旋转角;最后是比例校正因子,用于调整椭球大小。

理解:椭球面和地球肯定不是完全贴合的,因而,即使用同一个椭球面,不同的地区由于关心的位置不同,需要最大限度的贴合自己的那一部分,因而大地基准面就会不同。

地理坐标系

为什么需要转换坐标系?

因为国内对地理坐标有特殊的政策,所有电子地图必须对位置做偏移处理,这导致了从底层接口得到的经纬度坐标展示在地图上会有偏移。这种偏移不是线性的,不能简单地通过加减某个值来校正,并且不同的地图提供商采用的算法也不一样,例如百度地图和高德地图就采用了不同的偏移方式。

关于坐标系

常见的为以下3种:

  • 高德地图、腾讯地图以及谷歌中国区地图使用的是GCJ-02坐标系(火星坐标系)
  • 百度地图使用的是BD-09坐标系
  • 底层接口(HTML5 Geolocation或ios、安卓API)通过GPS设备获取的坐标使用的是WGS-84坐标系

国内基本上使用前面2者。

不同的坐标系之间可能有几十到几百米的偏移,所以在开发基于地图的产品,或者做地理数据可视化时,我们需要修正不同坐标系之间的偏差。

WGS-84 - 世界大地测量系统

WGS-84(World Geodetic System, WGS)是使用最广泛的坐标系,也是世界通用的坐标系,GPS设备得到的经纬度就是在WGS84坐标系下的经纬度。通常通过底层接口得到的定位信息都是WGS84坐标系。

GCJ-02 - 国测局坐标

GCJ-02(G-Guojia国家,C-Cehui测绘,J-Ju局),又被称为火星坐标系,是一种基于WGS-84制定的大地测量系统,由中国国测局制定。此坐标系所采用的混淆算法会在经纬度中加入随机的偏移。

国家规定,中国大陆所有公开地理数据都需要至少用GCJ-02进行加密,也就是说我们从国内公司的产品中得到的数据,一定是经过了加密的。绝大部分国内互联网地图提供商都是使用GCJ-02坐标系,包括高德地图,谷歌地图中国区等。

BD-09 - 百度坐标系

BD-09(Baidu, BD)是百度地图使用的地理坐标系,其在GCJ-02上多增加了一次变换,用来保护用户隐私。从百度产品中得到的坐标都是BD-09坐标系。

2.投影坐标系

投影坐标系使用基于X,Y值的​​坐标系统​​来描述地球上某个点所处的位置。

投影坐标系由 以下参数确定:

  • 地理坐标系(如WGS84)
  • 投影方法(如Mercator投影)

2.1 常见的投影方式

  • EPSG:4326(经纬度投影)
  • EPSG:3857(球面墨卡托投影)

看资料的时候发现EPSG:4326是地理坐标系,而EPSG:3857是投影坐标系,这让我产生困惑,为什么openlayer中projection能设置EPSG:4346

defs('EPSG:4326', "+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees");

defs('EPSG:3857', "+title=WGS 84 / Pseudo-Mercator +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs");

通过proj4js源码可以看出,都是基于84坐标系,但是proj的不相同。我的理解是在同一个坐标系下(WGS 84)采用了不同的投影方式。

例如,广州天地图API服务提供了2种投影方式的API服务。

总结

高德地图采用了Web Mercator(几乎市面上所有地图都是如此),所以openlayers的projecttion的默认值为“EPSG:3857”,如果手动设置为“EPSG:4326”,看起来会变形失真(见下图)。同时火星坐标系是基于84坐标系的基础上偏移计算得到的,只要投影方式一致,且点位数据进行坐标系转换,即可正确显示地图上。