1. 程式人生 > 程式設計 >OpenLayers實現圖層切換控制元件

OpenLayers實現圖層切換控制元件

OpenLayers並沒有封裝圖層切換的控制元件,所以我們需要自己來實現圖層控制元件。

自定義圖層切換控制元件的原理很簡單:顯示某個圖層時,將其他圖層隱藏。

完整程式碼:

layerSwitch.html:

<!DOCTYPE html>
<html lang="en">
<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>圖層切換控制元件</title>
 <link rel="stylesheet" href="../v5.3.0/css/ol.css" />
 <script src="../v5.3.0/build/ol.js"></script>
</head>
<body>
 <div id="controls">
  <input type="checkbox" id="osm" checked />OpenStreetMap
  <input type="checkbox" id="bingmap" />Bing Map
  <input type="checkbox" id="stamen" />Stamen Map
 </div>
 <div id="map"></div>
 
 <script>
  let map = new ol.Map({
   target: 'map',// 關聯到對應的div容器
   layers: [
    new ol.layer.Tile({  // OpenStreetMap圖層
     source: new ol.source.OSM()  
    }),new ol.layer.Tile({  // Bing Map圖層
     source: new ol.source.BingMaps({
      key: '略',// 可以自行到Bing Map官網申請key
      imagerySet: 'Aerial'
     }),visible: false  // 先隱藏該圖層
    }),new ol.layer.Tile({
     source: new ol.source.Stamen({
      layer: 'watercolor'
     }),visible: false  // 先隱藏該圖層
    })
   ],view: new ol.View({ // 地圖檢視
    projection: 'EPSG:3857',center: [0,0],zoom: 0
   })
  });
 
  let controls = document.getElementById('controls');  
  // 事件委託
  controls.addEventListener('click',(event) => {
   if(event.target.checked){  // 如果選中某一複選框
    // 通過DOM元素的id值來判斷應該對哪個圖層進行顯示
    switch(event.target.id){
     case "osm": 
      map.getLayers().item(0).setVisible(true);
      break;
     case "bingmap":
      map.getLayers().item(1).setVisible(true);
      break;
     case "stamen": 
      map.getLayers().item(2).setVisible(true);
      break;
     default: break;
    }
   }else{   // 如果取消某一複選框
    // 通過DOM元素的id值來判斷應該對哪個圖層進行隱藏
    switch(event.target.id){
     case "osm": 
      map.getLayers().item(0).setVisible(false);
      break;
     case "bingmap":
      map.getLayers().item(1).setVisible(false);
     case "stamen": 
      map.getLayers().item(2).setVisible(false);
     default: break;
    }
   } 
  });
 </script>
</body>
</html>

實現效果:

OpenLayers實現圖層切換控制元件

程式碼整體邏輯是很簡單的,其中使用了事件委託這一機制來繫結事件,事件委託可以減少事件繫結導致的記憶體消耗,所以平時開發時推薦多使用事件委託。

另外,map.getLayers()返回一個ol.Collection類的物件,該物件中包含了地圖中的三個圖層物件(ol.layer.Tile),可以為item()方法傳入對應索引來取出對應圖層物件。

最後,ol.layer.Tile類的setVisible()方法可以設定圖層的顯示與隱藏。

怎麼樣,自己實現一個圖層切換控制元件是不是很簡單呢?

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。