在html页面中引入腾讯地图,html引入腾讯地图

这篇博客介绍了如何在HTML页面中通过JavaScript获取地理位置信息,并使用腾讯地图API进行地图展示和路线规划。首先,通过`GetQueryString`函数获取URL参数,然后使用微信JS-SDK获取用户当前位置,最后利用腾讯地图的WebServiceAPI绘制路线并添加起点和终点的标记。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// 获取链接后面的参数

var latitudea = 0;

var longitudea = 0;

var image = "";

var latitude = 0;

var longitude = 0;

var lnglatXY = ""

function GetQueryString(name) {

var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");

var r = window.location.search.substr(1).match(reg);//search,查询?后面的参数,并匹配正则

if (r != null) return unescape(r[2]); return null;

}

console.log("latitude", GetQueryString("latitude"))

console.log("longitude", GetQueryString("longitude"))

console.log("image", GetQueryString("image"))

latitudea = GetQueryString("latitude")

longitudea = GetQueryString("longitude")

image = GetQueryString("image")

var map;

wx.config({

debug: false,

appId: '',

timestamp: '',

nonceStr: '',

signature: '',

jsApiList: [

// 所有要调用的 API 都要加到这个列表中

'chooseImage',

'uploadImage',

'scanQRCode',

'getLocation',

'openLocation'

]

});

wx.ready(function () {

wx.getLocation({

type: 'gcj02', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'

success: function (res) {

if (res.errMsg == "getLocation:ok") {

console.log('res', res)

longitude = res.longitude;

latitude = res.latitude;

lnglatXY = [res.longitude, res.latitude]; //已知点坐标

console.log("13123", lnglatXY[1]);

// initMap(lnglatXY);

//初始化地图

map = new TMap.Map('mapContainer', {

center: new TMap.LatLng(lnglatXY[1], lnglatXY[0]),//地图显示中心点

zoom: 11

});

//WebServiceAPI请求URL(驾车路线规划默认会参考实时路况进行计算)

var url = "https://apis.map.qq.com/ws/direction/v1/driving/"; //请求路径

url += "?from=" + lnglatXY[1] + "," + lnglatXY[0]; //起点坐标

url += "&to=" + latitudea + "," + longitudea; //终点坐标

url += "&output=jsonp&callback=cb";//指定JSONP回调函数名,本例为cb

url += "&key=GV4BZ-COE3X-AAN45-TW4LF-GVVMF-SYBT4"; //开发key,可在控制台自助创建

//发起JSONP请求,获取路线规划结果

jsonp_request(url);

cb(ret)

display_polyline(pl)

}

}

})

})

//浏览器调用WebServiceAPI需要通过Jsonp的方式,此处定义了发送JOSNP请求的函数

function jsonp_request(url) {

var script = document.createElement('script');

script.src = url;

document.body.appendChild(script);

}

//定义请求回调函数,在此拿到计算得到的路线,并进行绘制

function cb(ret) {

var coors = ret.result.routes[0].polyline, pl = [];

//获取路线距离

var distance = ret.result.routes[0].distance

var duration = ret.result.routes[0].duration

distance = distance / 1000

$("#distance").text("距离:" + distance.toFixed(2) + "公里")

$("#duration").text("时长:" + duration + "分钟")

console.log(ret)

//坐标解压(返回的点串坐标,通过前向差分进行压缩)

var kr = 1000000;

for (var i = 2; i < coors.length; i++) {

coors[i] = Number(coors[i - 2]) + Number(coors[i]) / kr;

}

//将解压后的坐标放入点串数组pl中

for (var i = 0; i < coors.length; i += 2) {

pl.push(new TMap.LatLng(coors[i], coors[i + 1]));

}

display_polyline(pl)//显示路线

//标记起终点marker

var marker = new TMap.MultiMarker({

id: 'marker-layer',

map: map,

styles: {

"start": new TMap.MarkerStyle({

"width": 25,

"height": 35,

"anchor": { x: 16, y: 32 },

"src": 'https://sucai.suoluomei.cn/sucai_zs/images/20191211151137-marker.png'

}),

"end": new TMap.MarkerStyle({

"width": 35,

"height": 35,

"anchor": { x: 16, y: 32 },

"src": 'http://sucai.suoluomei.cn/sucai_zs/images/20200104135819-moeaddress.png'

})

},

geometries: [{

"id": 'start',

"styleId": 'start',

"position": new TMap.LatLng(latitudea, longitudea),//接口渲染数据

"title": "

span>%20<span%20class=%22token%20string%22>%22

目的地"

}, {

"id": 'end',

"styleId": 'end',

"position": new TMap.LatLng(lnglatXY[1], lnglatXY[0]),//接口渲染数据

"title": "我的位置"

}]

});

//初始化infoWindow

var infoWindow = new TMap.InfoWindow({

map: map,

position: new TMap.LatLng(39.984104, 116.307503),

offset: { x: 0, y: -34 } //设置信息窗相对position偏移像素,为了使其显示在Marker的上方

});

infoWindow.close();//初始关闭信息窗关闭

//marker点击事件

marker.on("click", function (evt) {

//设置infoWindow

console.log("点击了坐标")

infoWindow.open(); //打开信息窗

infoWindow.setPosition(evt.geometry.position);//设置信息窗位置

infoWindow.setContent(evt.geometry.title);//设置信息窗内容

// infoWindow.setContent(evt.geometry.position.toString());//设置信息窗内容

})

}

function daohang() {

// window.location.href="https://mapdownload.map.qq.com/index?channel=10029633&key=personal&referer=myapp"latitude longitude

window.location.href = "https://apis.map.qq.com/uri/v1/routeplan?type=drive&from=我的位置&fromcoord=" + latitude + "," + longitude + "&to=目的地&tocoord=" + latitudea + "," + longitudea + "&policy=1&referer=GV4BZ-COE3X-AAN45-TW4LF-GVVMF-SYBT4"

}

function display_polyline(pl) {

//创建 MultiPolyline显示折线

var polylineLayer = new TMap.MultiPolyline({

id: 'polyline-layer', //图层唯一标识

map: map,//绘制到目标地图

//折线样式定义

styles: {

'style_blue': new TMap.PolylineStyle({

'color': '#3777FF', //线填充色

'width': 6, //折线宽度

'borderWidth': 5, //边线宽度

'borderColor': '#FFF', //边线颜色

'lineCap': 'round' //线端头方式

})

},

//折线数据定义

geometries: [

{

'id': 'pl_1',//折线唯一标识,删除时使用

'styleId': 'style_blue',//绑定样式名

'paths': pl

}

]

});

}

<think>好的,我现在需要在Vue2项目中集成腾讯地图API,但不太清楚具体怎么操作。首先,我应该看看用户提供的参考资料,里面有几个引用提到了不同的方法。 引用[1]和[4]提到在main.js引入腾讯地图的脚本,并且使用了VueJsonp插件。引用[3]则建议异步加载,避免首次加载过慢。引用[2]提到WebService API需要申请密钥。用户可能想在地图上展示位置,可能需要GL版本或者普通API。 首先,我需要确定使用哪种API。如果是地图展示,可能用JavaScript API GL,如引用[4]中的例子。但直接引入脚本可能会影响性能,所以需要考虑异步加载,如引用[3]的方法。另外,申请密钥是必须的,每个引用都提到了key。 步骤可能包括:申请密钥,引入脚本,异步加载,初始化地图。需要注意Vue2的语法,比如使用Vue.prototype来挂载实例,或者用Vue.use插件。引用[1]用了VueJsonp来处理JSONP请求,这可能是因为腾讯地图的某些接口需要JSONP跨域。 异步加载的话,可以用动态创建script标签的方式,并在加载完成后初始化地图。同时,需要处理组件中的地图初始化,可能需要在mounted生命周期钩子中检查API是否加载完毕,避免错误。 还需要考虑组件销毁时清理地图实例,防止内存泄漏。另外,如果使用WebService API,比如地理编码,可能需要不同的引入方式,如引用[2]所述,但用户可能更需要地图显示,所以重点在JavaScript API的集成。 可能的代码结构:在main.js中全局挂载,或者在特定组件中按需加载。根据引用[3]的建议,异步加载提高性能,所以应该推荐异步方法。同时,要处理加载状态,比如用Promise或者事件监听来确保API加载完成后再执行地图初始化。 总结步骤:申请Key,异步加载API脚本,在Vue组件中等待加载完成后创建地图实例,添加标记和交互。可能还需要处理错误情况,比如加载失败时的反馈。</think>在Vue2中集成腾讯地图API可通过以下步骤实现: ### 一、基础引入方法 1. **申请开发者密钥** 前往腾讯位置服务官网申请Key,格式如`OB4BZ-XXXXX-XXXXX-XXXXX-XXXXX-WPB77`[^2][^4] 2. **全局同步引入(简单但影响性能)** 在`public/index.html`中添加: ```html <script src="https://map.qq.com/api/gljs?v=1.exp&key=YOUR_KEY"></script> ``` 在`main.js`中挂载: ```javascript Vue.prototype.$TMap = window.TMap // 全局可用[^1] ``` 3. **组件内异步加载(推荐优化方案)** 在需要地图的组件中: ```javascript export default { data() { return { mapLoaded: false } }, async mounted() { await this.loadMapScript(); this.initMap(); }, methods: { loadMapScript() { return new Promise((resolve, reject) => { if (window.qq) return resolve(); const script = document.createElement('script'); script.src = `https://map.qq.com/api/gljs?v=1.exp&key=YOUR_KEY`; script.onload = resolve; script.onerror = reject; document.head.appendChild(script); }); }, initMap() { new window.qq.maps.Map(document.getElementById('map'), { center: new window.qq.maps.LatLng(39.916527, 116.397128), zoom: 13 }); } } } ``` ### 二、WebService API集成 对于地理编码等HTTP接口: ```javascript // 安装jsonp插件 npm install vue-jsonp // main.js配置 import VueJsonp from 'vue-jsonp' Vue.use(VueJsonp) ``` 使用示例: ```javascript this.$jsonp('https://apis.map.qq.com/ws/geocoder/v1/', { key: 'YOUR_KEY', address: '北京市海淀区', output: 'jsonp' }).then(res => { console.log(res.result.location); })[^2][^3] ``` ### 三、最佳实践建议 1. **性能优化** - 使用`v-if`控制地图容器渲染时机 - 配合`<keep-alive>`缓存地图组件 - 懒加载非首屏地图组件 2. **错误处理** ```javascript script.onerror = () => { console.error('地图加载失败'); this.$emit('map-error'); } ``` 3. **组件销毁处理** ```javascript beforeDestroy() { if (this.map) { this.map.destroy(); this.map = null; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值