咱們經常會有這樣的需求,獲取當前位置並顯示在地圖上或者是根據當前位置匹配當前位置供用戶選擇。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