百度地图JSAPI的图层功能Demo

来源:互联网 发布:linux 安装python3 编辑:程序博客网 时间:2024/05/17 03:21

地址: http://blog.csdn.net/BaiduLBS/article/details/8569756

2012CSDN博客之星火热出炉!       2013年全国百所高校巡讲讲师招募

        百度地图JSAPI的图层功能Demo       

分类:            JavaScript API74人阅读评论(0)收藏举报
百度地图JSAPI 图层控制

      在实际开发中大家经常会有图层的需求,比如地图上有餐馆、超市、KTV等marker点,但是用户希望通过图层控制只显示餐馆所在的图层,隐藏其他marker点。目前百度地图JSAPI没有类似点、线、面图层等的接口,但是可以通过数组处理达到类似的效果。以下结合一个简单的例子介绍下如何使用:

      1. 示例背景:

       在地图上添加10个点,其中,4个火车站,6个公园。地图初始化时显示全部10个点,通过下拉框选择显示火车站图层还是公园图层。

      2 . 示例实现步骤:

      1) 首先利用地图快速生成器生成带有以上10个标注(火车站+公园)的地图,效果如下图:


      2) 复制出源代码,如下:

[html] view plaincopyprint?
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
  2. <html xmlns="http://www.w3.org/1999/xhtml"> 
  3. <head> 
  4. <meta http-equiv="Content-Type"content="text/html; charset=gb2312"/> 
  5. <metaname="keywords"content="百度地图,百度地图API,百度地图自定义工具,百度地图所见即所得工具"/> 
  6. <meta name="description"content="百度地图API自定义地图,帮助用户在可视化操作下生成百度地图"/> 
  7. <title>百度地图API自定义地图</title> 
  8. <!--引用百度地图API--> 
  9. <styletype="text/css"> 
  10.     html,body{margin:0;padding:0;} 
  11. .iw_poi_title {color:#CC5522;font-size:14px;font-weight:bold;overflow:hidden;padding-right:13px;white-space:nowrap}
  12.     .iw_poi_content {font:12px arial,sans-serif;overflow:visible;padding-top:4px;white-space:-moz-pre-wrap;word-wrap:break-word} 
  13. </style> 
  14. <script type="text/javascript"src="http://api.map.baidu.com/api?key=&v=1.1&services=true"></script> 
  15. </head> 
  16.  
  17. <body> 
  18.   <!--百度地图容器--> 
  19.   <divstyle="width:697px;height:550px;border:#ccc solid 1px;"id="dituContent"></div> 
  20. </body> 
  21. <scripttype="text/javascript"> 
  22.     //创建和初始化地图函数: 
  23.     function initMap(){ 
  24.         createMap();//创建地图 
  25.         setMapEvent();//设置地图事件 
  26.         addMapControl();//向地图添加控件 
  27.         addMarker();//向地图中添加marker 
  28.     } 
  29.      
  30.     //创建地图函数: 
  31.     function createMap(){ 
  32.         var map = new BMap.Map("dituContent");//在百度地图容器中创建一个地图 
  33.         var point = new BMap.Point(111.043397,36.595088);//定义一个中心点坐标 
  34.         map.centerAndZoom(point,6);//设定地图的中心点和坐标并将地图显示在地图容器中 
  35.         window.map = map;//将map变量存储在全局 
  36.     } 
  37.      
  38.     //地图事件设置函数: 
  39.     function setMapEvent(){ 
  40.         map.enableDragging();//启用地图拖拽事件,默认启用(可不写) 
  41.         map.enableScrollWheelZoom();//启用地图滚轮放大缩小 
  42.         map.enableDoubleClickZoom();//启用鼠标双击放大,默认启用(可不写) 
  43.         map.enableKeyboard();//启用键盘上下左右键移动地图 
  44.     } 
  45.      
  46.     //地图控件添加函数: 
  47.     function addMapControl(){ 
  48.         //向地图中添加缩放控件 
  49.     var ctrl_nav = new BMap.NavigationControl({anchor:BMAP_ANCHOR_TOP_LEFT,type:BMAP_NAVIGATION_CONTROL_LARGE}); 
  50.     map.addControl(ctrl_nav); 
  51.         //向地图中添加缩略图控件 
  52.     var ctrl_ove = new BMap.OverviewMapControl({anchor:BMAP_ANCHOR_BOTTOM_RIGHT,isOpen:1}); 
  53.     map.addControl(ctrl_ove); 
  54.         //向地图中添加比例尺控件 
  55.     var ctrl_sca = new BMap.ScaleControl({anchor:BMAP_ANCHOR_BOTTOM_LEFT}); 
  56.     map.addControl(ctrl_sca); 
  57.     } 
  58.      
  59.     //标注点数组 
  60.     var markerArr = [{title:"station",content:"我的备注",point:"116.35885|39.949901",isOpen:0,icon:{w:21,h:21,l:0,t:0,x:6,lb:5}} 
  61.          ,{title:"station",content:"我的备注",point:"116.32723|39.901209",isOpen:0,icon:{w:21,h:21,l:0,t:0,x:6,lb:5}} 
  62.          ,{title:"station",content:"我的备注",point:"116.385297|39.871091",isOpen:0,icon:{w:21,h:21,l:0,t:0,x:6,lb:5}} 
  63.          ,{title:"station",content:"我的备注",point:"116.437039|39.913607",isOpen:0,icon:{w:21,h:21,l:0,t:0,x:6,lb:5}} 
  64.          ,{title:"park",content:"我的备注",point:"116.422666|39.960521",isOpen:0,icon:{w:23,h:25,l:23,t:21,x:9,lb:12}} 
  65.          ,{title:"park",content:"我的备注",point:"116.418067|39.885709",isOpen:0,icon:{w:23,h:25,l:23,t:21,x:9,lb:12}} 
  66.          ,{title:"park",content:"我的备注",point:"116.36|39.8383",isOpen:0,icon:{w:23,h:25,l:23,t:21,x:9,lb:12}} 
  67.          ,{title:"park",content:"我的备注",point:"116.487632|39.945919",isOpen:0,icon:{w:23,h:25,l:23,t:21,x:9,lb:12}} 
  68.          ,{title:"park",content:"我的备注",point:"116.2775|39.999001",isOpen:0,icon:{w:23,h:25,l:23,t:21,x:9,lb:12}} 
  69.          ,{title:"park",content:"我的备注",point:"116.316235|40.013757",isOpen:0,icon:{w:23,h:25,l:23,t:21,x:9,lb:12}} 
  70.          ]; 
  71.     //创建marker 
  72.     function addMarker(){ 
  73.         for(var i=0;i<markerArr.length;i++){ 
  74.             var json = markerArr[i]; 
  75.             var p0 = json.point.split("|")[0]; 
  76.             var p1 = json.point.split("|")[1]; 
  77.             var point =new BMap.Point(p0,p1); 
  78.             var iconImg = createIcon(json.icon); 
  79.             var marker =new BMap.Marker(point,{icon:iconImg}); 
  80.             var iw = createInfoWindow(i); 
  81.             var label =new BMap.Label(json.title,{"offset":new BMap.Size(json.icon.lb-json.icon.x+10,-20)}); 
  82.             marker.setLabel(label); 
  83.             map.addOverlay(marker); 
  84.             label.setStyle({ 
  85.                         borderColor:"#808080", 
  86.                         color:"#333", 
  87.                         cursor:"pointer" 
  88.             }); 
  89.              
  90.             (function(){ 
  91.                 var index =i
  92.                 var _iw = createInfoWindow(i); 
  93.                 var _marker =marker
  94.                 _marker.addEventListener("click",function(){ 
  95.                     this.openInfoWindow(_iw); 
  96.                 }); 
  97.                 _iw.addEventListener("open",function(){ 
  98.                     _marker.getLabel().hide(); 
  99.                 }) 
  100.                 _iw.addEventListener("close",function(){ 
  101.                     _marker.getLabel().show(); 
  102.                 }) 
  103.                 label.addEventListener("click",function(){ 
  104.                     _marker.openInfoWindow(_iw); 
  105.                 }) 
  106.                 if(!!json.isOpen){ 
  107.                     label.hide(); 
  108.                     _marker.openInfoWindow(_iw); 
  109.                 } 
  110.             })() 
  111.         } 
  112.     } 
  113.     //创建InfoWindow 
  114.     function createInfoWindow(i){ 
  115.         var json = markerArr[i]; 
  116.         var iw = new BMap.InfoWindow("<bclass='iw_poi_title'title='" + json.title + "'>" + json.title + "</b><divclass='iw_poi_content'>"+json.content+"</div>"); 
  117.         return iw; 
  118.     } 
  119.     //创建一个Icon 
  120.     function createIcon(json){ 
  121.         var icon = new BMap.Icon("http://app.baidu.com/map/images/us_mk_icon.png", new BMap.Size(json.w,json.h),{imageOffset: new BMap.Size(-json.l,-json.t),infoWindowOffset:new BMap.Size(json.lb+5,1),offset:new BMap.Size(json.x,json.h)}) 
  122.         return icon; 
  123.     } 
  124.      
  125.     initMap();//创建和初始化地图 
  126. </script> 
  127. </html> 

     3) 给markerArr数组里的数据添加type属性,用来标示是火车站图层还是公园图层。代码如下:

[html] view plaincopyprint?
  1. {title:"北京北站",content:"我的备注",point:"116.35885|39.949901",isOpen:0,icon:{w:21,h:21,l:0,t:0,x:6,lb:5},type:"station"} 

    4)定义一个Layer类,表示图层,该类有两个属性,data和IsShow,第一个属性代表图层数据;第二个属性表示图层是否显示。

[html] view plaincopyprint?
  1. function Layer() //定义图层类,data存储图层数据,isShow是否显示图层 
  2. this.data =new Array() ; 
  3. this.IsShow=true

    5)实例化两个图层,parkLayer(公园图层)和stationLayer(车站图层)。

[html] view plaincopyprint?
  1. var parkLayer=new Layer();//公园图层 
  2. var stationLayer=new Layer();//火车站图层 

   6)在addMarker方法内部添加如下代码,将数据存储到相应的图层里:

[html] view plaincopyprint?
  1. if(json.type=="station") 
  2.     stationLayer.data.push(marker); 
  3. else if(json.type=="park") 
  4.     parkLayer.data.push(marker); 

  7)在百度地图div控件下方添加下拉框,并设置改变下拉选项方法:

[html] view plaincopyprint?
  1. <select id="s1"name="oneclass"onchange=chooseLayer()> 
  2.     <optionselected="selected">--请选择--</option> 
  3.     <option>车站</option> 
  4.     <option>公园</option> 
  5.   </select> 

   8)实现chooseLayer方法,具体来讲,当下拉框选中火车站图层时,显示火车站图层,隐藏公园图层;反之亦然。

[html] view plaincopyprint?
  1. function showLayer(parkLayer,stationLayer) 
  2. if(parkLayer.IsShow==true) 
  3.   { 
  4.       for (var i=0;i<parkLayer.data.length ;i++ ) 
  5.       { 
  6.           parkLayer.data[i].hide(); 
  7.       } 
  8.     parkLayer.IsShow=false 
  9.    } 
  10. if(stationLayer.IsShow==false) 
  11.   { 
  12.     for (var i=0;i<stationLayer.data.length ;i++ ) 
  13.     { 
  14.       stationLayer.data[i].show(); 
  15.     } 
  16.     stationLayer.IsShow=true
  17.    } 
  18. function chooseLayer()  
  19.   var index = document.getElementById('s1').selectedIndex;  
  20. if(index==1){ 
  21.     showLayer(parkLayer,stationLayer); 
  22. }else if(index==2){ 
  23.     showLayer(stationLayer,parkLayer); 

   9) Done!

完整示例代码:

[html] view plaincopyprint?
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
  2. <html xmlns="http://www.w3.org/1999/xhtml"> 
  3. <head> 
  4. <meta http-equiv="Content-Type"content="text/html; charset=gb2312"/> 
  5. <metaname="keywords"content="百度地图,百度地图API,百度地图自定义工具,百度地图所见即所得工具"/> 
  6. <meta name="description"content="百度地图API自定义地图,帮助用户在可视化操作下生成百度地图"/> 
  7. <title>百度地图API自定义地图</title> 
  8. <!--引用百度地图API--> 
  9. <styletype="text/css"> 
  10.     html,body{margin:0;padding:0;} 
  11.     .iw_poi_title {color:#CC5522;font-size:14px;font-weight:bold;overflow:hidden;padding-right:13px;white-space:nowrap} 
  12.     .iw_poi_content {font:12px arial,sans-serif;overflow:visible;padding-top:4px;white-space:-moz-pre-wrap;word-wrap:break-word} 
  13. </style> 
  14. <script type="text/javascript"src="http://api.map.baidu.com/api?key=&v=1.1&services=true"></script> 
  15. </head> 
  16.  
  17. <body> 
  18.   <!--百度地图容器--> 
  19.   <divstyle="width:697px;height:550px;border:#ccc solid 1px;"id="dituContent"></div> 
  20.   <select id="s1"name="oneclass"onchange=chooseLayer()> 
  21.     <optionselected="selected">--请选择--</option> 
  22.     <option>车站</option> 
  23.     <option>公园</option> 
  24.   </select> 
  25. </body> 
  26. <script type="text/javascript"> 
  27. function Layer() //定义图层类,data存储图层数据,isShow是否显示图层 
  28. this.data =new Array() ; 
  29. this.IsShow=true
  30. var parkLayer=new Layer();//公园图层 
  31. var stationLayer=new Layer();//火车站图层 
  32. function showLayer(parkLayer,stationLayer) 
  33. if(parkLayer.IsShow==true) 
  34.   { 
  35.       for (var i=0;i<parkLayer.data.length ;i++ ) 
  36.       { 
  37.           parkLayer.data[i].hide(); 
  38.       } 
  39.     parkLayer.IsShow=false 
  40.    } 
  41. if(stationLayer.IsShow==false) 
  42.   { 
  43.     for (var i=0;i<stationLayer.data.length ;i++ ) 
  44.     { 
  45.       stationLayer.data[i].show(); 
  46.     } 
  47.     stationLayer.IsShow=true
  48.    } 
  49. function chooseLayer()  
  50.   var index = document.getElementById('s1').selectedIndex;  
  51. if(index==1){ 
  52.     showLayer(parkLayer,stationLayer); 
  53. }else if(index==2){ 
  54.     showLayer(stationLayer,parkLayer); 
  55.     //创建和初始化地图函数: 
  56.     function initMap(){ 
  57.         createMap();//创建地图 
  58.         setMapEvent();//设置地图事件 
  59.         addMapControl();//向地图添加控件 
  60.         addMarker();//向地图中添加marker 
  61.     } 
  62.      
  63.     //创建地图函数: 
  64.     function createMap(){ 
  65.         var map = new BMap.Map("dituContent");//在百度地图容器中创建一个地图 
  66.         var point = new BMap.Point(116.417851,39.924619);//定义一个中心点坐标 
  67.         map.centerAndZoom(point,12);//设定地图的中心点和坐标并将地图显示在地图容器中 
  68.         window.map = map;//将map变量存储在全局 
  69.     } 
  70.      
  71.     //地图事件设置函数: 
  72.     function setMapEvent(){ 
  73.         map.enableDragging();//启用地图拖拽事件,默认启用(可不写) 
  74.         map.enableScrollWheelZoom();//启用地图滚轮放大缩小 
  75.         map.enableDoubleClickZoom();//启用鼠标双击放大,默认启用(可不写) 
  76.         map.enableKeyboard();//启用键盘上下左右键移动地图 
  77.     } 
  78.      
  79.     //地图控件添加函数: 
  80.     function addMapControl(){ 
  81.         //向地图中添加缩放控件 
  82.     var ctrl_nav = new BMap.NavigationControl({anchor:BMAP_ANCHOR_TOP_LEFT,type:BMAP_NAVIGATION_CONTROL_LARGE}); 
  83.     map.addControl(ctrl_nav); 
  84.         //向地图中添加缩略图控件 
  85.     var ctrl_ove = new BMap.OverviewMapControl({anchor:BMAP_ANCHOR_BOTTOM_RIGHT,isOpen:0}); 
  86.     map.addControl(ctrl_ove); 
  87.         //向地图中添加比例尺控件 
  88.     var ctrl_sca = new BMap.ScaleControl({anchor:BMAP_ANCHOR_BOTTOM_LEFT}); 
  89.     map.addControl(ctrl_sca); 
  90.     } 
  91.      
  92.     //标注点数组 
  93.     var markerArr = [{title:"北京北站",content:"我的备注",point:"116.35885|39.949901",isOpen:0,icon:{w:21,h:21,l:0,t:0,x:6,lb:5},type:"station"} 
  94.          ,{title:"北京西站",content:"我的备注",point:"116.32723|39.901209",isOpen:0,icon:{w:21,h:21,l:0,t:0,x:6,lb:5},type:"station"} 
  95.          ,{title:"北京站",content:"我的备注",point:"116.437039|39.913607",isOpen:0,icon:{w:21,h:21,l:0,t:0,x:6,lb:5},type:"station"} 
  96.          ,{title:"地坛公园",content:"我的备注",point:"116.422666|39.960521",isOpen:0,icon:{w:23,h:25,l:23,t:21,x:9,lb:12},type:"park"} 
  97.          ,{title:"天坛公园",content:"我的备注",point:"116.418067|39.885709",isOpen:0,icon:{w:23,h:25,l:23,t:21,x:9,lb:12},type:"park"} 
  98.          ,{title:"世界花卉大观园",content:"我的备注",point:"116.36|39.8383",isOpen:0,icon:{w:23,h:25,l:23,t:21,x:9,lb:12},type:"park"} 
  99.          ,{title:"朝阳公园",content:"我的备注",point:"116.487632|39.945919",isOpen:0,icon:{w:23,h:25,l:23,t:21,x:9,lb:12},type:"park"} 
  100.          ,{title:"颐和园",content:"我的备注",point:"116.2775|39.999001",isOpen:0,icon:{w:23,h:25,l:23,t:21,x:9,lb:12},type:"park"} 
  101.          ,{title:"圆明园",content:"我的备注",point:"116.316235|40.013757",isOpen:0,icon:{w:23,h:25,l:23,t:21,x:9,lb:12},type:"park"} 
  102.          ,{title:"北京南站",content:"我的备注",point:"116.385656|39.869706",isOpen:0,icon:{w:21,h:21,l:0,t:0,x:6,lb:5},type:"station"} 
  103.          ]; 
  104.     //创建marker 
  105.     function addMarker(){ 
  106.         for(var i=0;i<markerArr.length;i++){ 
  107.             var json = markerArr[i]; 
  108.             var p0 = json.point.split("|")[0]; 
  109.             var p1 = json.point.split("|")[1]; 
  110.             var point =new BMap.Point(p0,p1); 
  111.             var iconImg = createIcon(json.icon); 
  112.             var marker =new BMap.Marker(point,{icon:iconImg}); 
  113.             var iw = createInfoWindow(i); 
  114.             var label =new BMap.Label(json.title,{"offset":new BMap.Size(json.icon.lb-json.icon.x+10,-20)}); 
  115.             marker.setLabel(label); 
  116.             map.addOverlay(marker); 
  117.             if(json.type=="station") 
  118.             { 
  119.                 stationLayer.data.push(marker); 
  120.             } 
  121.             else if(json.type=="park") 
  122.             { 
  123.                 parkLayer.data.push(marker); 
  124.             } 
  125.             label.setStyle({ 
  126.                         borderColor:"#808080", 
  127.                         color:"#333", 
  128.                         cursor:"pointer" 
  129.             }); 
  130.              
  131.             (function(){ 
  132.                 var index =i
  133.                 var _iw = createInfoWindow(i); 
  134.                 var _marker =marker
  135.                 _marker.addEventListener("click",function(){ 
  136.                     this.openInfoWindow(_iw); 
  137.                 }); 
  138.                 _iw.addEventListener("open",function(){ 
  139.                     _marker.getLabel().hide(); 
  140.                 }) 
  141.                 _iw.addEventListener("close",function(){ 
  142.                     _marker.getLabel().show(); 
  143.                 }) 
  144.                 label.addEventListener("click",function(){ 
  145.                     _marker.openInfoWindow(_iw); 
  146.                 }) 
  147.                 if(!!json.isOpen){ 
  148.                     label.hide(); 
  149.                     _marker.openInfoWindow(_iw); 
  150.                 } 
  151.             })() 
  152.         } 
  153.     } 
  154.     //创建InfoWindow 
  155.     function createInfoWindow(i){ 
  156.         var json = markerArr[i]; 
  157.         var iw = new BMap.InfoWindow("<bclass='iw_poi_title'title='" + json.title + "'>" + json.title + "</b><divclass='iw_poi_content'>"+json.content+"</div>"); 
  158.         return iw; 
  159.     } 
  160.     //创建一个Icon 
  161.     function createIcon(json){ 
  162.         var icon = new BMap.Icon("http://app.baidu.com/map/images/us_mk_icon.png", new BMap.Size(json.w,json.h),{imageOffset: new BMap.Size(-json.l,-json.t),infoWindowOffset:new BMap.Size(json.lb+5,1),offset:new BMap.Size(json.x,json.h)}) 
  163.         return icon; 
  164.     } 
  165.      
  166.     initMap();//创建和初始化地图 
  167. </script> 
  168. </html> 
原创粉丝点击