百度地圖ip定位,不算bug的bug


做為一個入行不足兩年的菜鳥,能在博客園寫下第一篇博客,是需要多大的勇氣啊。主要還是怕大神們噴啊。其次自己文筆實在太差了。 哈哈~還請各位大神,口下留情啊。

 

首先說下我的需求:一個需要城市分站的手機站。 當用戶訪問時自動定位到用戶所在的城市。因為之前做微信開發的時候,研究過一段時間的百度地圖api,拿到這個需求后,第一時間想到的就是ip定位api. 先貼出百度官方的說明:

IP定位 API是一個根據IP返回對應位置信息的http形式位置服務接口,支持多種語言調用,如C# 、C++、Java等,即通過發送http請求,返回json格式的位置數據(包括坐標值、省份、城市、百度城市代碼等)。

提供根據IP返回位置信息的功能,包括如下兩種情況:

1.獲取指定IP的位置信息:指定IP值,返回該IP對應的位置信息;

2.獲取當前設備IP的地址信息:根據用戶設備當前的IP返回位置信息;

 

使用方法

 

第一步,申請密鑰(ak) ,作為訪問服務的依據;

 

第二步,拼寫發送http請求的url,注意需使用第一步申請的ak;

 

第三步,接收http請求返回的數據(json格式)。

 

服務地址

 

URL:http://api.map.baidu.com/location/ip

 

接口參數

 

參數 含義 格式 說明
ip ip地址 string 可選,ip不出現,或者出現且為空字符串的情況下,會使用當前訪問者的IP地址作為定位參數
ak 用戶密鑰 string 必選,在lbs雲官網注冊的access key,作為訪問的依據
sn 用戶的權限簽名 string 可選,若用戶所用ak的校驗方式為sn校驗時該參數必須。(sn生成算法
coor 輸出的坐標格式 string 可選,coor不出現時,默認為百度墨卡托坐標;coor=bd09ll時,返回為百度經緯度坐標

 

 

 

 

 

返回值說明

 

返回結果(地址解析的結果)

 

  1. {  
  2.     address: "CN|北京|北京|None|CHINANET|1|None",   #地址  
  3.     content:       #詳細內容  
  4.     {  
  5.     address: "北京市",   #簡要地址  
  6.     address_detail:      #詳細地址信息  
  7.     {  
  8.     city: "北京市",        #城市  
  9.     city_code: 131,       #百度城市代碼  
  10.     district: "",           #區縣  
  11.     province: "北京市",   #省份  
  12.     street: "",            #街道  
  13.     street_number: ""    #門址  
  14.     },  
  15.     point:               #百度經緯度坐標值  
  16.     {  
  17.     x: "116.39564504",  
  18.     y: "39.92998578"  
  19.     }  
  20.     },  
  21.     status: 0     #返回狀態碼  
  22. }   
  23.                   
  24.               

 

 

我的實現流程是在頁面加載的時候,模擬執行http請求,根據返回值,判斷當前所在的城市。然后顯示不同城市的數據。

   

返回的結果如下:

1 {"address":"CN|\u6d59\u6c5f|None|None|CHINANET|None|None","content":{"address_detail":{"province":"\u6d59\u6c5f\u7701","city":"","district":"","street":"","street_number":"","city_code":29},"address":"\u6d59\u6c5f\u7701","point":{"y":"3374952.26","x":"13353719.99"}},"status":0}
View Code

然后解析這段json,就可以獲取到當前所在的城市,和當前的地理位置經緯度了。

做到這里,沒發現有什么端倪。 但當把程序發布后,部署到阿里雲后,奇跡出現了,無論我用任何設備訪問,獲取的位置都是北京。思索很久,也不得所知,畢竟本地執行是正確的。后來無意中發現公司的阿里雲的ip就是北京的,而獲取到的ip就和阿里雲的ip.當時的第一個想法就是百度的接口出現了bug,還蠻天真的給百度提交了bug反饋,希望他們能盡快修復,或者給我一個反饋。結果等了半個月,至今沒任何信息。 唉,誰讓咱太傻太天真了呢。

后來仔細想想,問題應該就是接口獲取到的是服務器端的位置。 因為代碼最終是通過客戶端發起的請求,然后服務器端在響應的時候運行的。換個思路來講,如果要定位客戶端的話,就必須在客戶端執行,想到這里,也就想到了解決方案了,那就是通過js,在客戶端獲取到位置信息,然后再跳轉到對應的城市分站。

 <script src="/js/jquery-1.4.4.js"></script>
    <script>
        $(function () {
            $.getJSON("http://api.map.baidu.com/location/ip?ak=此處是百度地圖分配的ak&callback=?", function (data) {
                alert(data.address);
            })
        })
    </script>
View Code

由於要客戶端執行,要考慮跨域的問題,所以在地址的后面要加上&callback=?,這樣就可以調用接口返回來的信息了。

 

寫完收工,大神請悠着點噴。歡迎指點。

還有,大家覺得這個算是一個bug嗎?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM