vue3项目中使用mapv

vue3项目中使用mapv

mapv是百度地图官方提供的地图数据可视化开源项目,提供了很多效果酷炫的绘图api

mapv地址在这里,示例图在这里

先解释为什么要用mapv

  1. echarts画的地图,都是行政区划,就算是geo地图,也只能在行政区划地图上添加一些地理信息点,而不能直接使用百度地图(只是个例子,也可以是高德)作为底图来展示地理信息数据
  2. 要想在使用百度地图,就得使用BMapGL
  3. BMapGL只能绘制一些比较简单的点线面图,如果想要画出复杂炫酷的地图可视化数据,就得使用mapv GL
  4. Mapv GL一般会配合MapV使用(是一般情况下,有时候也会单独用)

说来说去,就是地图可视化离不开BMapGL,而BMapG又离不开Mapv GL

目前,百度地图官方只提供了React-BMapGL文档

换句话说,如果用前端开发框架的话,得用react。当然也可以用vue,但是非常麻烦,折腾了很久,找到了一套可行的方案

先上效果,其实实现的就是mapv官网上的一个散点图例子

image-20240206150931029

总体来说,要经过这么几个步骤:

  1. 网页入口文件中引入bmapgl
  2. npm安装mapv和mapv gl
  3. 组件中引入并使用bmapgl以及mapv画图

一、网页入口文件中引入bmapgl

在vue项目的根目录的index.html文件中在线引入bmapgl

如下

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

<head>
  <meta charset="UTF-8">
  <link rel="icon" href="/favicon.ico">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Vite App</title>
  <!-- <script type="text/javascript"
    src="https://api.map.baidu.com/getscript?v=3.0&ak=ak&services=&t=20240108120956"></script>
  <link rel="stylesheet" type="text/css" href="http://api.map.baidu.com/res/webgl/10/bmap.css"> -->


  <!-- <script type="text/javascript" src="https://registry.npmmirror.com/echarts/5.4.3/files/dist/extension/bmap.min.js"></script> -->
</head>

<body>
  <div id="app"></div>
  <script type="module" src="/src/main.js"></script>
  <script type="text/javascript" src="https://api.map.baidu.com/getscript?v=1.0&type=webgl&ak=自己的ak" async="async"></script>

</body>

</html>

这里有三个坑:

  1. 从我注释的代码中可以看出来,我尝试了在不同的地方引入百度地图,但是我最终选择在dom的最后面引入,虽然我不确认这样是不是脱坑的解决方案,但是我还是建议这么写,因为dom的渲染是从上到下的,听说要等dom渲染完成再引入会不容易报错🥶

  2. 我在引入的过程中,添加了async="async",这是HTML5新增属性,需要Chrome、FireFox、IE9+浏览器支持,这么做的目的是让程序等待webgl加载完成在执行别的,其实这么做的目的和上面那个一样,都是因为控制台一直报错BMapGL未定义,查了一下,说异步导入可以解决,但是不写这个也可以,建议还是加上

  3. 官网给的引入脚本地址是https://api.map.baidu.com/api?v=1.0&type=webgl&ak=自己的ak,如果这么导入,控制台老是报警,不影响页面展示,报警内容如下:

    A parser-blocking, cross site (i.e. different eTLD+1) script, https://api.map.baidu.com/getscript?type=webgl&v=1.0&ak=xxx&services=&t=20240129120837, is invoked via document.write. The network request for this script MAY be blocked by the browser in this or a future page load due to poor network connectivity. If blocked in this page load, it will be confirmed in a subsequent console message. See https://www.chromestatus.com/feature/5718547946799104 for more details.

    如果没有强迫症的话,就不用改地址,听说改地址后会导致某些样式不起作用,也没测试过

二、mapv及mapv gl安装

没啥好说的,vue中使用,第一选择当然是通过包管理工具安装

npm i mapvgl
npm i mapv

个人安装的两个版本如下

“mapv”: “^2.0.62”,

“mapvgl”: “^1.0.0-beta.188”,

其实还有其他方式,可以通过cdn或者脚本引入,我没尝试,效果也未知

三、组件中的写法

我直接上我的完整代码(不知道为啥,搜索了网上一堆的代码,没有一个给出完整的代码,都是片段)

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

<script setup>
import { ref, onMounted } from 'vue'
import * as mapv from 'mapv'
import * as mapvgl from 'mapvgl'
import { whiteStyle } from '@/utils/mapvCommon'
const init = () => {
    var map = new BMapGL.Map("map", {
        style: { styleJson: whiteStyle }
    });
    var point = new BMapGL.Point(105.403119, 38.028658);
    map.centerAndZoom(point, 5);
    map.enableScrollWheelZoom(true);
    const data = ref([])
    const cities = [
        '北京', '天津', '上海', '重庆', '石家庄', '太原', '呼和浩特', '哈尔滨',
        '长春', '沈阳', '济南', '南京', '合肥', '杭州', '南昌', '福州', '郑州',
        '武汉', '长沙', '广州', '南宁', '西安', '银川', '兰州', '西宁', '乌鲁木齐',
        '成都', '贵阳', '昆明', '拉萨', '海口'
    ]
    let randomCount = 300
    while (randomCount--) {
        var cityCenter = mapv.utilCityCenter.getCenterByCityName(cities[parseInt(Math.random() * cities.length, 10)]);
        data.value.push({
            geometry: {
                type: 'Point',
                coordinates: [cityCenter.lng - 2 + Math.random() * 4, cityCenter.lat - 2 + Math.random() * 4]
            },
            properties: {
                count: parseInt(4 * Math.random(), 10)
            }
        });
    }
    var view = new mapvgl.View({
        map: map
    });
    var pointLayer = new mapvgl.PointLayer({
        blend: 'lighter',
        size: 10,
        color: function (item) {
            if (item.properties.count === 1) {
                return 'rgb(191, 67, 66, 0.8)';
            }
            else if (item.properties.count === 2) {
                return 'rgb(211, 139, 93, 0.8)';
            }
            else if (item.properties.count === 3) {
                return 'rgb(44, 85, 48, 0.8)';
            }
            else {
                return 'rgb(115, 158, 130, 0.8)';
            }
        }
    });

    view.addLayer(pointLayer);
    pointLayer.setData(data.value);
}
onMounted(() => {
    init()
})
</script>

<style lang="scss" scoped>
.map {
    height: 100%;
    width: 100%;
}
</style>

组件中引入了一个whiteStyle,它也是mapgl官方给的地图样式,它的地址在这里,我的写法是在utils文件夹下自己新建一个mapvCommon.js文件,然后对外按需暴露

画图的代码也是mapgl官方给的示例,地址在这里

这里依然有坑,官网给的原生js写法,我把画图写在了生命周期钩子中,因为老是报错,图也出不来。估计依然是dom渲染的问题

总结一下:

目前mapv在vue框架中的使用案例还是比较少的,官网给的示例都是原生写法,写在项目中不是这里报错就是那里报错🙈,几乎可以把人整崩溃。不知道怎么回事,百度地图的开发团队似乎更加倾向于react或者原生,而对vue的支持明显不够,对国内开发者不太友好。不管是mapv还是echarts,似乎都存在各种各样的坑,尤其是设计地图的开发展示

另外,开源是一把双刃剑,有些开源的作者简直提供的就是一堆垃圾代码,如果不能维护好,建议先不要开源(个人意见)

真的是春节前的最后一篇技术博客了,希望来源永无bug。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/374646.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c++父类转换为子类,子类转换为父类,子类父类指针相互强制转换

1.子类转换为父类 子类转换为父类之后&#xff0c;不能调用子类独有的函数和成员变量&#xff0c;只能调用子类继承的虚函数&#xff0c;利用 多态的特性。 #include <iostream>class base { public:virtual void Show(){std::cout << "base class" &…

HDL Designer 2021.1 如何将默认编辑器修改为VsCode

第1步 安装Vscode 第2步 添加Vscode至HDL Designer 第3步 更改HDL Designer编译器 第4步 修改结束&#xff0c;在HDL Designer中双击block可使用Vscode编辑verilog

十分钟掌握前端获取实时数据的三种主流方式

前端获取实时数据的三种主流方式 本文聊聊前端获取实时数据的三种主要方式。想象一下&#xff0c;我们在网上购物时&#xff0c;经常能看到最新的优惠信息弹出&#xff0c;或者在社交媒体上看到朋友的最新动态更新。这些都是因为后端在默默地向我们的页面推送了最新的消息。那…

Oracle systemstate、gdb、dbx介绍

当数据库出现严重的性能问题或者hang了的时候&#xff0c; 可能最常用的办法就是重启数据库&#xff0c;简单有效解决问题&#xff1b;但是重启后如何追踪问题的根本原因成了难题&#xff0c;很多信息随着重启也消失不见了&#xff0c;让追查问题变的十分棘手&#xff0c;这时就…

LeetCode:9.回文数,对整数的反转操作

博主本想找个简单的题水一下&#xff0c;结果太久没写这块的代码&#xff0c;直接写着宕机着&#xff0c;十分难受&#xff0c;最后还调试了几下&#xff0c;悲&#xff0c; 目录 题目&#xff1a; 思路&#xff1a; 官方代码&#xff08;反转一半的&#xff09;&#xff1a…

如何在 Java 中通过 Map.Entry 访问 Map 的元素

我们使用 Map.Entry 来遍历 ConcurrentHashMap 的代码片段如下&#xff1a; for (Map.Entry<String, String> entry : map.entrySet()) { System.out.println("Key: " entry.getKey() ", Value: " entry.getValue()); } 在 Map.java 中&…

SpringBoot:配置相关知识点

SpringBoot&#xff1a;多环境配置 配置知识点demo&#xff1a;点击查看LearnSpringBoot02 点击查看更多的SpringBoot教程 一、SpringBootApplication SpringBootApplication 来标注一个主程序类&#xff0c;说明这是一个Spring Boot应用&#xff0c;运行这个类的main方法来…

挑战杯 python+opencv+机器学习车牌识别

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于机器学习的车牌识别系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;4分工作量&#xff1a;4分创新点&#xff1a;3分 该项目较为新颖&#xff0c;适…

ios设备解锁 --Apeaksoft iOS Unlocker

Apeaksoft iOS Unlocker是一款针对iOS系统的密码解锁工具。其主要功能包括解锁多种锁屏类型&#xff0c;包括数字密码、Touch ID、Face ID和自定义密码。此外&#xff0c;它还可以帮助用户删除iPhone密码以进入锁屏设备&#xff0c;忘记的Apple ID并将iPhone激活为新的&#xf…

【ARM Coresight 系列文章 8.1 - ARM Coresight 通过 APBIC arbiter】

请阅读【ARM Coresight SoC-400/SoC-600 专栏导读】 文章目录 APBIC arbiter仲裁使用举例APBIC arbiter 在 SoC-600中,APBIC 是用来为 APB4 master 和 APB4 slave 提供 连接关系的组件。APB 是一种简单的总线协议,通常用于低带宽或低性能外设,如定时器、接口控制等。APBIC …

Unity3d Shader篇(三)— 片元半兰伯特着色器解析

文章目录 前言一、片元半兰伯特着色器是什么&#xff1f;1. 片元漫反射着色器的工作原理2. 片元半兰伯特着色器的优缺点优点&#xff1a;缺点&#xff1a; 3. 公式 二、使用步骤1. Shader 属性定义2. SubShader 设置3. 渲染 Pass4. 定义结构体和顶点着色器函数5. 片元着色器函数…

java中String类常用API

前言&#xff1a;在学习java的String类的时候&#xff0c;有很多的API需要了解&#xff0c;下面我将举出其中在新手学习时使用频率较大的几个API。 先大体看一下有哪几个&#xff1a;&#xff08;如图&#xff09; 目录 1.equals&#xff08;&#xff09;和 equalsIgnoreCase&…

Linux环境下配置mysql主从复制

主从配置需要注意的地方 1、主DB server和从DB server数据库的版本一致 2、主DB server和从DB server数据库数据一致[这里就会可以把主的备份在从上还原&#xff0c;也可以直接将主的数据目录拷贝到从的相应数据目录] 3、主DB server开启二进制日志,主DB server和从DB serve…

「递归算法」:全排列

一、题目 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&#xff1a; 输入&#xf…

【前端web入门第四天】02 CSS三大特性+背景图

文章目录: 1. CSS三大特性 1.1继承性 1.2 层叠性 1.3 优先级 1.3.1 优先级1.3.2 优先级-叠加计算规则 2. 背景图 2.1 背景属性2.2 背景图2.3 背景图的平铺方式2.4 背景图位置2.5 背景图缩放2.6 背景图固定2.7 背景复合属性 1. CSS三大特性 1.1继承性 什么是继承性? 子级默…

进阶C语言-通讯录的实现

通讯录 🎈1.设计要求🎈2.程序实现🔭2.1打印菜单及初始化通讯录🔭2.2显示所有联系人🔭2.3查找指定的联系人🔭2.4删除指定的联系人🔭2.5查找指定的联系人🔭2.6修改指定联系人🔭2.7按照年龄排序(以此为例)🎈3.全部源码以及实现🎈1.设计要求 🌞通过前面…

分享springboot框架的一个开源的本地开发部署教程(若依开源项目开发部署过程分享持续更新二开宝藏项目PostgresSQL数据库版)

1首先介绍下若依项目&#xff1a; 若依是一个基于Spring Boot和Spring Cloud技术栈开发的多租户权限管理系统。该开源项目提供了一套完整的权限管理解决方案&#xff0c;包括用户管理、角色管理、菜单管理、部门管理、岗位管理等功能。 若依项目采用前后端分离的架构&#xf…

3dmatch-toolbox详细安装教程-Ubuntu14.04

3dmatch-toolbox详细安装教程-Ubuntu14.04 前言docker搭建Ubuntu14.04安装第三方库安装cuda/cundnn安装OpenCV安装Matlab 安装以及运行3dmatch-toolbox1.安装测试3dmatch-toolbox(对齐两个点云) 总结 前言 paper:3DMatch: Learning Local Geometric Descriptors from RGB-D Re…

敏捷软件研发管理流程- scrum

Leangoo领歌是一款永久免费的专业的敏捷开发管理工具&#xff0c;提供端到端敏捷研发管理解决方案&#xff0c;涵盖敏捷需求管理、任务协同、进展跟踪、统计度量等。 Leangoo领歌上手快、实施成本低&#xff0c;可帮助企业快速落地敏捷&#xff0c;提质增效、缩短周期、加速创新…

【chromium】vs2022 中 clang构建

vs2022 “D:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\devenv.exe”看起来没装安装 clang 组件 vs2019 装的是12:报错了 Build started... 1>------ Build started: Project: ebBase, Configuration: Debug Win32 ------ 1>d:\Program Files…