JavaScript中獲取地理位置方法的小總結

獲取地理位置的方式,介紹兩種,一種是使用微信的JSSDK接口,另一種是使用百度地圖API。git

1.微信JSSDK獲取地理位置

在微信瀏覽器中,使用JSSDK提供的接口,定位設備所在的位置,步驟以下:web

step1,綁定域名

先登陸微信公衆平臺進入「公衆號設置」的「功能設置」裏填寫「JS接口安全域名」(使你的域名得到使用接口的權限)
備註:登陸後可在「開發者中心」查看對應的接口權限。ajax

step2,引入JS文件

在須要調用JS接口的頁面引入以下JS文件,(支持https):
https://map.qq.com/api/js?v=2...
http://res.wx.qq.com/open/js/...
備註:支持使用 AMD/CMD 標準模塊加載方法加載json

step3,經過config接口注入權限驗證配置

備註:
1.全部須要使用JSSDK的頁面都必須配置config,不然沒法調用
2.相同的URL只會觸發一次,若是是動態變化的URL,則會在變化時主動去觸發
3.Android微信客戶端不支持pushState的H5新特性,因此使用pushState來實現web app的頁面會致使簽名失敗,此問題會在Android6.2中修復
4.在js中,能夠經過ajax請求去後臺獲取appId這些,在PHP中能夠經過微信JSSDK中的方式獲取;api

$.ajax({
        type: 'get',
        url: '後臺接口URL,去獲取appId等',
        dataType: 'jsonp', //與後臺商議JSONP或者JSON
        jsonp: "callback",
        data: {
            url: location.href.split('#')[0] //當前頁面的URL,此種方式是爲了不在微信中分享只後,會在URL後追加'#fdsfsd',在這裏只須要拿到#以前的部分做爲合理的URL
        },
        success: function (result) {
          console.log(result);
            if (result.status == 0) {
                wx.config({
                  debug: false, // 開啓調試模式,調用的全部api的返回值會在客戶端alert出來,若要查看傳入的參數,能夠在pc端打開,參數信息會經過log打出,僅在pc端時纔會打印。
                  appId: result.data.appid, // 必填,公衆號的惟一標識
                  timestamp: result.data.timestamp, // 必填,生成簽名的時間戳
                  nonceStr: result.data.noncestr, // 必填,生成簽名的隨機串
                  signature: result.data.signature, // 必填,簽名
                  jsApiList: ['checkJsApi','getLocation'] // 必填,使用的JSSSK接口,其中checkJSAPI是必填的,能夠提早檢測客戶端是否支持你所使用的接口,若是不支持,則採用其餘方式處理
                });
             }
        },
        error: function(err){
            console.log(err); //ajax請求失敗
        }
    })

step4,經過ready接口處理成功驗證

wx.ready(function(){瀏覽器

// config信息驗證後會執行ready方法,全部接口調用都必須在config接口得到結果以後,
// config是一個客戶端的**異步操做**,因此若是須要在頁面加載時就調用相關接口,則須把相關接口放在**ready函數中調用來確保正確執行**。
// 對於用戶觸發時才調用的接口,則能夠直接調用,不須要放在ready函數中。

});安全

全部接口經過wx對象(也可以使用jWeixin對象)來調用,參數是一個對象,除了每一個接口自己須要傳的參數以外,還有如下通用參數:微信

1.success:接口調用成功時執行的回調函數。
2.fail:接口調用失敗時執行的回調函數。
3.complete:接口調用完成時執行的回調函數,不管成功或失敗都會執行。
4.cancel:用戶點擊取消時的回調函數,僅部分有用戶取消操做的api纔會用到。
5.trigger: 監聽Menu中的按鈕點擊時觸發的方法,該方法僅支持Menu中的相關接口app

備註:不要嘗試在trigger中使用ajax異步請求修改本次分享的內容,由於客戶端分享操做是一個同步操做,這時候使用ajax的回包會尚未返回。微信公衆平臺

以上幾個函數都帶有一個參數,類型爲對象,其中除了每一個接口自己返回的數據以外,還有一個通用屬性errMsg,其值格式以下:

調用成功時:"xxx:ok" ,其中xxx爲調用的接口名
用戶取消時:"xxx:cancel",其中xxx爲調用的接口名

wx.ready(function () {
    wx.getLocation({
    type: 'wgs84', // 默認爲wgs84的gps座標,若是要返回直接給openLocation用的火星座標,可傳入'gcj02'
    success: function (res) {
    // res 中返回經度和緯度,能夠根據需求是否轉換爲QQ地圖的精度
      let geocoder = new qq.maps.Geocoder({
        complete: function (result) {
        // result的值打印出來以下所示,能夠拿到地址和對應的城市名等信息,見下圖。                       
          var city = result.detail.addressComponents.city; 
          // to do what you want 
        }
      })
      var coord = new qq.maps.LatLng(res.latitude, res.longitude)
      geocoder.getAddress(coord);
    },
    cancel: function (res) {
      console.log('用戶拒絕受權獲取地理位置');
    },
    fail: function (res) {
      alert(JSON.stringify(res));
    }
  });
});

step5,經過error接口處理失敗驗證

wx.error(function(res){

// config信息驗證失敗會執行error函數,如簽名過時致使驗證失敗,具體錯誤信息能夠打開config的debug模式查看,也能夠在返回的res參數中查看,對於SPA能夠在這裏更新簽名。

});

到此爲止,在微信瀏覽器中獲取用戶的地理位置便可完成,在用戶首次進入該頁面時,會提示用戶是否給頁面受權使用地理位置,受權成功以後,將不會再次提示。

2.百度地圖API獲取地理位置

step1,引入js文件

http://api.map.baidu.com/api?...

step2,初始化位置對象,調用getCurrentPosition方法獲取位置

var geolocation = new BMap.Geolocation();
    geolocation.getCurrentPosition(function(r){
        if(this.getStatus() == BMAP_STATUS_SUCCESS){
            alert('您的位置:'+r.point.lng+','+r.point.lat);
        }
        else {
            alert('failed'+this.getStatus());
        }        
    },{enableHighAccuracy: true})

step3,將經緯度轉換爲具體位置

**此方法應該在getCurrentPosition的回調中執行;**
geoc.getLocation(r.point, function(rs){
    var addComp = rs.addressComponents;
    alert(addComp.province + ", " + addComp.city + ", " + addComp.district + ", " + addComp.street + ", " + addComp.streetNumber);
}

便可打印出你如今的街道的位置,很簡單對不對!!!
可是在微信中使用此方法時,每次進入頁面都會提示用戶受權,多是微信本身的隱私保護之類的緣由吧。

福利筆記^_^

獲取當前URL中的參數,須要注意的是最後的decodeURI,對於有中文的參數值很是有用。

function GetQueryString(name){
  var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
  var r = window.location.search.substr(1).match(reg);
  if(r!=null)
    return  decodeURI(r[2]);

參考文獻:
https://mp.weixin.qq.com/wiki...
http://lbsyun.baidu.com/jsdem...

相關文章
相關標籤/搜索