WebGL 系列——(三)Cesium 坐标系

715 阅读6分钟

想要学习三维可视化开发不可避免会接触到地图、地球,也不可避免会接触到经纬度、坐标系、坐标转换等地理概念,要想更好地完成可视化效果,搞懂这些概念是必须的,本文将分享下这些年作为一名非职业地理人由于开发所需学的地理相关知识。

一、经线和纬线

(一)横着画的那个是经线

  • 范围是 -90°-90°
  • 经线也称子午线,和纬线一样是人类为度量方便而假设出来的辅助线,定义为地球表面连接南北两极的大圆线上的半圆弧。任两根经线的长度相等,相交于南北两极点。每一根经线都有其相对应的数值,称为经度。经线指示南北方向。

(二)竖着画的那个是纬线

  • 范围是 -180°-180°
  • 纬线和经线一样是人类为度量方便而假设出来的辅助线,定义为地球表面某点随地球自转所形成的轨迹。任何一根纬线都是圆形而且两两平行。纬线的长度是赤道的周长乘以纬线的纬度的余弦,所以赤道最长,离赤道越远的纬线,周长越短,到了两极就缩为0。从赤道向北和向南,各分90°,称为北纬和南纬,分别用“N”和“S”表示。经度分东西,指南北,纬度分南北,指东西。

二、几种常用的地理坐标系

初次接触到坐标系是将经纬度坐标以点的形式展现在地图上,结果发现跟实际位置偏差了几百米,于是去疯狂恶补这方面的知识,真是干一行爱一行啊,作为程序员不仅要会写代码,还要了解本职工作业务方面的知识,不然就会在你意想不到的地方犯错误。

(一)CGCS2000 坐标系

  • 2000国家大地坐标系,是我国当前最新的国家大地坐标系,英文名称为China Geodetic Coordinate System 2000,英文缩写为CGCS2000。2000国家大地坐标系的原点为包括海洋和大气的整个地球的质量中心;2000国家大地坐标系的Z轴由原点指向历元2000.0的地球参考极的方向,该历元的指向由国际时间局给定的历元为1984.0的初始指向推算,定向的时间演化保证相对于地壳不产生残余的全球旋转,X轴由原点指向格林尼治参考子午线与地球赤道面(历元2000.0)的交点,Y轴与Z轴、X轴构成右手正交坐标系。采用广义相对论意义下的尺度。

(二)WGS84 坐标系

  • WGS84:World Geodetic System 1984,是为GPS全球定位系统使用而建立的坐标系统。通过遍布世界的卫星观测站观测到的坐标建立,其初次WGS84的精度为1-2m,在1994年1月2号,通过10个观测站在GPS测量方法上改正,得到了WGS84(G730),G表示由GPS测量得到,730表示为GPS时间第730个周。1996年,National Imagery and Mapping Agency (NIMA) 为美国国防部(U.S.Department of Defense, DoD)做了一个新的坐标系统。这样实现了新的WGS版本:WGS(G873)。其因为加入了USNO站和北京站的改正,其东部方向加入了31-39cm 的改正。所有的其他坐标都有在1分米之内的修正。第三次精化:WGS84(G1150),于2002年1月20日启用。
  • 国外的地图插件均采用 WGS84 坐标系。

暂停一下:两个注意,第一,数据库中存储的坐标点其坐标系一般为 WGS84;第二,目前来看,WGS84 坐标系和 CGCS2000 坐标系,两个椭球仅扁率有微小差异,引起同一点的坐标差异小于0.105mm。因此,在实际项目中,我们默认 WGS84 坐标系和 CGCS2000 坐标系一致。

(三)GCJ-02 坐标系

  • GCJ-02 是由中国国家测绘局(G 表示 Guojia 国家,C 表示 Cehui 测绘,J 表示 Ju 局)制订的地理信息系统的坐标系统。它是一种对经纬度数据的加密算法,即加入随机的偏差。国内出版的各种地图系统(包括电子形式),必须至少采用 GCJ-02 对地理位置进行首次加密。
  • 绝大部分国内互联网地图提供商都是使用 GCJ-02 坐标系,包括高德地图,谷歌地图中国区、腾讯地图等。

(四)百度坐标系:bd-09

  • 百度坐标系是在 GCJ-02 坐标系的基础上再次加密偏移后形成的坐标系,只适用于百度地图。(目前百度 API 提供了从其它坐标系转换为百度坐标系的 API ,但却没有从百度坐标系转为其他坐标系的API)。

三、投影坐标系的概念以及与地理坐标系的关系

所谓投影,可以这样理解,拿张a4纸卷成桶状,把地球丢进去,然后在地球中间放个光源,投影在a4纸上的地图样子就是投影,这只是其中一种投影方式,还有很多种其他投影方式。

3145f0a81ee8496ba747ad9b96082aec.png 图源:《ArcGIS地理信息系统从基础到实践》/闫磊, 张海龙编著,中国水利水电出版社

  • 地理坐标系为球面坐标,参考平面是椭球面,坐标单位是经纬度
  • 投影坐标系为平面坐标,参考平面是水平面,坐标单位是米和千米
  • 常见的投影坐标系有墨卡托投影-Mercator、高斯克吕格投影(Gauss - Kruger)、通用横轴墨卡托投影(UTM)、网络墨卡托投影(WebMercator)。
  • 高德地图、百度地图、腾讯地图,谷歌地图、OSM地图等等都用了网络墨卡托平面化+地理坐标系统加密展示,天地图虽然用的是 CGCS2000 坐标系,但是也提供了墨卡托投影方法来展示平面地图,ArcGIS Earth 则和 Google Earth 类似,都是直接使用3857坐标系。

在实际开发对于前端来说,首先要知道你拿到的坐标点经纬度是什么坐标系,其次要知道你即将渲染的地图是什么坐标系,二者对应起来才能调用相应的 api 去渲染,否则就会出现偏移问题。