百度地圖API圖示、文字、圖例與連線

三人行工作室發表於2019-05-24

百度地圖開放平臺功能強大,使用簡單,為地圖的自定義提供了非常方便的途徑!

本文以繪製一張全國機器輻射圖為例記錄其基本使用方法,效果如下圖:

百度地圖API圖示、文字、圖例與連線

圖中包括了帶圖示和文字的標註,連線以及圖例。

1.關於座標

說到地圖,不得不說座標。

我以為,GPS獲取經緯度之後,把經緯度丟給地圖就可以了。但那真的是自以為

1.1 座標系

來看看實際情況,以下是百度開發文件裡的描述:

目前國內主要有以下三種座標系:

WGS84:為一種大地座標系,也是目前廣泛使用的GPS全球衛星定位系統使用的座標系。

GCJ02:又稱火星座標系,是由中國國家測繪局制訂的地理資訊系統的座標系統。由WGS84座標系經加密後的座標系。

BD09:為百度座標系,在GCJ02座標系基礎上再次加密。其中bd09ll表示百度經緯度座標,bd09mc表示百度墨卡托米制座標。

非中國地區地圖,服務座標統一使用WGS84座標。

百度對外介面的座標系為BD09座標系,並不是GPS採集的真實經緯度,在使用百度地圖JavaScript API服務前,需先將非百度座標通過座標轉換介面轉換成百度座標。

通過 GPS 獲取的為 WGS84,在百度地圖上使用前要轉換為 BD09,百度提供了相應的 api 進行座標轉換,文件地址:http://lbsyun.baidu.com/index.php?title=webapi/guide/changeposition

http://api.map.baidu.com/geoconv/v1/?coords=114.21892734521,29.575429778924&from=1&to=5&ak=s1eeiQEfDF0WZfdfvLgHbG2Ru49UNCrn

返回結果:
{
    status : 0,
    result :
    [
        {
            x : 114.23074871003,
            y : 29.579084787993
        } 
    ]
}

具體還可參考下這篇文章:https://www.cnblogs.com/yesicoo/p/4668642.html

1.2 座標拾取器

如果座標是靜態的,或測試用,可以直接通過百度地圖提供的“座標拾取器”工具來獲取經緯度。

工具地址:http://api.map.baidu.com/lbsapi/getpoint/index.html

點哪就獲取哪的座標,此座標不用再轉換,複製過來即可以使用。

2. 開始應用

2.1 準備圖示

有好些站點可以下載圖示,如:https://easyicon.net,可以獲取一些圖示檔案。至於商用的要求則要看看站點說明。

如下圖,這裡準備總部與機器的圖示下載儲存為 head.png、machine.png。

百度地圖API圖示、文字、圖例與連線

2.2 開啟百度地圖

地圖API的使用需要先申請一個 ak,為了體驗方便,這裡已經申請了一個可以直接使用的 key,在頁面中可直接加入以下引用。

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

使用以下語句,定義全域性的地圖物件

    // 百度地圖 API 功能物件
    var map = null;
    if (BMap) {
        map = new BMap.Map("allmap");  // id=allmap 的容器內顯示
        map.enableScrollWheelZoom();
    }

2.2 標註:圖示與文字

標註使用 BMap.Marker,可以為其指定 Icon與Label。為了方便後續使用,本例定義以下函式,指定位置、圖示(本例中可用已經下載的圖示 head,machine)以及文字即可。

    /**
    * 指定經緯度,圖示,標註文字
    * 在地圖上新增標註
    * longitude 經度
    * latitude  緯度
    * icon      圖示
    * text      標註文字
    **/
    function addMarker(longitude, latitude, icon, text) {
        if (!map) return;

        var point = new BMap.Point(longitude, latitude); 
        var myIcon = new BMap.Icon(icon + ".png", new BMap.Size(32, 32));
        // 指定位置及標註的圖示
        var marker = new BMap.Marker(point, { icon: myIcon });  // 建立標註
        if(text){
            var label = new BMap.Label(text, { offset: new BMap.Size(32, -16) });
            marker.setLabel(label);
        }
        // 新增到地圖上
        map.addOverlay(marker);          
    }

2.3 連線

連線實際使用的是繪製多邊形的功能,只是當只指定了兩個點時,就是一根線。同樣,這裡定義一個函式以方便直接呼叫。

    /**
    * 指定起止經緯度,繪製連線線
    * 
    * longitudeFrom 經度
    * latitudeFrom  緯度
    * longitudeTo   經度
    * latitudeTo    緯度
    **/
    function addLine(longitudeFrom, latitudeFrom, longitudeTo, latitudeTo) {
        if (!map) return;

        var pointFrom = new BMap.Point(longitudeFrom, latitudeFrom); 
        var pointTo = new BMap.Point(longitudeTo, latitudeTo); 
        // 可以指定多點連線,此處只考慮兩點
        var line = new BMap.Polyline([pointFrom, pointTo], { strokeWeight:1, strokeOpacity:0.5, strokeColor:"red" });
        // 新增到地圖上
        map.addOverlay(line);     
    }

2.4 圖例

圖例需要以地圖定義的控制元件方式來新增,在控制元件的 initialize 事件中完成 DOM 元素的生成即可,為了體現過程本身,以下函式把 DOM 的html文字作為引數,由外部靈活定義。

    /**
    * 新增圖例
    * 實質就是在地圖上新增自己的頁面元素 
    *
    * html 網頁元素
    **/
    function addLegend(html){
        var LegendControl = function () {
            this.defaultAnchor = BMAP_ANCHOR_TOP_LEFT;
            this.defaultOffset = new BMap.Size(10, 10);
        }

        LegendControl.prototype = new BMap.Control();
        LegendControl.prototype.initialize = function (map) {
            var le = $(html)[0];
            map.getContainer().appendChild(le);
            return le;
        };

        var legendCtrl = new LegendControl();
        map.addControl(legendCtrl);
    } 

2.5 綜合

有了以上函式,綜合起來就流程清晰了。以下座標,均通過座標拾取器獲取。

    // 機器類:經度,緯度,名稱
    function Machine(longitude, latitude, name){
        this.longitude = longitude;
        this.latitude = latitude;
        this.name = name;
    } 

    // 確定地圖的中心位置與縮放級別
    var center = new BMap.Point(110.423997,31.40979);             
    map.centerAndZoom(center, 6);  // 級別 6,跨省檢視

    // 新增圖例,自由寫 html
    addLegend("<div style='font-size:12px; color:gray; width:140px; padding:5px; background:white; text-align:center; border:solid 1px gray;'>總部:<img src='head.png' style='width:16px; vertical-align:middle;' />&nbsp;&nbsp;裝置:<img src='machine.png'  style='width:16px; vertical-align:middle;' /></div>");

    // 總部位置
    var head = { longitude : 112.918702343957, latitude : 28.30070516 };
    addMarker(head.longitude, head.latitude, 'head', '總部');

    // 所有機器位置
    var machineList = [
        new Machine(114.876143,38.113315,'石家莊'),
        new Machine(112.521289,37.822014,'太原'),
        new Machine(108.989008,34.328175,'西安'),
        new Machine(117.230997,31.881961,'合肥'),
        new Machine(103.984944,30.553819,'成都'),
        new Machine(108.400295,22.862517,'南寧'),
        new Machine(113.257181,23.169067,'廣州'),
        new Machine(120.174565,30.298715,'杭州'),
        new Machine(102.881106,24.959705,'昆明')
    ];

    // 新增所有機器並連線
    for(var i=0; i<machineList.length; i++){
        addMarker(machineList[i].longitude, machineList[i].latitude, 'machine', machineList[i].name);
        addLine(head.longitude, head.latitude, machineList[i].longitude, machineList[i].latitude);
    } 

3. 結語

本文完整程式碼可從此處下載:

https://github.com/triplestudio/helloworld/blob/master/baidu_map_demo.html

在此基礎上,可以根據需要進一步擴充套件功能,具體參考百度地圖開放平臺開發文件:

http://lbsyun.baidu.com/

相關文章