百度地圖實現復雜覆蓋物(Overlay)比如:Echarts


先來看效果圖

效果圖

一 前置知識

  1. 官方Overlay-覆蓋物的抽象基類
方法 返回值 描述
initialize(map: Map) HTMLElement 抽象方法,用於初始化覆蓋物,當調用map.addOverlay時,API將調用此方法。自定義覆蓋物時需要實現此方法。自定義覆蓋物時需要將覆蓋物對應的HTML元素返回
isVisible() Boolean 判斷覆蓋物是否可見
draw() none 抽象方法,當地圖狀態發生變化時,由系統調用對覆蓋物進行繪制。自定義覆蓋物需要實現此方法
show() none 顯示覆蓋物。對於自定義覆蓋物,此方法會自動將initialize方法返回的HTML元素樣式的display屬性設置為空
hide() none 隱藏覆蓋物。對於自定義覆蓋物,此方法會自動將initialize方法返回的HTML元素樣式的display屬性設置為none
  1. 重點方法講解

    • initialize(map: Map)

      初始化覆蓋物,當調用map.addOverlay(--),會自動調用,自定義Overlay在此處可以定義呈現在地圖上的HTML元素

    • draw()

      當地圖發生變化,會自動調用此方法,進行覆蓋物的重繪工作

    • map.pointToOverlayPixel(point);

      將經緯度坐標轉換成屏幕的像素坐標,此像素坐標就是ECharts圖形渲染在地圖中的位置

  2. 自定義實現,需要實現對 initialize 和draw 方法進行實現,達到自定義Overlay的目的

  3. MapPanes

    此類表示地圖上所有覆蓋物的容器集合,沒有構造函數,通過對象字面量形式表示。通過Map的getPanes方法可獲得該對象實例。通過 map.getPanes().labelPane.appendChild(div); 將自定義的div添加到覆蓋物列表

二 實現

  1. 新建complexCustomOverlay.js文件,廢話少說,直接代碼
!function(baiduMap) {
        /** * 自定義覆蓋物類, 取名 ComplexCustomOverlay 使用時直接 new ComplexCustomOverlay 即可 * 示例 new ComplexCustomOverlay(121.620483, 31.291102, function(div_obj){}); * @param {*} lng 經度 * @param {*} lat 維度 * @param {*} callback 回調方法 */
        ComplexCustomOverlay = function(lng, lat, callback) {
            this._point = new baiduMap.Point(lng, lat);
            this._callback = callback;
        };
		//繼承Overlay基類
        ComplexCustomOverlay.prototype = new baiduMap.Overlay();
		/** * 實現initialize方法,此方法在map.addOverlay(--)時會自動調用,完成初始化工作 */
        ComplexCustomOverlay.prototype.initialize = function(map) {
            this._map = map;
            //生成div,用來承載ECharts
            var div = this._div = document.createElement("div");
            // 可以根據情況添加些樣式信息
            // div.style.backgroundColor = "#fff";
            div.style.zIndex = baiduMap.Overlay.getZIndex(this._point.lat);
            div.style.width = "100px";
            div.style.height = "100px";
            // marginLeft marginTop 的設置可以讓這個div的中心點和給定的經緯度重合
            div.style.marginLeft = '-50px';
            div.style.marginTop = '-50px';
            //必須是絕對定位,不然會偏離原來位置
            div.style.position='absolute';
            //將該覆蓋物添加到標簽覆蓋物列表
            map.getPanes().labelPane.appendChild(div);
            //調用傳入的回調方法
            this._callback(div);
            return div;
        };
		/** * 當地圖發生變化,會自動調用此方法,進行覆蓋物的重繪工作 * 例如 拖動地圖、地圖放大縮小等操作,都會自動調用draw方法進行重繪 */
        ComplexCustomOverlay.prototype.draw = function(){
            //餅圖的位置設置,需要獲取該地圖點的像素位置x,y
            var pixel = this._map.pointToOverlayPixel(this._point);
            this._div.style.left = pixel.x + "px";
            this._div.style.top  = (pixel.y - 30) + "px";
        }
}(BMap); // 將BMap作為參數傳入
  1. 調用
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>百度地圖結合ECharts實現復雜覆蓋物(Overlay)</title>
    <style> html, body { margin: 0; padding: 0; height: 100%; width: 100%; } #map { height: 100%; width: 100%; } </style>
    <script type="text/javascript" src="./js/echarts.min.js"></script>
    <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=5ieMMexWmzB9jivTq6oCRX9j&callback"></script>
    <script type="text/javascript" src="./js/complexCustomOverlay.js"></script>
</head>
<body>
    <div id="map"></div>
</body>
</html>

<script type="text/javascript"> var map = new BMap.Map("map"); // 創建Map實例 map.centerAndZoom(new BMap.Point(121.620523, 31.290215), 18); map.setCurrentCity("上海"); map.enableScrollWheelZoom(true); // 地圖加載完成事件 // map.addEventListener("tilesloaded",function(){alert("地圖加載完畢");}); map.addEventListener('zoomend', function(e){ var zoom = e.target.getZoom(); if(zoom < 17) { // 小於17級,統計圖 myCompOverlay.hide(); } else { myCompOverlay.show(); } }); var drawPie = function(obj) { //map.removeOverlay(overlay: Overlay) //map.clearOverlays() var echarts2 = echarts.init(obj); var option = { tooltip : { trigger: 'item', formatter: "{b}:{c}" }, series : [ { name: '人流統計圖', type: 'pie', radius : ['0', '35%'], data:[ {value:679, name:'人流數量'} ], color:['green'],// 餅圖的顏色 label: { normal: { show: true, position: 'inside', padding: [0, 0, 20, 0], formatter: '{c}' }, }, labelLine: { show: false } }, { name: '垃圾桶數量統計', type: 'pie', radius : ['40%', '100%'], data:[ {value:335, name:'干垃圾桶'}, {value:110, name:'濕垃圾桶'}, {value:210, name:'可回收垃圾桶'}, {value:410, name:'有害垃圾桶'} ], itemStyle: { emphasis: { shadowBlur: 10, shadowOffsetX: 0, shadowColor: 'rgba(0, 0, 0, 0.5)' } }, label: { normal: { show: true, position: 'inside', formatter: '{c}' } }, labelLine: { show: false } } ] }; echarts2.setOption(option); }; // 實例化自定義Overlay,傳入經緯度以及回調方法 var myCompOverlay = new ComplexCustomOverlay(121.620483, 31.291102, drawPie); map.addOverlay(myCompOverlay); </script>

轉載於:https://www.cnblogs.com/itgiser/p/11463352.html


免責聲明!

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



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