微信小程序——定位

最近有客户提了一个需求,要求登陆考试系统的测评者记录下当时的位置。web形式的虽然可以通过IP来定位,但是IP太容易作假了,所以为了比较高的准确性,最后决定用微信小程序,虽然也有作假的可能,但比web形式要好一些。

一、 准备工作

    既然要定位,那么肯定需要找到跟地图相关的功能API,查找微信开发文档,因为我们这里只是需要记录地位功能,不需要打开地图,所以只使用wx.getLocation 即可。查看这个方法后,发现微信只是提供了定位的经纬度,居然没有提供地点的中文名称,

我们要保存地址,肯定不能只是保存经纬度,这个一般没人能看的懂吧,而坑爹的是,找了一通,我也没发现微信小程序有提供这个功能。在网上搜索了下,百度地图和高德地图由当前经纬度获取地点的API功能。考虑到上次天气预报小程序用的是高德,这次还是用高德的功能吧。使用的方式一样,要在高德开放平台建一个定位的应用,步数很简单,第一步类型里选择“导航”,第二步平台项选择“微信小程序”即可,创建好后,会得到一个应用的key。

二、创建小程序项目

    先看看小程序中的getLocation这个功能结果到底是什么

   打开index.js,将page({})中onLoad 方法中的代码改成如下

wx.getLocation({
      type: 'wgs84',
      success(res) {
        console.log("-----success location-----")
        console.log(res)

        //var latitude = res.latitude
        //var longitude = res.longitude
        // wx.openLocation({
        //   latitude,
        //   longitude,
        //   scale: 18
        // })         

      },
      fail(res) {
        console.log("-----fail location-----")
        console.log(res)      
      }
    });

编译后,如果是第一次使用,应该会报一个需要授权的提醒,那么先要在app.json里添加一段代码

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

,然后授权定位即可,授权成功后,在控制台就能看到打印的一个json字符串:

重要的是latitude 维度 、 longitude 经度 这2个数据 ; 其余字段的含义,可以查看文档,文档中都有详细解释。

如果把上面代码中的注释部分打开,小程序编译后显示的就是当前的地图。从地图上看,定位是不准确的,原因我没去查,我猜测就是因为通过IP去定位的,所以导致有出入,如果是在手机上查看,定位就是准确的。

三、结合高德地图API定位地点

    修改index.wxml文件,将定位的地点名称显示在页面上。

<view>
<text>{{address}}</text>
<view wx:for="{{arrAddress}}">
  <text>
    {{item.address}} -- {{item.name}}
  </text>
</view>
<button open-type="openSetting">打开授权设置页</button> 
</view>

第一个text标签里存放定位的地点名,循环的view标签先不要管,button是打开授权设置页用的,小程序开发工具有时候会有问题,当不是第一次使用授权时,有时候不会弹出授权的对话框,可以通过这个按钮直接打开,下面我也会讲如果自定义一个对话框提醒,然后打开授权页面。

查找高德地图提供的定位API,进入高德开放平台网站,找到“开发支持”-->"微信小程序SDK" --> "参考手册"-->"基础类",

下面的 getPoiAround(Object)  周边POI地址,getRegeo(Object) 定位地址, 均可获取到地址,但我们只是用来地位,用第二个即可。将index.js代码更新如下

const amapFile = require('../../utils/amap-wx.js')
const app = getApp()

Page({
  data: {    
    arrAddress:[],
    address:''
  },  
  onLoad: function () {
    var $that = this;
    wx.getLocation({
      type: 'wgs84',
      success(res) {
        console.log("-----success location-----")
        console.log(res)

        var myAmapFun = new amapFile.AMapWX({ key: app.baseData.gdLocationKey });
        myAmapFun.getRegeo({
          success: function (data) {
            
            //成功回调
            console.log("data ----- ")
            console.log(data)
            
            var address = data[0].desc + "【" + data[0].name + "】"
            $that.setData({ address: address });
          },
          fail: function (info) {
            //失败回调
            console.log(info)
            msg(info.errMsg)
          }
        });      

      },
      fail(res) {
        console.log("-----fail location-----")
        console.log(res)      
      }
    });    
    
  },
  onReady:function(){
    console.log("----onReady-----") 
  }
})

编译后,在模拟器页面上就会出现定位的地点名称,同样存在误差问题,如果用手机就没有问题了。

其实看上面的代码,完全可以不需要用小程序的wx.getLocation  ,直接用高德的API就能定位当前地点,这里之所以还是用wx.getLocation,是为了提醒授权的原因,但是只是这样写也是有问题的,如果是非第一次授权,只会报错,不会弹出授权的提醒对话框,这里要自己写一个提醒框。

四、自定义授权地位对话框

  先将上面的代码提取到一个方法里,我这里放在了util.js中

module.exports={
  msg:msg,
  getLocation: getLocation
}
function msg(title){  
  wx.showToast({
    title: title,
    icon: "success",
    duration: 1000
  })
}
function getLocation($that) {
  var address ;
  wx.getLocation({
    type: 'wgs84',
    success(res) {
      console.log("-----success location-----")
      console.log(res)
      var myAmapFun = new amapFile.AMapWX({ key: app.baseData.gdLocationKey });
      myAmapFun.getRegeo({
        success: function (data) {
          //成功回调
          console.log("data ----- ")
          console.log(data)          
          address = data[0].desc + "【" + data[0].name+ "】"
          $that.setData({ address: address });
        },
        fail: function (info) {
          //失败回调
          console.log(info)
          msg(info.errMsg)
        }
      })
    },
    fail(res) {
      console.log("-----fail location-----")
      console.log(res)
      //settingLoaction($that)
    }
  });
}

修改index.js

const util = require('../../utils/util.js')
const app = getApp()
Page({
  data: {    
    arrAddress:[],
    address:''
  },  
  onLoad: function () {
    
    console.log("----onLoad-----")
    util.getLocation(this);
    
  }
})

编译后,模拟器中也会出现定位的地点,这时候点击模拟器中“打开授权设置页”按钮,将“使用我的地理位置”开关关闭掉,重新编译小程序,控制台就会报错,但是模拟器并不会弹出授权对话框。即使只是使用高德的API,控制台也会报错:

{errCode: "0", errMsg: "getLocation:fail auth deny"} 提示未授权定位。

判断有没有授权其实就是通过微信小程序的获取用户的当前设置里面的“scope.userLocation” 是否为true判断。

编写判断方法

function settingLoaction($that){
  wx.getSetting({    
    success: function (res) {
      console.log("-----userLocation-----")
      console.log(res)
      if (res.authSetting['scope.userLocation'] != true) {
        wx.showModal({
          title: '授权当前位置',
          content: '需要获取您的地理位置,请确认授权,否则无法获取您所需数据',
          success: function (res) {
            if (res.cancel) {//点击取消
              msg("授权失败1!")
              getLocation($that)
            } else if (res.confirm) {//点击确定
              wx.openSetting({
                success: function (res) {
                  console.log(res)
                  if (res.authSetting['scope.userLocation'] == true) {
                    msg("授权成功1!")
                    getLocation($that)
                  } else {
                    msg("授权失败2!")
                    getLocation($that)
                  }
                }
              })
            }
          }
        });
      }
    }
  });
}

然后将上面的 getLocation($that) 方法中获取定位失败返回函数中注释掉的 settingLoaction($that) 开启即可,这时重新编译小程序,会弹出自定义的对话框。我这里写的方法是只有当用户授权了,对话框才会消失,实际用的时候,可以根据自己需要操作。

五、getPoiAround

  这个是高德提供的获取经纬度周边20个地址的功能,将上面的getRegeo换成这个即可,然后将值赋给前端即可

   $that.setData({ arrAddress: data.markers });

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、 简介 产品介绍 微信是腾讯公司于2011年初推出的一款快速发送语音短信、视频、图片和文微信是腾讯公司推出的一个为智能手机提供即时通讯服务的免费应用程序。微信支持跨通信运营商、跨操作系统平台快速发送语音短信、视频、图片和文字,支持多人群聊的手机聊天软件。 市场环境分析 米聊是国内上线最早的类KIK应用软件,但“米聊”问世后的十几天,有着“中国最大的虚拟运营商”之称的腾讯,上线了类似产品微信。2011年国内互联网发展可谓如火如荼,QQ、MSN、谷歌Gtalk,米聊、盛大KIKI、微信以及运营商的类似产品都再发力。 产品定位 微信定位人群是年轻人、白领阶层、高端商务人士、时尚的iphone族。 二、 广告文案创作 广告构思 当今社会的年轻人都觉得自己孤独孤单,总是每个人都对着自己的手机跟每一个新认识的人闲聊着感慨着结交着各样的朋友,每个人都希望自己的圈子变得更大不再孤单•••••• 信息时代人们随时需要用信息用网络来寻找你所需要的•••••• 镜头一:一块广告栏上贴着各种信息,工作、出租房屋、装修公司、休闲娱乐等•••• 镜头二:以为待业的青年,以为要租房的白领,以为找装修公司的中年男人,一位四处看美女的年轻小伙••••在广告栏前你争我抢的看着他们所需要的信息。 镜头三:一位时尚的美女拿着手机路过,瞟一眼拥挤的人们,随口说了一句:“还在这看什么啊,微信上啥都有!” 镜头四:到处看美女的小伙注意到了这位美女,隐约听到了他的话,于是追上前问:“美女,你刚才说什么?”美女大声回答说:“找房子找工作找装修,找帅哥找美女交朋友,上微信啊!”
虚拟定位是指在微信小程序中通过模拟用户的地理位置信息来实现位置定位的功能。在微信小程序开发中,可以通过调用微信小程序的API来获取用户的地理位置信息,然后将其传递给后台服务器进行处理。但有时候,我们需要在开发过程中模拟用户的地理位置信息,以便测试或演示某些功能。 在微信小程序开发中,可以使用微信官方提供的微信开发者工具来实现虚拟定位微信开发者工具是一个比较好用的编辑器,它提供了方便的调试功能,其中就包括虚拟定位。通过微信开发者工具,我们可以设置虚拟的经纬度信息,模拟用户不同的地理位置,从而进行相应的功能测试。 此外,还可以通过查阅微信小程序的开发文档来了解更多关于虚拟定位的使用方法。微信小程序宝典秘籍是一本较为全面的小程序开发文档,其中包含了关于微信小程序的API、组件、框架等方面的详细说明,可以帮助开发者更好地了解和使用虚拟定位功能。 总结起来,要在微信小程序中实现虚拟定位功能,可以使用微信开发者工具进行设置和调试,同时参考微信小程序的开发文档来了解更多相关知识。<span class="em">1</span> #### 引用[.reference_title] - *1* [基于微信小程序实现地图定位小程序源码分享](https://download.csdn.net/download/ybigbear/87936325)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值