一、前言
最近改用了百度地图,一下子从之前的火星坐标系GCJ-02换成BD-09,一下子还不太习惯,一开始还以为是数据不准,导致页面叠加物都偏移了,但是整体都偏移就感觉不太对劲。
问了老前辈,才知道是不同坐标系的锅,赶紧恶补恶补。
所以今天我们就来讲讲这些坐标系的种类、用途和互相之间如何转换吧。
二、坐标系的种类
为什么要有这么多坐标系,因为国内对地理坐标有特殊的政策,防止外部势力轻易获取详细的各种重点设施的地理坐标,所以就规定了GPS获取的原始坐标,不允许在网上对外提供,凡是电子地图,就必须对位置做偏移处理,同时偏移不是简单的线性偏移,而是根据不同的算法,计算得出的结果,这就是不同的坐标系。不同坐标系下,偏移值在几十到几百米不等。
1、地心坐标系WGS-84
地心坐标系,也是GPS原始的坐标体系,目前世界上通用的坐标系就是它,代表厂商有MapBox、Cerium、OpenStreeMap、BingMap等。
2、火星坐标系GCJ-02
火星坐标系,由地心坐标系WGS-84加密后形成,制订方是中国国家测绘局,目前在高德、腾讯、谷歌中国、阿里云地图等地图厂商,用得就是该坐标系。
3、百度坐标系BD-09
百度坐标系,作为国内地图老东家,百度拥有自己的坐标系BD-09,他是在火星坐标系GCJ-02的基础上,再次加密得来的。
目前而言就只有百度相关产品在使用。
这里就需要注意了,如果之前都是用的高德、腾讯等地图产品,转战百度地图后,记得根据不同坐标系对坐标进行转换。
4、天地图CGCS2000
天地图是我国当前最新的国家大地坐标系,原点为包括海洋和大气的整个地球的质量中心,和WGS-84坐标系的椭球体基本类似,偏差值在0.11mm, 所以天地图和WGS-84基本可以兼容使用。
目前由国家地理信息公共服务平台,提供天地图的相关产品。
三、推荐一个好用的工具库coordtransform
coordtransform工具库,提供了百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、
和WGS84坐标系之间的转换的工具模块,天地图的话,就默认用WGS84的相关方法即可
1、用法
// 安装
npm install coordtransform
2、引入使用
// 在对应文件里
var coordtransform=require('coordtransform')
//百度经纬度坐标转国测局坐标 参数,经度lng,纬度lat
var bd09togcj02=coordtransform.bd09togcj02(116.404, 39.915)
// 返回格式为【经度,纬度】数组
// 如上面的bd09togcj02=[ 116.39762729119315, 39.90865673957631 ]
其他函数顾名思义,都是从一个坐标系转换成另一个坐标系。
gcj02tobd09、wgs84togcj02、gcj02towgs84
四、坐标系之间的转换
我把目前收集到的通用转换代码,放到了在线连接上,可自取。
目前提供了百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换,基本和第三点用法相似。
有需要的jym,可以copy下来,放到自己的项目里去,全局或者局部引入都可,比第三方库用着稳定,也可以按自己的业务逻辑,随意修改源码,更改返回形式。
五、小结
坐标偏移基本只有国内范围才需要,国外的坐标不需要偏移。
多学一点,多知道一些,有备无患,指不定将来啥时候就用得上。
ps: 我是地霊殿__三無,希望能帮到你。