广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >微信小程序中正确使用地图的方法实例
  • 331
分享到

微信小程序中正确使用地图的方法实例

2024-04-02 19:04:59 331人浏览 泡泡鱼
摘要

目录前言1. 准备2. 实战2.1 配置小程序权限2.2 封装工具函数2.2.1 全局函数与变量2.2.2 工具函数2.3 跳转选址页面前的处理2.4 跳转后的处理2.4.1 页面初

前言

今天是我的小兄弟(微信小程序方面)在工作中遇到的一个场景——选择某个位置周围的学校,感觉很有用,就让他给大家分享一下。

这次想分享一下关于微信小程序中选择全国中的一个学校和地址的方法,经过调研发现大多网站提供全国学校名称的是比较老的一些学校,像比较新或者地方比较偏僻的学校一般都找不到。想想这样是肯定不行的,那就继续寻找能更全面的方式,最终想到了地图中提供的服务提供的学校最全面,这里就采用腾讯地图的开放接口作为示例演示。

1. 准备

通过阅读腾讯地图开放平台可以得知微信小程序可以下载SDK提供直接调用接口来使用腾讯地图,当然也可以自己对URL进行封装请求并返回自己的数据,本示例均使用了,因为SDK中封装时会调用某些接口,而在示例中会多时间内调用同一接口,那么就会造成频繁调用接口的错误。

过程中我也会用有赞团队的vant来展示学校信息,所以也需要提前安装好依赖备用,具体安装步骤见官网

2. 实战

2.1 配置小程序权限

首先就是在进入小程序时让用户给我们的小程序开启定位的权限,需要我们在app.JSON文件中添加以下代码:


"permission": {
  "scope.userLocation": {
    "desc": "你的位置信息将用于小程序位置接口的效果展示"
  }
}

加上这一字段,当小程序用到定位系统时,发现小程序的权限没给到就会让用户将权限给到小程序,效果如下:

2.2 封装工具函数

2.2.1 全局函数与变量

app.js


// 全局变量
globalData: {
    userInfo: null
  },
// 全局引入方法,简便引入第三方包
require: ($url)=> require($url)

2.2.2 工具函数

util.js


// 引入SDK核心类
const QQMapWX = require('./qqmap-wx-jssdk.min.js');
// 实例化api核心类
let key = '';
let qqmapsdk;
key &&(qqmapsdk = new QQMapWX({
  key // 必填
}));
module.exports = {
  qqmapsdk,
  key
}

这里我们引入SDK,并且将实例化对象直接传出去,但是这里需要给上腾讯的地图开放接口秘钥,这里我的key就不提供了,将key传出去是因为我们后面需要使用,为了不暴露自己的key,一般在开发时,key一般存储在后端的config中的,这里为了方便演示就在前端做处理了。

2.3 跳转选址页面前的处理

手机要定位不仅需要微信权限开启,还有我们的手机也有一个定位系统权限也要开启,所以在正式开始定位前,为了用户的更好体验我们这一块功能我们通常还需要一系列的操作,这里我简单的用button来用作跳转。

wxml


<view>
	<van-btn bind:tap="GotoMap" type="info">前往使用地图</van-btn>
</view>

首先我们需要为按钮添加一个点击事件,这里我们可以处理很多事情;接下来让我们来看看js代码吧!


// 引入所需的工具函数
const app = getApp();
const {qqmapsdk} = app.require('utils/util');
Page({
  
  // 点击按钮跳转到地图页面
   gotoMap(){
     wx.showLoading({
       title: "正在跳转至地图页"
     })
    // 跳转前要做几件事情提高用户体验性
    // 1. 要验证用户是否开启了定位,没有的话就引导
    // 2. 还需验证程序的定位权限,没有的话就引导
    // 3. 做好上面的两点才可以开始跳转了
    wx.getLocation({
      success(res){
        wx.navigateTo({
          url: "/pages/map/index"
        })
      },
      fail(e){
        if (e && (e.errCode == 2 || e.errCode == 404)) {
          wx.showModal({
            title: "提示",
            content: '位置信息获取失败,请检查手机“位置信息”是否未开启',
            showCancel: false
          })
        } else if (e && ((e.errMsg.indexOf('getLocation:fail auth deny') != -1) || (e.errMsg.indexOf('system permission denied') != -1))) {
          showModal({
            title: "提示",
            content: '位置信息获取失败,请检查微信是否有定位权限',
            confirmText: "重新获取",
            success(res){
              if(res.confirm === true){
                detectSettings()
              } else if(res.cancel == true){
                return;
              }
            }
          })
        } else if(e.errMsg.indexOf("频繁") !== -1){
          wx.showModal({
            title: "提示",
            content: "位置信息接口调用太频繁了,请等10-30秒后再操作。",
            showCancel: false
          })
        }
      },
      complete(){
        wx.hideLoading()
      }
    })
    // 引导开启微信定位权限
    function detectSettings(){
      wx.getSetting({
        success(res){
          if(res && (res.authSetting["scope.userLocation"] !== undefined && res.authSetting["scope.userLocation"] !==true)){
            wx.showModal({
              title: "提示",
              content:"小程序没有定位权限,请前往设置微信小程序的定位权限。",
              confirmText: "前往设置",
              success(res){
                if(res.cancel == true){
                  return
                } else if (res.confirm === true){
                  wx.openSetting({
                    success(result){
                      if(result && (result.authSetting["scope.userLocation"] !== undefined && result.authSetting["scope.userLocation"] ===true)){
                        wx.navigateTo({
                          url: "/pages/map/index"
                        })
                      } else {
                        wx.navigateTo({
                          url: "/pages/index/index"
                        })
                      }
                    },
                  })
                } 
              },
              fail(){
                wx.navigateTo({
                  url: "/pages/index/index"
                })
              }
            })
          } else {
            wx.navigateTo({
              url: "/pages/map/index"
            })
          }
        },
        complete(){
          wx.hideLoading()
        }
      })
    }
   }
})

看完代码就看看效果吧,我们这里着重说明没有符合跳转的条件,效果如下GIF所示:

上面的GIF没有对手机定位系统未开做处理,这个演示在这个方面的处理比较简单,仅仅是提示一下就没了,日常开发中一般会有其他的更好的处理方式,未开的效果如下:

2.4 跳转后的处理

2.4.1 页面初始化

经过上一步的处理我们已经已经确定了,手机的两个权限都给到了,那么我们开始处理地图选址页面的处理,开始之前先看看成品是什么样的,如下:

wxml


<!--pages/map/index.wxml-->
<view class="fixed top">
  <van-search bind:search="searchSchool" placeholder="请输入学校名称" model:value="{{schoolName}}" />
  <view class="school-nav">
    <text class="left">附近的学校</text>
    <view class="right" bind:tap="changeCity">
      <van-icon name="location-o" />
      <text>{{city || "北京市"}}</text>
    </view>
  </view>
</view>
<view class="addr-cell" bindtap="subData">
  <block wx:for="{{options}}" wx:key="index">
    <van-cell data-chooseOpt="{{item}}" title-width="70vw" title="{{item.title}}" value="" label="{{item.address}}" />
  </block>
  <view id="txt" class="btm">
    <text wx:if="{{options.length}}">{{count>0 ? "下拉刷新获取更多信息" : "已经到底了"}}</text>
    <text class="no-data" wx:else>没有获取到相关的数据。。。</text>
  </view>
</view>	

整体框架就如上面的wxml所示,如果将数据全部提供就会像上图所示。那么接着说明一下他的逻辑实现吧!


// 引入所需的工具函数
const app = getApp();
const {qqmapsdk,key} = app.require('utils/util');
// 初始化生命周期函数
onLoad: function (options) {
  _this = this;
  _this.init()
},

下面的函数不仅仅在加载时用到,在后面也会用到,我用传入的参数来区别。如果是在加载时调用,他仅仅是为了获取到用户的当前位置,获取到的位置用于显示;如果传入一个地址就将用于地址逆解析的。


// 你地址解析和获取当前位置
init(location){
  let query = {
    success(res){
      console.log(res)
      if(res.status === 0) {
        // console.log(res.result.location)
        app.globalData.adInfo = res.result.ad_info;
        _this.setData({
          city: res.result.ad_info.city,
          lat: res.result.location.lat,
          lng: res.result.location.lng,
        })
        _this.qqSearch();
      } else {
        wx.showModal({
          title: '提示',
          content:res.message || "获取地理位置信息失败。",
          showCancel: false
        })
      }
    },
    fail(e){
      console.log(e)
    }
  }
  location && (query.location = location);
  qqmapsdk.reverseGeocoder(query);
}

2.4.2 搜索功能实现


// 如果输入的是一个城市,就只会显示城市而不会显示学校
searchSchool(e){
  // 没输入或者输入空格
  if(e && (!e.detail || e.detail.trim() === '')){
    wx.showToast({
      title: "请输入有效的学校名称",
      icon: 'none',
      duration: 2000
    })
    return
  }
  _this.setData({
    options:[],
    count: -2
  })
  _this.qqSearch(e.detail);
},
qqSearch(name){
  // 输入框输入的学校名称
  wx.showLoading({
    title: "正在获取信息"
  })
  const mks = [];
  let count,
      boundary= `nearby(${_this.data.lat},${_this.data.lng},1000)`;
  search(name)
  function search(name){
    const opts = {
      keyWord: '大学',  //搜索关键词
      page_size: 15,
      page_index: _this.data.pageIndex, // 获取更多
      key: key,
      boundary
    };
    if(name){
      opts.boundary = `region(${_this.data.city})`
      opts.keyword = name
    }
    // 这里主要是避免高频调用接口而导致的错误,所以只能使用URL获取相关信息
    wx.request({
      url: "https://apis.map.qq.com/ws/place/v1/search",
      method: "get",
      data:{
        ...opts
      },
      success: function (res) { //搜索成功后的回调
        console.log(res)
        if(res.statusCode !== 200 || (res.data && res.data.status !== 0)) return;
        // 初始化和其他状态
        // 计算可以下滑几次获取更多
        if(_this.data.count === -1 || _this.data.count === -2){
          count = res.data.count && Math.floor(res.data.count/10);
        }else {
          count = --_this.data.count;
        }
        for (let i = 0; i < res.data.data.length; i++) {
          mks.push({ // 获取返回结果,放到mks数组中
            title: res.data.data[i].title,
            address: res.data.data[i].address,
          })
        }
      },
      fail: function (e) {
        console.log(e)
        wx.showToast({
          title: JSON.stringify(e) || "获取地图信息失败",
          icon: "none",
          duration: 3000
        })
      },
      complete: function (){
        setTimeout(()=>{
          wx.hideLoading()
          mks.push(..._this.data.options);
          _this.setData({ //设置markers属性,将搜索结果显示在地图中
            options: mks,
            count
          })
        },1000)
      }
    });
  }
},

2.4.3 下滑到底获取更多


// 下滑到底生命周期函数
onReachBottom: function () {
  _this.data.pageIndex = ++_this.data.pageIndex;
  _this.data.count && _this.qqSearch();
},

2.4.4 提交数据

对于提交数据这里就不多做处理了,选择的话就提示一下,在实际开发中一般都需要将数据存到数据库中另作他用。


subData(e){
  const data = e.target.dataset.chooseopt;
  // 处理点击提示文字的情况
  if(!data) return;
  wx.showModal({
    title: "提示",
    content: `您所在学校是【${data.title}】吗?`,
    success(res){
      // 取消
      if(res.cancel) {
        return;
      } else if (res.confirm){
        // 确定
        // 向后端请求添加或者修改,一般需要详细的地址,这里简单处理
        wx.showToast({
          title: data.title,
          icon: "none"
        })
      }
    },
    fail(){
      wx.showToast({
        title: "失败",
        icon: "error"
      })
    }
  })
}

2.4.5 切换城市


changeCity(){
  _this.setData({
    options:[],
    count:-2,
    // 简易的双向数据绑定,进入就清空输入框的内容
    schoolName: ''
  })
  wx.chooseLocation({
    latitude:_this.data.lat,
    longitude:_this.data.lng,
    success(res){
      if(res.errMsg === "chooseLocation:ok"){
        // 获取到选择的位置,会通过地址逆解析去解析经纬度
        _this.init(`${res.latitude},${res.longitude}`);
      }
    },
    // 按取消按钮
    fail(e){
      if(e.errMsg === "chooseLocation:fail cancel"){
        _this.init();
      }
    },
    complete(){
    }
  })
}

到此,微信小程序学校选择就全部完成了,此次实战一步一步慢慢实现下来逻辑并不复杂。

总结

到此这篇关于微信小程序中正确使用地图的文章就介绍到这了,更多相关微信小程序使用地图内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 微信小程序中正确使用地图的方法实例

本文链接: https://www.lsjlt.com/news/134446.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 微信小程序中正确使用地图的方法实例
    目录前言1. 准备2. 实战2.1 配置小程序权限2.2 封装工具函数2.2.1 全局函数与变量2.2.2 工具函数2.3 跳转选址页面前的处理2.4 跳转后的处理2.4.1 页面初...
    99+
    2022-11-12
  • 微信小程序地图定位的实现方法实例
    目录前言方法如下总结:前言 地图定位这个功能大家都很熟悉吧,那微信小程序中要怎么实现地图定位呢,其实非常简单,没有大家想象中那么难,看完本篇文章,你也可以轻松实现这个小功能哦。 方法...
    99+
    2022-11-13
  • 微信小程序map地图使用方法详解
    本文实例为大家分享了微信小程序map地图使用的具体实现代码,供大家参考,具体内容如下 以下代码是主要的代码片段 <!-- 地图部分 --> <!-- en...
    99+
    2022-11-12
  • 微信小程序加载本地图片的方法
    微信小程序加载本地图片的方法:1、在微信开发工具中打开项目。2、新建一个文件夹并将图片放到这个目录下。3、用style样式的方式或image标签的相对路径去访问图片,实现加载本地图片。具体操作步骤:首先,打开微信开发工具,再打开项目。如下图...
    99+
    2022-10-23
  • 使用微信小程序实现地图定位功能
    使用微信小程序实现地图定位功能微信小程序作为一种轻量级的应用程序,提供了丰富的能力,其中地图定位功能是许多小程序开发者常常需要使用的。本文将介绍如何使用微信小程序来实现地图定位功能,并给出具体的代码示例。一、准备工作在开始编写代码之前,我们...
    99+
    2023-11-21
    微信小程序 实现功能 地图定位
  • 微信小程序中的轮播图实现示例
    目录1.scroll-view 组件的基本使用2.swiper 和 swiper-item 组件的基本使用3.text 组件的基本使用4.rich-text 组件的基本使用1.scr...
    99+
    2022-12-22
    小程序轮播图 微信小程序轮播图
  • 微信小程序webView嵌入H5的方法实例
    前言 微信小程序提供了新的开放能力!它终于开放了在小程序中内嵌HTML页面的功能!从微信小程序基础库1.6.4开始,我们就可以在小程序内放置一个<web-view>组件来...
    99+
    2022-11-12
  • 微信小程序中引入echart图表的方法
    这篇文章给大家分享的是有关微信小程序中引入echart图表的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。正文:准备:小程序开发环境,下载ECharts组件,gitHub地址:https://github.c...
    99+
    2023-06-08
  • 微信小程序中MD5方法的示例分析
    这篇文章给大家分享的是有关微信小程序中MD5方法的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。微信小程序 MD5的方法详解生成的文件可以放在  utils文件...
    99+
    2022-10-19
  • 微信小程序中本地数据读取的方法
    小编给大家分享一下微信小程序中本地数据读取的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!微信小程序 本地数据读取实例一般情...
    99+
    2022-10-19
  • 微信小程序地图标记多个位置的方法详解
    目录1 问题2 方法3 结语1 问题 如何在微信小程序实现标记多个位置。 2 方法 1.在pages文件夹下新建image文件夹用来存放标记的图片。 2.在map标签中添加mark...
    99+
    2022-11-13
  • 微信小程序使用本地存储方法(wx.setStorageSync()和wx.getStorageSync())
    微信小程序的本地存储可以使用wx.setStorageSync()和wx.getStorageSync()方法实现,这里为您介绍一下使用本地存储的流程。 设置数据:使用wx.setStorageSync()方法可以将数据以键值对的方式存储到...
    99+
    2023-09-01
    微信小程序 小程序
  • 微信小程序实现吸顶效果的方法实例
    目录1. 实现方式2. 存在的问题3. 考虑是否有更好的实现方式总结背景是做一个日期title随着用户滑动,当滑到当前日期list数据时,有一个吸顶效果,并且该效果与原来样式不一样 ...
    99+
    2022-11-12
  • 微信小程序在{{ }}中直接使用函数的方法示例
    前言 在微信小程序开发中(原生wxml、wxcss),想直接在{{ }}调用方法处理数据, 但是会报错。如:在项目中涉及到百分比的计算,js浮点数运算会出现精度问题,造成小数位数过...
    99+
    2022-11-12
  • uniapp在微信小程序中使用ECharts的方法
    今天使用uniapp集成Echarts,实现地图图表的展示 可以参照mpvue-echarts 参照:https://github.com/F-loat/mpvue-echarts ...
    99+
    2022-11-12
  • 微信小程序图片压缩功能的实现方法
    微信小程序图片压缩功能的实现方法 :1、在 wx.chooseImage 接口选择相机图片。2、在 wx.getImageInfo 接口获取图片信息。3、计算压缩比例和最终图片的长宽。4、创建 canvas 绘制最终图片。5、在 wx.ca...
    99+
    2022-10-07
  • 微信小程序图片上传功能的实现方法
    目录前言首先是静态布局和样式部分下面是js的部分,我已详细备注~~~总结前言 最近做了个小程序,涉及到了图片上传的功能,今天给大家详细介绍下如何实现小程序图片上传,话不多说先上代码 ...
    99+
    2022-11-13
  • 如何在微信小程序中使用Echarts方法
    如何在微信小程序中使用Echarts方法?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。xxx.json{ "usingComponents":...
    99+
    2023-06-08
  • 微信小程序swiper轮播图组件使用方法详解
    本文实例为大家分享了微信小程序swiper轮播图组件的使用,供大家参考,具体内容如下 在components中新建文件夹swiper components/swiper/swiper...
    99+
    2022-11-13
  • 原生微信小程序使用vant的tabbar(解决点击俩次图标才正确切换)
    一、声明:在导入使用vant (tabbar)组件的时候,发现通过点击切换的方法来更改active的方法,会出现图标没用及时对应上,需要第二次点击才对应上的问题。 先使用npm引入vant组件库 1.第一步:在资源管理器下方空白处选择...
    99+
    2023-09-06
    微信小程序 小程序 Powered by 金山文档
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作