mapboxgl 渲染热力图并动态更新

该博客介绍了如何在Web应用中结合OpenLayers和Mapbox来创建一个地图,并动态更新热力图数据。通过监听地图移动事件,根据不同的缩放级别动态调整热力图数据源,实现实时的地图范围更新和热力图渲染。同时,展示了如何配置Mapbox地图的属性,如交互性、缩放和旋转控制等。
摘要由CSDN通过智能技术生成

  <template>

  <div>

    <div id="map" class="map"></div>

  </div>

</template>

  <script>

import "ol/ol.css";

import GeoJSON from "ol/format/GeoJSON";

import HeatmapLayer from "ol/layer/Heatmap";

import Layer from "ol/layer/Layer";

import Source from "ol/source/Source";

import VectorSource from "ol/source/Vector";

import View from "ol/View";

import { fromLonLat, toLonLat } from "ol/proj";

import Map from "ol/Map";

const center = [8.330867392650134, 47.28077320363727];

let initZoom = 1;

export default {

  data() {

    return {

      globalBounds: [],

      map: {},

    };

  },

  mounted() {

    this.initMap();

  },

  methods: {

    updates(value) {

      this.globalBounds = value;

      // console.log("监听更新的值:", this.globalBounds, 999999999999);

    },

    initMap() {

      let self = this;

      const mbMap = new mapboxgl.Map({

        style: "http://172.0.0.1:1008/styles/basic-preview/style.json",  //地图服务的数据地址

        attributionControl: false,

        boxZoom: false,

        center: center,

        container: "map",

        doubleClickZoom: false,

        dragPan: false,

        dragRotate: false,

        interactive: false,

        keyboard: false,

        pitchWithRotate: false,

        scrollZoom: false,

        touchZoomRotate: false,

      });

      let heat1 = "/data/geojson/world-cities.geojson";

      let heatmap = "/data/geojson/world-cities-ii.geojosn";

      let heatsource = new VectorSource({

        url: heat1,

        format: new GeoJSON(),

      });

        //加载热力图

      let cities = new HeatmapLayer({

        source: heatsource,

        weight: function (feature) {

          return feature.get("population") / 1e7;

        },

        radius: 15,

        blur: 15,

      });

      const mbLayer = new Layer({

        render: function (frameState) {

          const canvas = mbMap.getCanvas();

          const viewState = frameState.viewState;

          const visible = mbLayer.getVisible();

          canvas.style.display = visible ? "block" : "none";

          canvas.style.position = "absolute";

          const opacity = mbLayer.getOpacity();

          canvas.style.opacity = opacity;

          const rotation = viewState.rotation;

          mbMap.jumpTo({

            center: toLonLat(viewState.center),

            zoom: viewState.zoom - 1,

            bearing: (-rotation * 180) / Math.PI,

            animate: false,

          });

          if (mbMap._frame) {

            mbMap._frame.cancel();

            mbMap._frame = null;

          }

          mbMap._render();

          return canvas;

        },

      });

     //监听地图变化

      mbMap.on("moveend", () => {

        // 获取当前缩放级别

        const zoom = mbMap.getZoom();

        let zoomSize = 1;

        if (zoom < 7) {

          zoomSize = 1;

        } else if (zoom >= 7 && zoom < 9) {

          zoomSize = 2;

        } else if (zoom >= 9 && zoom < 11) {

          zoomSize = 3;

        } else if (zoom >= 11) {

          zoomSize = 4;

        }

        if (initZoom != zoomSize) {

          initZoom = zoomSize;

          if (cities) {

            //动态刷新热力图数据

            heatsource.setUrl(heatmap);

            heatsource.refresh();

          }

        }

        // 获取当前范围

        const bounds = mbMap.getBounds();

        // console.log(bounds, "左下:", bounds._ne, "右上:", bounds._sw);

        self.updates([

          [bounds._ne.lat, bounds._ne.lng],

          [bounds._sw.lat, bounds._sw.lng],

        ]);

      });

     //挂载地图

      var map = new Map({

        target: "map",

        view: new View({

          center: fromLonLat(center),

          zoom: 4,

        }),

        layers: [mbLayer, cities],

      });

    },

  },

};

</script>

  <style>

.map {

  width: 100%;

  height: 600px;

}

</style>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你想了解关于 Mapbox GL 和 Echarts 迁徙图的相关内容吗?Mapbox GL 是一个开源的地图绘制库,可以用来创建交互式的地图应用程序。Echarts 是一个基于 JavaScript 的数据可视化库,可以用来展示各种类型的图表,包括迁徙图。 要使用 Mapbox GL 和 Echarts 创建迁徙图,你可以按照以下步骤进行操作: 1. 首先,引入 Mapbox GL 和 Echarts 的相关库文件到你的项目中。你可以从官方网站或使用包管理工具如npm或yarn来安装它们。 2. 创建一个包含地图容器的 HTML 元素,在这个容器中将显示迁徙图。你可以使用 Mapbox GL 提供的 API 来初始化地图和设置样式。 3. 准备迁徙数据。迁徙数据通常包含起始地点、目标地点和迁徙人数等信息。你可以将这些数据存储在一个 JSON 文件中,或者通过网络请求从后端获取。 4. 在 JavaScript 代码中,使用 Echarts 的 API 创建一个迁徙图实例。通过配置项,你可以设置迁徙图的样式、数据源和交互行为等。 5. 将迁徙图实例绑定到地图容器中,这样迁徙图就会在地图上进行渲染。 以下是一个简单的示例代码,演示了如何使用 Mapbox GL 和 Echarts 创建迁徙图: ```html <!DOCTYPE html> <html> <head> <title>Mapbox GL + Echarts 迁徙图</title> <meta charset="utf-8" /> <style> #map { width: 800px; height: 600px; } </style> </head> <body> <div id="map"></div> <script src="path/to/mapbox-gl.js"></script> <script src="path/to/echarts.js"></script> <script> // 初始化地图 mapboxgl.accessToken = 'your-access-token'; var map = new mapboxgl.Map({ container: 'map', style: 'mapbox://styles/mapbox/streets-v11', center: [lon, lat], zoom: 10 }); // 准备迁徙数据 var migrationData = [ { from: [fromLon1, fromLat1], to: [toLon1, toLat1], count: 100 }, { from: [fromLon2, fromLat2], to: [toLon2, toLat2], count: 200 }, // ... ]; // 创建迁徙图实例 var chartDom = document.getElementById('map'); var myChart = echarts.init(chartDom); var option = { series: [{ type: 'lines', data: migrationData.map(function (item) { return { coords: [item.from, item.to], value: item.count }; }), // 其他配置项... }] }; myChart.setOption(option); // 将迁徙图绑定到地图容器中 map.on('load', function () { var canvas = myChart.getCanvas(); var container = map.getCanvasContainer(); container.appendChild(canvas); }); </script> </body> </html> ``` 请注意,上述代码中的一些参数如 access token、经纬度等需要根据你的实际情况进行设置。 希望这个回答能够帮到你!如果有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值