当前位置:   article > 正文

腾讯地图API的应用_腾讯地图api接口文档

腾讯地图api接口文档

腾讯地图JavaScript API的应用

目录

前言

正文

注册腾讯位置服务账号

设置秘钥

获取秘钥

腾讯地图的开发文档

腾讯地图的JavaScript API

腾讯地图demo

总结


前言

随着社会的高速发展,手机地图已经成为了生活中不可或缺的一部分,他出现在各种app中,比如外卖app需要展示配送的路线和距离,导航的app需要路线规划和显示路线拥挤情况,社交app需要显示自己所在的位置和附近用户的位置。基本上只要你做的产品涉及到地图板块,你都需要引进相关地图api。那么对于开发者来说,怎么使用地图的api来完成我们的功能点就变的至关重要啦,这篇博客就讲解下腾讯地图JavaScript API的应用。

正文

注册腾讯位置服务账号

腾讯位置服务账号注册地址

点击上面的链接,填写注册信息,点击注册按钮进行注册即可

完成开发者验证,即可进行注册key

设置秘钥

 

获取秘钥

腾讯地图的开发文档

针对不同的平台,腾讯地图的api还是很全的

腾讯地图的JavaScript API

这里具体看下JavaScript API ,这是一个官方给的demo,如何创建地图,并设置地图初始化的参数,我们在源代码编辑器里去随意改变下参数,点击运行就出现代码运行的效果,很方便开发者理解这个功能的参数的作用和效果,而且贴心的还写了备注。

腾讯地图demo

一、使用场景,查询出发地到目的地路线规划,我们先看下路线规划的api给的例子,就知道接下来写代码的思路了,我们需要先获取用户输入的起点位置的坐标,在获取终点坐标的位置,然后调用接口获取路线规划的结果,最后根据结果绘画路线即可

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>折线应用: 路线规划</title>
  8. </head>
  9. <script charset="utf-8"
  10. src="https://map.qq.com/api/gljs?v=1.exp&key=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77"></script>
  11. <style>
  12. html,
  13. body {
  14. height: 100%;
  15. margin: 0px;
  16. padding: 0px;
  17. }
  18. #mapContainer {
  19. width: 100%;
  20. height: 100%;
  21. }
  22. </style>
  23. <body onload="initMap()">
  24. <div id="mapContainer"></div>
  25. </body>
  26. </html>
  27. <script>
  28. //注:本例仅为说明流程,不保证严谨
  29. var map;
  30. function initMap(){
  31. //初始化地图
  32. map = new TMap.Map('mapContainer', {
  33. center: new TMap.LatLng(39.980619,116.321277),//地图显示中心点
  34. zoom:14 //缩放级别
  35. });
  36. //WebServiceAPI请求URL(驾车路线规划默认会参考实时路况进行计算)
  37. var url="https://apis.map.qq.com/ws/direction/v1/driving/"; //请求路径
  38. url+="?from=39.984039,116.307630"; //起点坐标
  39. url+="&to=39.977263,116.337063"; //终点坐标
  40. url+="&output=jsonp&callback=cb" ; //指定JSONP回调函数名,本例为cb
  41. url+="&key=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77"; //开发key,可在控制台自助创建
  42. //发起JSONP请求,获取路线规划结果
  43. jsonp_request(url);
  44. }
  45. //浏览器调用WebServiceAPI需要通过Jsonp的方式,此处定义了发送JOSNP请求的函数
  46. function jsonp_request(url){
  47. var script=document.createElement('script');
  48. script.src=url;
  49. document.body.appendChild(script);
  50. }
  51. //定义请求回调函数,在此拿到计算得到的路线,并进行绘制
  52. function cb(ret){
  53. var coords = ret.result.routes[0].polyline, pl = [];
  54. //坐标解压(返回的点串坐标,通过前向差分进行压缩)
  55. var kr = 1000000;
  56. for (var i = 2; i < coords.length; i++) {
  57. coords[i] = Number(coords[i - 2]) + Number(coords[i]) / kr;
  58. }
  59. //将解压后的坐标放入点串数组pl中
  60. for (var i = 0; i < coords.length; i += 2) {
  61. pl.push(new TMap.LatLng(coords[i], coords[i+1]));
  62. }
  63. display_polyline(pl)//显示路线
  64. //标记起终点marker
  65. var marker = new TMap.MultiMarker({
  66. id: 'marker-layer',
  67. map: map,
  68. styles: {
  69. "start": new TMap.MarkerStyle({
  70. "width": 25,
  71. "height": 35,
  72. "anchor": { x: 16, y: 32 },
  73. "src": 'https://mapapi.qq.com/web/lbs/javascriptGL/demo/img/start.png'
  74. }),
  75. "end": new TMap.MarkerStyle({
  76. "width": 25,
  77. "height": 35,
  78. "anchor": { x: 16, y: 32 },
  79. "src": 'https://mapapi.qq.com/web/lbs/javascriptGL/demo/img/end.png'
  80. })
  81. },
  82. geometries: [{
  83. "id": 'start',
  84. "styleId": 'start',
  85. "position": new TMap.LatLng(39.984039,116.307630307503)
  86. }, {
  87. "id": 'end',
  88. "styleId": 'end',
  89. "position": new TMap.LatLng(39.977263,116.337063)
  90. }]
  91. });
  92. }
  93. function display_polyline(pl){
  94. //创建 MultiPolyline显示折线
  95. var polylineLayer = new TMap.MultiPolyline({
  96. id: 'polyline-layer', //图层唯一标识
  97. map: map,//绘制到目标地图
  98. //折线样式定义
  99. styles: {
  100. 'style_blue': new TMap.PolylineStyle({
  101. 'color': '#3777FF', //线填充色
  102. 'width': 8, //折线宽度
  103. 'borderWidth': 5, //边线宽度
  104. 'borderColor': '#FFF', //边线颜色
  105. 'lineCap': 'round', //线端头方式
  106. })
  107. },
  108. //折线数据定义
  109. geometries: [
  110. {
  111. 'id': 'pl_1',//折线唯一标识,删除时使用
  112. 'styleId': 'style_blue',//绑定样式名
  113. 'paths': pl
  114. }
  115. ]
  116. });
  117. }
  118. </script>

二、具体的demo的代码

效果图:

代码:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5. <title>腾讯地图</title>
  6. <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css"
  7. integrity="sha384-B0vP5xmATw1+K9KRQjQERJvTumQW0nPEzvF6L/Z6nronJ3oUOFUFpCjEUQouq2+l" crossorigin="anonymous">
  8. <style type="text/css">
  9. * {
  10. margin: 0;
  11. padding: 0;
  12. }
  13. #container {
  14. /*地图(容器)显示大小*/
  15. width: 100%;
  16. height: 100%;
  17. z-index: 1;
  18. }
  19. .searchWrap {
  20. position: absolute;
  21. top: 30px;
  22. left: 30px;
  23. z-index: 2;
  24. }
  25. #list-group,
  26. #list-group2,
  27. .searchEnd {
  28. display: none;
  29. }
  30. #closeBtn {
  31. position: absolute;
  32. top: -10px;
  33. right: -14px;
  34. }
  35. .dropdown-menu .list-group-item.active {
  36. color: #fff;
  37. background-color: #007bff;
  38. border-color: #007bff;
  39. }
  40. </style>
  41. <!--引入Javascript API GL,参数说明参见下文-->
  42. <script src="https://map.qq.com/api/gljs?v=1.exp&key=HMQBZ-XC7KD-WZ64J-PFOQM-CFMT6-HUBOX"></script>
  43. </head>
  44. <!-- 页面载入后,调用init函数 -->
  45. <body>
  46. <!-- 定义地图显示容器 -->
  47. <div id="container"></div>
  48. <div class="searchWrap">
  49. <div class="searchStart">
  50. <div class="input-group mb-3">
  51. <input type="text" autocomplete="off" id="search" class="form-control strtSiteIpt" placeholder="请输入地点"
  52. aria-describedby="basic-addon1">
  53. <div class="input-group-append">
  54. <span class="input-group-text" id="basic-addon1">搜索</span>
  55. </div>
  56. </div>
  57. <ul class="list-group" id="list-group">
  58. <li class="list-group-item"></li>
  59. </ul>
  60. </div>
  61. <div class="searchEndWrap">
  62. <div class="searchEnd">
  63. <div class="input-group mb-3">
  64. <input type="text" autocomplete="off" id="search2" class="form-control strtSiteIpt"
  65. placeholder="请输入地点" aria-describedby="basic-addon2">
  66. <div class="input-group-append">
  67. <span class="input-group-text" id="basic-addon2" style="position: relative;">搜索
  68. <button class="close" id="closeBtn"><span aria-hidden="true">&times;</span></button>
  69. </span>
  70. </div>
  71. </div>
  72. <ul class="list-group" id="list-group2">
  73. <li class="list-group-item"></li>
  74. </ul>
  75. </div>
  76. </div>
  77. <div class="btn-group">
  78. <button type="button" id="pathLineSearch" class="btn btn-primary">路线</button>
  79. </div>
  80. </div>
  81. </body>
  82. <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
  83. <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/js/bootstrap.bundle.min.js"
  84. integrity="sha384-Piv4xVNRyMGpqkS2by6br4gNJ7DXjqk09RmUpJ8jgGtD7zP9yug3goQfGII0yAns"
  85. crossorigin="anonymous"></script>
  86. <script>
  87. $(function () {
  88. //定义地图中心点坐标
  89. let center = new TMap.LatLng(39.984120, 116.307484)
  90. //定义map变量,调用 TMap.Map() 构造函数创建地图
  91. let map = new TMap.Map(document.getElementById('container'), {
  92. center: center,//设置地图中心点坐标
  93. zoom: 4, //设置地图缩放级别
  94. // pitch: 43.5, //设置俯仰角
  95. // rotation: 45 //设置地图旋转角度
  96. });
  97. let markerLayer = new TMap.MultiMarker({
  98. id: 'marker-layer',
  99. map: map
  100. });
  101. function addMarker(latLng, id) {
  102. markerLayer.add({
  103. id: id,
  104. position: latLng
  105. });
  106. let lng = latLng.lng
  107. let lat = latLng.lat
  108. map.setCenter(new TMap.LatLng(lat,lng)); // 坐标为天安门
  109. }
  110. //移除marker事件
  111. function removeMarker(id) {
  112. markerLayer.remove(id)
  113. }
  114. // 创建 MultiPolyline
  115. let polylineLayer = new TMap.MultiPolyline({
  116. id: 'polyline-layer', //图层唯一标识
  117. map: map,//绘制到目标地图
  118. //折线样式定义
  119. styles: {
  120. 'style_blue': new TMap.PolylineStyle({
  121. 'color': '#3777FF', //线填充色
  122. 'width': 8, //折线宽度
  123. 'borderWidth': 5, //边线宽度
  124. 'borderColor': '#FFF', //边线颜色
  125. 'lineCap': 'round', //线端头方式
  126. })
  127. },
  128. //折线数据定义
  129. geometries: []
  130. });
  131. // 添加路线
  132. function addlineLayer(res) {
  133. let coords = res.result.routes[0].polyline, pl = [];
  134. //坐标解压(返回的点串坐标,通过前向差分进行压缩)
  135. let kr = 1000000;
  136. for (let i = 2; i < coords.length; i++) {
  137. coords[i] = Number(coords[i - 2]) + Number(coords[i]) / kr;
  138. }
  139. //将解压后的坐标放入点串数组pl中
  140. for (let i = 0; i < coords.length; i += 2) {
  141. pl.push(new TMap.LatLng(coords[i], coords[i + 1]));
  142. }
  143. // 删除路线
  144. polylineLayer.remove(['pl_1'])
  145. // 显示折线
  146. polylineLayer.add({
  147. 'id': 'pl_1',//折线唯一标识,删除时使用
  148. 'styleId': 'style_blue',//绑定样式名
  149. 'paths': pl
  150. })
  151. }
  152. let searchStartArr = [] // 开始地点数据
  153. let searchStartVal = null
  154. let searchEndArr = [] // 结束地点数据
  155. let searchEndVal = null
  156. let pathLineWay = 'driving' // 路线默认方式
  157. // 搜索开始点
  158. $('body').on('input', '#search',
  159. function (e) {
  160. let search = $('#search').val()
  161. clearTimeout(window.setTimeOutSearch1)
  162. window.setTimeOutSearch1 = setTimeout(() => {
  163. searchStartArr = []
  164. if (search === "") {
  165. $('#list-group').hide()
  166. } else {
  167. $('#list-group').show()
  168. }
  169. $('#list-group').html(`<li class="list-group-item" id="0">
  170. <span class="lleft">正在努力查找中<span>
  171. <span class="lright"><span>
  172. </li>`)
  173. $.ajax({
  174. type: "get",
  175. url: "https://apis.map.qq.com/ws/place/v1/suggestion",
  176. data: {
  177. 'keyword': search,
  178. 'key': 'HMQBZ-XC7KD-WZ64J-PFOQM-CFMT6-HUBOX',
  179. 'output': 'jsonp'
  180. },
  181. //key换成自己的
  182. dataType: "jsonp",
  183. jsonp: "callback",
  184. jsonpCallback: "TXmap",
  185. headers: {
  186. 'Content-Type': 'application/json'
  187. },
  188. success: function (response) {
  189. if (response.status !== 0) {
  190. console.log('请求失败')
  191. return
  192. }
  193. searchStartArr = response.data
  194. let html = ''
  195. response.data.forEach(item => {
  196. html += `
  197. <li class="list-group-item" id="${item.id}">
  198. <span class="lleft">${item.title}<span>
  199. <span class="lright">${item.address}<span>
  200. </li>
  201. `
  202. });
  203. $('#list-group').html(html)
  204. }
  205. });
  206. }, 200)
  207. }
  208. )
  209. $('.searchStart').on('click', '.list-group-item', function (e) {
  210. if (searchStartVal !== null) {
  211. removeMarker([searchStartVal.id])
  212. }
  213. let target = null
  214. if ($(e.target).attr('class') === "list-group-item") {
  215. target = $(e.target)
  216. } else {
  217. target = $(e.target).parents('.list-group-item')
  218. }
  219. searchStartVal = searchStartArr.find(item => {
  220. return item.id == target.attr('id')
  221. })
  222. $('#search').val(searchStartVal.title)
  223. $('#list-group').hide()
  224. addMarker(searchStartVal.location, searchStartVal.id)
  225. })
  226. $('#basic-addon1').click(function () {
  227. addMarker(searchStartVal.location, searchStartVal.id)
  228. })
  229. // 搜索结束点
  230. $('body').on('input', '#search2',
  231. function (e) {
  232. let search = $('#search2').val()
  233. clearTimeout(window.setTimeOutSearch2)
  234. window.setTimeOutSearch2 = setTimeout(() => {
  235. searchEndArr = []
  236. if (search === "") {
  237. $('#list-group2').hide()
  238. } else {
  239. $('#list-group2').show()
  240. }
  241. $('#list-group2').html(`<li class="list-group-item" id="0">
  242. <span class="lleft">正在努力查找中<span>
  243. <span class="lright"><span>
  244. </li>`)
  245. $.ajax({
  246. type: "get",
  247. url: "https://apis.map.qq.com/ws/place/v1/suggestion",
  248. data: {
  249. 'keyword': search,
  250. 'key': 'HMQBZ-XC7KD-WZ64J-PFOQM-CFMT6-HUBOX',
  251. 'output': 'jsonp'
  252. },
  253. //key换成自己的
  254. dataType: "jsonp",
  255. jsonp: "callback",
  256. jsonpCallback: "TXmap",
  257. headers: {
  258. 'Content-Type': 'application/json'
  259. },
  260. success: function (response) {
  261. if (response.status !== 0) {
  262. console.log('请求失败')
  263. return
  264. }
  265. searchEndArr = response.data
  266. let html = ''
  267. response.data.forEach(item => {
  268. html += `
  269. <li class="list-group-item" id="${item.id}">
  270. <span class="lleft">${item.title}<span>
  271. <span class="lright">${item.address}<span>
  272. </li>
  273. `
  274. });
  275. $('#list-group2').html(html)
  276. }
  277. });
  278. }, 200)
  279. }
  280. )
  281. $('.searchEndWrap').on('click', '.list-group-item', function (e) {
  282. if (searchEndVal !== null) {
  283. removeMarker([searchEndVal.id])
  284. }
  285. let target = null
  286. if ($(e.target).attr('class') === "list-group-item") {
  287. target = $(e.target)
  288. } else {
  289. target = $(e.target).parents('.list-group-item')
  290. }
  291. searchEndVal = searchEndArr.find(item => {
  292. return item.id == target.attr('id')
  293. })
  294. $('#search2').val(searchEndVal.title)
  295. $('#list-group2').hide()
  296. addMarker(searchEndVal.location, searchEndVal.id)
  297. })
  298. $('#basic-addon2').click(function () {
  299. addMarker(searchEndVal.location, searchEndVal.id)
  300. })
  301. // 路径搜索
  302. $('#pathLineSearch').click((e) => {
  303. if ($(".searchEnd").is(":hidden")) {
  304. $('.searchEnd').show()
  305. return
  306. }
  307. if (searchStartVal === null) {
  308. alert('请输入结束出发地')
  309. return
  310. }
  311. if (searchEndVal === null) {
  312. alert('请输入结束目的地')
  313. return
  314. }
  315. $.ajax({
  316. type: "get",
  317. url: "https://apis.map.qq.com/ws/direction/v1/" + pathLineWay + "/",
  318. data: {
  319. "from": searchStartVal.location.lat + ',' + searchStartVal.location.lng,
  320. "from_poi": searchStartVal.id,
  321. "to": searchEndVal.location.lat + ',' + searchEndVal.location.lng,
  322. "to_poi": searchEndVal.id,
  323. 'key': 'HMQBZ-XC7KD-WZ64J-PFOQM-CFMT6-HUBOX',
  324. 'output': 'jsonp'
  325. },
  326. //key换成自己的
  327. dataType: "jsonp",
  328. jsonp: "callback",
  329. jsonpCallback: "TXmap",
  330. headers: {
  331. 'Content-Type': 'application/json'
  332. },
  333. success: function (response) {
  334. addlineLayer(response)
  335. }
  336. });
  337. })
  338. $('#closeBtn').click(function () {
  339. if (searchEndVal !== null) {
  340. removeMarker([searchEndVal.id])
  341. }
  342. // 删除路线
  343. polylineLayer.remove(['pl_1'])
  344. $('.searchEnd').hide()
  345. $('#search2').val('')
  346. searchEndArr = []
  347. searchEndVal = null
  348. })
  349. });
  350. </script>
  351. </html>

总结

这里我就抛转引玉下,总体感觉腾讯位置服务上手还是很快的,api还是很完善的,示例的注解也相对完善,注册简便这块我是真的喜欢,毕竟对于程序员来说,最喜欢简单,简单的界面,简洁的代码,都让开发者心情无比舒畅。

感兴趣的小伙伴,或者做自己项目用到地图的小伙伴们赶紧注册用用吧!有问题大家还能一起讨论!

我是阿达,一名喜欢分享知识的程序员,时不时的也会荒腔走板的聊一聊电影、电视剧、音乐、漫画,这里已经有16496位小伙伴在等你们啦,感兴趣的就赶紧来点击关注我把,哪里有不明白或有不同观点的地方欢迎留言!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/495233
推荐阅读
相关标签
  

闽ICP备14008679号