vue3使用百度地图实现个性化地图和轨迹

news2024/11/15 21:48:19

vue3使用百度地图实现个性化地图和轨迹

最终效果如图:
在这里插入图片描述

步骤如下:

一、百度地图在vue3中的引入

1.首先在百度地图开发中心中申请ak(不多介绍)
2.两种引入方式:在 index.html 中直接引入;使用npm导包。(我使用的是npm导包,但是我试了直接引入的,也是可以的)

<script type="text/javascript" src="https://api.map.baidu.com/api?v=3.0&ak=应用AK"></script>

3.若不想带有百度地图水印,可在 index.html 中使用以下代码去掉

 <style type="text/css">.BMap_cpyCtrl {display: none;}</style>
  <style type="text/css">.anchorBL{display:none;}</style>

4.在 index.html 中引入路书和聚合点

  <!-- 路书功能 -->
  <script type="text/javascript" src="https://api.map.baidu.com/library/LuShu/1.2/src/LuShu_min.js"></script>
  <!-- 聚合点 -->
  <script type="text/javascript" src="//api.map.baidu.com/library/TextIconOverlay/1.2/src/TextIconOverlay_min.js"></script>
  <script type="text/javascript"  src="//api.map.baidu.com/library/MarkerClusterer/1.2/src/MarkerClusterer_min.js"></script>

5.index.html页面最终如图:
在这里插入图片描述

二、页面内容

1.一个有宽高的div和自定义信息窗口

 <div style="width: 800px;height: 600px" id="containerGL">
 ...
 <div ref="customInfoWindow" class="custom-info-window" v-show="showTap">
       自定义的信息窗口内容
      {{onedata}}
 </div>

2.新建异步加载文件并引入页面
我是在api/baidumapApi里新建bmgl.js文件

在这里插入图片描述
bmgl.js内容

const ak = '你的ak'

/**
* 异步加载百度地图
* @returns {Promise}
* @constructor
*/
export function loadBaiDuMap() {
   return new Promise(function (resolve, reject) {
       try {
           console.log('BMap is defined:', BMapGL === undefined || BMapGL)
           resolve(BMapGL)
       } catch (err) {
           window.init = function () {
               resolve(BMapGL)
           }
           let script = document.createElement('script')
           script.type = 'text/javascript'
           script.src = `http://api.map.baidu.com/api?v=1.0&type=webgl&ak=${ak}&callback=init`
           script.onerror = reject
           document.body.appendChild(script)
       }
   })
}

在页面引入:

import { loadBaiDuMap } from "@/api/baidumapApi/bmgl.js"

3.自定义图标并创建标注

           //点数据
          let cityData = ref([
              { enitInt: 121.46374, enitLat: 31.22581, name: '人民广场', online: 1 },
              { enitInt: 121.44566, enitLat: 31.22389, name: '静安寺', online: 0 },
              { enitInt: 121.4832, enitLat: 31.23843, name: '外滩', online: 1 },
           ])
            // 创建点
        cityData.value.forEach(item => {
            let myIcon1 = new BMapGL.Icon('../../../../../src/assets/images/onLine.png', new BMapGL.Size(40, 40));
            let myIcon2 = new BMapGL.Icon('../../../../../src/assets/images/noOnLine.png', new BMapGL.Size(40, 40));
            const point = new BMapGL.Point(item.enitInt, item.enitLat)
            // 创建标注
            let marker = new BMapGL.Marker(point, { icon: item.online == 1 ? myIcon1 : myIcon2 });
            // 将标注添加到地图中
            map.addOverlay(marker)
             //点击标注事件
            marker.addEventListener('click', (e: any) => {
                let infoWindow = new BMapGL.InfoWindow(customInfoWindow.value, {
                    maxWidth: 350,
                    minWidth: 350,
                    closeOnClick: true
                })
                marker.openInfoWindow(infoWindow)
                showTap.value = true
                lngdata.value = item.enitInt
                latdata.value = item.enitLat
                addrName.value = item.name
                vedioVisible.value = true
            })
        })

4.创建轨迹线

         //轨迹线
         var paths = [];
         cityData.value.forEach(item => {
             const point = new BMapGL.Point(item.enitInt, item.enitLat)
             paths.push(point)
         })
         //添加折线
         const polyline = new BMapGL.Polyline(paths,
            {
                enableEditing: false,//是否启用线编辑,默认为false
                enableClicking: true,//是否响应点击事件,默认为true
                icons: [],
                strokeWeight: '2',//折线的宽度,以像素为单位
                strokeOpacity: 0.8,//折线的透明度,取值范围0 - 1
                strokeColor: "#416EBF" //折线颜色
            });
         map.addOverlay(polyline);

5.个性化地图样式

去官网上下载自己的个性地图

①登录官网后,点击"控制台–特色服务平台–个性化地图",在该页面可以找到地图模板,选择适合你需求的模板并发布样式。这样你就能在"我的地图"中找到该地图。
在这里插入图片描述
②复制JSON文件(也可以将JSON文件下载到本地,此方法自行搜索)
在这里插入图片描述
③在map里使用

        // 本地个性化地图,通过JSON文件的方式获取
        var styleJson =
            [{
                "featureType": "land",
                "elementType": "geometry",
                "stylers": {
                    "visibility": "on",
                    "color": "#091220ff"
                }
!!!!!                
!!!!!此处json太长,进行了省略,请自行去官网复制
!!!!!
            },{
                "featureType": "scenicspots",
                "elementType": "labels.text.stroke",
                "stylers": {
                    "color": "#ffffff00"
                }
            }]
        map.setMapStyleV2({ styleJson: styleJson })

三、最终地图代码

<template>
<div style="width: 100%;height: 100%;" id="containerGL"></div>
<div ref="customInfoWindow" class="custom-info-window" v-show="showTap">
       {{ addrName }}
       {{ lngdata }}
       {{ latdata }}
        </div>
</template>

......

onMounted(() => {
    initMap()
})
//是否展示窗口信息
const showTap = ref(false)
const customInfoWindow = ref(null)
//定义坐标字段
const lngdata = ref('')
const latdata = ref('')
const addrName = ref('')
//点数据
let cityData = ref([
    { enitInt: 121.46374, enitLat: 31.22581, name: '人民广场', online: 1 },
    { enitInt: 121.44566, enitLat: 31.22389, name: '静安寺', online: 0 },
    { enitInt: 121.4832, enitLat: 31.23843, name: '外滩', online: 1 },
])
//初始化地图
function initMap() {
    // 传入密钥获取地图回调。
    loadBaiDuMap().then((BMapGL: any) => {
        // 创建地图实例
        let map = new BMapGL.Map("containerGL", { enableMapClick: false });
        // 本地个性化地图,通过JSON文件的方式获取
        var styleJson =
            [{
                "featureType": "land",
                "elementType": "geometry",
                "stylers": {
                    "visibility": "on",
                    "color": "#091220ff"
                }
!!!!!                
!!!!!此处json太长,进行了省略,请自行去官网复制
!!!!!
            },{
                "featureType": "scenicspots",
                "elementType": "labels.text.stroke",
                "stylers": {
                    "color": "#ffffff00"
                }
            }]
        map.setMapStyleV2({ styleJson: styleJson })
        // 添加比例尺控件
        map.addControl(
            new BMapGL.ScaleControl({
                anchor: "BMAP_ANCHOR_BOTTOM_LEFT",
                offset: new BMapGL.Size(20, -10),
            })
        );
        // 设置地图允许的最大最小级别
        map.setMinZoom(5)
        map.setMaxZoom(20)
        // 添加缩放控件
        map.addControl(
            new BMapGL.ZoomControl({
                anchor: "BMAP_ANCHOR_BOTTOM_RIGHT",
                offset: new BMapGL.Size(10, 10),
            })
        )
        map.disableDoubleClickZoom() //阻止双击放大
        // 保存地图
        map.value = map
        // 创建点坐标 axios => res 获取的初始化定位坐标
        const point = new BMapGL.Point(121.46374, 31.22581)
        // 初始化地图,设置中心点坐标和地图级别
        map.centerAndZoom(point, 15)
        //开启鼠标滚轮缩放
        map.enableScrollWheelZoom(true)
        //轨迹线
        var paths = [];
        cityData.value.forEach(item => {
            // 创建点
            let myIcon1 = new BMapGL.Icon('../../../../../src/assets/images/onLine.png', new BMapGL.Size(40, 40));
            let myIcon2 = new BMapGL.Icon('../../../../../src/assets/images/noOnLine.png', new BMapGL.Size(40, 40));
            const point = new BMapGL.Point(item.enitInt, item.enitLat)
            // 创建标注
            let marker = new BMapGL.Marker(point, { icon: item.online == 1 ? myIcon1 : myIcon2 });
            paths.push(point)
            // 将标注添加到地图中
            map.addOverlay(marker)
            marker.addEventListener('click', (e: any) => {
                let infoWindow = new BMapGL.InfoWindow(customInfoWindow.value, {
                    maxWidth: 350,
                    minWidth: 350,
                    closeOnClick: true
                })
                marker.openInfoWindow(infoWindow)
                showTap.value = true
                lngdata.value = item.enitInt
                latdata.value = item.enitLat
                addrName.value = item.name
            })

        })
        //添加折线
        const polyline = new BMapGL.Polyline(paths,
            {
                enableEditing: false,//是否启用线编辑,默认为false
                enableClicking: true,//是否响应点击事件,默认为true
                icons: [],
                strokeWeight: '2',//折线的宽度,以像素为单位
                strokeOpacity: 0.8,//折线的透明度,取值范围0 - 1
                strokeColor: "#416EBF" //折线颜色
            });
        map.addOverlay(polyline);
    }).catch((err) => {
        console.log(err)
    })
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MyBatis 学习(一)之 MyBatis 概述

目录 1 MyBatis 介绍 2 MyBatis 的重要组件 3 MyBatis 执行流程 4 参考文档 1 MyBatis 介绍 MyBatis 是一个半自动化的 ORM &#xff08;Object-Relational Mapping&#xff0c;对象关系映射&#xff09;持久层框架&#xff0c;它允许开发者通过 XML 或注解将对象与数据库中…

STM32进阶笔记——复位、时钟与滴答定时器

本专栏争取每周三更新直到更新完成&#xff0c;期待大家的订阅关注&#xff0c;欢迎互相学习交流。 目录 一、复位1.1 软件复位1.2 低功耗管理复位 二、时钟2.1 系统时钟(SYSCLK)选择2.2 系统时钟初始化 三、滴答定时器&#xff08;Systick&#xff09;3.1 SysTick部分寄存器3.…

docker中hyperf项目配置虚拟域名

在使用hyperf框架时&#xff0c;直接用了docker环境进行开发 下载镜像运行容器 docker run --name hyperf -v /data/project:/data/project -p 9501:9501 -itd -w /data/project --privileged -u root --entrypoint /bin/sh 镜像ID配置docker-compose.yml version: "3.…

python-产品篇-图形验证码

文章目录 准备代码效果 准备 代码 from tkinter import * from tkinter.messagebox import * import time import os root Tk() import random dirall[] randima []def call():global image1global image2global image3global image4global image5global seloneglobal …

sawForceDimensionSDK安装,sigma7+ros

force dimension的sdk中没有关于ros&#xff0c;借助开源的sawForceDimensionSDK实现对于数据的封装和可视化&#xff0c;方便后续使用 链接&#xff1a; GitHub - jhu-saw/sawForceDimensionSDK 具体步骤&#xff1a; 安装qt和ros&#xff0c;官网下载Force Dimension SDK …

Win10系统如何关闭边缘滑动功能?Win10关闭边缘滑动功能方法

Win10系统如何关闭边缘滑动功能&#xff1f;Win10系统支持电脑端和平板等移动设备&#xff0c;所以具有触控操作的功能&#xff0c;较为常见的就是边缘滑动手势功能&#xff0c;但有小伙伴想了解是否可以设置关闭&#xff0c;具体该如何设置呢&#xff1f; 设置方法 1、首先&…

idea2023新UI风格不见了怎么办?

用了一段时间idea2023,有一天不知道点了什么&#xff0c;整个UI又变成了2022的风格 如果想换成2023的UI风格怎么办&#xff1f; 点击file->setting->new UI->勾选Enable new UI&#xff0c;restart就可以回到最新版本的UI了 新风格

groovy:XmlParser 读 Freeplane.mm文件,生成测试案例.csv文件

Freeplane 是一款基于 Java 的开源软件&#xff0c;继承 Freemind 的思维导图工具软件&#xff0c;它扩展了知识管理功能&#xff0c;在 Freemind 上增加了一些额外的功能&#xff0c;比如数学公式、节点属性面板等。 强大的节点功能&#xff0c;不仅仅节点的种类很多&#xff…

Python爬虫项目实战案例-批量下载网易云榜单音乐保存至本地

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…

数学学习与研究杂志社《数学学习与研究》杂志社编辑部2023年第29期目录

考试研究 提高高三数学二轮复习质量的思考与实践 佘淮青; 2-4 提升高三数学复习质量的策略探究 王飞; 5-7 核心素养背景下的高中数学命题策略研究 陈明发; 8-10 提升中考数学复习课的有效性研讨 韩兴宏; 11-13 中学教学方法《数学学习与研究》投稿&#xff1a;…

React入门之React_渲染基础用法和class实例写法

渲染元素 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>04元素渲染</title><script src&…

迟到的VNCTF2024逆向题WP

这次比赛因为有事外出&#xff0c;只做了前两题&#xff0c;最近有空才把另外3题也做出来&#xff0c;总体来说比以往的VNCTF逆向题目要难一些。当然也有可能是我水平退步了&#xff0c;就算有时间参加比赛&#xff0c;应该也做不完这5题。VN的小伙伴越来越厉害了&#xff0c;出…

Python + Google AI 自动修复 Sonar Bug 实践

前言 在工作中总会遇到种种不期而至的需求&#xff0c;比如前段时间突然要修复所有 Sonar Bug&#xff0c;涉及各种琐碎的代码风格问题&#xff0c;包括但不限于语法不规范、废弃注释等问题。这些项目都已经持续开发几年了&#xff0c;Sonar 上的问题层出不穷&#xff0c;各种…

汽车三元催化器的废品项目详解,三元催化再生项目的回收技术教学

一、教程描述 这是一个收废品项目&#xff0c;就收那些别人不懂的&#xff0c;三元催化器的附加值高&#xff0c;只要掌握技术&#xff0c;怎么玩都行的&#xff0c;只是要放得下你的面子。三元催化器&#xff0c;是安装在汽车排气系统中最重要的机外净化装置&#xff0c;它可…

Python 神经概率语言模型代码实现和详解,NPLM代码实现和详解;NPLM代码模板讲解,最简单的NLP预测模型

1.神经概率语言模型&#xff1a;NPLM NPLM&#xff08;Neural Probabilistic Language Model&#xff09;是一种经典的神经概率语言模型&#xff0c;被用于自然语言处理任务中。它使用神经网络来学习词汇之间的关系&#xff0c;通过计算词汇序列的概率分布来预测下一个词汇。N…

论文设计任务书学习文档|基于Web的个性化简历职位推荐系统的设计与实现

文章目录 论文(设计)题目:基于Web的个性化简历职位推荐系统的设计与实现1、论文(设计)的主要任务及目标2、论文(设计)的主要内容3、论文(设计)的基本要求4、进度安排论文(设计)题目:基于Web的个性化简历职位推荐系统的设计与实现 1、论文(设计)的主要任务及目标…

log4j 基础使用入门教程

一、Log4j介绍 在项目中&#xff0c;不管是开发人员写代码还是测试人员写的测试代码一般都需要做一些日志来记录项目的行为&#xff0c;以便更好的跟踪项目中的一些交互和问题。 Log4j ( Logger For Java ) , Java 日志的记录包。 官方网站 。Log4j 是 Apache 的一个开源项目…

理解C转汇编后代码分析

题目 . - 力扣&#xff08;LeetCode&#xff09; 解题代码 #include <stdio.h> #include "stdbool.h"typedef struct {int score;int index;int count; } Record; Record records[26] {0};int totalScore(char *w) {int total 0;for (int i 0; i < st…

程序员的金三银四/金九银十求职宝典

目录 金三银四&#xff0c;金九银十 方向一&#xff1a;面试技巧分享 方向二&#xff1a;面试题解析 方向三&#xff1a;公司文化解读 方向四&#xff1a;职业规划建议 方向五&#xff1a;成功案例展示 方向六&#xff1a;行业趋势分析 金三银四&#xff0c;金九银十 “金…

Docker制作lamp镜像并在其他机器上部署

为了方便将自己的LAMP运行环境和项目在其他机器上部署或发布&#xff0c;可以用基于Dockerhub 里的mattrayner/lamp镜像打包自己需要的镜像。 1、先选择合适的镜像文件 镜像mattrayner/lamp有多个版本&#xff0c;根据自己需要选择下载 2、镜像在首次运行时会自动下载&#x…