微信小程序 高德地图路线规划实现过程详解

下面我将针对“微信小程序 高德地图路线规划实现过程详解”给出完整攻略。

1. 准备工作

在进行微信小程序中的路线规划实现前,需要先前往高德开放平台进行申请并获取到 Web API Key,之后根据所需进行接口授权,获取相关权限。之后需要创建微信小程序,并获取到AppId,最后在 小程序后台-开发-开发设置 中将域名加入到 request 合法域名中。

2. 实现步骤

2.1 引入高德地图SDK

首先需要在小程序的 page.json 文件中添加高德地图SDK的引用地址:

{
  "usingComponents": {
    "amap": "path/to/amap/amap"
  }
}

然后通过 npm 安装 wx-amap-graphicswx-amap-wx 模块:

npm i wx-amap-graphics wx-amap-wx --save

在小程序页面中引入:

import Amap from './libs/amap-wx.js'
import AmapGraphics from './libs/amap-wx-graphics.js'

2.2 获取定位信息

wx.getLocation({
  type: 'gcj02',
  success(res) {
    console.log(res)
  }
})

wx.getLocation() 函数是微信小程序提供的获取用户地理位置的接口。其中 type 参数指定了返回值的坐标系,gcj02 是中国国家测绘局制定的坐标系,也是高德地图所采用的坐标系。获取到用户当前所处位置后,可以用来设置起点坐标点。

2.3 实现路线规划

wx.request({
  url: 'https://restapi.amap.com/v3/direction/driving',
  data: {
    origin: `${startLocation.lng},${startLocation.lat}`,
    destination: `${endLocation.lng},${endLocation.lat}`,
    key: '高德地图Web API Key'
  },
  success(res) {
    console.log(res)
  }
})

在路线规划过程中,需要使用高德地图提供的 “direction/driving” 接口,该接口实现了驾车路线的计算,并返回路线方案规划的结果。其中 {startLocation, endLocation} 是构造好的起点及终点地理位置对象。请求成功后,依据结果完成后续业务逻辑。

2.4 渲染地图

通过高德地图SDK将路线渲染至地图上。在微信小程序开发过程中,可以使用 <amap /> 组件:

<amap class="map" id="myMap" scale="15"
  polyline="{{polyline}}"
  markers="{{markers}}"
  circles="{{circles}}"
  controls="{{controls}}"
  bindcomplete="onMapComplete"
/>

其中,<amap /> 组件是高德地图的渲染组件,通过各类属性将路线及其他地理信息渲染至地图上实现展示效果。各类属性中的 markers 用于设置地图标记点,可以通过设置不同的图标及其他属性之实现对地理位置的标注;polyline 属性用于设置地图上的路径线段;controls 则用于控制地图视图上的缩放尺度等事件的控制。

3. 示例

下面是一个基于微信小程序,通过高德地图实现驾车路线规划的示例代码:

// index.js
import Amap from './libs/amap-wx.js'
import AmapGraphics from './libs/amap-wx-graphics.js'

Page({
  data: {
    startLocation: {},
    endLocation: {},
    polyline: [],
    circles: [],
    markers: [],
    controls: [{
      id: 1,
      iconPath: '/images/plus.png',
      position: {
        left: 10,
        top: 10,
        width: 40,
        height: 40
      },
      clickable: true
    }, {
      id: 2,
      iconPath: '/images/minus.png',
      position: {
        left: 10,
        top: 60,
        width: 40,
        height: 40
      },
      clickable: true
    }]
  },

  onLoad() {
    this.onCreateMap()
  },

  onCreateMap() {
    let s = wx.getSystemInfoSync()
    let w = s.windowWidth
    let h = s.windowHeight

    this.amap = new Amap.AMapWX({
      key: '高德地图Web API Key',
      version: '1.4.0'
    })

    let that = this
    this.amap.getRegeo({
      success: data => {
        let startLocation = {
          lng: data[0].longitude,
          lat: data[0].latitude
        }
        let endLocation = {
          lng: data[0].longitude + 0.015,
          lat: data[0].latitude + 0.01
        }
        that.setData({
          startLocation,
          endLocation
        })
        that.getRoute()
      },
      fail: info => {
        console.log(info)
      }
    })
  },

  getRoute() {
    wx.showLoading({
      title: '正在加载...',
    })

    let that = this
    wx.request({
      url: 'https://restapi.amap.com/v3/direction/driving',
      data: {
        origin: `${that.data.startLocation.lng},${that.data.startLocation.lat}`,
        destination: `${that.data.endLocation.lng},${that.data.endLocation.lat}`,
        key: '高德地图Web API Key'
      },
      success(res) {
        wx.hideLoading()
        console.log(res)

        let steps = res.data.route.paths[0].steps
        let path = []
        let markers = []
        let segments = []
        for (let i = 0; i < steps.length; i++) {
          let polyline = []
          let points = steps[i].polyline.split(';')
          let startPoint = {
            lng: parseFloat(points[0].split(',')[0]),
            lat: parseFloat(points[0].split(',')[1])
          }
          let endPoint = {
            lng: parseFloat(points[points.length - 1].split(',')[0]),
            lat: parseFloat(points[points.length - 1].split(',')[1])
          }
          path.push({
            points,
            color: "#0091ff",
            width: 6
          })
          markers.push({
            iconPath: "/images/marker.png",
            longitude: startPoint.lng,
            latitude: startPoint.lat,
            width: 50,
            height: 50
          })
          if (i === 0) {
            segments.push({
              start: that.data.startLocation,
              end: startPoint
            })
          } else {
            let lastStep = steps[i - 1]
            let lastPoints = lastStep.polyline.split(';')
            let lastEndPoint = {
              lng: parseFloat(lastPoints[lastPoints.length - 1].split(',')[0]),
              lat: parseFloat(lastPoints[lastPoints.length - 1].split(',')[1])
            }
            segments.push({
              start: lastEndPoint,
              end: startPoint
            })
          }
        }
        markers.push({
          iconPath: "/images/mark_b.png",
          longitude: that.data.endLocation.lng,
          latitude: that.data.endLocation.lat,
          width: 50,
          height: 50
        })

        that.setData({
          polyline: path,
          markers: markers,
          segments: segments
        })
      },
      fail: err => {
        wx.hideLoading()
        console.log(err)
      }
    })
  },

  onMapComplete() {
    let that = this
    this.amap.createMarkers({
      markers: that.data.markers,
      success: data => {
        console.log(data)
      }
    })
    this.amap.createPolyline({
      polylines: that.data.polyline,
      success: data => {
        console.log(data)
      }
    })

    this.amap.getCenterLocation({
      success: data => {
        console.log(data)
      }
    })

    this.setData({
      circles: [{
        longitude: that.data.startLocation.lng,
        latitude: that.data.startLocation.lat,
        fillColor: '#FF000033',
        radius: 80
      }, {
        longitude: that.data.endLocation.lng,
        latitude: that.data.endLocation.lat,
        fillColor: '#FF000033',
        radius: 80
      }]
    })
  },

  handleClickControl(e) {
    let id = e.controlId
    let scale = this.amap.getScale()
    if (id === 1) {
      scale += 1
    } else {
      scale -= 1
    }
    this.amap.setScale(scale)
  }
})

另外,这里还需注意将页面中 amap 组件的尺寸及其他属性进行添加和设置以达到最终的路线及地图展示的效果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:微信小程序 高德地图路线规划实现过程详解 - Python技术站

(0)
上一篇 2023年5月30日
下一篇 2023年5月30日

相关文章

  • PHP实现动态表单生成工具详解

    下面我会详细讲解“PHP实现动态表单生成工具”的完整攻略。 1. 前言 动态表单生成是一个十分实用的功能,它可以方便快捷地创建各种样式的表单,不仅可以提高开发效率,而且可以极大地方便用户填写信息。 在 PHP 中,我们可以通过一些简单的代码实现动态表单生成功能,下面就一步步来讲解。 2. 基本思路 我们的基本思路是通过 PHP 中的数组来动态生成表单元素,具…

    PHP 2023年5月27日
    00
  • 精心收集的jQuery常用的插件1000

    “精心收集的jQuery常用的插件1000”攻略 什么是jQuery插件? jQuery插件是为JQuery编写的可重用代码块,可以轻松地将它们添加到你的网站或应用程序中。常用的JQuery插件可以让你轻松地创建动画、表单验证、幻灯片、日期选择器和其他流行的内容。 “精心收集的jQuery常用的插件1000”是什么? “精心收集的jQuery常用的插件100…

    PHP 2023年5月27日
    00
  • PHP实现倒计时功能

    下面是PHP实现倒计时功能的完整攻略。 步骤一:定义倒计时结束时间 首先,你需要定义倒计时结束的时间,可以用PHP中的date()函数进行定义。比如,我们定义倒计时结束时间为2022年1月1日 00:00:00。 $endtime = strtotime(‘2022-01-01 00:00:00’); 步骤二:计算倒计时剩余时间 接下来,你需要计算倒计时剩余…

    PHP 2023年5月27日
    00
  • 收集的二十一个实用便利的PHP函数代码

    收集的二十一个实用便利的PHP函数代码是一份包含20个方便使用的PHP函数的代码集合。如果你想学习这些函数的使用方法并且在你的项目中应用它们,可以按照以下步骤进行操作: 1. 下载代码集合 首先,需要下载包含这20个PHP函数的代码集合。可以从网上直接下载或者通过git克隆下来。下载后需要解压并保存至你的项目中。 2. 导入代码 将代码集合中的所有PHP函数…

    PHP 2023年5月30日
    00
  • 聊一聊关于php源码中refcount的疑问

    以下是关于“聊一聊关于PHP源码中refcount的疑问”的完整使用攻略: 基础知识 在了解PHP源码中的refcount之前,需要掌握一些基础知识,包括PHP变量的内部结构、PHP变量的引用计数机制、PHP变量的垃圾回收机制等。以下是一些常见的基础知识: PHP变量的内部结构,包括zval结构体、zend_string结构体等。 PHP变量的引用计数机制,…

    PHP 2023年5月12日
    00
  • PHP list() 将数组中的值赋给变量的简单实例

    下面我将详细讲解PHP中使用list()函数将数组中的值赋给变量的简单实例。 首先,list()函数是一个内置函数,用于将数组中的值赋给变量。它接收一个数组作为参数,并按照数组中的顺序将值赋给变量。 下面是具体的操作步骤: 1. 声明一个数组 首先,我们需要声明一个数组,以便使用list()函数将它的值赋给变量。下面是一个简单的数组示例: <?php …

    PHP 2023年5月27日
    00
  • PHP改进计算字符串相似度的函数similar_text()、levenshtein()

    一、介绍 在PHP编程中,经常会涉及到比较两个字符串的相似程度,例如搜索引擎的关键词匹配,为此,PHP提供了两个用于计算字符串相似度的函数——similar_text()和levenshtein()。 similar_text()函数通过计算两个字符串相同字符的数量来确定它们之间的相似度百分比。 levenshtein()函数通过计算将一个字符串转换成另一个…

    PHP 2023年5月26日
    00
  • php中echo与print区别点整理

    下面是详细讲解“php中echo与print区别点整理”的完整攻略: 1. echo和print的区别 在PHP中,echo和print都是用于将字符串输出到浏览器或者终端的命令。它们的用法很相似,但是它们在以下几个方面有明显的区别。 echo没有返回值,只是输出字符串到浏览器;print有返回值,返回值为1。 echo可以一次性输出多个字符串,中间用逗号隔…

    PHP 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部