咱们经常会有这样的需求,获取当前位置并显示在地图上或者是根据当前位置匹配当前位置供用户选择。php
咱们在这时候想到的必定是使用国内三大地图api来实现功能,事实上固然,程序员不该该重复造轮子,况且是如此大的一个工程。html
but! 大家有没有发现,每当大家使用定位获取到经纬度而且使用api进行地质解析的时候,获取到的地址总与真实地址有差别。git
通常人遇到这些问题的时候就当作定位偏差了,没有深层次考虑缘由就提交,测试也以为这是合理偏差。。。程序员
可是,我要说的是,真不是定位问题!web
定位偏差是存在的,可是这每每不是形成你位置偏移的主要缘由,你和精确的位置之间可能只差了一个坐标系!算法
众所周知地球是一个不规则椭圆体,GIS中的坐标系定义由基准面和地图投影两组参数肯定,而基准面的定义则由特定椭球体及其对应的转换参数肯定。 基准面是利用特定椭球体对特定地区地球表面的逼近,所以每一个国家或地区均有各自的基准面。基准面是在椭球体基础上创建的,椭球体能够对应多个基准面,而基准面只能对应一个椭球体。json
意思就是不管是谷歌地图、搜搜地图仍是高德地图、百度地图区别只是针对不一样的大地地理坐标系标准制做的经纬度,不存在准不许的问题,你们都是准的只是参照物或者说是标准不同。api
谷歌地图采用的是WGS84地理坐标系(中国范围除外),谷歌中国地图和搜搜中国地图采用的是GCJ02地理坐标系,百度采用的是BD09坐标系,而设备通常包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系。微信
记住,这一点很重要。ide
这么多坐标系为何不统一用WGS84呢,这就是国家地理测绘总局对于出版地图的要求,出版地图必须符合GCJ02坐标系标准了,也就是国家规定不能直接使用WGS84地理坐标系。
那么产生定位差的问题就很明显了,你把GPS芯片获取到的WGS84坐标系的坐标用到地图里,填错坑了。
var map = L.map('allmap',{
minZoom: 4,
maxZoom: 13,
crs: L.CRS.EPSG4326 // 设置成
}).setView([48.505, 3.09], 13);
复制代码
如上例中使用leaflet设置为EPSG4326坐标系(其实就是WGS84的别名),那么就不须要坐标转换,直接使用就能够了。
使用算法转换后的坐标系用在地图中就能够了。
例如在微信公众号中获取到的经纬度而后使用腾讯地图服务获取地址当前地址:
wx.getLocation({
success: (data) => {
let x = data.latitude;
let y = data.longitude;
let API_KEY = 'XXX-XXX';
jsonp(`https://apis.map.qq.com/ws/coord/v1/translate/?locations=${x},${y}&type=1&key=${API_KEY}&output=jsonp`, null, (err, res) => {
if (!err && res.status === 0) {
jsonp(`https://apis.map.qq.com/ws/geocoder/v1/?location=${res.locations[0].lat},${res.locations[0].lng}&key=${API_KEY}&get_poi=1&output=jsonp`, null, (err, data) => {】
if (err || data.status !== 0) {
... //do something
} else {
... //do something error
}
});
} else {
... //do something error
}
});
},
cancel: (res) => {
... //do something cancel
}
});
复制代码
如下为国内三大地图的坐标系转换api介绍:
腾讯地图坐标转换服务: lbs.qq.com/webservice_…
百度地图坐标转换服务: developer.baidu.com/map/wiki/in…
高德地图坐标转换服务: lbs.amap.com/api/webserv…
大部分人在获取到经纬度以后直接就放到地图中去展现了,这样获得的位置展现每每和真实位置相差甚远,只要加上坐标转换就没这个问题。
一些使用地图的经验分享给你们。
--The End