1. 圖層其實是使用了疊加的概念,將一個類型或者屬性的物體,疊加在另外一個物體上,只不過這些物體
都是有位置的,當這些物體疊加在一起時,就能顯示出對應的位置關系了,再賦予它們不同的樣式,
當這樣的疊加越來越多時,則能描述出一個復雜的空間物體關系了。
2. CanvasLayer
首先按照正常程序繪制canvas,然后將canvas通過Overlay添加到地圖上,和前面添加 Marker 的原理其實是一樣的。
1 // 添加Canvas2D覆蓋物 2 var canvasLayer = null; 3 4 function addCanvasLayer(){ 5 6 /** 7 * 如果已存在,則刪除,否則添加多個后,無法通過 removeCanvasLayer 函數刪除, 8 **/ 9 if(canvasLayer){ 10 removeCanvasLayer(); 11 canvasLayer = null; 12 } 13 14 canvasLayer = new BMap.CanvasLayer({ 15 update:update 16 }); 17 18 function update(){ 19 var ctx = this.canvas.getContext("2d"); 20 if(!ctx){ 21 return; 22 } 23 24 ctx.clearRect(0,0,ctx.canvas.width,ctx.canvas.height); 25 var temp = {}; 26 ctx.fillStyle = "rgba(50,50,255,0.7)"; 27 ctx.beginPath(); 28 var data = [ 29 new BMap.Point(117.3223,31.8534), 30 new BMap.Point(117.3568,31.85863), 31 new BMap.Point(117.3465,31.88641) 32 ]; 33 for(var i=0,len = data.length; i<len;i++) { 34 var pixel = map.pointToPixel(data[i]); 35 ctx.fillRect(pixel.x,pixel.y,30,30); 36 } 37 } 38 map.addOverlay(canvasLayer); 39 }
3. 添加TileLayer
TileLayer 一般為金字塔形的圖片地址,根據xyz的排列規則進行加載。
此代碼是加載清華的微圖。
1 function addTileLayer(){ 2 map.centerAndZoom(new BMap.Point(116.332782, 40.007978), 16); 3 tileLayer = new BMap.TileLayer({isTransparentPng:true}); 4 tileLayer.getTilesUrl = function (tileCoord, zoom) { 5 var x = tileCoord.x; 6 var y = tileCoord.y; 7 return '../img/tsinghua/' + zoom + '/tile' + x + '_' + y + '.png';; 8 } 9 map.addTileLayer(tileLayer); 10 }
4. 地面疊加層高
地面疊加層使用的是 GroundOverlay,添加到地圖上時,使用的是 map.addOverlay。此處以圖片為地圖,添加到地圖上。
可以通過設置 opacity | displayOnMinLevel | displayOnMaxLevel 控制顯示內容。
1 function addGroundOverlay() { 2 3 // 西南角和東北角 4 var SW = new BMap.Point(116.29579,39.837146); 5 var NE = new BMap.Point(116.475451,39.9764); 6 7 map.centerAndZoom(SW, 13); 8 9 10 groundOverlayOptions = { 11 opacity: 1, 12 displayOnMinLevel: 10, 13 displayOnMaxLevel: 14 14 } 15 16 // 初始化GroundOverlay 17 groundOverlay = new BMap.GroundOverlay(new BMap.Bounds(SW, NE), groundOverlayOptions); 18 19 // 設置GroundOverlay的圖片地址 20 groundOverlay.setImageURL('../img/si-huan.png'); 21 22 // 單擊事件 23 groundOverlay.addEventListener('click', function (clickEvent) { 24 // console.log('clickEvent', clickEvent); 25 }); 26 27 // 雙擊事件 28 groundOverlay.addEventListener('dblclick', function (dblclickEvent) { 29 // console.log('dblclickEvent', dblclickEvent); 30 }); 31 32 // 添加GroundOverlay 33 map.addOverlay(groundOverlay); 34 }
4. 交通流量層 TrafficLayer
TrafficLayer 是BMap 中封裝好的對象,可以直接調用。這里是自己寫的邏輯,其實完全可以使用 TrafficControl 代替這些代碼。
TrafficControl 的內部代碼我沒有去看,邏輯上應該和這個差不多,只不過封裝為了一個Control對象。
1 var trafficLayer = null;//交通流量圖層 2 var trafficType = 0 ; 3 /** 4 * 添加交通流量圖層 5 */ 6 function showTrafficLayer(){ 7 8 if(trafficType == 0){ 9 addTrafficeLayer(); 10 trafficType = 1; 11 } else { 12 removeTrafficLayer(); 13 trafficType = 0 ; 14 } 15 } 16 17 function addTrafficeLayer(){ 18 trafficLayer = new BMap.TrafficLayer(); 19 map.addTileLayer(trafficLayer); 20 } 21 22 function removeTrafficLayer(){ 23 if(trafficLayer){ 24 map.removeTileLayer(trafficLayer); 25 } 26 }
5. DrawManager
這是一個開源的封裝個對象庫,http://lbsyun.baidu.com/index.php?title=jspopular3.0/guide/mouse2draw
主要引用了以下文件
1 <script type="text/javascript" src="http://api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.js"></script> 2 <link rel="stylesheet" href="http://api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.css" />
實際代碼
1 function addDrawManager(){ 2 var styleOptions = { 3 storkColor:"red", 4 fillColor:"red", 5 strokeWeight:3, 6 strokeOpacity:0.7, 7 fillOpacity: 0.6, 8 strokeStyle:'solid' 9 } 10 11 var drawingManager = new BMapLib.DrawingManager(map,{ 12 _isOpen:false, 13 enableDrawingTool:true, 14 drawingToolOptions:{ 15 anchor: BMAP_ANCHOR_TOP_RIGHT, 16 offset: new BMap.Size(5,5) 17 }, 18 circleOptions:styleOptions, 19 polylineOptions:styleOptions, 20 polygonOptions: styleOptions, 21 rectangleOptions: styleOptions 22 }); 23 drawingManager.addEventListener('overlaycomplete',overlaycomplete); 24 25 }
6. 頁面顯示
CanvasLayer

TileLayer

GroundOverlay

DrawManager

7. 代碼參考:
https://github.com/WhatGIS/bdMap
