添加自定義覆蓋物
                編輯時間:2017-03-03

                zdy.jpg



                自定義覆蓋物

                API自1.1版本起支持用戶自定義覆蓋物。

                要創建自定義覆蓋物,您需要做以下工作:

                1.定義一個自定義覆蓋物的構造函數,通過構造函數參數可以傳遞一些自由的變量。

                2.設置自定義覆蓋物對象的prototype屬性為Overlay的實例,以便繼承覆蓋物基類。

                3.實現initialize方法,當調用map.addOverlay方法時,API會調用此方法。

                4.實現draw方法。

                定義構造函數并繼承Overlay

                首先您需要定義自定義覆蓋物的構造函數,在下面的示例中我們定義一個名為SquareOverlay的構造函數,它包含中心點和邊長兩個參數,用來在地圖上創建一個方形覆蓋物。

                // 定義自定義覆蓋物的構造函數 

                function SquareOverlay(center, length, color){   

                 this._center = center;   

                 this._length = length;   

                 this._color = color;   

                }   

                // 繼承APIBMap.Overlay   

                SquareOverlay.prototype = new BMap.Overlay();

                初始化自定義覆蓋物

                當調用map.addOverlay方法添加自定義覆蓋物時,API會調用該對象的initialize方法用來初始化覆蓋物,在初始化過程中需要創建覆蓋物所需要的DOM元素,并添加到地圖相應的容器中。

                地圖提供了若干容器供覆蓋物展示,通過map.getPanes方法可以得到這些容器元素,它們包括:

                floatPane

                markerMouseTarget

                floatShadow

                labelPane

                markerPane

                mapPane

                這些對象代表了不同的覆蓋物容器元素,它們之間存在著覆蓋關系,最上一層為floatPane,用于顯示信息窗口內容,下面依次為標注點擊區域層、信息窗口陰影層、文本標注層、標注層和矢量圖形層。

                我們自定義的方形覆蓋物可以添加到任意圖層上,這里我們選擇添加到markerPane上,作為其一個子結點。

                // 實現初始化方法 

                SquareOverlay.prototype.initialize = function(map){   

                // 保存map對象實例  

                 this._map = map;       

                 // 創建div元素,作為自定義覆蓋物的容器  

                 var div = document.createElement("div");   

                 div.style.position = "absolute";       

                 // 可以根據參數設置元素外觀  

                 div.style.width = this._length + "px";   

                 div.style.height = this._length + "px";   

                 div.style.background = this._color;     

                // div添加到覆蓋物容器中  

                 map.getPanes().markerPane.appendChild(div);     

                // 保存div實例  

                 this._div = div;     

                // 需要將div元素作為方法的返回值,當調用該覆蓋物的show、  

                // hide方法,或者對覆蓋物進行移除時,API都將操作此元素。  

                 return div;   

                }

                繪制覆蓋物

                到目前為止,我們僅僅把覆蓋物添加到了地圖上,但是并沒有將它放置在正確的位置上。您需要在draw方法中設置覆蓋物的位置,每當地圖狀態發生變化(比如:位置移動、級別變化)時,API都會調用覆蓋物的draw方法,用于重新計算覆蓋物的位置。通過map.pointToOverlayPixel方法可以將地理坐標轉換到覆蓋物的所需要的像素坐標。

                // 實現繪制方法  

                SquareOverlay.prototype.draw = function(){   

                // 根據地理坐標轉換為像素坐標,并設置給容器   

                 var position = this._map.pointToOverlayPixel(this._center);   

                 this._div.style.left = position.x - this._length / 2 + "px";   

                 this._div.style.top = position.y - this._length / 2 + "px";   

                }

                移除覆蓋物

                當調用map.removeOverlay或者map.clearOverlays方法時,API會自動將initialize方法返回的DOM元素進行移除。

                顯示和隱藏覆蓋物

                自定義覆蓋物會自動繼承Overlay的show和hide方法,方法會修改由initialize方法返回的DOM元素的style.display屬性。如果自定義覆蓋物元素較為復雜,您也可以自己實現show和hide方法。

                // 實現顯示方法   

                SquareOverlay.prototype.show = function(){   

                 if (this._div){   

                   this._div.style.display = "";   

                 }   

                }     

                // 實現隱藏方法 

                SquareOverlay.prototype.hide = function(){   

                 if (this._div){   

                   this._div.style.display = "none";   

                 }   

                }

                自定義其他方法 通過構造函數的prototype屬性,您可以添加任何自定義的方法,比如下面這個方法每調用一次就能改變覆蓋物的顯示狀態:

                // 添加自定義方法  

                SquareOverlay.prototype.toggle = function(){   

                 if (this._div){   

                   if (this._div.style.display == ""){   

                     this.hide();   

                   }   

                   else {   

                     this.show();   

                   }   

                 }   

                }

                添加覆蓋物

                您現在已經完成了一個完整的自定義覆蓋物的編寫,可以添加到地圖上了。

                // 初始化地圖 

                var map = new BMap.Map("container");   

                var point = new BMap.Point(116.404, 39.915);   

                map.centerAndZoom(point, 15);   

                // 添加自定義覆蓋物  

                var mySquare = new SquareOverlay(map.getCenter(), 100, "red");   

                map.addOverlay(mySquare);

                實現上圖效果的JS代碼示例:

                <script type="text/javascript">
                    
                // 創建Map實例
                   
                var mp = new BMap.Map("allmap", {enableMapClick:false});
                    
                // 設置地圖背景色為白色
                   
                mp.getContainer().style.background = '#FFF';
                    
                var point = new BMap.Point(110.1, 35.1);
                    
                // 默認顯示中心點和地圖層級
                  
                mp.centerAndZoom(point, 5);
                    
                mp.addControl(new BMap.NavigationControl());
                    
                mp.addControl(new BMap.NavigationControl());
                    
                //顯示比例尺在右下角
                mp.addControl(new BMap.ScaleControl({anchor: BMAP_ANCHOR_BOTTOM_RIGHT, isOpen: true}));
                //右上角顯示電子地圖和衛星圖切換
                mp.addControl(new BMap.MapTypeControl({mapTypes: [BMAP_NORMAL_MAP,BMAP_SATELLITE_MAP]}));
                   
                mp.enableScrollWheelZoom();      // 啟用滾輪放大縮小。
                  
                mp.enableKeyboard();             // 啟用鍵盤操作。 
                  
                mp.enableContinuousZoom();    //啟用連續縮放效果
                  
                function ComplexCustomOverlay(point, text, mouseoverText){
                       
                this._point = point;
                       
                this._text = text;
                       
                this._overText = mouseoverText;
                       
                }
                        ComplexCustomOverlay.prototype =
                new BMap.Overlay();
                       
                ComplexCustomOverlay.prototype.initialize = function(map){
                       
                this._map = map;
                       
                var div = this._div = document.createElement("div");
                       
                div.style.position = "absolute";
                       
                div.style.zIndex = BMap.Overlay.getZIndex(this._point.lat);
                       
                div.style.backgroundColor = "#EE5D5B";
                       
                div.style.border = "1px solid #BC3B3A";
                       
                div.style.color = "white";
                       
                div.style.height = "18px";
                       
                div.style.padding = "2px";
                       
                div.style.lineHeight = "18px";
                       
                div.style.whiteSpace = "nowrap";
                       
                div.style.MozUserSelect = "none";
                       
                div.style.fontSize = "12px"
                       
                var span = this._span = document.createElement("span");
                       
                div.appendChild(span);
                       
                span.appendChild(document.createTextNode(this._text));
                       
                var that = this;

                       
                var arrow = this._arrow = document.createElement("div");
                       
                arrow.style.background = "url(images/label.png) no-repeat";
                       
                arrow.style.position = "absolute";
                       
                arrow.style.width = "11px";
                       
                arrow.style.height = "10px";
                       
                arrow.style.top = "22px";
                       
                arrow.style.left = "10px";
                       
                arrow.style.overflow = "hidden";
                       
                div.appendChild(arrow);

                       
                div.onmouseover = function(){
                       
                this.style.backgroundColor = "#6BADCA";
                       
                this.style.borderColor = "#0000ff";
                       
                this.getElementsByTagName("span")[0].innerHTML = that._overText;
                       
                arrow.style.backgroundPosition = "0px -20px";
                        
                }

                        div.onmouseout = function(){
                       
                this.style.backgroundColor = "#EE5D5B";
                       
                this.style.borderColor = "#BC3B3A";
                       
                this.getElementsByTagName("span")[0].innerHTML = that._text;
                       
                arrow.style.backgroundPosition = "0px 0px";
                        
                }

                        mp.getPanes().labelPane.appendChild(div)
                ;

                       
                return div;
                       
                }
                        ComplexCustomOverlay.prototype.draw = function(){
                        var map =
                this._map;
                       
                var pixel = map.pointToOverlayPixel(this._point);
                       
                this._div.style.left = pixel.x - parseInt(this._arrow.style.left) + "px";
                       
                this._div.style.top  = pixel.y - 30 + "px";
                       
                }
                var txt =
                "銀湖海岸城", mouseoverTxt = txt + " " + parseInt(Math.random() * 1000,10)
                +
                "" ;

                var myCompOverlay = new ComplexCustomOverlay(new BMap.Point(116.407845,39.914101),
                "銀湖海岸城",mouseoverTxt);
                       
                mp.addOverlay(myCompOverlay);
                </script>

                                           

                微信掃碼添加客服
                400-028-7262
                聯系我們
                主站蜘蛛池模板: 精品视频无码一区二区三区| 99这里只有精品66视频| 欧美日韩视频精品一区二区| 国产69精品久久久久999三级| 2020狠狠操| 好吊日视频在线| 久久亚洲国产成人精品无码区| 欧美日韩精品一区二区三区不卡| 午夜爱爱免费视频| 麻豆tv入口在线看| 国产精品美女视频| 一个色综合导航| 日本三人交xxx69| 亚洲aⅴ男人的天堂在线观看| 热久久国产欧美一区二区精品| 国产-第1页-浮力影院| 欧美欧洲性色老头老妇| 国自产精品手机在线观看视频| 三男三女换着曰| 日本漫画口工全彩内番漫画丝袜 | 四虎亚洲国产成人久久精品| 69堂国产成人精品视频不卡| 天天射天天操天天| 中文字幕乱妇无码AV在线| 日韩精品欧美国产精品亚| 亚洲成a人一区二区三区| 男人扒开添女人下部免费视频 | 国产aⅴ激情无码久久久无码 | 在线精品免费视频无码的| 两个美女脱了内裤互摸网沾| 日韩中文字幕在线视频| 亚洲国产欧美精品| 狠狠色噜噜狠狠狠狠av| 台湾一级淫片完整版视频播放| 高中生被老师第一次处破女| 国产精品情侣自拍| 99精品无人区乱码1区2区3区| 幼香视频在线观看免费| 久久久久久久久久久久久久久久久久| 欧美丰满熟妇乱XXXXX网站| 亚洲精品动漫免费二区|