uniapp获取定位以及打开地图选择

3,271 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情

app在填写收货地址、首页根据城市和位置进行个性化推荐等场景时,需要获取定位、获取打开地图选择位置,uniapp封装了定位和地图的API:

一、注册高德地图账号,申请appkey。

申请appkey,在manifest.json文件App模块配置Geolocation(定位)勾选高德定位并填入appkey

app-nvue中在打开地图选择时只能使用高德地图,所以建议统一使用高德。

二、获取定位

官方文档:uni.getLocation(OBJECT) | uni-app官网 (dcloud.net.cn)

uni.getLocation({

    type: 'wgs84',

    success: function (res) {

        console.log('当前位置的经度:' + res.longitude);

        console.log('当前位置的纬度:' + res.latitude);

    }

});

type默认为 wgs84 返回 gps 坐标(只有经纬度信息),gcj02 返回国测局坐标(可以解析)

wgs84只能获取到经纬度信息,无法获取到地址文本(xx省xx市),gcj02可以获取到经纬度和地址文本,但是需要配置第三方地图的key(前面的高德地图配置)

// 解析出具体地址
uni.getLocation({

    type: 'gcj02',

    geocode: true, //需要配置

    success: function (res) {

        console.log('当前地址文本:' + res.address); //address参数只支持app端

    }

});

三、打开地图进行选择位置

获取位置:uni.getLocation(OBJECT) | uni-app官网 (dcloud.net.cn)

uni.chooseLocation({

    success: function (res) {

        console.log('位置名称:' + res.name);

        console.log('详细地址:' + res.address);

        console.log('纬度:' + res.latitude);

        console.log('经度:' + res.longitude);

    }

});

调用api,程序会打开地图进行选择,选择完成后触发success函数并返回结果,返回值需要注意一下:

1、name和address的区别

  • name:位置的名称,比如瑞幸咖啡

  • address:具体地址:比如广东省广州市天河区北京路6号

在一些场景下,比如填写收货地址,可能会拼接上两者作为最终地址:广东省广州市天河区北京路6号瑞幸咖啡,但是name有可能不存在,返回的默认值就是 '地图位置',很显然,这个值应该排除

2、address可能没有省市区

获取地图后,我们可能会把地址做切割,分别保存省市区,比如:

{

    province_name: '广东省',

    city_name: '广州市',

    area_name: '天河区'

}

但是切割的时候注意,点击领海区域,可能得到的address是"中华人民共和国",或者选择了国外地址,并没有省市区。

另外存在地级市,比如东莞下,是没有区的,切割时也应该注意。

四、选择地图的坑

api很简单,在测试过程中也很顺利,但是打包上线后,app打开地图选择时,一片空白,根据官方回复,这种情况只可能是地图sdk配置错了,和uniapp官方没有关系。

咨询了高德官方,结合uniapp的文档说明,估计是需要商业授权才可使用,一年就需要5w块,也没有试用的名额,所以也无法验证究竟是不是这个原因。

但是选择定位,解析出address地址是不受这方面影响的(二、获取定位)。

五、应用没有定位权限时的处理

调用uni.getLocation时,会向用户申请定位权限,如果用户拒绝了权限或者定位服务没有开启,会导致获取定位失败,这时候可以显示按钮让用户去设置开启定位:

// #ifdef APP-VUE
   const platform = uni.getSystemInfoSync().platform

    if (platform === 'android') {
        var main = plus.android.runtimeMainActivity(); //获取activity  
        var Intent = plus.android.importClass('android.content.Intent');
        var Settings = plus.android.importClass('android.provider.Settings');
        var intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); //android打开定位设置
        main.startActivity(intent);
    } else if (platform === 'ios') {
        plus.runtime.launchApplication({ //ios打开定位设置
            action: 'App-Prefs:root=LOCATION_SERVICES'
        }, function(e) {
            console.log(JSON.stringify(e));
        });
    }
 //#endif