微信小程序之map地图规划路线以及显示距离

2023-11-20

有个问题:在选择公交路线(包含步行和公交)时,怎么才能让不同的路线显示不同的颜色?
ps:有个方式,自己写坐标解压往后的存入新数组。把步行时的数据标注下,有什么简单的方法呢?
在这里插入图片描述

自定义函数文件

/**
 * 自动获取定位信息
 */
function getLocation(that, qqmapsdk) {
  if (wx.getSystemInfoSync().locationEnabled == false) {
    wx.showModal({
      title: '提示',
      content: '请打开手机定位',
      showCancel: false
    })
    return;
  }
  if (wx.getSetting) {
    wx.getSetting({
      success: (res) => {
        if (res.authSetting['scope.userLocation'] != undefined && res.authSetting['scope.userLocation'] != true) {
          wx.showModal({
            title: '请求授权当前位置',
            content: '需要获取您的地理位置,请确认授权',
            success: function (res) {
              if (res.confirm) {
                wx.openSetting({})
              } else if (res.cancel) {
                wx.showModal({
                  title: '提示',
                  content: '授权失败',
                  showCancel: false
                })
                wx.removeStorage('tempAddrInfo_dingwei');
                return;
              }
            }
          })
        } else {
          wx.getLocation({ //授权获取当前位置信息
            type: 'gcj02',
            success(res) {
              qqmapsdk_dizhi(that, qqmapsdk, res.latitude, res.longitude);
            },
            fail(res) { //请求频率第一次返回当前未知信息,剩余返回第一次位置信息
              wx.showModal({
                title: '提示',
                content: '无法获取您的位置信息,请到设置—>微信—>位置中检查是否打开定位服务并允许访问您的定位。并重新进入小程序',
              })
            }
          })
        }
      }
    })
  } else {
    // 如果希望用户在最新版本的客户端上体验您的小程序,可以这样子提示
    wx.showModal({
      title: '提示',
      content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。'
    })
    return;
  }
}
/**
 * 地址解析
 */
function qqmapsdk_dizhi(that, qqmapsdk, latitude, longitude) {
  qqmapsdk.reverseGeocoder({
    location: latitude + ',' + longitude,
    success: function (v) {
      var tempAddrInfo_dingwei = wx.getStorageSync('tempAddrInfo_dingwei') || {};
      var d_quyu = v.result.address_component.province + v.result.address_component.city + v.result.address_component.district
      tempAddrInfo_dingwei.province = v.result.address_component.province; //省份
      tempAddrInfo_dingwei.city = v.result.address_component.city; //城市
      tempAddrInfo_dingwei.district = v.result.address_component.district; //区
      tempAddrInfo_dingwei.address = v.result.address; //详细地址
      tempAddrInfo_dingwei.address_dquyu = d_quyu; //省市区
      tempAddrInfo_dingwei.latitude = v.result.location.lat; //坐标
      tempAddrInfo_dingwei.longitude = v.result.location.lng; //坐标
      wx.setStorageSync('tempAddrInfo_dingwei', tempAddrInfo_dingwei);
      console.log(tempAddrInfo_dingwei)
      //刷新数据
      // that.goRefreshDatas();
    },
    fail: function (v) {},
  })
}

module.exports = {
  getLocation: getLocation,
}

index.wxml

<view class="page-body">
  <view class="page-section page-section-gap">
    <map id="myMap" style="width: 100%; height: {{height}}px;" scale="{{scale}}" bindmarkertap="markerTap"
      polyline="{{polyline}}" show-location="true" latitude="{{tempAddrInfo_dingwei.latitude}}"
      longitude="{{tempAddrInfo_dingwei.longitude}}"></map>
    <view class="Dang" bindtap="Dingwei">
      <image src="../images/dingweidang.png"></image>
    </view>
    <view class="Daohang">
      <view class="title">距离:{{mode_juli}}米</view>
      <view class="caozuo">
        <button class="left" bindtap="getCenterLocationqi" type="primary">
          <image src="../images/mudidi.png"></image><text>选择起点</text>
        </button>
        <button class="left" bindtap="getCenterLocationzong" type="primary">
          <image src="../images/mudidi.png"></image><text>选择终点</text>
        </button>
        <!-- <button class="right" bindtap="Xdiandaohang">
          <image src="../images/daozhequ.png"></image><text>到这去</text>
        </button> -->
      </view>
    </view>
  </view>
</view>
<view class="danghang">
  <view bindtap="luXian" data-id="1" class="li {{luixian==1?'hover':''}}">驾车</view>
  <view bindtap="luXian" data-id="2" class="li {{luixian==2?'hover':''}}">步行</view>
  <view bindtap="luXian" data-id="3" class="li {{luixian==3?'hover':''}}">骑行</view>
  <view bindtap="luXian" data-id="4" class="li {{luixian==4?'hover':''}}">公交</view>
</view>

index.css

button {
  margin: 0;
  padding: 0;
  border-radius: 0;
  border: none;
  font-size: 1em;
  background-color: transparent;
}

button::after {
  border: none;
}

.page-section-gap {
  box-sizing: border-box;
  position: relative;
}

.page-section-gap .Dang {
  position: absolute;
  bottom: 280rpx;
  right: 40rpx;
  background-color: #fff;
  border-radius: 50%;
  width: 60rpx;
  height: 60rpx;
  z-index: 999;
  display: flex;
  justify-content: center;
  align-items: center;
}

.page-section-gap .Dang image {
  width: 40rpx;
  height: 40rpx;
}

.page-body-button {
  margin-bottom: 30rpx;
}

.daohang {
  border-radius: 10rpx;
  background-color: #000;
  color: #fff;
  font-size: 24rpx;
  text-align: center;
  font-weight: bold;
}

.Zhoubian {
  margin-top: 20px;
}

.page-body .Daohang {
  position: absolute;
  background-color: #fff;
  border-top-left-radius: 20rpx;
  border-top-right-radius: 20rpx;
  bottom: 0rpx;
  left: 0rpx;
  z-index: 999;
  width: 100%;
  padding: 20rpx 0;
}

.page-body .Daohang .title {
  font-size: 30rpx;
  font-weight: 500;
  color: #000;
  padding-bottom: 20rpx;
  border-bottom: 2rpx solid #ccc;
  margin: 0 20rpx;
}

.page-body .Daohang .caozuo {
  display: flex;
  justify-content: center;
  align-items: center;
  padding: 20rpx 0;
  margin: 0 20rpx;
}

.page-body .Daohang .caozuo .zhou {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  width: 200rpx;
  background-color: #fff;
  border: 1px solid #FFFFFF;
}

.page-body .Daohang .caozuo .zhou image {
  width: 30rpx;
  height: 30rpx;
}

.page-body .Daohang .caozuo .zhou text {
  font-size: 24rpx;
  color: #000;
  font-weight: 500;
  margin-top: 10rpx;
}

.page-body .Daohang .caozuo .left {
  display: flex;
  justify-content: center;
  align-items: center;
  flex: 1;
  /* border: 1px solid #1296db; */
  padding: 10rpx;
  border-radius: 32rpx;
  margin-right: 20rpx;
}

.page-body .Daohang .caozuo .left image {
  width: 40rpx;
  height: 40rpx;
}

.page-body .Daohang .caozuo .left text {
  font-size: 30rpx;
  color: #fff;
  font-weight: 500;
  margin-left: 20rpx;
}

.page-body .Daohang .caozuo .right {
  display: flex;
  justify-content: center;
  align-items: center;
  flex: 1;
  background-color: #1296db;
  padding: 10rpx;
  border-radius: 32rpx;
  margin-left: 20rpx;
}

.page-body .Daohang .caozuo .right image {
  width: 40rpx;
  height: 40rpx;
}

.page-body .Daohang .caozuo .right text {
  font-size: 30rpx;
  color: #fff;
  font-weight: 500;
  margin-left: 20rpx;
}

.danghang {
  position: fixed;
  top: 0rpx;
  left: 0rpx;
  width: 100%;
  height: 100rpx;
  z-index: 99999999999999;
  background-color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
}

.danghang .li {
  width: 25%;
  display: flex;
  align-items: center;
  justify-content: center;
}

.danghang .li.hover {
  color: #1296db;
}

index.js

var app = getApp();
var util = require("../../utils/util.js");
var QQMapWX = require('../../utils/qqmap-wx-jssdk.min.js'); //引用库
var qqmapsdk = new QQMapWX({
  key: app.globalData.tengxunMapKey //微信小程序,腾讯位置服务key
});
Page({
  data: {
    latitude: '39.9090401338795', //默认中心点
    longitude: '116.39744076190188', //默认中心点
    markers: [{
      id: '',
      latitude: '',
      longitude: '',
      name: '',
      callout: {}
    }],
    scale: 16, //默认缩放
    luixian: 0,
    polyline: [{
      points: '', //路线的存放做标数组
      color: '', //路线颜色
      width: '', //线的宽度
    }],
    zhonxin: [{ //把所有路劲都显示在当前地图中
      latitude: '',
      longitude: '',
    }],
    mode: 'driving', //默认驾车
    mode_juli: 0, //默认驾车
  },
  onShow: function () {
    var that = this;
    var tempAddrInfo_dingwei = wx.getStorageSync('tempAddrInfo_dingwei');
    if (!tempAddrInfo_dingwei) {
      util.getLocation(that, qqmapsdk);//获取用户当前定位
    }
    //默认起始位置为当前所在位置
    var luxian_qi = tempAddrInfo_dingwei.latitude + ',' + tempAddrInfo_dingwei.longitude;
    var from_latitude = tempAddrInfo_dingwei.latitude;
    var from_longitude = tempAddrInfo_dingwei.longitude;
    that.setData({
      height: wx.getSystemInfoSync().windowHeight, //默认地图大小满屏
      tempAddrInfo_dingwei,
      luxian_qi,
      from_longitude,
      from_latitude,
    })
    //返回中心点
    var mapCtx = wx.createMapContext('myMap'); //wxml中map标签的id值
    mapCtx.moveToLocation();
  },
  //返回中心点
  Dingwei: function (e) {
    var that = this;
    //返回中心点
    var mapCtx = wx.createMapContext('myMap'); //wxml中map标签的id值
    mapCtx.moveToLocation();
  },
  //选择起点
  getCenterLocationqi: function () {
    var that = this;
    wx.chooseLocation({ //这个是拉起搜索
      success(res) {
        that.setData({
          luxian_qi: res.latitude + ',' + res.longitude,
          from_latitude: res.latitude,
          from_longitude: res.longitude,
        })
        console.log(res.latitude + ',' + res.longitude)
      },
    })
  },
  //选择终点
  getCenterLocationzong: function () {
    var that = this;
    wx.chooseLocation({ //这个是拉起搜索
      success(res) {
        that.setData({
          luxian_end: res.latitude + ',' + res.longitude,
          to_latitude: res.latitude,
          to_longitude: res.longitude,
        })
      },
    })
  },
  // // // // // // // // // // // // //路线规划 (腾讯地图接口)// // // // // // // // // // // 
  luXian: function (e) {
    var that = this;
    if (!that.data.luxian_qi || !that.data.luxian_end) { //起点
      wx.showModal({
        title: '提示',
        content: '路线规划失败1,请确认终点和起点',
        showCancel: false
      })
      return;
    }
    //计算两坐标之间的中心点
    // var zhonxin = that.data.zhonxin;
    // zhonxin[0].latitude = (Number(that.data.from_latitude) + Number(that.data.to_latitude)) / 2;
    // zhonxin[0].longitude = (Number(that.data.from_longitude) + Number(that.data.to_longitude)) / 2;
    var mapCtx = wx.createMapContext("myMap");
    mapCtx.includePoints({
      padding: [70, ],
      points: [{
        latitude: that.data.from_latitude,
        longitude: that.data.from_longitude
      }, {
        latitude: that.data.to_latitude,
        longitude: that.data.to_longitude
      }]
    })
    var luixian = e.currentTarget.dataset.id;
    var mode = that.data.mode;
    if (luixian == 1) { //驾车
      mode = 'driving';
    } else if (luixian == 2) { //步行
      mode = 'walking';
    } else if (luixian == 3) { //骑行  
      mode = 'bicycling';
    } else if (luixian == 4) {
      mode = 'transit';
    }
    //规划路线
    qqmapsdk.direction({
      mode: mode, //可选值:'driving'(驾车)、'walking'(步行)、'bicycling'(骑行),不填默认:'driving',可不填
      //from参数不填默认当前地址
      from: that.data.from_latitude + ',' + that.data.from_longitude, //用户当前做标
      to: that.data.to_latitude + ',' + that.data.to_longitude, //终点做标
      success: function (res) {
        var ret = res;
        if (luixian != 4) {
          var coors = ret.result.routes[0].polyline,
            pl = [];
          //坐标解压(返回的点串坐标,通过前向差分进行压缩)
          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({
              latitude: coors[i],
              longitude: coors[i + 1]
            })
          }
        } else {
          var ret = res.result.routes[0];
          var count = ret.steps.length;
          var pl = [];
          var coors = [];
          //获取各个步骤的polyline
          for (var i = 0; i < count; i++) {
            if (ret.steps[i].mode == 'WALKING' && ret.steps[i].polyline) {
              coors.push(ret.steps[i].polyline);
            }
            if (ret.steps[i].mode == 'TRANSIT' && ret.steps[i].lines[0].polyline) {
              coors.push(ret.steps[i].lines[0].polyline);
            }
          }
          //坐标解压(返回的点串坐标,通过前向差分进行压缩)
          var kr = 1000000;
          for (var i = 0; i < coors.length; i++) {
            for (var j = 2; j < coors[i].length; j++) {
              coors[i][j] = Number(coors[i][j - 2]) + Number(coors[i][j]) / kr;
            }
          }
          //定义新数组,将coors中的数组合并为一个数组
          var coorsArr = [];
          for (var i = 0; i < coors.length; i++) {
            coorsArr = coorsArr.concat(coors[i]);
          }
          //将解压后的坐标放入点串数组pl中
          for (var i = 0; i < coorsArr.length; i += 2) {
            pl.push({
              latitude: coorsArr[i],
              longitude: coorsArr[i + 1]
            })
          }
        }
        //设置polyline属性,将路线显示出来,将解压坐标第一个数据作为起点
        that.setData({
          latitude: pl[0].latitude,
          longitude: pl[0].longitude,
          polyline: [{
            points: pl,
            color: '#FF0000DD',
            width: 4
          }]
        })
      },
      fail: function (error) {
        console.log(error)
        wx.showModal({
          title: '提示',
          content: error.message,
          showCancel: false
        })
        return;
      },
    });
    //计算距离
    qqmapsdk.calculateDistance({
      mode: mode, //可选值:'driving'(驾车)、'walking'(步行),不填默认:'walking',可不填
      //from参数不填默认当前地址
      //获取表单提交的经纬度并设置from和to参数(示例为string格式)
      from: that.data.luxian_qi, //若起点有数据则采用起点坐标,若为空默认当前地址
      to: that.data.luxian_end, //终点坐标
      success: function (res) { //成功后的回调
        var res = res.result;
        var dis = [];
        for (var i = 0; i < res.elements.length; i++) {
          dis.push(res.elements[i].distance); //将返回数据存入dis数组,
        }
        that.setData({ //设置并更新mode_juli数据
          mode_juli: dis
        });
      },
      fail: function (error) {
        wx.showModal({
          title: '提示',
          content: '计算距离仅支持驾车,步行',
          showCancel: false
        })
        return;
      },
    });
    that.setData({
      luixian,
    })
  },
})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

微信小程序之map地图规划路线以及显示距离 的相关文章

  • CentOS 6.0 缺少 mcrypt 扩展 解决办法

    解决办法 安装php mcrypt libmcrypt libmcrypt devel这三个库文件1 安装第三方yum源 默认yum源里面没有这几个库文件 不能使用yum安装 wget http www atomicorp com inst
  • CSS 资源大全中文版

    预处理器 更快地编译 CSS GCSS 一个用GO语言编写的CSS预处理器 官网 LESS 向下兼容CSS并为当前的CSS增加额外的功能 官网 Myth 只用写纯CSS而不用担心浏览器加载缓慢 官网 PCSS 一个用Python语言编写的C
  • 虚拟机安装windows7的ISO镜像文件

    链接 https pan baidu com s 1stvzfq9UQFjlwAm4NzPpCg 提取码 wf67 复制这段内容后打开百度网盘手机App 操作更方便哦
  • React Hooks之useReducer

    useReducer 官网传送门 前言 const state dispatch useReducer reducer initialArg init useState 的替代方案 它接收一个形如 state action gt newSt
  • 【C++】VS code如何配置使用C++(手把手教学)

    博 主 米码收割机 技 能 C Python语言 公众号 测试开发自动化 获取源码 商业合作 荣 誉 阿里云博客专家博主 51CTO技术博主 专 注 专注主流机器人 人工智能等相关领域的开发 测试技术 VS code如何配置使用C 手把手教
  • centos 7修改打开文件数限制

    本文转自 http www tuicool com articles b2UNzm 未作修改 由于原文内容过多 在此仅列出部分内容 3 加大打开文件数的限制 open files 查看 ulimit n ulimit a vi etc se

随机推荐

  • Jmeter接口测试+压力测试

    jmeter是apache公司基于java开发的一款开源压力测试工具 体积小 功能全 使用方便 是一个比较轻量级的测试工具 使用起来非常简单 因为jmeter是java开发的 所以运行的时候必须先要安装jdk才可以 jmeter是免安装的
  • MathType 使用的解决方案

    目前遇到这种情况 MathType联网后显示证书失效 需要重新认证或者购买 或者是MathType成了精简版 只剩两行了 解决方案 分为两步 先禁止MathType联网 再删除注册表多余信息 1 禁止MathType联网 打开 控制面板 g
  • 解决server显示问题/cannot connect to X server

    1 mac下载XQuartz 安装 2 如下图打开终端 3 设置粘贴板 偏好设置 输入 勾选模拟三按键鼠标 偏好设置 粘贴板 勾选启用同步 偏好设置 粘贴板 勾选粘贴板改变时更新PRIMARY 4 连接服务器 ssh X user ip 5
  • 答题活动小程序V7.0

    答题活动小程序V7 0
  • Messari 2022年度报告9 - DAO亦有道

    大多数技术倾向于使边缘化的工人自动地做枯燥的任务 而区块链则自动去中心化 这不仅没有让出租车司机失业 而是让中心化的优步失业 同时让出租车司机直接与客户合作 Vitalik Buterin 我们前面在监管部分的讨论到了去中心化自治组织 DA
  • TypeScript从入门到精通(六)数组类型的定义

    常见且单一的数组 const numberArr string 123 456 789 数组有多种类型格式的 const AtWill string number 小爱好 18 数组中对象的定义 const obj name string
  • Lattice PCIe 学习 1

    我自己之前没有使用过lattice 平台 这次公司准备使用lattice 的PCIe IPCore 我准备在CSDN上写一系列学习笔记 记录使用过程 我使用的平台 win10 lattice diamond 3 12 这个软件下载地址 ht
  • Unity 安卓打包

    Unity打包的方式有很多种 自动打包和手动打包 今天小弟就鼓捣鼓捣unity手动打包 如果想动态打包的话 可以去看其他大佬的帖帖哈 unity打包先配置环境 下载unity的时候可以顺道把unity的安卓包下载下来 如果忘了也没事 可以从
  • [ 容器 ] Docker 的数据管理

    目录 一 Docker 的数据管理 1 1 数据卷 2 数据卷容器 二 端口映射 三 容器互联 使用centos镜像 四 Docker 镜像的创建 1 基于现有镜像创建 2 基于本地模板创建 3 基于Dockerfile 创建 3 1 联合
  • [776]github fork 别人的项目源作者更新后如何同步更新

    1 打开fork 过来的项目如下所示 2 点击new pull request 3 在进入的界面 后进行将左边的设置为你自己的仓库 fork 过来的源在右边 如下图 4 当选择完后会变成下图 5 接下来 将其展示出可以调整状态 右边改为源f
  • Linux修改hostname的几种方式,及遇到的问题

    之前修改主机名全都是采用的network方式 今天遇到点问题 发现hostname并非之前理解的那样 自己配置hostname的问题 这与系统的版本有关系么 腾讯云7 5的 百度云的是6 5 我自己在VMware上安装的6 5就没 etc
  • pybind播放视频

    解码挺快的 0 16ms 但是不知道为什么 还没传数据 特别慢 400 800ms一张图片 coding utf 8 import pysdk as demo import time filepath 0217 h264 start tim
  • Sprng依赖注入(三):构造方法注入是如何工作的?

    前言 这是Spring依赖注入系列的第三篇 前两篇主要分析了Spring bean依赖属性注入的两种方式 是字段注入和setter方法注入 单独比较这两种方式 会发现其过程和工作原理非常类似 那么构造方法注入会不会也和前两种比较类似呢 本篇
  • Android EditText TextWatcher应用实例

    Android TextWatcher应用实例 2012 02 21 15 52 12 转载 标签 android textwatcher 杂谈 分类 手机世界 1 使用TextWathcer限制输入字符个数 布局中EditText在and
  • 5类6类7类网线对比_3类、5类、超5类网线大家了解多少?

    随着时代的进步 网络成为大家必不可少的东西 在安装网络的时候网线是大家最容易忽略的部件 在组建网络时 大家大多都重视光猫 交换机 路由器等设备 但是对于网线 大家一般都不会挑剔 可是随着网络的提速 网线的重要性也越来越明显 今天蜗牛就和大家
  • 给定一个序列快速计算不同二叉树的个数

    给定一个序列求二叉树的个数 就相当于n个数进栈然后得到一个出栈序列种树 假设用f n 表示n个数的出栈序列数的种树 假设第一个出栈序数是k 则k将1 n的序列分为两个序列 其中一个是1 k 1 序列个数是k 1 另一个是 k 1 n 序列个
  • mybatis批量插入后获取自增ID

    mybatis批量插入后获取自增ID 上代码 Mapper java 批量新增产品元素 param elementList 产品元素列表 return 结果 public int insertOrderElement List
  • 分享常用的开发资源

    前言 分享一些本人工作至今整理的一些资源 主要是包括工作 生活 博文中用到的文档 软件和网站 1 文档暂时未整理好 就先不放上来 如需要某方面的文档 可以联系本人 如果有的话可以进行分享 包括但不限于java 大数据 Python SQL等
  • DC-DC的功率电感 是越大越好? 还是越小越好?

    DC DC的功率电感 是越大越好 还是越小越好 问题 DC DC的功率电感 是越大越好 还是越小越好 回答 刚刚好最好 过大过小都不好 首先由公式可知 电感值越大 其Ripple越小 亦即电流越稳定 进而降EMI辐射干扰 但过大的电感值 会
  • 微信小程序之map地图规划路线以及显示距离

    有个问题 在选择公交路线 包含步行和公交 时 怎么才能让不同的路线显示不同的颜色 ps 有个方式 自己写坐标解压往后的存入新数组 把步行时的数据标注下 有什么简单的方法呢 自定义函数文件 自动获取定位信息 function getLocat