my.getlocation(object object)
基础库 或更高版本; 若版本较低,建议采取 兼容处理 。
支小宝客户端 支持
安诊儿客户端 支持
小程序开发者工具: 支持。ide 模拟器中的默认位置为杭州。可在模拟器工具栏中点击定位按钮,自定义当前位置的经纬度。
主体: 企业支付宝小程序 、 个人支付宝小程序
获取用户所处地理位置。
可获取经纬度(坐标格式为 gcj-02),也可通过指定适当的入参获取省市区县乃至街道地址。 因暂无境外地图数据,在中国内地(不含港澳台)以外的地区,此 api 可能无法正常工作。
类目审核
自 2023 年 11 月 15 日 起,位置类接口仅对符合要求的小程序主营行业开放,在使用前请查看 端权限接口使用类目说明,否则小程序上线审核将会被驳回。
定位授权
调用 my.getlocation 接口获取用户地理位置信息,需要有用户授权,包含三层:
- 系统开启了定位功能。可通过 my.getsystemsetting 或者 my.getsysteminfo 查询系统是否开启定位功能;
- 系统已对支付宝授权位置信息。可通过 my.getappauthorizesetting 或者 my.getsysteminfo 查询系统是否对支付宝授权位置信息;
- 用户在 my.getlocation 调用时弹出的位置信息授权框里选择同意授权给当前小程序。可通过 my.getsetting 查询用户是否同意授权地理位置信息给当前小程序。注意: 若用户从未在当前小程序触发过地理位置授权,则 my.getsetting 获取到的 authsetting 对象中将不会包含 location 这个属性。
可点此查看示例 定位授权准备。
出错处理
除用户授权以外,地理位置的成功获取也依赖用户手机当前的状态,如有 gps 或基站信号、有正常的网络连接等。各种出错的可能及处理措施,请参考后文错误码表格中的凯发app官方网站的解决方案。
object object
查看示例
属性 | 类型 | 默认值 | 必填 | 兼容性 | 描述 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
cachetimeout | number | 30 | 否 | - | 支付宝客户端经纬度定位缓存过期时间,单位为秒 |
||||||||||||||||
type | number | 0 | 否 | 基础库: 1.0/2.3.1 |
获取经纬度数据的类型 |
||||||||||||||||
|
|||||||||||||||||||||
adversion | string | - | 否 | - | 获取逆地理信息的版本编码
|
||||||||||||||||
success | function | - | 否 | - | 调用成功的回调函数 |
||||||||||||||||
fail | function | - | 否 | - | 调用失败的回调函数 |
||||||||||||||||
complete | function | - | 否 | - | 调用结束的回调函数(调用成功、失败都会执行) |
success 回调函数
参数
object res
查看示例
属性 | 类型 | 兼容性 | 描述 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
longitude | string | - | 经度。范围为 -180~180,负数表示西经 |
||||||||||
latitude | string | - | 纬度。范围为 -90~90,负数表示南纬 |
||||||||||
accuracy | string | - | 精确度,单位米 (m) |
||||||||||
horizontalaccuracy | string | - | 水平精确度,单位为米 (m) |
||||||||||
country | string | - | 国家名称(当入参 type > 0 时生效) |
||||||||||
countrycode | string | - | 国家编号(当入参 type > 0 时生效) |
||||||||||
province | string | - | 省份名称(当入参 type > 0 时生效) |
||||||||||
provinceadcode | string | - | 省份的地区代码(当入参 type > 0 时生效) |
||||||||||
city | string | - | 城市名称(当入参 type > 0 时生效) |
||||||||||
cityadcode | string | - | 城市的地区代码(当入参 type > 0 时生效) |
||||||||||
district | string | - | 区县名称(当入参 type > 0 时生效) |
||||||||||
districtadcode | string | - | 区县的地区代码(当入参 type > 0 时生效) |
||||||||||
streetnumber | object | - | 街道门牌信息(当入参 type > 1 生效) |
||||||||||
|
|||||||||||||
pois | array | - | 定位点附近的 poi(兴趣点) 列表(当 type 为 3 时生效)。表示一个地图上有意义的点,可能是一栋建筑、一个商铺、一个邮筒、一个公交站等 |
||||||||||
|
|||||||||||||
altitude | string | - | 海拔高度,单位米 (m) |
||||||||||
verticalaccuracy | string | 支付宝: 10.3.26 |
垂直精度,单位为米 (m) |
fail 回调函数
参数
object err
查看示例
属性 | 类型 | 描述 |
---|---|---|
error | number | 错误码 |
errormessage | string | 错误信息 |
fail 回调的参数为 object,error
属性为错误码,errormessage
属性为错误消息。
错误码 | 错误消息 | 凯发app官方网站的解决方案 |
---|---|---|
11 | 请确认定位相关权限已开启 |
用户设备未开启定位功能,或未授予支付宝定位权限。
|
12 | 网络异常,请稍后再试。 |
提示用户检查网络。 |
13 | 定位失败,请稍后再试。 |
提示用户再次尝试。 |
14 | 获取到的基站与 wifi 为空,请您打开 wifi 开关,如已打开,建议移动到有 wifi 的区域再发起定位。 |
提示用户在有手机信号或有 wifi 的区域再次尝试,且确保打开 wifi 开关。 |
2001 | 用户不允许授权。 |
用户之前已经拒绝授权且勾选了“总是保持以上选择,不再询问”,本次调用 my.getlocation 直接失败,不会弹出授权提示。
|
2003 | 用户勾选了不允许授权选项。 |
用户在对小程序授权地理位置的提示弹框里点击了拒绝,且同时勾选了 “总是保持以上选择,不再询问”。
|
其他 | 其他问题导致的定位失败。 |
提示用户稍后再试。 |
my.getlocation({
type: 1, // 获取经纬度和省市区县数据
success: (res) => {
console.log(res);
},
fail: (error) => {
console.error('定位失败: ', json.stringify(error));
},
complete: (res) => {
console.log(res);
},
});
page({
onshow() {
// 由于跳转到系统设置页无法监听用户最终是否打开系统定位及对支付宝授权位置信息,因此请在生命周期 onshow 中调用定位授权准备方法。
const authguidelocation = async () => {
const mygetsysteminfo = () => {
return new promise((resolve, reject) => {
my.getsysteminfo({
success: resolve,
fail: reject
});
});
};
const mygetsetting = () => {
return new promise((resolve, reject) => {
my.getsetting({
success: resolve,
fail: reject
});
});
};
const myopensetting = () => {
return new promise((resolve, reject) => {
my.opensetting({
success: resolve,
fail: reject
});
});
};
const myalert = (content) => {
return new promise((resolve, reject) => {
my.alert({
content,
success: resolve,
fail: reject
});
});
};
// 获取用户是否开启系统定位及授权支付宝使用定位
const islocationenabled = async () => {
const systeminfo = await mygetsysteminfo();
return !!(systeminfo.locationenabled && systeminfo.locationauthorized);
};
// 若用户未开启系统定位或未授权支付宝使用定位,则跳转至系统设置页
const showauthguideifneeded = async () => {
if (!(await islocationenabled())) {
my.showauthguide({
authtype: "lbs"
});
return false;
}
return true;
};
// 获取用户是否授权过当前小程序使用定位
const islocationmpauthorized = async () => {
const settinginfo = await mygetsetting();
return settinginfo.authsetting.location === undefined || settinginfo.authsetting.location;
};
// 若用户未授权当前小程序使用定位,则引导用户跳转至小程序设置页开启定位权限
const requestlocationpermission = async () => {
await myalert("如果用户之前拒绝授权当前小程序获取地理位置权限,将会弹出此弹窗,请根据需要替换文案。");
const opensettinginfo = await myopensetting();
return opensettinginfo.authsetting.location;
};
try {
if (!(await showauthguideifneeded())) {
return false;
}
if (await islocationmpauthorized()) {
return true;
}
if (await requestlocationpermission()) {
return true;
}
return false;
} catch (error) {
console.error(error);
return false;
}
};
authguidelocation().then(res => {
console.log(res);
if (res === true) {
my.getlocation({
type: 1, // 获取经纬度和省市区县数据
success: (res) => {
console.log(res);
},
fail: (error) => {
console.error('定位失败: ', json.stringify(error));
},
});
}
});
}
})
{
"latitude": "30.267023",
"longitude": "120.107822",
"accuracy": "200.000000",
"country": "中国",
"countrycode": "156",
"province": "浙江省",
"city": "杭州市",
"cityadcode": "330100",
"district": "西湖区",
"districtadcode": "330106",
"pois": [
{
"name": "支付宝大楼",
"address": "天目山路与竞舟路交叉口东南约140米"
},
{
"name": "蚂蚁集团元空间",
"address": "西溪路556号"
},
{
"name": "同乐舫(西溪路店)",
"address": "西溪路556-9号蚂蚁集团元空间"
},
{
"name": "星巴克(杭州西溪路阿里中心店)",
"address": "西溪路556号阿里中心13-14号"
},
{
"name": "小林刺身(浙商创投店)",
"address": "西溪路527-7号钱江浙商创投中心1楼"
},
{
"name": "杭味面馆(蚂蚁集团元空间店)",
"address": "古荡街道浙江网商银行蚂蚁集团元空间1层"
},
{
"name": "老娘舅(290杭州西溪路支付宝大厦店)",
"address": "古荡街道浙江网商银行蚂蚁集团元空间1层"
},
{
"name": "食其家·牛丼咖喱(蚂蚁集团元空间店)",
"address": "古荡街道浙江网商银行蚂蚁集团元空间1层"
},
{
"name": "品记煲(蚂蚁集团元空间店)",
"address": "西溪路556-119蚂蚁集团元空间"
},
{
"name": "肯德基(蚂蚁集团元空间店)",
"address": "古荡街道浙江网商银行蚂蚁集团元空间1层"
},
{
"name": "肯德基(西溪路餐厅)",
"address": "西溪路556号"
},
{
"name": "中国银行(杭州西溪谷支行)",
"address": "西溪路527-13号"
},
{
"name": "香港新曜记茶餐厅(蚂蚁集团元空间店)",
"address": "西溪路556-18号第1层18单元号(蚂蚁集团元空间)"
},
{
"name": "蚂蚁集团元空间3号楼",
"address": "西溪路556号蚂蚁集团元空间"
},
{
"name": "可莎蜜儿(蚂蚁集团元空间店)",
"address": "古荡街道浙江网商银行蚂蚁集团元空间2层"
},
{
"name": "蚂蚁集团元空间1号楼",
"address": "西溪路556号蚂蚁集团元空间"
},
{
"name": "古荡镇村",
"address": "西湖区"
},
{
"name": "川味泡菜馆(西溪店)",
"address": "西溪路560号"
},
{
"name": "他山记(他山宴)",
"address": "西溪路529号"
},
{
"name": "叶氏兄弟果业(蚂蚁集团元空间员工专享店)",
"address": "西溪路556号蚂蚁集团元空间内"
},
{
"name": "钱江浙商创投中心b座",
"address": "西溪路527号钱江浙商创投中心"
},
{
"name": "浙江网商银行",
"address": "西溪路556号蚂蚁集团元空间4号楼"
},
{
"name": "阿里中心-z空间",
"address": "西溪路556号"
},
{
"name": "如意菜饭(蚂蚁集团元空间店)",
"address": "古荡街道浙江网商银行蚂蚁集团元空间1层"
},
{
"name": "钱江浙商创投中心c座",
"address": "西溪路527号钱江浙商创投中心"
},
{
"name": "西溪路口腔门诊部",
"address": "西溪路与飞达巷交叉口东南40米"
},
{
"name": "果麦文化传媒股份有限公司",
"address": "西溪路527号钱江浙商创投中心2号楼"
},
{
"name": "半山里茶叙(蚂蚁集团元空间店)",
"address": "西溪路556号-21蚂蚁集团元空间(近飞达巷西南门)"
},
{
"name": "甘其食(阿里z空间店)",
"address": "西溪路556号"
},
{
"name": "中国政法大学浙江教学中心",
"address": "西溪路525号浙大科技园a座东区429室"
}
],
"bearing": "-1.000000",
"locationtime": 1666595238150,
"provinceadcode": "330000",
"streetnumber": {
"street": "西溪路",
"number": "556号"
},
"horizontalaccuracy": "200.000000",
"verticalaccuracy": "13.579473"
}
{
"error": 11,
"errormessage": "请确认定位相关权限已开启"
}
q:为什么 my.getlocation 获取的位置信息与实际用户的位置信息会有偏差?
1、首先排查是否是用户未开启精确位置权限。
- ios 端:ios 14 系统以上有此权限,可通过 设置 -> 支付宝 -> 位置 -> 精确位置 查看是否开启精确位置权限,未开启开启。
- 安卓端:安卓部分机型有精确位置权限,由于机型众多,不在此列举,可在网上自行查找。
2、假若用户开启了精确位置权限,则可能用户的设备是使用的 wi-fi 补偿定位,此种情况下地理位置信息会由提供网络服务的统一路由接口提供,偏差属于正常现象,需要用户断开 wi-fi 连接,使用移动网络的基站定位;除此之外,地理位置信息也容易受用户周围环境影响(如城市中心、山谷、深层建筑物内,信号可能受到屏蔽或反射等干扰,导致定位精度下降。此外,强电磁干扰、天气状况和卫星轨道变化等因素也可能影响定位技术的性能。在这些情况下,手机定位可能会变得不稳定或无法正常工作。),此种情况之下,可提示用户自行移到不受信号干扰的开阔地带。
3、除以上种种因素之外,还可能是受手机自身设备因素影响(如设备的天线设计、硬件质量、传感器性能、处理器性能等),如是受此种因素影响,则暂时无解。
q:如何获取用户所在的省市区县名称?
my.getlocation 入参 type 为 1/2/3 时,接口内部会做逆地理编码,success 回调参数中包含取到省市区县名称。推荐使用 type 1,速度相对最快。
q:my.getlocation 在 ide 模拟器中获取的地理位置信息不对怎么办?
ide 模拟器上的 my.getlocation 默认位置为杭州。可在模拟器工具栏中点击定位按钮,自定义当前位置的经纬度:
q:my.getlocation 返回的行政区划名称和编码的完整数据在哪里下载?
当前使用的行政区数据可 。此数据与民政部公布的 基本一致。点此查看 。