坐标转换概述
谷歌地图采用的是WGS84地理坐标系 (中国范围除外) ,谷歌中国地图和高德、腾讯等采用的是GCJ02地理坐标系,百度采用的是BD09坐标系,而设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系。我国要求互联网地图在国内必须至少使用GCJ02进行首次加密,不允许直接使用WGS84坐标下的地理数据,同时任何坐标系均不可转换为WGS84坐标。
这就是为什么设备采集的经纬度在地图上显示的时候经常有很大的偏差,远远超出民用GPS 10米偏移量的技术规范。
针对于此,国内地图服务都提供了对应的功能。比如百度地图使用的是BD09坐标系,百度地图定位服务可以设置返回经纬度坐标类型:
option.setCoorType("bd09ll");
//可选,设置返回经纬度坐标类型,默认GCJ02
//GCJ02:国测局坐标;
//BD09ll:百度经纬度坐标;
//BD09:百度墨卡托坐标;
//海外地区定位,无需设置坐标类型,只能统一返回WGS84类型坐标
要想正确在百度地图上显示点位,必须用BD09ll
。
而且百度地图不提供WGS84经纬度的定位服务。
要想用手机获取WGS84经纬度,必须调用原生定位去获取。
使用定位芯片或者原生定位能够获取到WGS84坐标。要想在地图上正确显示,还需要进行坐标转换。
比如百度地图提供提供非百度坐标转换为百度坐标的坐标转换功能:
WGS84(大地坐标系)→bd09(百度坐标系)
GCJ02(国测局坐标系)→bd09(百度坐标系)
千寻位置提供在线坐标转换服务,可以进行如下坐标转换:
BD09转化WGS84
BD09转化GCJ02
GCJ02转化WGS84
GCJ02转化BD09
如何在地图上输入坐标定位?
比如在谷歌地图在顶部的搜索框中,输入您的坐标。
以下示例是支持的坐标格式:
- 度分秒 (DMS):41°24’12.2"N 2°10’26.5"E
- 度和十进制分 (DMM):41 24.2028,2 10.4418
- 小数度数 (DD):41.40338,2.17403
比如GPS芯片模块传输过来的数据是$GNGGA数据,它的经纬度格式为ddmm.mmmm(度分格式)。
在谷歌地图上按度和十进制分输入查询即可。肯定会有较大的偏移,因为没有进行坐标转换。
WGS84转GCJ02可以使用在线转换工具。
补充
各种在线工具可能有不好用的时候,所以要是能自己写代码转换是最好的。
这里推荐一个**gcoord**库。
引入:
<script src="https://unpkg.com/gcoord/dist/gcoord.js"></script>
使用:
var result = gcoord.transform(
[116.403988, 39.914266], // 经纬度坐标
gcoord.WGS84, // 当前坐标系
gcoord.BD09 // 目标坐标系
);
console.log(result); // [116.41661560068297, 39.92196580126834]
这个转换结果和在线工具转换是一样的。