vue中使用百度webgl地图以及踩坑记录

2023-11-17

前言

在公司项目中,之前使用的是vue-baidu-map库,功能上使用暂无太大问题。最近需要在项目基础上添加一个大屏数据页面,并涉及到换肤功能,就是在换肤这里遇到了一些坑,使用个性化主题之后,出现,地图加载卡顿、白色方块,图层缩放最大等级问题等。

查了一些资料,因为vue-baidu-map中使用的是v2版本,而在给地图设置个性化主题时,使用的是setMapStyleV2方法,这个方法要V3版本才有。所以、跟着教程把vue-baidu-map修改成了V3版本,但事与愿违,并没有生效,反而在切换主题时,出现奇怪的效果、 2个主题同时出现在地图上。

最后看了一下百度地图官方上面的一些DEMO实例,决定使用webgl,除了3D视角,在其它方面上、如地图的加载、点与点的切换,缩放等功能,都有过渡动画和一些细节上的优化,和V2相比、给人的体验好太多。

一、百度webgl地图引入和初始化

webgl可自行到vue项目中的index.html中引入

<template>
  <div :id="el" style="width:100%;height:100%;z-index:0;"></div>
</template>
<script>
export default {
  props: {
    el: {
      type: String,
      default: "alarm-big-map"
    }
  },
  data() {
    return {
      zoom: 3,
      mapObj: null,
    };
  },
  mounted() {
    this.initMap();
  },
  methods: {
    // 地图初始化
    initMap() {
      if (!this.mapObj) {
        this.mapObj = new window.BMapGL.Map(this.el);
      }
      var point = new BMapGL.Point(116.404, 39.915); // 初始化中心点坐标
      this.mapObj.centerAndZoom(point, this.zoom); // 初始化地图,设置中心点坐标和地图级别
      this.mapObj.enableScrollWheelZoom(true);
    }
  }
};
</script>
<style lang="less" scoped>
</style>

二、设置个性化主题setMapStyleV2()

<template>
  <div :id="el" style="width:100%;height:100%;z-index:0;"></div>
</template>
<script>
import mapTheme from "@/assets/newbig/themeJson/default.json";
export default {
  props: {
    el: {
      type: String,
      default: "alarm-big-map"
    }
  },
  data() {
    return {
      zoom: 3,
      mapObj: null
    };
  },
  mounted() {
    this.initMap();
  },
  methods: {
    // 地图初始化
    initMap() {
      if (!this.mapObj) {
        this.mapObj = new window.BMapGL.Map(this.el);
      }
      this.setTheme(mapTheme);
      var point = new BMapGL.Point(116.404, 39.915); // 初始化中心点坐标
      this.mapObj.centerAndZoom(point, this.zoom); // 初始化地图,设置中心点坐标和地图级别
      this.mapObj.enableScrollWheelZoom(true);
    },
    // 设置/切换 主题
    setTheme(styleJson) {
      this.mapObj.setMapStyleV2({
        styleJson
      });
    }
  }
};
</script>
<style lang="less" scoped>
</style>

三、添加自定义覆盖物

1、Marker
如果是一些简单的自定义图片、形状点等,使用Marker就可以了。

let myIcon = new BMapGL.Icon(
    this.renderIcon(item),
    new BMapGL.Size(25, 25)
);
let mk = new BMapGL.Marker(
   new BMapGL.Point(item.longitude, item.latitude),
   { icon: myIcon }
);
mk.setTitle(item.equipmentName); // 设置鼠标悬浮展示标题

添加点击事件

 mk.addEventListener("click", () => {})

2、自定义覆盖物
有两个自定义覆盖类,CustomOverlay和CustomHtmlLayer,经过测试和使用,CustomOverlay类的MinZoom和MaxZoom属性设置后不生效(官方的DEMO上其实也不生效),这两个属性主要是控制、在不同的缩放等级中是否展示或隐藏。所以选用CustomHtmlLayer

// 渲染 项目点
    renderItemPoint(list) {
      function createItemEle(config) {
        const box = document.createElement("div");
        box.setAttribute("class", "big-map-item-box");
        const span = document.createElement("span");
        span.innerText = config.count;

        let title = document.createElement("div");
        title.setAttribute("class", "big-map-item-box-title");
        title.innerText = config.workName;
        box.appendChild(span);
        box.appendChild(title);
        return box;
      }

      let _that = this;

      const customOverlay = new BMapGL.CustomHtmlLayer(createItemEle, {
        maxZoom: 13
      });

      let features = list.reduce((prev, next) => {
        prev.push({
          type: "Feature",
          geometry: {
            type: "Point",
            coordinates: [next.longitude, next.latitude]
          },
          properties: { // 这里的数据,点击事件中可以获取
            width: 50,
            height: 50,
            radius: 50,
            lineWidth: 20,
            bgBase: "#add",
            bgFill: "#9d55ef",
            data: 0.5,
            ...next
          }
        });

        return prev;
      }, []);

      var data = {
        type: "FeatureCollection",
        features
      };

      customOverlay.setData(data);
      // 添加自定义图层到地图上
      this.mapObj.addCustomHtmlLayer(customOverlay);
      // 点击事件
      customOverlay.addEventListener("click", function(e) {
        console.log(e.target.properties.data);
        let { longitude, latitude } = e.target.properties;
        _that.mapObj.setZoom(21);
        _that.mapObj.centerAndZoom(new BMapGL.Point(longitude, latitude), 21);
        setTimeout(() => {
          _that.zoom = 21;
        }, 1000);
      });
    },

四、清除所有覆盖物clearOverlays()

this.mapObj.clearOverlays();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue中使用百度webgl地图以及踩坑记录 的相关文章

随机推荐

  • Web服务器漏洞小结(中间件)

    IIS IIS是Windows Server中自带的一个Web服务器 IIS出现的漏洞 一 IIS目录解析漏洞 test asp 1 jpg IIS5 x 6 0 以 asp asa cer cdx 命名的文件夹 其目录内的任何扩展名的文件
  • 静态测试方法

    本文讨论人工静态测试方法和自动静态测试方法 来帮你理解研发流程上是如何保证代码质量的 以及如何搭建自己的自动静态代码扫描方案 并且应用到项目的日常开发工作中去 人工静态方法 人工静态方法检查代码错误 主要有代码走查 结对编程 以及同行评审这
  • leetcode Path Sum II

    python Definition for a binary tree node class TreeNode object def init self x self val x self left None self right None
  • Python量化交易:策略创建运行流程

    同学们前面两期量化交易内容 Python量化交易入门 量化交易的历史 Python量化交易项目怎么做 Python量化交易之回测框架介绍 文章目录 学习目标 一 体验创建策略 运行策略流程 1 1 创建策略 1 2 策略界面 二 策略界面功
  • [NOI 2015复习][BZOJ 1509][NOI 2003]逃学的小孩(树的直径)

    题目链接 http www lydsy com JudgeOnline problem php id 1509 题目大意 要从一棵树中找出三个点 X Y Z X Y Z 使得 min dis A C dis B C dis A B min
  • STM32超声波模块测距串口输出/通用定时器中断并输出PWM控制舵机/系统定时器延时

    参考 stm32 超声波模块 原理 实现测距 舵机使用 作者 点灯小哥 发布时间 2021 03 10 19 37 16 网址 https blog csdn net weixin 46016743 article details 1146
  • 利用Albumentations工具包进行图像的数据增强(以yolo数据标注格式为例)

    最近在看数据增强方法时 看到了这个有趣的工具包 研究了下并以yolo数据标注格式为例写了一个示例脚本 该工具最大的好处是会根据你使用的数据增强方法自动修改标注框信息 import albumentations as A import cv2
  • MySQL 数据类型

    整数类型 分类 类型 字节 范围 整数类型 TINYINT 1 128 127 SMALLINT 2 32768 32767 MEDIUMINT 3 8388608 8388607 INT INTEGER 4 2 31 2 31 1 BIG
  • JAVA数据库连接总结

    1 Oracle8 8i 9i数据库 thin模式 Class forName oracle jdbc driver OracleDriver newInstance String url jdbc oracle thin localhos
  • libuv异步文件读写

    libuv 异步文件读写 一 libuv编译环境 1 可查看另一篇 libuv 介绍与编译 http mp blog csdn net postedit 79193274 程序代码 include
  • 2022-04-30 Unity核心2——Sprite

    文章目录 一 Single 图片编辑 二 Multiple 图片编辑 三 Polygon 多边形编辑 四 Sprite Renderer 精灵渲染器 五 Sprite Creator 精灵创造者 六 Sprite Mask 精灵遮罩 七 S
  • Python语言基础—注释的作用及分类

    系列文章目录 Python语言基础 注释的作用及分类 Python语言基础 常用运算符总结 Python语言基础 定义变量与数据类型 Python语言基础 if判断和循环总结 Python语言基础 理解面向对象 Python语言基础 集合的
  • 学习之-Spring Cache缓存框架应用本地缓存

    此文章用于个人学习记录 原文地址 https zhuanlan zhihu com p 452315531 如果想了解springCache与redis的交互请看其他文章 缓存是web项目不可或缺的一部分 通过缓存能够降低服务器数据库压力
  • AIX logging

    复杂度2 5 机密度3 5 最后更新2021 05 15 AIX有很多log 不同的东西 程序 会log到不同的地方 这是有历史的操作系统无法避免的问题 太杂 太乱 有了新机制又要学 旧log又没法简单放弃或者改变 经由alog管理 查看
  • 假设在一个32位little endian的机器上运行下面的程序,结果是多少?

    假设在一个32位little endian的机器上运行下面的程序 结果是多少 假设在一个 32 位 little endian 的机器上运行下面的程序 结果是多少 include
  • 【每日进步一点点】C语言刷题技巧及训练1

    恭喜你发现宝藏 这里是刹那芳间 很高兴为您服务 C语言编程题 相信很多同学学校的C语言考试是上机做编程题叭 不要慌 这里将带你进行一个初步的入门 进行一些简单的编程题练习 Anyway 请一定要去多多实践 上机操作 还有 望具备空杯心态 这
  • React(五)- React组件的组合使用

    React 五 React组件的组合使用 一 Todo案例 1 1 组件的具体实现 1 1 1 Header 1 1 2 List 1 1 3 Item 1 1 4 Footer 1 2 父类App组件的实现 二 Todo案例的总结 Rea
  • opencv形态学操作

    连通性 在图像中 最 的单位是像素 每个像素周围有8个邻接像素 常 的邻接关系有3 种 4邻接 8邻接和D邻接 分别如下图所示 4邻接 像素p x y 的4邻域是 x 1 y x 1 y x y 1 x y 1 N p 表示像素p的4邻接
  • GRE隧道实验

    AR1 interface GigabitEthernet0 0 0 进入接口 ip address 10 1 12 1 255 255 255 0 ospf enable 200 area 0 0 0 200 AR2 interface
  • vue中使用百度webgl地图以及踩坑记录

    前言 在公司项目中 之前使用的是vue baidu map库 功能上使用暂无太大问题 最近需要在项目基础上添加一个大屏数据页面 并涉及到换肤功能 就是在换肤这里遇到了一些坑 使用个性化主题之后 出现 地图加载卡顿 白色方块 图层缩放最大等级