开启掘金成长之旅!这是我参与「掘金日新计划 · 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