目录
前言
自从2017年自然资源部发文要求使用国家2000坐标系以来,各地区各部门已经逐渐开始使用国家2000坐标系(CGCS2000
),并逐步实现将已有的北京54、西安80坐标系转换到国家2000坐标系。但是目前最火爆的三维地理信息框架Cesium
,其中使用的默认坐标系仍然是WGS84
坐标系。为了方便使用,下文中皆称为2000坐标系和84坐标系。本文正是基于此,将坐标系修改为2000坐标系,并对比修改前后的效果。当然,修改坐标系并不是简单的将椭球参数改为2000参数即可,需将对应的一整套数据、服务,全部转为2000。本文正是在这一实践过程中总结而来。
1 常用椭球参数
坐标系 | 椭球 | 长半轴(a) | 短半轴(b) | 扁率 (a-b) / a |
---|---|---|---|---|
北京54 | 克拉索夫斯基椭球 | 6378245 | 6356863.0187730473 | 0.0033523298692592 |
西安80 | 1975国际椭球 | 6378140 | 6356755.288157528 | 0.003352813177897 |
WGS84 | WGS84椭球体 | 6378137 | 6356752.3142451795 | 0.0033528106647476 |
国家2000 | 国家2000坐标系椭球 | 6378137 | 6356752.3141403558 | 0.0033528106811825 |
2 Cesium中定义CGCS2000椭球
Cesium
中通过Ellispoid
类定义椭球的,该类中定义了一个常量Ellipsoid.WGS84
/**
* An Ellipsoid instance initialized to the WGS84 standard.
*
* @type {Ellipsoid}
* @constant
*/
Ellipsoid.WGS84 = Object.freeze(
new Ellipsoid(6378137.0, 6378137.0, 6356752.3142451793)
);
照猫画虎,我们新增一个Ellipsoid.CGCS2000
常量即可
/**
* An Ellipsoid instance initialized to the CGCS2000 standard.
*
*
* @type {Ellipsoid}
* @constant
*/
Ellipsoid.CGCS2000 = Object.freeze(
new Ellipsoid(6378137.0, 6378137.0, 6356752.3141403558)
);
为了方便测试,我们直接将Ellipsoid.WGS84
的参数修改为2000的值,这样其他的地方调用WGS84常量的地方我们就不用修改了。
/**
* An Ellipsoid instance initialized to the WGS84 standard.
*
* @type {Ellipsoid}
* @constant
*/
Ellipsoid.WGS84 = Object.freeze(
// new Ellipsoid(6378137.0, 6378137.0, 6356752.3142451793)
new Ellipsoid(6378137.0, 6378137.0, 6356752.3141403558)
);
3 空间服务CGCS2000化
好了,现在来到了最关键的地方了。Cesium
只是用来加载数据的,它决定不了数据源的坐标系,因此我们需要将数据源改为2000的坐标系。那么有哪些数据需要需要转为2000坐标系呢?自然是影像和地形。
3.1 影像服务的2000化
第一步自然是栅格影像数据转2000坐标系,很多人都用的ArcGIS
转2000坐标系,使用投影栅格工具,但是可能会遇到无效的投影变换错误。而在自定义地理变换时,对着一堆方法及其对应的参数又很无奈,一脸懵逼,不知道是什么意思。
在此,我想说的是,这个错误通过上面的方法一般都是能成功的。比如作者使用ArcGIS10.3
成功了,使用ArcGIS10.8
却遇到了无效的地理变换错误。因此我可以肯定这是一个ArcGIS
的Bug
。也有可能是因为我们使用的破解版…
那么还有其他解决方案吗?那当然,使用QGIS进行坐标转换!
3.2 使用QGIS进行坐标转换
在QGIS
中的很多操作都比ArcGIS
要简单很多,而且QGIS
使用起来非常简单,QGIS
的安装也很简单,绿色版安装包只占了100多兆,真是不可思议。我知道很多GISer
都是从ArcGIS
起步的,对QGIS
一无所知,因此我建议广大GISer
可以试试QGIS
,你会发现新大陆的。
3.3 地形服务的2000化
地形服务的2000化其实和影像服务的2000化是类似的,因为DEM
也是tif
文件,也需要通过ArcGIS
或QGIS
转为2000的坐标系,唯一不同的是,转换完毕之后需要进行terrain
文件的制作,可以使用开源的CesiumTerrainBuilder
或CesiumLab
封装好的工具,此处过于简单,我们直接略过。
4 对比
在一切工作准备完毕后,就开始使用GeoServer
进行服务的发布,由于我之前已经修改了GeoServer
的源码,使得GeoServer
可以发布terrain
文件了,而影像数据本来GeoServer
就是支持的,现在已经一切具备,是时候发布2000服务并加载测试。首先要说明的是,我们对比的方式是,将地图缩放到最大的层级上,直到地图放不大为止,找一个固定的点来查看经度、纬度和高程的值。
4.1 Cesium使用2000坐标系和84坐标系加载84服务
首先可以得出的结论是,Cesium
使用2000坐标系时,也可以加载WGS84
的服务(影像和地形),Cesium
使用2000坐标系和84坐标系加载84服务,通过拾取坐标,得到的差异很小,仅在高程上有一些差别。
4.2 Cesium使用2000坐标系和84坐标系加载2000服务
类似的,Cesium
使用2000坐标系和84坐标系加载2000服务,通过拾取坐标,得到的差异也很小,也仅在高程上有一些差别。
4.3 Cesium使用2000坐标系加载2000服务和84坐标系加载84服务
前面两个都是服务不变,仅更改Cesium
中的坐标系时的对比效果,现在我们来试试服务和Cesium
同时改动,看看是什么效果,首先是Cesium
使用84坐标系加载84服务
然后是Cesium
使用2000坐标系加载2000服务
可以看出,其实和之前两次的对比结果是类似的,同一个位置的得到的经纬度信息是相同的,仅仅是在高程方面显示了微小的差异。
5 总结
本文通过梳理在Cesium
中使用2000椭球和84椭球的相关参数,最终通过修改默认椭球,实现了在Cesium
中定义并使用2000坐标系,并通过修改GIS
数据、服务的坐标系,对比了在Cesium
中使用2000坐标系和84坐标系时,分别加载2000和84的服务,得出了以下结论:
Cesium
中默认使用的是WGS84
椭球的长短半轴参数,即WGS84
坐标系。- 在
Cesium
中可以定义并使用国家2000坐标系。 Cesium
中使用国家2000坐标系和WGS84
坐标系加载WGS84服务,拾取到的经纬度相同,高程偏差在毫米级。Cesium
中使用国家2000坐标系和WGS84
坐标系加载国家2000服务,拾取到的经纬度相同,高程偏差在毫米级。Cesium
中使用国家2000坐标系加载 国家2000服务 和使用WGS84
坐标系加载WGS84服务,拾取到的经纬度相同,高程偏差在毫米级。- 在对高程精度要求不是很高的情况下,国家2000服务和
WGS84
服务可以相互替代。
注:本文中提及到的国家2000服务和WGS84服务皆指的是地理坐标系,即球面坐标。