微信小程序+腾讯地图开发实现路径规划绘制


Posted in Javascript onMay 22, 2019

现象

我们想用微信小程序实现在map>组件上自定义显示导航路径,但是目前为止官方并未给出相应的方法实现,map>组件确实有绘制点对点连线的属性polyline,但是呢我们没有一系列的坐标集合也是画不出一条路径的,

微信小程序+腾讯地图开发实现路径规划绘制

更糟糕的是即便你内置微信小程序JavaScript SDK,它目前为止也不能给你相应的返回导航路径中所有坐标集合方法实现,不信你看介绍

微信小程序+腾讯地图开发实现路径规划绘制

解决方案

那我们只能用WebService API咯,

微信小程序+腾讯地图开发实现路径规划绘制

但是不要高兴的太早,根据文档,我们要的接口参数是酱紫的

微信小程序+腾讯地图开发实现路径规划绘制

那么我们开始写(下面是菜鸡版代码,非礼勿视)

微信小程序+腾讯地图开发实现路径规划绘制

wx.request()参数的data部分对”from”/”to”赋值不能采用惯用手法了,你会发现换了好几种方式依然不能如意,要么请求参数非法,要么语法编译又过不了,没办法,最后只能使用绝招了

微信小程序+腾讯地图开发实现路径规划绘制 

哼哼,状态稳如老狗 @_@

ok,到此为止,我们已经拿到我们想要的坐标集合了,那么接下来就是提取坐标数组,然后给polyline绘制的问题了

利用polyline绘制路径

什么都不说了,直接上代码:

/**
  * 获取当前位置标记在地图上并且利用polyline绘制路径
  */
 now_LocationTap: function () {
  var that = this
  /**
   * 初始化当前地图标记信息
   */
  wx.getLocation({
   type: 'gcj02', // 默认为 wgs84 返回 gps 坐标,gcj02 返回可用于 wx.openLocation 的坐标
   success: function (res) {
    console.log('当前位置数据Object如下:')
    console.log(res)
    /** 开始同步数据 */
    that.setData({
     now_Location: {
      latitude: res.latitude,
      longitude: res.longitude,
     },
     /**初始化地图标记点附近车辆信息 */
     markers: [
      {
       iconPath: '/resources/wait/car.png',
       width: 70,
       height: 70,
       latitude: res.latitude,
       longitude: res.longitude
      }
     ]

    })
    console.log('当前latitude:' + res.latitude)
    console.log('当前longitude:' + res.longitude)
    console.log('当前latitude同步结果:' + that.data.now_Location.latitude)
    console.log('当前longitude同步结果:' + that.data.now_Location.longitude)

    /********************** 从腾讯地图WebService API请求导航路线坐标集合用于point_Array折线连接 */
    var now_Location = String(res.latitude + ',' + res.longitude)
    var end_Location = String(that.data.endLocation.latitude + ',' + that.data.endLocation.longitude)
    wx.request({
     url: 'https://apis.map.qq.com/ws/direction/v1/driving/', //连接接口地址

     data: {
      from: now_Location,
      to: end_Location,
      policy: 'REAL_TRAFFIC',  //结合路况的最优方式
      key: '腾讯地图KEY',

     },
     header: {
      'content-type': 'application/json' // 默认值
     },
     success: function (res) {
      console.log(res.data)
      console.log('剩余距离:' + res.data.result.routes[0].distance + '米')
      console.log('剩余时间:' + res.data.result.routes[0].duration + '分钟')
      console.log('导航路线点串如下:')
      console.log(res.data.result.routes[0].polyline)
      /** 获取返回的方案路线坐标点串并解压 */
      var coors = res.data.result.routes[0].polyline
      for (var i = 2; i < coors.length; i++)
      { coors[i] = coors[i - 2] + coors[i] / 1000000 }
      console.log('路线坐标点串解压完毕!')
      console.log('路线坐标点串解压结果如下:')
      console.log(coors);
      /** 将解压后的坐标点串进行拼接成polyline想要的样子 */
      var coors_new=[] //记住微信小程序声明一个数组这样写
      for(var j = 0; j < coors.length; j++){
      coors_new.push({
      latitude: parseFloat(coors[j]),
      longitude: parseFloat(coors[j+1])
     })
     j++;
    } 

      /* 自己想的针对polyline的points做出的格式化方案,直接实现了目标对象的字符串形式,但是一开始没注意数据类型的问题,随后试了好几种方案都不如意,最终查看了高德地图的开发方案后恍然大悟,Array.push({latitude:'',longitude:''}),简直完美!
      for (var i = 0, j = 0; i < coors.length - 2, j < coors.length/2; i++,j++)
      { 
       coors[i] = String('{latitude:'+String(coors[i])+','+'longitude:'+String(coors[i + 1])+'}') ;
       coors_new[j] = coors[i];
       i+=1;  //此处注意不+2的原因是:还有for循环的自动+1,结合起来就会达到跳2的效果
      }
      */

      console.log('路线坐标点串格式化完毕!')
      console.log('路线坐标点串格式化结果如下:')
      console.log(coors)
      console.log('已经产生新的经纬度数组coors_new如下:')
      console.log(coors_new)
      console.log('路线坐标点串解压后一共:' + coors.length + '个')
      console.log('路线坐标点串转换后一共:' + coors_new.length + '个')
      /** 开始同步路线坐标集合+剩余距离+剩余时间数据 */
      that.setData({
       now_Duration: res.data.result.routes[0].duration,  //剩余时间
       now_Distance: res.data.result.routes[0].distance,  //剩余距离
       polyline_Object: [{
        points: coors_new,//指定一系列坐标点,从数组第一项连线至最后一项
        color: "#FF0000DD",
        width: 2,
        dottedLine: true
       }],
      })
      console.log('更新points经纬度数组如下:')
      console.log(that.data.polyline_Object[0].points)
      console.log('更新polyline_Object如下:')
      console.log(that.data.polyline_Object)
      console.log('当前剩余时间 now_Duration同步结果:' + that.data.now_Duration+'分钟')
      console.log('当前剩余距离now_Distance同步结果:' + that.data.now_Distance+'米')
     }
    })

   },
  })
 }!

微信小程序+腾讯地图开发实现路径规划绘制 

至此路径规划告一段落

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
在表单提交前进行验证的几种方式整理
Jul 31 Javascript
jQuery下拉菜单的实现代码
Nov 03 Javascript
jquery实现全选、全不选以及单选功能
Mar 23 jQuery
Node+Express+MongoDB实现登录注册功能实例
Apr 23 Javascript
Vue2单一事件管理组件通信
May 09 Javascript
jsTree事件和交互以及插件plugins详解
Aug 29 Javascript
使用MUI框架模拟手机端的下拉刷新和上拉加载功能
Sep 04 Javascript
详解Vue 事件修饰符capture 的使用
Dec 29 Javascript
vue后台管理之动态加载路由的方法
Aug 13 Javascript
jQuery实现鼠标移到某个对象时弹出显示层功能
Aug 23 jQuery
微信小程序自定义顶部组件customHeader的示例代码
Jun 03 Javascript
微信小程序实现拨打电话功能的示例代码
Jun 28 Javascript
详解wepy开发小程序踩过的坑(小结)
May 22 #Javascript
vue项目中mock.js的使用及基本用法
May 22 #Javascript
JavaScript函数式编程(Functional Programming)组合函数(Composition)用法分析
May 22 #Javascript
vue以组件或者插件的形式实现throttle或者debounce
May 22 #Javascript
JavaScript函数式编程(Functional Programming)箭头函数(Arrow functions)用法分析
May 22 #Javascript
JavaScript函数式编程(Functional Programming)高阶函数(Higher order functions)用法分析
May 22 #Javascript
浅谈VUE防抖与节流的最佳解决方案(函数式组件)
May 22 #Javascript
You might like
PHP模拟SQL Server的两个日期处理函数
2006/10/09 PHP
用javascript实现兼容IE7的类库 IE7_0_9.zip提供下载
2007/08/08 Javascript
jquery插件制作 图片走廊 gallery
2012/08/17 Javascript
JavaScript代码复用模式实例分析
2012/12/02 Javascript
jQuery.buildFragment使用方法及思路分析
2013/01/07 Javascript
JSP跨iframe如何传递参数实现代码
2013/09/21 Javascript
JavaScript自定义数组排序方法
2015/02/12 Javascript
Node.js编写组件的三种实现方式
2016/02/25 Javascript
jQuery实现的自定义滚动条实例详解
2016/09/20 Javascript
javascript中Date对象的使用总结
2016/11/21 Javascript
基于jQuery实现简单人工智能聊天室
2017/02/10 Javascript
jquery实现简单实用的轮播器
2017/05/23 jQuery
JS 组件系列之BootstrapTable的treegrid功能
2017/06/16 Javascript
微信小程序 input输入及动态设置按钮的实现
2017/10/27 Javascript
Vue实现PopupWindow组件详解
2018/04/28 Javascript
仿ElementUI实现一个Form表单的实现代码
2019/04/23 Javascript
浅析vue-router中params和query的区别
2019/12/24 Javascript
javascript前端和后台进行数据交互方法示例
2020/08/07 Javascript
[01:39:42]Fnatic vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
[00:06]Yes,it worked!小卡尔成功穿越时空加入战场!
2019/07/20 DOTA
在python中的socket模块使用代理实例
2014/05/29 Python
Python 实现数据库更新脚本的生成方法
2017/07/09 Python
使用Python实现在Windows下安装Django
2018/10/17 Python
对python中词典的values值的修改或新增KEY详解
2019/01/20 Python
Python面向对象程序设计示例小结
2019/01/30 Python
Python OpenCV调用摄像头检测人脸并截图
2020/08/20 Python
python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析
2020/03/08 Python
CSS的pointer-events属性详细介绍(作用和注意事项)
2014/04/23 HTML / CSS
Application Cache未缓存文件无法访问无法加载问题
2014/05/31 HTML / CSS
皇家阿尔伯特英国官方商店:Royal Albert骨瓷
2019/03/25 全球购物
国际商务专业学生个人的自我评价
2013/09/28 职场文书
皮肤科医师岗位职责
2013/12/04 职场文书
公司道歉信范文
2014/01/09 职场文书
2014年政协工作总结
2014/12/09 职场文书
Python关于OS文件目录处理的实例分享
2021/05/23 Python
MySQL为数据表建立索引的原则详解
2022/03/03 MySQL