溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

百度地圖坐標(biāo)轉(zhuǎn)換

發(fā)布時間:2020-06-15 16:31:54 來源:網(wǎng)絡(luò) 閱讀:6965 作者:qllinhongyu 欄目:移動開發(fā)

   在上一篇博文(HTML5地理位置定位)中介紹了如何用HTML5獲取當(dāng)前用戶的地理坐標(biāo)信息。得到了這么重要的數(shù)據(jù),我們就可以通過調(diào)用地圖接口,實現(xiàn)很多屌炸天的功能。

   先給大家看個我通過HTML5獲取到自己的坐標(biāo)信息后,再調(diào)用百度地圖接口定位的截圖:

百度地圖坐標(biāo)轉(zhuǎn)換

   哎喲我去,第一張圖不對啊,這地圖上顯示的地理位置與我實際的地理位置不符呀!偏離的好遠!是百度地圖定位不準(zhǔn)確嗎?其實根本不是百度地圖的問題,而是你提供的地理坐標(biāo)不對!坐標(biāo)怎么會不對呢?客官別急,讓我慢慢道來:

   首先,我這個Demo背景是用HTML5 Geolocation特性通過GPS設(shè)備“愛瘋”獲取來的地理坐標(biāo)信息(GPS設(shè)備獲取的坐標(biāo)),根據(jù)相關(guān)法律的規(guī)定,GPS獲取的原始坐標(biāo)又不能在互聯(lián)網(wǎng)上對外提供。

   其次,不同的API提供商可能會使用不同的坐標(biāo)系,例如google地圖、百度地圖、soso地圖……他們的坐標(biāo)系都有所差異。

   簡單的說,就是我現(xiàn)在GPS設(shè)備獲取的坐標(biāo),如果要在百度地圖中精確定位的話,那就得把GPS原坐標(biāo)轉(zhuǎn)換為百度地圖的坐標(biāo)系。同理,如果調(diào)用的是別家地圖API,你也得把坐標(biāo)轉(zhuǎn)換為他們的體系。


   那到底該怎么轉(zhuǎn)換坐標(biāo)呢?放心,API提供商早就為大家準(zhǔn)備好了接口。本文就以百度地圖為例:

   百度地圖官方文檔:http://developer.baidu.com/map/changeposition.htm文檔已經(jīng)寫了很清楚,我就不細說了,結(jié)合下本文的Demo給大家講講我的做法。

   (1)首先你要成為百度開發(fā)者,要獲取百度給你的密鑰,這樣你才可以調(diào)用百度的API;

   (2)按照請求參數(shù)說明拼寫發(fā)送http請求的url;發(fā)送的請求格式是:http://api.map.baidu.com/geoconv/v1/?(拼寫參數(shù))……

服務(wù)參數(shù)的詳情:

參數(shù)含義取值范圍是否必須默認取值
coords源坐標(biāo)

格式:經(jīng)度,緯度;經(jīng)度,緯度…


限制:最多支持100個

格式舉例:

114.21892734521,29.575429778924;

114.21892734521,29.575429778924

ak開發(fā)者密鑰
sn用戶的權(quán)限簽名
若用戶所用ak的校驗方式為sn校驗時該參數(shù)必須。(sn生成算法)
from源坐標(biāo)類型

取值為如下:

1:GPS設(shè)備獲取的角度坐標(biāo);

2:GPS獲取的米制坐標(biāo)、sogou地圖所用坐標(biāo);

3:google地圖、soso地圖、aliyun地圖、mapabc地圖和amap地圖所用坐標(biāo)

4:3中列表地圖坐標(biāo)對應(yīng)的米制坐標(biāo)

5:百度地圖采用的經(jīng)緯度坐標(biāo)

6:百度地圖采用的米制坐標(biāo)

7:mapbar地圖坐標(biāo);

8:51地圖坐標(biāo)

默認為1,即GPS設(shè)備獲取的坐標(biāo)
to目的坐標(biāo)類型

有兩種可供選擇:5、6。

5:bd09ll(百度經(jīng)緯度坐標(biāo)),

6:bd09mc(百度米制經(jīng)緯度坐標(biāo));

默認為5,即bd09ll(百度坐標(biāo))
output返回結(jié)果格式

json或者xml

json

   (3)接收返回的數(shù)據(jù)(json或者xml格式),這個返回的格式就是依據(jù)之前你發(fā)送的url請求中output這個參數(shù)來定的,默認返回的是json格式。

返回值說明:

名稱類型含義取值范圍
statusinit狀態(tài)碼正常0,異常非0,詳細見狀態(tài)碼說明
resultjson或者xml數(shù)組轉(zhuǎn)換結(jié)果與輸入順序一致

xfloat橫坐標(biāo)
yfloat縱坐標(biāo)

例如你發(fā)送的url為:http://api.map.baidu.com/geoconv/v1/?coords=114.21892734521,29.575429778924;114.21892734521,29.575429778924&from=1&to=5&ak=你的密鑰

則返回的json格式:

{
    status : 0,
    result :
    [
        {
            x : 114.23074871003,
            y : 29.579084787993
        },
        {
            x : 114.23075628327,
            y : 29.579081090996
        }
    ]
}

   

   廢話說了一大堆,還是趕緊上Demo源碼:

function initdata(){ //頁面初始化
        if (navigator.geolocation){
            navigator.geolocation.getCurrentPosition(showPosition,showError);//HTML5獲取GPS設(shè)備地理位置信息
        }else{
            document.getElementById("allmap").innerHTML="Geolocation is not supported by this browser.";
        }
    }
    function showPosition(position){
        var x=position.coords.latitude;//獲取緯度
        var y=position.coords.longitude;//獲取經(jīng)度
        //轉(zhuǎn)為百度地圖坐標(biāo)
        //注意點:1、coords的經(jīng)度、緯度順序(可多組坐標(biāo)轉(zhuǎn)換,以;(分號)隔開)。2、from與to的準(zhǔn)確性。3、callback為回調(diào)函數(shù)
        var positionUrl = "http://api.map.baidu.com/geoconv/v1/?coords="+y+","+x+"&from=1&to=5&ak=你的密鑰&callback=getMap";
        var script = document.createElement('script');
        script.src = positionUrl;
        document.getElementsByTagName("head")[0].appendChild(script);
    }
    function getMap(data){
        //返回的狀態(tài)碼,0為正常;1為內(nèi)部錯誤;21為from非法;22為to非法;24為coords格式非法;25為coords個數(shù)非法,超過限制  
        if(data.status!=0){
            alert("地圖坐標(biāo)轉(zhuǎn)換出錯");
            return ;
        }
        //result為數(shù)組
        var result = data.result;
        var lon = result[0].x;//經(jīng)度
        var lat = result[0].y;//緯度
                                                                                               
        // 百度地圖API功能
        var map = new BMap.Map("allmap");            // 創(chuàng)建Map實例
        var point = new BMap.Point(lon,lat);
        map.centerAndZoom(point, 14);
        map.addControl(new BMap.ZoomControl());          //添加地圖縮放控件
        var marker1 = new BMap.Marker(point);  // 創(chuàng)建標(biāo)注
        map.addOverlay(marker1);              // 將標(biāo)注添加到地圖中
        //創(chuàng)建信息窗口
        var infoWindow1 = new BMap.InfoWindow("您當(dāng)前所處的位置,經(jīng)度:"+lon+";緯度:"+lat);
        marker1.addEventListener("click", function(){this.openInfoWindow(infoWindow1);});
    }
    //HTML5獲取地理位置信息錯誤處理
    function showError(error)
  {
  switch(error.code)
    {
    case error.PERMISSION_DENIED:
      document.getElementById("allmap").innerHTML="User denied the request for Geolocation."
      break;
    case error.POSITION_UNAVAILABLE:
      document.getElementById("allmap").innerHTML="Location information is unavailable."
      break;
    case error.TIMEOUT:
      document.getElementById("allmap").innerHTML="The request to get user location timed out."
      break;
    case error.UNKNOWN_ERROR:
      document.getElementById("allmap").innerHTML="An unknown error occurred."
      break;
    }
  }

   

   不搭嘎的結(jié)語:嗯,雖然還很菜,但一直在努力,堅持博客分享。文章中若有不足或不正確之處,還望大家指正。

   

附件:http://down.51cto.com/data/2364365
向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI