微信小程序中的地图定位功能map组件

1.首先先写页面结构

<template>
    <view class="map_wrap">
        <map id="mapSelected" style="width: 690rpx; height: 300px; margin-left: 30rpx;" :latitude="latitude" :longitude="longitude" :markers="covers" :controls="controls" :scale="18" @controltap="controltap" @tap="clickMap" 
        @regionchange="regionchange">
        </map>
        
        <view class="tips_text" style="margin-top: 30rpx; padding: 0 30rpx; font-size: 30rpx; box-sizing: border-box;">
            <view class="tips_header">当前地址:</view>
            <view class="address_text">{{address}}</view>
            <view class="tips_header">推荐地址:</view>
            <view class="address_text">{{address_info}}</view>
        </view>
        
        <!-- 保存按钮 -->
        <view class="add_address_wrap">
            <view class="add_address_btn" @click="saveAddress">保存</view>
        </view>
    </view>
</template>

latitude::经度
longitude:纬度
markers:数组类型,标记点,用于标记你目前所处的位置。另外它还有很多属性,链接:map组件官方文档
scale:缩放级别,取值范围为5-18,默认16
controls:控件,可让你手指拖动地图时,它在你指定的位置不动
regionchange:视野发生变化时触发的事件,依据这个函数的回调参数和控件来实时获取你选择的地址

2.属性事件介绍完了,话不多说,开始撸代码逻辑。毕竟实践是获取知识最好的途径。在微信小程序中获取用户的当前地理位置是需要用户手动授权的。

isGetLocation(a = "scope.userLocation") { // 3. 检查当前是否已经授权访问scope属性
    var _this = this;
        uni.getSetting({
            success(res) {
                console.log(res)
                if (!res.authSetting[a]) { // 3.1 每次进入程序判断当前是否获得授权,如果没有就去获得授权,如果获得授权,就直接获取当前地理位置
                    _this.getAuthorizeInfo()
                } else {
                    _this.getLocationInfo()
                }
            }
        });
}

使用uni.getSetting()方法来获取用户的当前设置,每次进入程序判断当前是否获得授权,如果没有,就去调起弹窗请求获得授权,如果获得授权,就直接获取当前地理位置。

getAuthorizeInfo(a = "scope.userLocation") { // 1. uniapp弹窗弹出获取授权(地理,个人微信信息等授权信息)弹窗
    var _this = this;
    uni.authorize({
        scope: a,
        success() { //1.1 允许授权
            _this.getLocationInfo();
        }
    })
}

uni.authorize()调用后会立刻弹窗询问用户是否同意授权小程序使用某项功能或获取用户的某些数据,但不会实际调用对应接口,等用户点击确定之后才会调用对应接口。如果用户之前已经同意授权,则不会出现弹窗,直接返回成功。如果用户之前拒绝了授权,此接口会直接进入失败回调。注意:此时选择不同的接口有不同的适用场景,萝卜青菜,各有所爱。

2.1 如果选择的是uni.chooseLocation(),这个简单,直接调用即可。

getLocationInfo () {
    uni.chooseLocation({
        success: (res) => {
            console.log(res)
            this.addressInfoText = res.name
        }
    })
}

效果图

选择地址点击确定以后返回数据,此时可根据需要选择你的收货地址。
返回数据

2.1 如果选择的是uni.getLocation(),这个相对来说复杂一点。
(1)先去获取当前所在位置的经纬度

uni.getLocation({
    type: 'gcj02',
    success: (res) => {
        console.log(res)
        this.latitude = res.latitude.toString()
        this.longitude = res.longitude.toString()
                        
        // 获取地理位置详情信息
        this.getLocationDetail()
    }
});

(2)然后根据经纬度获取详细的地址

getLocationDetail () {
    uni.request({
        header: {
            "Content-Type": "application/text"
        },
        url: 'https://apis.map.qq.com/ws/geocoder/v1/?location=' + this.latitude + ',' + this.longitude +
                        '&key=XOXBZ-MZWWD-CDX4H-PONXN-UA5PJ-D7FJN',
        success:(re)=> {
            //成功获取到经纬度
            console.log(re)
            if (re.statusCode == 200) {
                this.address_info_recomd = re.data.result.formatted_addresses.recommend
                this.address_info = re.data.result.address_reference.town.title + re.data.result.address_reference.street.title + re.data.result.address_reference.landmark_l2.title
                this.address = re.data.result.address
                            
            } else {
                uni.showToast({
                    title: '获取地理位置失败,请重试',
                    icon: "none"
                })
            }
        }
    });
}
返回数据

效果图

(3)再把控件定在地图的中心点,然后手动拖动地图,从而实现手动选择收货地址的功能。

data () {
    return {
        city: '', // 城市
        address_info: '', // 详细地址
        address: '', // 总地址
        latitude: 39.909, // 默认经度(北京天安门)
        longitude: 116.39742, // 默认纬度
        covers: [{
            latitude: 39.909, // 定位图标所在的位置(北京天安门)
            longitude: 116.39742,
            // iconPath: '../../../../../static/uploads/image/profile/location_address.png' // 默认自带图标,可自定义图标
        }],
        controls: [{ // 控件
            id: 99,
            position: { // 控件位置
                left: 160,
                top: 120
            },
            iconPath: '../../../../../static/uploads/image/profile/location_address.png' // 控件图标
        }]
    }
}
// 在地图渲染更新完成时触发
            regionchange (e) {
                console.log(e)
                if (e.type == 'end' && (e.causedBy == 'scale' || e.causedBy == 'drag')) {
                    this.mapCtx = uni.createMapContext("mapSelected"); // 创建map的上下文对象, 从而操控map组件
                    this.mapCtx.getCenterLocation({
                        success: (res) => {
                            console.log(res)
                            this.latitude = res.latitude
                            this.longitude = res.longitude
                            this.getLocationDetail()
                        }
                    })
                }
            }

mapSelected:map组件的id,结合以上方法去实时获取你选择位置的经纬度,根据经纬度即可实现实时选择收货地址的功能。

手动拖动地图效果图

可能会踩的坑

这个在app.json中一定要配置好

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

也可在manifest.json这里配置,选择微信小程序配置,勾选位置接口,如下图

配置图片

另外服务端口号也要开启
服务端口号开启

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容