微信小程序调用腾讯地图路线规划-注意点

新建mapApi.js:

复制代码
// utils/mapApi.js
const QQ_MAP_KEY = '********************'

// 获取两点之间的路线
const getRouteBetweenPoints = (from, to, mode = 'walking') => {
  return new Promise((resolve, reject) => {
    wx.request({
      url: `https://apis.map.qq.com/ws/direction/v1/${mode}/`,
      data: {
        from: `${from.latitude},${from.longitude}`,
        to: `${to.latitude},${to.longitude}`,
        key: QQ_MAP_KEY
      },
      success(res) {
        if (res.data.status === 0) {
          resolve(res.data.result.routes[0])
        } else {
          reject(new Error(res.data.message))
        }
      },
      fail: reject
    })
  })
}

// 解压polyline坐标点(腾讯地图返回的是压缩数据)
const decodePolyline = (polyline) => {
  const points = []
  for (let i = 2; i < polyline.length; i++) {
    polyline[i] = polyline[i - 2] + polyline[i] / 1000000
  }
  for (let j = 0; j < polyline.length; j++) {
    points.push({
      latitude: parseFloat(polyline[j].toFixed(6)),
      longitude: parseFloat(polyline[j + 1].toFixed(6))
    })
    j++
  }
  return points
}

module.exports = {
  getRouteBetweenPoints,
  decodePolyline
}

具体页面js:

复制代码
// pages/route/route.js
const mapApi = require('../../utils/mapApi.js')

Page({
  data: {
    markers: [],
    polyline: [],
    centerLat: 0,
    centerLng: 0
  },

  async onLoad() {
    // 你的5个经纬度点
    const points = [
      { latitude: 39.9042, longitude: 116.4074, title: '起点' },
      { latitude: 39.9142, longitude: 116.4174, title: '途经点1' },
      { latitude: 39.9242, longitude: 116.4274, title: '途经点2' },
      { latitude: 39.9342, longitude: 116.4374, title: '途经点3' },
      { latitude: 39.9442, longitude: 116.4474, title: '终点' }
    ]
    
    // 添加标记点
    const markers = points.map((point, index) => ({
      id: index,
      latitude: point.latitude,
      longitude: point.longitude,
      title: point.title,
      iconPath: index === 0 ? '/images/start.png' : 
                 index === points.length - 1 ? '/images/end.png' : '/images/waypoint.png',
      width: 30,
      height: 30
    }))
    
    this.setData({ markers })
    
    // 依次获取相邻两点之间的路线
        // 依次获取相邻两点之间的路线,控制并发频率为每秒3次
        let allRoutePoints = []
    
        // 简化的并发控制实现
        const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms))
        
        for (let i = 0; i < points.length - 1; i++) {
          try {
            console.log(`正在获取第 ${i+1} 段路线...`)
            
            // 每处理3个请求后等待1秒
            if (i > 0 && i % 3 === 0) {
              console.log('达到并发限制,等待1秒...')
              await delay(1000)
            }
            
            const route = await mapApi.getRouteBetweenPoints(points[i], points[i + 1], 'walking')
            const decodedPoints = mapApi.decodePolyline(route.polyline)
            allRoutePoints = allRoutePoints.concat(decodedPoints)
            console.log(`第 ${i+1} 段路线获取成功,当前总点数:${allRoutePoints.length}`)
          } catch (error) {
            console.error(`获取第 ${i+1} 段路线失败:`, error)
          }
        }
    
    
    // 配置路线
    this.setData({
      polyline: [{
        points: allRoutePoints,
        color: '#2E8B57',
        width: 5,
        borderColor: '#FFF',
        borderWidth: 1,
        arrowLine: true
      }],
      centerLat: points[0].latitude,
      centerLng: points[0].longitude
    })
  }
})

注意,由于调用api service接口有并发要求,每秒调用的次数不能超过5次,所以目前设置在每秒3次:

创建key:

相关推荐
沐子a~1 分钟前
小程序实战:萌宠案例
小程序
火眼金睛记单词18 分钟前
零基础成人重拾英语:第一个月的30天行动地图
前端·经验分享·学习·小程序
xinraynet27 分钟前
沈阳企业小程序开发选型:五个可核验维度,附设备数据采集与私域商城的技术实现要点
大数据·科技·ai·微信小程序·小程序
小码哥06815 小时前
Java医院陪诊系统陪护系统陪诊小程序,三端齐全可定制
大数据·小程序·陪诊陪护·陪诊小程序·陪护系统·陪诊系统·陪护小程序
连涨- AI脑波英语16 小时前
机构小程序对接词汇课程,测试账号怎样与正式学生账号隔离?
小程序·接口安全·脑机单词速记
liangshanbo121520 小时前
前端面试题:微信小程序怎么优化性能?
前端·微信小程序·notepad++
扶风ff1 天前
练题簿在线免费刷题:题目导入、章节管理、Excel 与 Word 导出,让题库更好用
学习·小程序·word·excel
拖孩1 天前
一个全程 AI 写的小程序「厨菜记」,上线 20 天跑通流量主,收入几块钱,开心得不行
前端·后端·微信小程序
程序猿_极客1 天前
【免费】分享一套优质的基于微信小程序的音乐播放器系统的设计与实现,源码+文档+视频详解(讲解)
微信小程序·小程序·springboot·音乐播放器小程序·音乐管理系统
愚公搬代码1 天前
【愚公系列】《微信小程序项目实战(AI编程+视频图解)》015-测试
微信小程序·小程序·ai编程