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


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 相关文章推荐
jQuery autocomplete插件修改
Apr 17 Javascript
Input 特殊事件onpopertychange和oninput
Jun 17 Javascript
JavaScript 继承详解(一)
Jul 13 Javascript
精心挑选的12款优秀的基于jQuery的手风琴效果插件和教程
Aug 22 Javascript
javascript操作excel生成报表全攻略
May 04 Javascript
zepto.js中tap事件阻止冒泡的实现方法
Feb 12 Javascript
jQuery oLoader实现的加载图片和页面效果
Mar 14 Javascript
jQuery鼠标事件汇总
Aug 30 Javascript
JS运动特效之任意值添加运动的方法分析
Jan 24 Javascript
JS实现的检验身份证格式并输出出生日期,年龄,性别,出生地示例
May 17 Javascript
vue里的data要用return返回的原因浅析
May 28 Javascript
vue+vant-UI框架实现购物车的复选框全选和反选功能
Nov 05 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 ctype函数中文翻译和示例
2014/03/21 PHP
ThinkPHP模板判断输出Empty标签用法详解
2014/06/30 PHP
用脚本调用样式的几种方法
2006/12/09 Javascript
jQuery 页面 Mask实现代码
2010/01/09 Javascript
jQuery 定时局部刷新(setInterval)
2010/11/19 Javascript
代码触发js事件(click、change)示例应用
2013/12/13 Javascript
javascript的alert box在java中如何显示多行
2014/05/18 Javascript
JS实现自动切换文字的导航效果代码
2015/08/27 Javascript
BootStrap glyphicons 字体图标实现方法
2016/05/01 Javascript
基于jQuery插件实现点击小图显示大图效果
2016/05/11 Javascript
Bootstrap开发实战之响应式轮播图
2016/06/02 Javascript
终于实现了!精彩的jquery弹幕效果
2016/07/18 Javascript
AngularJS 单元测试(一)详解
2016/09/21 Javascript
AngularJS基于ngInfiniteScroll实现下拉滚动加载的方法
2016/12/14 Javascript
React Native使用fetch实现图片上传的示例代码
2018/03/07 Javascript
NodeJS实现不可逆加密与密码密文保存的方法
2018/03/16 NodeJs
基于JavaScript实现幸运抽奖页面
2020/07/05 Javascript
vue中使用element-ui进行表单验证的实例代码
2018/06/22 Javascript
express启用https使用小记
2019/05/21 Javascript
[01:03]悬念揭晓 11月26日DOTA2完美盛典不见不散
2017/11/23 DOTA
[01:10]DOTA2 Supermajor:英雄,由我们见证
2018/05/14 DOTA
用Python编写一个每天都在系统下新建一个文件夹的脚本
2015/05/04 Python
python决策树之C4.5算法详解
2017/12/20 Python
python使用mysql的两种使用方式
2018/03/07 Python
关于Python正则表达式 findall函数问题详解
2018/03/22 Python
Django的models模型的具体使用
2019/07/15 Python
python 装饰器功能与用法案例详解
2020/03/06 Python
PyTorch中的C++扩展实现
2020/04/02 Python
Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
2020/06/14 Python
如何快速一次性卸载所有python包(第三方库)呢
2020/10/20 Python
市场营销管理制度
2014/01/29 职场文书
2016暑期社会实践心得体会范文
2016/01/14 职场文书
公司转让协议书
2016/03/19 职场文书
Golang 空map和未初始化map的注意事项说明
2021/04/29 Golang
Python 避免字典和元组的多重嵌套问题
2022/07/15 Python
SqlServer常用函数及时间处理小结
2023/05/08 SQL Server