vue 中 使用腾讯地图 (动态引用腾讯地图及使用签名验证)

在这里插入图片描述
在这里插入图片描述

在设置定位的时候使用 腾讯地图 选择地址
在 mounted中引入腾讯地图:
this.website.mapKey 为地图的 key

// 异步加载腾讯地图APIconst script = document.createElement('script');script.type = 'text/javascript';script.src = 'https://map.qq.com/api/js?v=2.exp&key='+this.website.mapKey+'&callback=init';document.body.appendChild(script);// 回调函数,初始化地图window.init = () => {this.initMap();this.$nextTick(()=>{if(this.map){//   // 监听中心点变化事件,更新marker的位置this.listener=qq.maps.event.addListener(this.map, 'dragend', ()=>this.centerChanged());}})};

在 destroyed 卸载

 destroyed(){let scripts = document.querySelectorAll('script');// 遍历所有找到的<script>元素并移除它们scripts.forEach((script)=> {let src=script.getAttribute('src');if(src&&src.indexOf('qq')>=0){script.parentNode.removeChild(script);}});qq.maps.event.removeListener(this.listener)},

弹框组件代码为:

<template><el-dialog title="设置定位":visible.sync="dialogVisible"width="900px":before-close="handleClose":modal-append-to-body="true":append-to-body="true":close-on-click-modal="false"v-dialogdragclass="common-dialog"><div class="clearfix"><div class="pull-left near-box"><el-input v-model="keyword" @change="changeKeyword"><el-button slot="append" icon="el-icon-search" @click="searchNear"></el-button></el-input><ul class="location-list"><li v-for="(item,index) in nearList" :key="index" :class="selectedIndex==index?'location-active':''"><div @click="handleSelect(item,index)"><div class="location-title">{{item.title}}</div><span class="location-address">{{item.address}}</span></div></li></ul></div><div class="pull-right map-box"><div id="container"></div></div></div><span slot="footer" class="dialog-footer"><el-button @click="handleClose">取 消</el-button><el-button type="primary" @click="submitAction">确 定</el-button></span></el-dialog>
</template>
<script>import {mapGetters} from "vuex";import {getAddressByLat,searchByKeyword} from '@/api/address'export default {props:{form:{type: Object}},data(){return {selectedIndex:'',keyword: '山东省青岛市',dialogVisible : true,mapZoom: 15,pitch: 0,addressInfo: this.form,mapCenter: {adcode: 370203,city: "青岛市",district: "市北区",ip: "111.17.222.181",lat: 36.08743,lng: 120.37479,nation: "中国",province: "山东省"},nearList:[],map:null,//地图markerLayer:null,listener:null}},mounted(){if(this.form.lat&&this.form.lng){this.mapCenter={...this.form,city:this.form.cityName};this.keyword=this.form.provinceName+this.form.cityName+this.form.areaName+this.form.address.substring(0,64)} else if(this.location.lat){this.mapCenter = {...this.location};if(this.location.province&&this.location.city){this.keyword=(this.location.province+this.location.city).substring(0,64)}}// 异步加载腾讯地图APIconst script = document.createElement('script');script.type = 'text/javascript';script.id = 'qqMap';script.name = 'qqMap';script.src = 'https://map.qq.com/api/js?v=2.exp&key='+this.website.mapKey+'&callback=init';document.body.appendChild(script);// 回调函数,初始化地图window.init = () => {this.initMap();this.$nextTick(()=>{if(this.map){//   // 监听中心点变化事件,更新marker的位置this.listener=qq.maps.event.addListener(this.map, 'dragend', ()=>this.centerChanged());}})};},destroyed(){let scripts = document.querySelectorAll('script');// 遍历所有找到的<script>元素并移除它们scripts.forEach((script)=> {let src=script.getAttribute('src');if(src&&src.indexOf('qq')>=0){script.parentNode.removeChild(script);}});qq.maps.event.removeListener(this.listener)},computed: {...mapGetters(["location"]),},methods:{//初始化地图initMap(){let element=document.getElementById('container');//定义地图中心点坐标let center=new qq.maps.LatLng(this.mapCenter.lat,this.mapCenter.lng);//定义map变量,调用 TMap.Map() 构造函数创建地图this.map = new qq.maps.Map(element, {pitch: this.pitch,center: center,//设置地图中心点坐标zoom:this.mapZoom,   //设置地图缩放级别});// 创建一个位于地图中心点的markerthis.markerLayer = new qq.maps.Marker({map: this.map,position: center});if(this.keyword){this.getAddressByKeyword( this.mapCenter)}},centerChanged(){this.mapCenter=this.map.getCenter();this.getLocationByLat()},//当前选择handleSelect(item,index){this.selectedIndex=index;this.mapCenter={...item,lat:item.location.lat,lng:item.location.lng,};this.map.setCenter(new qq.maps.LatLng(item.location.lat,item.location.lng));this.markerLayer.setPosition(new qq.maps.LatLng(item.location.lat,item.location.lng))// this.getLocationByLat()},changeKeyword(val){this.keyword=val;},searchNear(){this.mapCenter={};this.getAddressByKeyword()},getLocationByLat(){getAddressByLat({location:`${this.mapCenter.lat},${this.mapCenter.lng}`,key:this.website.mapKey,}).then(res=>{this.keyword=res.result.address;this.getAddressByKeyword(res.result)})},//根据关键字查找地址列表//https://lbs.qq.com/service/webService/webServiceGuide/webServiceSuggestiongetAddressByKeyword(latInfo){let params={keyword:this.keyword,region:this.mapCenter.city?this.mapCenter.city:'',policy:1,page_size:20,page_index:1,address_format:'short',key:this.website.mapKey,};if(this.mapCenter.lat&&this.mapCenter.lat!=-1&&this.mapCenter.lng&&this.mapCenter.lng!=-1){params.location=`${this.mapCenter.lat},${this.mapCenter.lng}`}searchByKeyword(params).then(res=>{this.nearList=res.data;let first=res.data&&res.data[0]?res.data[0]:'';if(first){this.selectedIndex=0;if(!params.location){let lat=first.location.lat;let lng=first.location.lng;this.mapCenter={...first,lat:lat,lng:lng};this.map.setCenter(new qq.maps.LatLng(lat,lng))}} else if(latInfo){let obj={...latInfo.ad_info,...latInfo.location,address:latInfo.address,title:latInfo.formatted_addresses&&latInfo.formatted_addresses.recommend?latInfo.formatted_addresses.recommend:latInfo.address};this.mapCenter=obj;this.nearList=[obj];this.map.setCenter(new qq.maps.LatLng(this.mapCenter.lat,this.mapCenter.lng))}this.markerLayer.setPosition(new qq.maps.LatLng(this.mapCenter.lat,this.mapCenter.lng))})},handleClose(){this.dialogVisible=false;this.$emit('closeDialog',false)},submitAction(){if(!this.keyword){this.$message.error('请输入关键字查询/或拖动地图查找');return false}this.$emit('changeMapLocation', this.selectedIndex>=0&&this.nearList[this.selectedIndex]?this.nearList[this.selectedIndex]:this.mapCenter);this.handleClose()}}}
</script>
<style lang="scss" scoped>@import "@/styles/variables";.common-dialog {/deep/.el-dialog__body{padding:20px 30px;}.el-input__inner{height:36px;line-height: 36px;}}.near-box{width:300px;height:500px;}.map-box{width:calc(100% - 320px);height:500px;margin:0;padding:0}#container{width:100%;height:100%;}/deep/ .el-input{min-width: auto;}.location-list{list-style: none;margin: 10px 0 0;padding:0;max-height: 460px;border:1px solid $color-border-light;overflow-y: auto;}.location-list li{list-style: none;padding:5px;border-bottom:1px solid $color-border-light;cursor: pointer;&:last-child{border-bottom: none;}}.location-list li.location-active{background-color: $color-primary;.location-title,.location-address{color:#fff;}}.location-title{font-size: 14px;color:$color-text-dark;font-weight: bold;}.location-address{font-size: 12px;color: $color-text-secondary;transform: scale(0.85);}
</style>

以逆地址解析为例写法为:

import request from "@/axios";
//逆地址解析
export const getAddressByLat = (params) =>{return request.jsonp('/ws/geocoder/v1', {output: "jsonp",...params})
}

axios 调用 jsonp 方法

import axios from 'axios';
import {serialize} from '@/util/util';
import {Message} from 'element-ui';
axios.jsonp = function(url,data){if(!url) throw new Error('接口地址错误')function sortObjectByKeys(obj) {return Object.keys(obj).sort().reduce((sortedObj, key) => {sortedObj[key] = obj[key];return sortedObj;}, {});}const callback = 'CALLBACK' + Math.random().toString().substr(9,18)const time=Date.now();let newData=sortObjectByKeys({...data,callback,time});let sign=md5(`${url}?${serialize(newData)}YOUR_SK`);const JSONP = document.createElement('script')JSONP.setAttribute('type','text/javascript')const headEle = document.getElementsByTagName('head')[0];JSONP.src = `https://apis.map.qq.com${url}?${serialize(newData)}&sig=${sign}`;return new Promise( (resolve) => {window[callback] = r => {if(r.status!='0'){Message({message: r.message,type: 'warning'});}resolve(r)headEle.removeChild(JSONP)delete window[callback]}headEle.appendChild(JSONP)})
}
export default axios;

YOUR_SK为腾讯地图签名验证时SK。 见下图:
在这里插入图片描述

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

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

相关文章

SS8812T替代DRV8812的国产双通道H桥电机驱动芯片

由工采网代理的SS8812T是一款国产双通道H桥电机驱动芯片&#xff1b;该芯片为打印机和其它电机一体化应用提供一种双通道集成电机驱动方案&#xff1b;可Pin-to-Pin兼容替代DRV8812&#xff0c;可广泛应用于POS、打印机、安防相机、办公自动化设备、游戏机、机器人等。 产品描述…

Vue.js 案例——商品管理

一.需要做出的效果图&#xff1a; 二.实现的步骤 首先&#xff0c;先建一个项目&#xff0c;命名Table&#xff0c;在Table项目中的components里新建一个MyTable.vue文件。 第二步&#xff0c;在原有的 HelloWorld.vue中写入代码。 HelloWorld.vue代码如下&#xff1a; <…

KumiaoQQ机器人框架源码

源码介绍 酷喵机器人框架基于PC协议与MGCH的结合&#xff0c;MGCH即 MiraiGO-CQhttp&#xff08;代码类型&#xff1a;易语言&#xff09;基本的API功能已经实现&#xff0c;具体可自测&#xff08;教程/日志/说明文本已附带&#xff09;开放源码仅供参考学习交流&#xff0c;…

远超美国!中国AI专利数量全球第一!商汤推出面向C端用户大模型“Vimi”,可生成分钟级视频!|AI日报

文章推荐 苹果获得OpenAI董事会观察员职位&#xff01;Runway正筹集新一轮融资&#xff0c;估值40亿美元&#xff01;&#xff5c;AI日报 AI基准测评&#xff08;下&#xff09;&#xff1a;视频生成、代码能力、逻辑推理&#xff0c;AI是否已经超越人类&#xff1f; 联合国…

【linux高级IO(一)】理解五种IO模型

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux高级IO 1. 前言2. 重谈对…

kubernetes dashboard安装

1.查看符合自己版本的kubernetes Dashboard 比如我使用的是1.23.0版本 https://github.com/kubernetes/dashboard/releases?page5 对应版本 kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml修改对应的yaml,…

adb不插usb线通过wifi调试

说起做手机开发也有好多年了&#xff0c;说来惭愧&#xff0c;我最近才知道安卓手机是可以不插数据线进行开发调试的。起因是公司近期采购了一批安卓一卡通设备&#xff0c;需要对其进行定制开发APP,但是由于我插USB调试发现没有反应。通过询问厂家才知道可以通过WIFI进行调试。…

请注意,以下这几种操作都会导致流量卡被停用!

最近一段时间&#xff0c;小编经常收到一些反馈&#xff0c;明明是刚办理的手机号还没有用几天就被停用了&#xff0c;今天&#xff0c;这篇文章我们要了解就是手机号被停用的问题。 ​ 对于新办理的手机号会被停用这个问题&#xff0c;主要还是因为运营商为了防止电话诈骗&…

java数据结构集合复习之包装类和泛型

前言: 这是我最一年学习java的一部分的回顾总结 1.包装类 在Java中&#xff0c;由于基本类型不是继承自Object&#xff0c;为了在泛型代码中可以支持基本类型&#xff0c;Java给每个基本类型都对应了一个包装类型。 1.1基本数据类型和对应的包装类 ----—基本数据类型包装类…

ubuntu软件源的两种格式和环境变量

1. ubuntu的/etc是什么目录&#xff1f; 在Ubuntu操作系统中&#xff0c;/etc/是一个特殊的目录&#xff0c;它包含系统的配置文件。这些配置文件用于设置各种系统和应用程序的参数和选项。 一般来说&#xff0c;用户可以在这个目录下找到各种重要的配置文件&#xff0c;如网络…

Web3 ETF的主要功能

Web3 ETF的主要功能可以概括为以下几点&#xff0c;Web3 ETF仍是一项新兴投资产品&#xff0c;其长期表现仍存在不确定性。投资者在投资Web3 ETF之前应仔细研究相关风险&#xff0c;并做好充分的风险评估。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xf…

商务办公优选!AOC Q27E3S2商用显示器,打造卓越新体验!

摘要&#xff1a;助办公室一族纵横职场&#xff0c;实现高效舒适办公&#xff01; 在日常商务办公中&#xff0c;对于办公室一族来说总有太多“难难难难难点”&#xff1a;工作任务繁琐&#xff0c;熬夜加班心力交瘁、长时间伏案工作导致颈椎、眼睛等出现问题&#xff0c;职业…

BBA车主,千万别去试驾问界M9

文 | AUTO芯球 作者 | 雷慢&响铃 我劝你啊&#xff0c;千万别去试驾问界M9&#xff0c; 不然啊&#xff0c;可能1个小时50万就没了&#xff0c; 不信你看这个“大冤种”&#xff0c; 他曾经发誓打死不买电车&#xff0c; 考虑了三、四年换宝马X5&#xff0c; 结果谈完…

前端面试题5(前端常见的加密方式)

前端常见的加密方式 在前端进行数据加密主要是为了保护用户的隐私和提升数据传输的安全性。前端数据加密可以采用多种方法&#xff0c;以下是一些常见的加密技术和方法&#xff1a; 1. HTTPS 虽然不是直接的前端加密技术&#xff0c;但HTTPS是保障前端与后端数据传输安全的基…

关于MCU-Cortex M7的存储结构(flash与SRAM)

MCU并没有DDR&#xff0c;所以他把代码存储在flash上&#xff0c;临时变量和栈运行在SRAM上。之所以这么做是因为MCU的cpu频率很低&#xff0c;都是几十MHZ到一二百MHZ&#xff0c;flash的读取速度能够满足cpu 的取指需求&#xff0c;但flash 的写入速度很慢&#xff0c;所以引…

刚办理的手机号被停用,你可能遇到这些问题了!

很多朋友都会遇到手机号被停用的情况&#xff0c;那么你知道你的手机号为什么会被停用吗&#xff1f;接下来&#xff0c;关于手机号被停用的问题&#xff0c;跟着小编一块来了解一下吧。 ​停机的两种形态&#xff1a; 1、第一个是局方停机&#xff0c;即语音、短信和流量都不…

xmind2testcase工具将测试用例从Xmind转为CSV导入禅道

使用xmind编写测试用例&#xff0c;使用xmind2testcase工具将测试用例从Xmind转为CSV导入禅道&#xff0c;便于管理。 1.工具准备 第一步&#xff1a;安装python 第二步&#xff1a;安装xmind2testcase工具 运行-cmd-打开命令提示符弹窗&#xff0c;输入安装命令 安装命令&…

意图数据集HWU、Banking预处理

当谈到意图数据集时&#xff0c;HWU、Banking和Clinc是三个常见的数据集。以下是关于这三个数据集的介绍&#xff1a; 目录 一、数据集介绍 HWU数据集 Banking数据集 Clinc数据集 二、数据集预处理 数据处理 数据存储 数据类别分析 句子长度统计 一、数据集介绍 HW…

AI产品经理能力模型的重点素质:人文素养和灵魂境界

在AI产品经理的能力模型中&#xff0c;我最想提的差异化关键点&#xff0c;就是“人文素养和灵魂境界”。 1 为什么“人文素养和灵魂境界”非常重要&#xff1f; 一、“人文素养和灵魂境界”如何影响AI产品设计&#xff1f; 例1&#xff1a;面对一个具体的AI场景&#xff0…

25考研,数二全程跟的张宇老师请问660(做了一半)880和张宇1000题应该怎么选择?

跟张宇老师&#xff0c;也可以做其他的题集&#xff0c;不一定非要做1000题 我当初考研复习的时候&#xff0c;也听了张宇老师的课程&#xff0c;但是我并没有做1000题 因为1000题对于我来说太难了。做了一章之后&#xff0c;就换成其他的题目了。 对于大家来说&#xff0c;…