微信小程序地图插件系列(一):微信小程序使用高德地图(不定期更新)

前言

小程序默认的map组件地图是腾讯地图,但是我们常常会遇到一些需求,让用户选择使用自己喜欢的地图,对于这些功能也是我们前端开发工程师的必要技能。


地址链接
1、高德地图,小程序sdk文档地址
2、高德地图,小程序sdk下载地址

微信小程序地图插件系列其他文章
微信小程序地图插件系列(二):微信小程序使用百度地图


提示:以下是本篇文章正文内容,下面案例可供参考

效果展示

一、准备阶段

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

二、快速上手

  • 1、创建一个小程序
  • 2、创建一个map文件夹,并创建page页面
  • 3、打开map.js文件,用下面的代码完全替换原代码。(注意:js文件中要使用自己的高德key
// miniprogram/pages/gao_de/gao_de.js
var amapFile = require('../../libs/amap-wx.js');//如:..­/..­/libs/amap-wx.js
Page({
   

  /** * 页面的初始数据 */
  data: {
   
    markers: [{
   
      iconPath: "../../img/mapicon_navi_s.png",
      id: 0,
      latitude: 39.989643,
      longitude: 116.481028,
      width: 23,
      height: 33
    },{
   
      iconPath: "../../img/mapicon_navi_e.png",
      id: 0,
      latitude: 39.90816,
      longitude: 116.434446,
      width: 24,
      height: 34
    }],
    distance: '',
    cost: '',
    polyline: []
  },

  /** * 生命周期函数--监听页面加载 */
  onLoad: function (options) {
   
    var that = this;
    var myAmapFun = new amapFile.AMapWX({
   key:'你的高德key'});
    myAmapFun.getPoiAround({
   
      success: function(data){
   
        console.log(data)
        //成功回调
      },
      fail: function(info){
   
        //失败回调
        console.log(info)
      }
    })
    //获取自己所在地址的定位
    myAmapFun.getRegeo({
   
      success: function(data){
   
        //成功回调
        console.log('---------')

        console.log(data)
      },
      fail: function(info){
   
        //失败回调
        console.log(info)
      }
    })

    //获取定位地点天气内容
    myAmapFun.getWeather({
   
      success: function(data){
   
        console.log(data,'123')
        //成功回调
      },
      fail: function(info){
   
        //失败回调
        console.log(info)
      }
    })

    //路线
    myAmapFun.getDrivingRoute({
   
      origin: '116.481028,39.989643',
      destination: '116.434446,39.90816',
      success: function(data){
   
        var points = [];
        if(data.paths && data.paths[0] && data.paths[0].steps){
   
          var steps = data.paths[0].steps;
          for(var i = 0; i < steps.length; i++){
   
            var poLen = steps[i].polyline.split(';');
            for(var j = 0;j < poLen.length; j++){
   
              points.push({
   
                longitude: parseFloat(poLen[j].split(',')[0]),
                latitude: parseFloat(poLen[j].split(',')[1])
              })
            } 
          }
        }
        that.setData({
   
          polyline: [{
   
            points: points,
            color: "#0091ff",
            width: 6
          }]
        });
        if(data.paths[0] && data.paths[0].distance){
   
          that.setData({
   
            distance: data.paths[0].distance + '米'
          });
        }
        if(data.taxi_cost){
   
          that.setData({
   
            cost: '打车约' + parseInt(data.taxi_cost) + '元'
          });
        }
          
      },
      fail: function(info){
   

      }
    })

  },
  goDetail: function(){
   
    wx.navigateTo({
   
      url: '../navigation_car_detail/navigation'
    })
  },
  goToCar: function (e) {
   
    wx.redirectTo({
   
      url: '../navigation_car/navigation'
    })
  },
  goToBus: function (e) {
   
    wx.redirectTo({
   
      url: '../navigation_bus/navigation'
    })
  },
  goToRide: function (e) {
   
    wx.redirectTo({
   
      url: '../navigation_ride/navigation'
    })
  },
  goToWalk: function (e) {
   
    wx.redirectTo({
   
      url: '../navigation_walk/navigation'
    })
  },

})
  • 4、打开pages/map/map.wxml文件,用下面代码完全替换
<view class="flex-style">
  <view class="flex-item active" bindtouchstart="goToCar">驾车</view>
  <view class="flex-item" bindtouchstart="goToWalk">步行</view>
  <view class="flex-item" bindtouchstart="goToBus">公交</view>
  <view class="flex-item" bindtouchstart="goToRide">骑行</view>
</view>
<view class="map_box">
  <map id="navi_map" longitude="116.451028" latitude="39.949643" scale="12" markers="{
    {markers}}" polyline="{
    {polyline}}"></map>
</view>

<view class="text_box">
  <view class="text">{
  {distance}}</view>
  <view class="text">{
  {cost}}</view>
  <view class="detail_button" bindtouchstart="goDetail">详情</view>
</view>
  • 5、拷贝样式代码到 pages/index/index.wxss文件
.flex-style{
   
  display: -webkit-box;
  display: -webkit-flex;
  display: flex;
}
.flex-item{
   
  height: 35px; 
  line-height: 35px;
  text-align: center;
  -webkit-box-flex: 1;
  -webkit-flex: 1;
  flex: 1
}
.flex-item.active{
   
  color:#0091ff;
}
.map_box{
   
  position:absolute;
  top: 35px;
  bottom: 90px;
  left: 0px;
  right: 0px;
}
#navi_map{
   
  width: 100%;
  height: 100%;
}
.text_box{
   
  position:absolute;
  height: 90px;
  bottom: 0px;
  left: 0px;
  right: 0px;
}
.text_box .text{
   
  margin: 15px;
}
.detail_button{
   
  position:absolute;
  bottom: 30px;
  right: 10px;
  padding: 3px 5px;
  color: #fff;
  background: #0091ff;
  width:50px;
  text-align:center;
  border-radius:5px;
}
  • 6、点击保存,他会出现下属提示

getLocation需要在app.json中声明permission

  • 7、找到app.json文件,在配置上添加如下代码即可。
 "permission": {
   
    "scope.userLocation":{
   
      "desc": 
    }
  },

这里请大家对应替换自己pages/map/map.js中的图片路径。以便于更直观的看到效果。


总结

就先入个门。想继续和我完成后续学习的同志们,请关注我。以便于我更新后能通知到您!!!

全部评论

相关推荐

面试官人很好,态度和蔼可亲,没答出来时也会引导你去思考。由于是晚上面的,导致我白天一天都有点紧张,面的时候状态也不是很好,正常可能面试官提问完应该思考几秒再答,而我就像抢答一样一口气把所有会的都说出来,这样就导致逻辑比较混乱,东一句西一句的。首先是自我介绍,先把会的技术大致讲一下,由于我八股背的多所以着重讲了一下,Java,go,jvm,MySQL,Redis,计网,操作系统这些,然后一小部分闲聊,然后先问了一下项目,面试官问我这个项目是否落实之类的,直接坦言说是写的练手的,包括之前也写过IM通讯,外卖之类的。然后面试官就把提问的重点放在了八股上。先问了Java:类加载器(答:3种+自定义类加载器、tomcat、原因+双亲委派+好处)JVM参数(答:xmx,xms,newsize这些,问我是如何设定的,我回答是把内存分一半给堆,再把堆分一半给新生代,这方面确实不太了解)然后问了一下并发相关的:线程池(答:线程池的7个参数(忘了线程工厂和阻塞时间了),3个重要参数,还有线程如何启用,为什么要设计最大线程数之类的,提到Java栈默认分配1MB运行时不可以更改)AQS(答:先讲clh是自旋锁+list,然后是AQS在这个基础上做的两个优化,然后举了一下reentrantlock根据state如何获取资源)CAS(答:使用三个字段,aba问题,然后将通常搭配自旋锁实现,面试官问通常会自旋多少次,这个不太了解,答的100,然后问100次大概多少秒,回答微秒级,然后面试官讲了一下怎么做资源可能没用完,意识到可能还需要进行阻塞操作)然后考虑一下Linux命令(top,ps,如何使用管道符过滤线程和使用Linux启动线程没答出来)然后问Redis:持久化机制(答:三种aof,rdb,混合,aof的三个参数刷盘策略,rdb以快照保存,使用bgsave会使用子线程来保存不会阻塞,而aof虽然会阻塞但是只在写完数据后追加一条命令,不会太影响,然后是他俩的优缺点,还有混合是怎么保存数据的)集群模式(答:三种,主从复制到缺点再到哨兵机制,正常使用三个哨兵互相监督,主节点挂了投票选主哨兵然后选主节点,然后额外讲一下脑裂的问题,主节点进行数据更新然后把命令写入aof来同步从节点,最后cluster集群,如何实现,使用16383个哈希槽(艹答成16384了),先根据哈希码取余,再根据节点数取余决定放在哪个节点上,然后问了一下我会怎么选集群模式,首先是cluster的问题,会让管道操作之类的失效,然后哨兵会导致整个集群结构变得复杂,使用小项目可能会考虑哨兵,大的考虑cluster,然后考了一下cluster如果一个节点挂了怎么办,根据节点数重新取余然后数据转移,面试官说这么转移比较慢,有没有别的办法,我隐约记得使用一个类似环形数组的方式,想不起来了)然后考了一下MySQL的b+树(这方面的知识点太多了,导致我什么都想讲逻辑就比较乱,讲了一下聚簇索引,树的叶子节点对应着一张页16KB,MySQL有一个区的概念,把这些页放在同一个区中,这样叶子节点的双向链表遍历时速度更快,然后b+树的扇出比较大(非常二,说成扇度之类的,面试官以为说的是扇区)这样层数就比较小,一行1kb数据的话3层可以放心2000w数据)其他的暂时想不起来了算法是lru,面试官问要不要提示,我说写个,然后写了10分钟左右,说大概写好了,但是面试官指出了2个小错误,第一个马上就改回来了,第二个一直没看出来(大脑这时候已经停止工作了)反问:问学习建议,说根据实际的项目进行深入,考虑应该怎么做,还问了一下组里面是做Java的吗?面试官说他是做go的,组里什么语言都有,语言影响不大,连忙补充了一句我对go的底层有深入源码的学习)结束。总体感觉答得不太好,没有太体现出深度,细节也不够全面。
下一个更好呗:佬,我投完云智一直没消息,多久约的一面啊
查看14道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务