php,調用百地圖度API實現標記

來源:互聯網
上載者:User

標籤:des   c   style   class   blog   code   

最近一個項目需要用到地圖的定位和標記功能,本來考慮使用google map API 。但是在國內這個速度確實很慢,有時候載入到一半就出現錯了,不過可以通過google agent 來解決在國內的訪問速度的問題,但是這樣還是很麻煩。所以自己決定使用百度地圖的API來實現。好了直接先上一張吧,地圖的地區是隨便選的。

完成的功能:

1.根據提供的地址在地圖上定位

2.建立了多邊形地區,該地區可以靈活的標記,例如關於一些配送範圍,就可以通過標記來完成。

要實現以上效果需要以下步驟:

1.先申請百度地圖API 的訪問的 key(ak) ,可以通過這個地址來申請:http://lbsyun.baidu.com/apiconsole/key?application=key

在申請key的時候你需要確定的是你的這個key的應用類型是什麼,server or mobile ... 可以參考:

2.在你的工程中直接引入百度V1.3的介面檔案

<script src="http://api.map.baidu.com/api?v=1.3&ak=you key"  type="text/javascript"></script>

其中如果你引入的版本低於1.3,那麼這塊需要將ak換成key 就好了,you key 就是申請的key , 在這裡我的key的應用類型是 for browser的。

3.javascript 代碼部分

    var map = new BMap.Map("container");       var mypoint = new BMap.Point(116.404, 39.915);    // 建立點座標     map.centerAndZoom(mypoint,15); // 初始化地圖,設定中心點座標和地圖層級    //    map.setMapType(BMAP_SATELLITE_MAP); 設定地圖類型    var marker = new BMap.Marker( mypoint );    map.addOverlay( marker );    marker.addEventListener("click", function(){                 var infoWin = new BMap.InfoWindow("your show information");//定義顯示資訊                         this.openInfoWindow(infoWin);    });        var x1 = mypoint.lat+0.002;    var x2 = mypoint.lat- 0.002;    var y1 = mypoint.lng + 0.002;    var y2 = mypoint.lng - 0.002;                 var secRing = [            new BMap.Point(y1, x1),  // 經度 緯度            new BMap.Point(y1, x2),            new BMap.Point(y2, x2),            new BMap.Point(y2, x1)        ];                        //建立多邊形    var secRingPolygon = new BMap.Polygon(                secRing,                {                    strokeColor:"#f50704",                    fillColor:"#FF0000",                    strokeWeight:2,                     fillOpacity:0,                    strokeOpacity:0.8                }    );    map.addOverlay(secRingPolygon);    map.enableScrollWheelZoom();    //啟用滾輪放大縮小,預設禁用    map.enableContinuousZoom();    //啟用地圖慣性拖拽,預設禁用    // 建立Map執行個體    map.addControl(new BMap.NavigationControl());  //添加預設縮放平移控制項    map.addControl(new BMap.OverviewMapControl({ isOpen: true, anchor: BMAP_ANCHOR_BOTTOM_RIGHT }));   //右下角,開啟        

其中 secRing 部分是構造矩形地區的代碼,該矩形地區是由API中提供的 Polygon 來實現的。以上代碼的效果是該多邊形地區是不可以自由標記的。所以需要在把secRingPolygon加到map之前,需要用以下代碼來允許該多邊形地區可編輯。

secRingPolygon.enableEditing();

以上的代碼就可以實現。但是如果需要把多邊形每次編輯的座標記錄下來,或者是記錄編輯地區的運動軌跡,那麼就需要secRingPolygon添加一個事件(mouseout),然後通過getPath這個函數來擷取編輯後的軌跡。如果有業務的需求,你可以把該軌跡儲存到資料庫中,當下次載入的時候,你可以直接把該軌跡估值給secRing 這個數組,這樣你的標記就可以在地圖上顯示。

//添加事件            secRingPolygon.addEventListener("mouseout", function(){                var pathObj = secRingPolygon.getPath();            var htmlStr = "";            for(var i in pathObj){                var position = pathObj[i];                htmlStr += position.lng +","+position.lat+ "<br>";                        }             document.getElementById(‘info‘).innerHTML = htmlStr        }); 

這塊直接把運動後的軌跡輸出到頁面。

還有就是如果通過一個給定的地址來在地圖上標記出來,目前採用的是通過PHP提供的curl介面,調用geocoder的v2 api 來得到改地址的經緯度。

可以參考:http://developer.baidu.com/map/webservice-geocoding.htm

該介面返回的參數格式可以選擇json或者是其它的。json格式返回結果的如下:

//不帶回呼函數的傳回值{    status: 0,    result:     {        location:         {            lng: 116.30814954222,            lat: 40.056885091681        },    precise: 1,    confidence: 80,    level: "商務大廈"    }}

PHP代碼如下:

        $address = urlencode($addr);        $url = "http://api.map.baidu.com/geocoder/v2/?address=$address&output=json&ak=your key";        $ch = curl_init();        curl_setopt($ch, CURLOPT_URL, $url);        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);        $response = curl_exec($ch);        curl_close($ch);        $result = json_decode($response, true);        $lat = $result["result"]["location"]["lat"];        $lng = $result["result"]["location"]["lng"];

其中你的 addr就是地址,需要用urlencode進行轉義。

這樣你就可以擷取到當前地址的經度和緯度資訊,然後輸出到前端,再調用 new BMap.Point(lat,lng); 來進行渲染。

這塊你可以對baidu map API 再次封裝,供項目中其它的地方使用。地圖API的功能遠不止這些,還有很多用法可以直接參考百度 map API 的手冊。

還有更多的demo可以參考:http://developer.baidu.com/map/jsdemo.htm

好了!!!!

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.