微信小程序——根据当前定位查询附近商家

使用微信内置地图查看位置

项目需求: 根据当前的定位位置,查看附近有哪些商家,并可查看商家具体位置。

步骤

效果图

说明:
1. 如图展示 点击拒绝后,显示授权获取位置按钮, 用户触发按钮时,拉起设置位置信息页面。
2. 点击允许授权,显示商家列表,点击某商家可查看具体位置
在这里插入图片描述

具体实现

说明: 这里分步骤说明,直接copy可使用。【注意:发送请求换成自己方法】

wxml

<view class="nearbyBizListWrap" style='margin-top: {{navH}}px'>
    <block wx:if="{{postion}}">
        <view wx:if="{{!is_empty}}">
            <view class="media_list_Box">
                <view wx:for="{{nearbyListData}}" wx:key="" bindtap='distributionBIZTap' data-bizId='{{item.business_id}}'>
                    <view class='media_item'>
                        
                        
                    </view>
                </view>
                <view class="nullDataTips" wx:if="{{!hasMoreData}}">
                    <text>没有更多数据了</text>
                </view>

                <view class="nullDataTips" wx:if="{{hiddenLoading}}">
                    <text>正在加载中...</text>
                </view>
            </view>
        </view>
        <view class="nullBox clearfix" wx:else>
            <view class="box">
                <view class="des">暂无附近场所</view>
            </view>
        </view>
    </block>

    <!-- 显示授权按钮 -->
    <block wx:else>
        <view class="authorizationBox">
            <button hidden="{{hideAuthBtn}}" open-type="openSetting" bindopensetting='handler' class="weui-btn btn-area" type="primary">点击授权并获取位置信息 </button>
        </view>
    </block>
</view>

js

1. 初始数据及调用
data: {
	p: 1,
    page_size: 8,
    is_empty: false,
    hasMoreData: true,
    hiddenLoading: true,
    lng: 0.00, //经度
    lat: 0.00, //纬度
    hideAuthBtn: true//控制是否显示 手动授权按钮
    postion: true, //是否授权, 已授权展示商家列表
}

/**
* 生命周期函数--监听页面显示
*/
onShow: function() {
    // 检查当前用户设置权限状态
    this.check_Authorization();
},
2. 获取用户当前设置

说明: 首先检查用户是否授权状态, 只有授权成功会执行获取当前地理位置信息。方可以查看附近商家列表。

/**
* 获取用户当前设置
*/
check_Authorization: function() {
    var that = this;
    wx.getSetting({
        success: (res) => {
            if (res.authSetting['scope.userLocation'] != undefined && res.authSetting['scope.userLocation'] == true) {
                that.setData({
                    postion: true,
                })
                
                //获取当前位置
                that.getLocation();
            } else {
                //未授权
                that.setData({
                    postion: false
                })
                
                //获取当前位置
                that.getLocation();
            }
        },
        fail(res) {
            console.log(res)
        }
    })
},
3. 获取当前位置
/**
* 调用wx.getLocation系统API,获取当前地理位置
*/
getLocation: function() {
    var that = this;
    //获取位置
    wx.getLocation({
        type: 'gcj02', //默认为 wgs84 返回 gps 坐标,gcj02 返回可用于wx.openLocation的坐标
        success: function(res) {
            that.setData({
                postion: true,
            })
            // 保存经纬度
            that.setData({
                lng: res.longitude,
                lat: res.latitude,
            })

            // 获取附近商家列表
            that.getnearbyList(true);
        },
        fail: function(e) {			
            //首次弹窗提示授权,点击取消后,显示手动授权按钮
            that.setData({
                hideAuthBtn: false
            })
        }
    });
},
4. 获取附近商家列表
  • 发送请求,获取数据。个人所需,这里直接copy项目里代码,包含分页功能。
  • 注意: 下面的url地址仅供参考,需修改为实际所用的
  • 如需测试数据,请看后台返回数据格式效果图
getnearbyList: function(type = true) {
    var that = this;
    var params = 'p=' + that.data.p + '&page_size=' + that.data.page_size + '&lng=' + that.data.lng + '&lat=' + that.data.lat;
	// 发送请求
    http.getReq("Nearby/nearbyList?" + params, function(res) {
        if (res.code != 200) {
            feedbackApi.showToast({
                title: res.msg,
                mask: false
            })
            return
        }
        var datas = res.data.list;
        var dataList = that.data.nearbyListData.concat(datas);

        that.setData({
            nearbyListData: dataList,
            hiddenLoading: true,
            p: that.data.p + 1
        })

        if ((datas.length != that.data.page_size) && (datas.length > 0)) {
            //全部加载完成,显示没有更多数据
            that.setData({
                hasMoreData: false,
                hiddenLoading: false
            });
        }

        //  处理显示加载中
        if (datas.length == 0) {
            that.setData({
                hiddenLoading: false,
                hasMoreData: false,
            });
        }
        if (dataList.length == 0) {
            that.setData({
                is_empty: true,
            });
        }
    }, type)
},
5. 点击商家查看详情
  • 根据列表中数据,获取当前点击商家并得到对应信息
/**
* 查看具体商家信息
*/
distributionBIZTap: function(e) {
    var that = this;
    //商家当前id
    var bizid = e.currentTarget.dataset.bizid;
    this.data.nearbyListData.forEach((item, i) => {
        if (item.business_id == bizid) {
            // 调用打开目标位置(打开地图)
            that.openLocation(item);
        }
    })
},
6. 使用微信内置地图查看商家具体位置

注意: 度只接收Number类型, 因得到是String类型,这里需要转换下。

/**
* 使用微信内置地图查看商家位置
*/
openLocation: function(item) {
    // console.log(item);
    var that = this;
    wx.getLocation({ //获取当前经纬度
        type: 'gcj02', //返回可以用于wx.openLocation的经纬度,官方提示bug: iOS 6.3.30 type 参数不生效,只会返回 wgs84 类型的坐标信息  
        success: function(res) {
            wx.openLocation({ //使用微信内置地图查看位置。
                latitude: Number(item.lat), //目标纬度
                longitude: Number(item.lng), //目标经度
                name: item.shop_name, //店铺名
                address: item.address //详细地址
            })
        }
    })
},

手动授权(用户拒绝后)

  • 用户取消了授权, 短时间内不会再弹窗的, 为会更好体验,再次进入页面时显示按钮,让用户触发。

  • 通过button按钮,并设置open-type="openSetting",调起设置允许使得我的地理位置

/**
* 手动授权
*/
handler: function(e) {
    var that = this;
    if (!e.detail.authSetting['scope.userLocation']) {
        that.setData({
            postion: false
        })
    } else {
        that.setData({
            postion: true,
        })
    }
},

后端返回数据格式效果图

上面第4点获取附近商家列表,接口返回的数据格式,仅供参考
在这里插入图片描述

注意:

  • 这时,如果直接运行代码会提示需声明permission字段。那就按照提示操作吧~~~

  • 需配置permission弹窗提示
    在这里插入图片描述

  • app.json中声明permission字段, 如下

"permission": {
    "scope.userLocation": {
        "desc": "需要获取您的地理位置,请确认授权,否则地图定位功能将无法使用"
    }
},
"sitemapLocation": "sitemap.json"

原码下载

原码下载: 请查看

  • 11
    点赞
  • 116
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
### 回答1: 微信小程序是一种轻量化的应用程序,可以在微信中直接使用。它具有快速开发、轻便易用等优点。其中,微信小程序map组件可以用于定位当前位置。 首先,在小程序开发工具中添加map组件,可以利用微信提供的API进行对地图的操作。然后,在页面上添加按钮或者其他交互方式,触发定位功能。可以通过微信提供的wx.getLocation接口获取当前地理位置,将其坐标转换为经纬度等信息,再在地图上显示出来。 微信小程序map组件还可以加入自定义的标记点、路线等功能。比如,可以在地图上设置一个目标地点,当用户到达该地点时进行提醒。除此之外,还可以将地图与其他组件联动,实现更多实用性功能。 总之,通过微信小程序map组件定位当前位置可以在很多场景下得到运用,例如共享单车、打车等领域,也为用户带来更加便利和舒适的出行体验。 ### 回答2: 微信小程序定位功能可以让用户在地图查看自己的当前位置,并且可以进行定位导航等一系列应用操作。 要使用微信小程序定位功能,首先需要获取用户的授权。用户可以通过点击相关按钮进行授权,同时小程序需要向用户说明获取授权的作用和用途。 获取授权后,就可以通过小程序调用微信地图API,实现对用户当前位置定位功能。用户当前位置会在地图上进行标注,并且可以实现定位导航、查询周边信息等功能。 除了获取授权和调用API之外,开发者还需要考虑到用户体验和隐私保护等方面。比如,在页面显示用户当前位置时要注意保护用户隐私,使用合适的地图标识等。 总体来说,微信小程序定位功能可以方便用户在不同场景下使用地图,同时也增加了小程序的实用性。对开发者而言,需要注意用户隐私和开发规范等方面的问题,以保证用户体验和小程序功能的完善。 ### 回答3: 微信小程序中提供了一种方便的方法,可以使用map组件定位当前位置。这个组件可以用来显示地图和标记位置,还可以选择地图的种类和放大程度。在小程序中,我们只需要在wxml文件中添加map组件,然后在js文件中调用API即可进行位置定位。 首先,我们需要引入wx.getLocation() API,这个API可以获得当前用户的地理位置。通过这个API获得的经纬度信息,我们可以通过地图定位到用户的当前位置。在js文件中添加如下代码,就可以实现定位操作: ``` wx.getLocation({ type: 'gcj02', success(res) { const latitude = res.latitude const longitude = res.longitude const speed = res.speed const accuracy = res.accuracy } }) ``` 其中,type参数可以设置定位方式,gcj02表示国测局加密经纬度坐标,还有其他选项,具体可以查看文档。通过上述代码,我们得到用户的经纬度位置,并可以通过map组件显示在地图上。 ``` <map latitude="{{latitude}}" longitude="{{longitude}}" scale="{{scale}}" markers="{{markers}}" show-location="{{true}}" /> ``` 最后,在wxml文件中加入map组件即可。其中,latitude和longitude参数分别表示经纬度位置,scale参数表示显示比例尺,markers参数可以设置地图标记,show-location参数表示是否显示定位标记。 总之,通过微信小程序的map组件和wx.getLocation() API,我们可以轻松实现定位当前位置的操作。这一功能在很多小程序中都会用到,比如地图导航、外卖送餐等等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值