高德地图实现-微信小程序地图导航

2023-09-15 09:57:11

效果图:

微信图片_20230806201545.png微信图片_20230806201628.png

一、准备阶段

  • 1、在高德开放平台注册成为开发者
  • 2、申请开发者密钥(key)。
  • 3、下载并解压高德地图微信小程序SDK

高德开放平台:

注册账号(https://lbs.amap.com/)) 申请小程序应用的 key
image.png

应用管理(https://console.amap.com/dev/key/app)) -> 我的应用 -> 创建新应用
image.png
生成的 key 即可用在程序中

  • 下载相关 sdk 文件,导入 amap-wx.js 到项目中:https://lbs.amap.com/api/wx/download

微信小程序:

1.在创建的项目中,新建一个名为 libs 目录,将 amap-wx.js (amap-wx.js 从相关下载页面下载的 zip 文件解压后得到)文件拷贝到 libs 的本地目录下,如下图所示。
image.png

2.设置小程序安全通讯域名,为了保证高德小程序 SDK 中提供的功能的正常使用,需要设置安全域名。
登录微信公众平台,在 “设置”->“开发设置” 中设置 request 合法域名,将 https://restapi.amap.com 中添加进去,如下图所示:

  1. app.json中加入
"permission": {
    "scope.userLocation": {
      "desc": "你的位置信息将用于小程序位置接口的效果展示",
      "dowload": "您的文件访问权限用于打开文件"
    }

  },

在你需要引用地图的页面的js文件中引入 amap-wx.js 文件。

var amapFile = require('../../../libs/amap-wx.130'); //如:..­/..­/libs/amap-wx.js

完整代码


import {
  baipaoGps
} from "../../../utils/api/car.js";
var amapFile = require('../../../libs/amap-wx.130'); //如:..­/..­/libs/amap-wx.js
Page({
  data: {
    longitude: 117.3590007750093, //经度
    latitude: 22.846911841310202, //维度
    scale: 17, //地图默认缩放等级
    showModal: false, //弹框显隐
    modalData: {}, //详情信息
    G: {
      pi: 3.141592653589793,
      a: 6378245,
      ee: .006693421622965943,
      x_pi: 52.35987755982988
    },
    licence:'',//车牌号
    markers:[],//点位数据
  },

  onLoad: function (options) {
    if (options) {
      this.setData({
        licence:options.licence
      })
    //初始化地图
    this.mapCtx = wx.createMapContext('map');
    this.baipaoGps(options).then((res) => {
      if (res) {
       //加载点位数据
       this.loadMarkers();
      } 
    })
  }else{
    wx.showToast({
      title:  '车牌号为空',
      icon: 'none'
    })
  }
  },
  /**
   * 请求数据
   */
  baipaoGps(options){
    return new Promise((resolve, reject) => {
      console.log(options)
    baipaoGps(options).then(res => {
      if (res.data.success) {
        this.data.markers.push(res.data.result)
        resolve(res.data.result)
      } else {
        wx.showToast({
          title:  res.data.message,
          icon: 'none'
        })
      }
    })
  })

  },

  loadMarkers: function () {
    //生成 markers 列表,用于在地图上展示
    let markersData = this.data.markers.map(marker => {
      // console.log(marker)
      var a = this.transfor2Mars( Number(marker.baipaoGpsInfoBean.gps.lat),  Number(marker.baipaoGpsInfoBean.gps.lng));
      return {
        id: Number(marker.extra.id),
        longitude: a.Lng,
        latitude: a.Lat,
        vehNum: marker.extra.licenseName,
        location:marker.baipaoGpsInfoBean.location,
        iconPath: '../../../static/img/marker.png',
        width: 40,
        height: 40,
      };
      
    });
    this.setData({
      markers: markersData,
      longitude:markersData[0].longitude,
      latitude:markersData[0].latitude
    });
  },
  // 点击标记点时触发
  markertap(e) {
    //点击 marker 时触发,获取对应的点位信息并展示弹框
    // console.log(e.detail)
    let markerData = this.data.markers.find(marker => marker.id === e.detail.markerId);
    this.setData({
      showModal: true,
      modalData: markerData
    });
  },
  // 关闭弹框
  onClose() {
    this.setData({
      showModal: false
    });
  },
  navigateToMap() {
    const modalData = this.data.modalData;
    const { longitude, latitude } = modalData;
    // 调用小程序API打开高德地图并进行导航
    wx.openLocation({
      longitude,
      latitude,
      name: modalData.location, // 标记点名称,可根据实际情况设置
      scale: 18, // 地图缩放级别,可根据实际情况设置
    });
  },
  isOutOfChina(e, a) {
    return a < 72.004 || a > 137.8347 || (e < .8293 || e > 55.8271)
  },
  transforLat(e, a) {
    var t = 2 * e - 100 + 3 * a + .2 * a * a + .1 * e * a + .2 * Math.sqrt(Math.abs(e));
    return t += 2 * (20 * Math.sin(6 * e * this.data.G.pi) + 20 * Math.sin(2 * e * this.data.G.pi)) / 3,
      t += 2 * (20 * Math.sin(a * this.data.G.pi) + 40 * Math.sin(a / 3 * this.data.G.pi)) / 3,
      t += 2 * (160 * Math.sin(a / 12 * this.data.G.pi) + 320 * Math.sin(a * this.data.G.pi / 30)) / 3
  },
  transforLng(e, a) {
    var t = 300 + e + 2 * a + .1 * e * e + .1 * e * a + .1 * Math.sqrt(Math.abs(e));
    return t += 2 * (20 * Math.sin(6 * e * this.data.G.pi) + 20 * Math.sin(2 * e * this.data.G.pi)) / 3,
      t += 2 * (20 * Math.sin(e * this.data.G.pi) + 40 * Math.sin(e / 3 * this.data.G.pi)) / 3,
      t += 2 * (150 * Math.sin(e / 12 * this.data.G.pi) + 300 * Math.sin(e / 30 * this.data.G.pi)) / 3
  },

  transfor2Mars(e, a) {
    if (this.isOutOfChina(e, a))
      return {
        Lat: e,
        Lng: a
      };
    var t = this.transforLat(a - 105, e - 35),
      r = this.transforLng(a - 105, e - 35),
      n = e / 180 * this.data.G.pi,
      o = Math.sin(n);
    o = 1 - this.data.G.ee * o * o;
    var s = Math.sqrt(o);
    return {
      Lat: e + (t = 180 * t / (this.data.G.a * (1 - this.data.G.ee) / (o * s) * this.data.G.pi)),
      Lng: a + (r = 180 * r / (this.data.G.a / s * Math.cos(n) * this.data.G.pi))
    }

  },
})

<view>
	<!-- 地图控件 -->
	<view>
		<map id="map" longitude="{{longitude}}" latitude="{{latitude}}" scale="{{scale}}" markers="{{markers}}"
			bindmarkertap="markertap">
		</map>
	</view>
	<!-- 弹框 -->
	<view>
		<van-popup closeable bind:close="onClose" round custom-style="height: 30%" position="bottom" show="{{ showModal }}"
			bind:close="onClose">
			<view class="detailsBox">

				<view>
					<text>车牌号码 :</text>
					<text>{{modalData.vehNum}}</text>
				</view>
				<view>
					<text>所在位置:</text>
					<text>{{modalData.location}}</text>
					<view class="dh" bindtap="navigateToMap">地图导航
						
					</view>
					<image style="width:30px;height:30px;margin-top: 5px;position: absolute;"
							src="/static/img/map/daohang.png"></image>
				</view>


			</view>
		</van-popup>
	</view>
</view>
#map{
  width: 100%;
  height: 100vh;
}

.detailsBox{
  padding: 20rpx 20rpx 0rpx 28rpx;
  font-size: 28rpx;
}
.detailsBox view:nth-child(n+2){
  margin-top: 20rpx;
}
view{
  font-size: 18px;
}
.dh {
  display: inline-block;
  /* padding: 10px 20px; */
  color: rgb(76, 36, 255);
  font-size: 15px;
  border-radius: 4px;
  cursor: pointer;
  transition: background-color 0.3s ease;
  margin-left: 20px;
}

.dh:hover {
  background-color: #0056b3;
}



更多推荐

Java流式编程的使用

流式编程的使用步骤使用流式编程的步骤就是:设置数据源,设置数据处理的方式,设置收集结果的方式。使用filter方法实现过滤条件例子为下(查询年龄大于18的用户):@TestpublicvoidstreamTest1(){List<Student>students=Arrays.asList(newStudent("to

搜索——最短路模型,多源bfs

最短路模型,即求从起点到终点的最短路径,我们可以选择dijkstra,spfa等等,在这里我们可以利用宽搜(bfs)的特性来求,因为bfs是一层一层的向外扩展的,所以当我们第一次遍历到终点时,所在的层数即为起点到终点的最短路径。多源bfs,顾名思义,多个起点的bfs,与一般的bfs不同的地方在于根据题目要求,将多个起点

国外访问学者面签需要注意什么?

国外访问学者面签是前往国外进行学术研究或合作的关键一步,因此需要谨慎准备。以下是知识人网小编整理的一些需要注意的重要事项,以确保面签顺利进行:1.签证申请材料准备:首先,要仔细阅读所申请国家的签证要求,并准备所需的申请材料。通常,这些材料包括护照、签证申请表、邀请函、学术证明、财务证明和研究计划等。2.邀请函:如果你是

dirpro:专业的目录扫描工具教程

项目在github已开源,获取地址:https://github.com/coleak2021/dirpro1.简介dirpro是一款由python编写的目录扫描器,操作简单,功能强大,高度自动化自动根据返回状态码和返回长度,对扫描结果进行二次整理和判断,准确性非常高已实现功能可自定义扫描线程每扫描10%自动显示扫描进

位图的实现,布隆过滤器

位图:概念:由于位图是通过一个比特位来判断是不是在范围里面的,所以其对应的时间复杂度都是O(1)的。位图的实现:如上图所示:上图对应的就是3个字节,即24个比特位要想实现位图,就得知道我们要记录的这个数应该存储到哪个位置,假设这个数是x那么对应:x/32所得的值就是该数字应该存在第几个字节上x%32所得的值就是对应在此

传统的经典问题 Java 的 Interface 是干什么的

传统的经典问题Java的Interface是干什么解答上面的这个问题应该还是比较好回答的吧。只要你做过Java,通常Interface的问题多多少少会遇到,而且可能会遇到一大堆。在JAVA编程语言中是一个抽象类型(AbstractType),它被用来要求类(Class)必须实现指定的方法,使不同类的对象可以利用相同的界

Dubbo源码理解

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,

MySQL索引、事务与存储引擎

索引事务存储引擎一、索引1.1索引的概念1.2索引的实现原理1.2索引的作用1.3创建索引的依据1.4索引的分类和创建1.4.1普通索引index1.4.2唯一索引unique1.4.3主键索引primarykey1.4.4组合索引(单列索引与多列索引)1.4.5全文索引fulltext1.5查看索引1.6删除索引二、

聚类-kmeans

聚类算法是无监督学习算法,指定将数据分成k个簇。然后通过每个点到各个簇的中心的欧氏距离来分类。kmeans本身会陷入局部最小值的状况,二分kmeans可以解决这一点。二分kmeans是遍历所有的簇,将其分成2个,比较哪一个分裂结果更好,用距离和来代表误差例如现在只有一个簇A,第一轮分裂成A,A1,下一次比较A,A1两个

PB转纯BS工具

pbtowebConvertPowerbuilderUItowebAutomatically.源码地址:GitHub-pcwe2002/pbtoweb:automaticallyconvertPowerbuilderUItoweb支持转换控件WindowDataWindowCommandButtonCheckBoxRa

ES6中新增加的Symbol数据类型及其使用场景

聚沙成塔·每天进步一点点⭐专栏简介在这里插入图片描述⭐ES6中的Symbol数据类型⭐对象属性名称⭐防止属性冲突⭐内置Symbols⭐迭代器和生成器⭐写在最后⭐专栏简介前端入门之旅:探索Web开发的奇妙世界记得点击上方或者右侧链接订阅本专栏哦几何带你启航前端之旅欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、

热文推荐