利用openlayer6中實現:圖層級別1-4使用熱力圖,圖層5-7使用點圖層表示,高於7使用圖標圖層表示

利用openlayer6中實現:圖層級別1-4使用熱力圖,圖層5-7使用點圖層表示,高於7使用圖標圖層表示

分三層:三個圖層,實際上是利用同一組座標數據,不同層級表現形式不同

<!doctype html>
<html lang="en">

<head>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.3.1/css/ol.css"
    type="text/css">
  <style>
    .map {
      height: 400px;
      width: 100%;
    }
  </style>
  <script src="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.3.1/build/ol.js"></script>
  <title>OpenLayers example</title>
</head>

<body>
  <h2>My Map</h2>
  <div id="map" class="map"></div>
  <script type="text/javascript">
    var layerMap = new Map();
    var features = [];
    var features2 = [];
    var features3 = [];

    let points = [];

    for (let i = 0; i < 1100; i++) {
      let point = [130 + 30 * Math.random() - 40 * Math.random(), 262 * Math.random() - 2 * Math.random()]
      points.push(point)
    }
    for (let i = 0; i < 1100; i++) {

      features.push(new ol.Feature({
        geometry: new ol.geom.Point(points[i])
      }))
      features2.push(new ol.Feature({
        geometry: new ol.geom.Point(points[i])
      }))
      features3.push(new ol.Feature({
        geometry: new ol.geom.Point(points[i])
      }))

    }


    var pointSource = new ol.source.Vector({
      features: features
    })
    var IconSource = new ol.source.Vector({
      features: features2
    })
    var heatMapSource = new ol.source.Vector({
      features: features3
    })
    //新建點圖層
    var pointLayer = new ol.layer.Vector({
      source: pointSource,
      style: function () {
        return new ol.style.Style({
          image: new ol.style.Circle({
            color: 'red',
            radius: 5,
            fill: new ol.style.Fill({
              color: 'red'
            }),
            stroke: new ol.style.Stroke({
              color: 'gray', width: 3
            })
          })
        })
      }

    })

    pointLayer.layerId = 'pointLayerId'
    layerMap.set(pointLayer.layerId, pointLayer)

    //新建熱力圖層
    var heatMap = new ol.layer.Heatmap({
      source: heatMapSource
    })
    heatMap.layerId = 'heatMapId'
    layerMap.set(heatMap.layerId, heatMap)


    //新建圖標圖層
    var iconLayer = new ol.layer.Vector({
      source: IconSource,
      style: function () {
        return new ol.style.Style({
          image: new ol.style.Icon({
            src: 'F:\\workspaces\\precode\\code2\\two\\car.png',
            color: 'red',
            radius: 5,

          })
        })
      }

    })
    iconLayer.layerId = 'iconLayerId'
    layerMap.set(iconLayer.layerId, iconLayer)
    //現在有三個圖層,首先在找到地圖上現在呈現出來的圖層,然後判斷是否刪除該圖層。

    var map = new ol.Map({
      target: 'map',
      layers: [
        new ol.layer.Tile({
          source: new ol.source.OSM()
        }),
        pointLayer
      ],
      view: new ol.View({
        center: [130, 26],
        zoom: 6,
        projection: 'EPSG:4326'
      })
    });


    //刪除地圖上多餘的圖層,然後添加一個正確的圖層的id
    var toCurrentLayer = function (layerId) {
      let layers = map.getLayers().getArray();
      let curLayerId;
      for (let i = 0; i < layers.length; i++) {
        if (layers[i].layerId) {
          curLayerId = layers[i].layerId
          break;
        }
      }

      if (curLayerId) {
        map.removeLayer(layerMap.get(curLayerId));
        map.addLayer(layerMap.get(layerId))
      }

    }
    map.getView().on('change:resolution', zoomCallback);
    var isFindLayerById = function (layerId) {
      let result = false;

      let layers = map.getLayers().getArray()
      for (let i = 0; i < layers.length; i++) {
        if (layers[i].layerId == layerId) {
          return true
        }
      }
      return false

    }
    function zoomCallback(event) {
      window.viewEvent = event;
      console.log(event);

      let zoom = event.target.getZoom()
      console.log(zoom)
      if (zoom <= 5 && !isFindLayerById("heatMapId")) {
        //層級小於5,顯示是熱力圖
        toCurrentLayer("heatMapId");

      } else if (5 < zoom && zoom <= 7 && !isFindLayerById("pointLayerId")) {
        //顯示點圖層
        toCurrentLayer("pointLayerId");
      } else if (zoom > 7 && !isFindLayerById("iconLayerId")) {
        //顯示圖標圖層
        toCurrentLayer("iconLayerId");
      }
    }
  </script>
</body>

</html>

運行展示如下:(網絡原因,底圖顯示不出來)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章