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


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 相关文章推荐
window.open被浏览器拦截后的自定义提示效果代码
Nov 19 Javascript
js 发个判断字符串是否为符合标准的函数
Apr 27 Javascript
node.js chat程序如何实现Ajax long-polling长链接刷新模式
Mar 13 Javascript
jquery $.ajax相关用法分享
Mar 16 Javascript
jquery offset函数应用实例
Nov 14 Javascript
浅谈jQuery中对象遍历.eq().first().last().slice()方法
Nov 26 Javascript
jQuery 如何给Carousel插件添加新的功能
Apr 18 Javascript
JavaScript函数节流概念与用法实例详解
Jun 20 Javascript
浅析Vue自定义组件的v-model
Nov 26 Javascript
javascript实现画板功能
Apr 12 Javascript
vue3.0 加载json的方法(非ajax)
Oct 26 Javascript
vue3 watch和watchEffect的使用以及有哪些区别
Jan 26 Vue.js
详解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
smarty静态实验表明,网络上是错的~呵呵
2006/11/25 PHP
javascript 小型动画组件与实现代码
2010/06/02 PHP
IIS7.X配置PHP运行环境小结
2011/06/09 PHP
PHP中使用glob函数实现一句话删除某个目录下的所有文件
2014/07/22 PHP
PHP上传文件时自动分配路径的方法
2015/01/09 PHP
php准确获取文件MIME类型的方法
2015/06/17 PHP
PHP安装threads多线程扩展基础教程
2015/11/17 PHP
YII Framework框架教程之日志用法详解
2016/03/14 PHP
js实现iframe自动自适应高度的方法
2015/02/17 Javascript
实例代码详解jquery.slides.js
2015/11/16 Javascript
javascript新闻跑马灯实例代码
2020/07/29 Javascript
JS实现pasteHTML兼容ie,firefox,chrome的方法
2016/06/22 Javascript
jquery动态遍历Json对象的属性和值的方法
2016/07/27 Javascript
JS继承之借用构造函数继承和组合继承
2016/09/07 Javascript
进阶之初探nodeJS
2017/01/24 NodeJs
浅谈javascript中的 “ &amp;&amp; ” 和 “ || ”
2017/02/02 Javascript
JavaScript使用链式方法封装jQuery中CSS()方法示例
2017/04/07 jQuery
JavaScript实现form表单的多文件上传
2020/03/27 Javascript
jQuery 表单序列化实例代码
2017/06/11 jQuery
vue axios用法教程详解
2017/07/23 Javascript
ubuntu编译nodejs所需的软件并安装
2017/09/12 NodeJs
vue2.0 自定义 饼状图 (Echarts)组件的方法
2018/03/02 Javascript
Angular实现模版驱动表单的自定义校验功能(密码确认为例)
2018/05/17 Javascript
Python 列表(List)操作方法详解
2014/03/11 Python
Python采用Django开发自己的博客系统
2020/09/29 Python
浅谈Python 的枚举 Enum
2017/06/12 Python
利用python模拟实现POST请求提交图片的方法
2017/07/25 Python
python实现Adapter模式实例代码
2018/02/09 Python
Python实现的读取文件内容并写入其他文件操作示例
2019/04/09 Python
Python使用lambda抛出异常实现方法解析
2020/08/20 Python
python 基于DDT实现数据驱动测试
2021/02/18 Python
活动策划求职信模板
2014/04/21 职场文书
会计师事务所实习证明
2014/11/16 职场文书
pytorch 如何把图像数据集进行划分成train,test和val
2021/05/31 Python
Nebula Graph解决风控业务实践
2022/03/31 MySQL
MySQL使用IF语句及用case语句对条件并结果进行判断 
2022/09/23 MySQL