微信小程序获取定位、通过地点文本获取经纬度进行导航
近期有个需求为进入小程序获取到用户定位、并且通过搜索地址查询经纬度进行导航的需求,自己尝试了一下结果如下。
近期有个需求为进入小程序获取到用户定位、并且通过搜索地址查询经纬度进行导航的需求,自己尝试了一下结果如下
目录
requiredPrivateInfos:全局配置 | 微信开放文档
3、reverseGeocoder(可配合wx.getLocation做定位解析)
一、全局配置
requiredPrivateInfos:全局配置 | 微信开放文档
申明需要使用的地理位置相关接口,类型为数组。目前支持以下项目:
- getFuzzyLocation: 获取模糊地理位置
- getLocation: 获取精确地理位置
- onLocationChange: 监听试试地理位置变化事件
- startLocationUpdate: 接收位置消息(前台)
- startLocationUpdateBackground: 接收位置消息(前后台)
- chooseLocation: 打开地图选择位置
- choosePoi: 打开 POI 列表选择位置
- chooseAddress: 获取用户地址信息
如:app.json
{
"pages": ["pages/index/index"],
"requiredPrivateInfos": [
"getLocation",
"onLocationChange",
"startLocationUpdateBackground",
"chooseAddress",
"chooseLocation",
"choosePoi"
]
}
注:若使用以上接口,均需在小程序管理后台,「开发」-「开发管理」-「接口设置」中自助开通该接口权限。
二、接入腾讯位置服务sdk
文档地址:微信小程序JavaScript SDK | 腾讯位置服务
根据步骤注册,申请密钥
引入sdk.js文件
微信公众平台-开发-开发管理-开发设置配置域名https://apis.map.qq.com
三、权限设置
微信公众平台-开发-开发管理-接口设置 去申请权限
四、地理位置方法
1、wx.getLocation(需要获取权限)
功能:获取当前的地理位置、速度。当用户离开小程序后,此接口无法调用。
地址:wx.getLocation(Object object) | 微信开放文档
(1)点击弹起授权窗口
(1-1)允许状态
成功获取定位城市
(1-2)拒绝状态(自己写的弹框)
2、wx.chooseLocation (需要权限)
功能:打开地图选择位置
地址: wx.chooseLocation(Object object) | 微信开放文档
3、wx.openLocation
功能:使用微信内置地图查看位置
地址:wx.openLocation(Object object) | 微信开放文档
4、wx.choosePoi
功能:打开 POI 列表选择位置,支持模糊定位(精确到市)和精确定位混选。
地址:wx.choosePoi(Object object) | 微信开放文档
开发助手不支持调试
五、腾讯位置服务
1、search
功能:地点搜索,搜索周边poi,比如:“酒店” “餐饮” “娱乐” “学校” 等等
地址:微信小程序JavaScript SDK | 腾讯位置服务
2、getSuggestion
功能: 用于获取输入关键字的补完与提示,帮助用户快速输入
地址:微信小程序JavaScript SDK | 腾讯位置服务
返回结果
3、reverseGeocoder(可配合wx.getLocation做定位解析)
功能: 本接口提供由坐标到坐标所在位置的文字描述的转换,输入坐标返回地理位置信息和附近poi列表。
地址:微信小程序JavaScript SDK | 腾讯位置服务
拿到定位的经纬度做定位解析处理 拿到当前位置
4、geocoder
功能:提供由地址描述到所述位置坐标的转换,与逆地址解析reverseGeocoder()的过程正好相反。
通过传入名称去查询经纬度从而进行导航处理
5、其他接口
六、完整代码
1、wxml
<view class="testview">
<view bindtap="getLocation"> 点击获取定位城市</view>
<view wx:if="{{city}}">定位城市:{{city}}</view>
<view bindtap="openLocation"> 获取当前位置打开地图</view>
<view bindtap="getopenLocation"> 通过选定位置打开地图</view>
<view bindtap="fixopenLocation">固定经纬度打开地图</view>
<view bindtap="poiLocation">poi打开地图</view>
<view bindtap="gettextlocation">通过文本去查找地图</view>
<view class="iptbox">
输入内容:<input class="input" bindinput="bindKeyInput" type="text"/>
</view>
<view bindtap="getkeywords">点击通过关键词查找</view>
<view bindtap="getkeywordsbc" >通过关键词补充提示</view>
</view>
<view class="list">
列表
<view class="item" wx:for="{{list}}" wx:key="index">
名称:{{item.title}}
地址:{{item.address}}
<view class="button" data-item="{{item}}" bindtap="openitem">点击去导航</view>
</view>
</view>
<confirm isShow="{{showConfirm}}" opt="{{conOpt}}" bindconfirmCb="confirm" bindcancelCb="cancel">
<view slot="center" >检测到您没打开获取位置的权限,是否去设置打开</view>
</confirm>
2、js
// pages/test/test.js
var QQMapWX = require('../../utils/location/qqmap-wx-jssdk');
var qqmapsdk = new QQMapWX({
key: 'xxxxx'//申请完成的密钥
});
Page({
/**
* 页面的初始数据
*/
data: {
conOpt:{
// cancelText:'取消'
showCancel: true,
showConfirm: true,
header:'提示',
confirmColor: '#008FFF',
cancelColor:'#61646C'
},
showConfirm:false,
inputValue:'',
list:[]
},
confirm(){
let that=this
that.setData({
showConfirm:false
})
wx.openSetting({
success (res) {
console.log(res.authSetting)
// res.authSetting = {
// "scope.userInfo": true,
// "scope.userLocation": true
// }
}
})
},
cancel(){
let that=this
that.setData({
showConfirm:false
})
},
openconfirm(){
let that=this
wx.getSetting({
success (res) {
console.log('success');
console.log(res.authSetting)
console.log(res);
if(res.authSetting){
console.log(res.authSetting["scope.userLocation"]);
if(res.authSetting["scope.userLocation"]!=true){
that.setData({
showConfirm:true
})
}else{
that.setData({
showConfirm:false
})
}
}
// res.authSetting = {
// "scope.userInfo": true,
// "scope.userLocation": true
// }
},fail(res){
console.log('fail');
console.log(res);
}
})
},
//获取定位城市
getLocation(){
let that=this
// wx.authorize({
// scope: 'scope.userLocation',
// success: (res) => {
// console.log('成功:' , res)
// },
// fail: (res) => {
// console.log('失败:', res)
// that.openconfirm()
// },
// })
// wx.authorize({
// scope: 'scope.userLocation',
// success: (res) => {
// console.log('成功:' , res)
// },
// fail: (res) => {
// console.log('失败:', res)
// },
// })
console.log('获取定位')
wx.getLocation({
type: 'wgs84',
success (res) {
console.log(res);
const latitude = res.latitude
const longitude = res.longitude
const speed = res.speed
qqmapsdk.reverseGeocoder({
location: {
latitude: latitude,
longitude: longitude
},
success: function (res) {
//获取详细地址
console.log(res)
var citys = res.result.address_component.city;
that.setData({
city:citys
})
}
})
},fail(res){
console.log(res);
that.openconfirm()
}
})
},
//获取当前位置打开地图
openLocation(){
let that=this
console.log('打开地图')
wx.getLocation({
type: 'gcj02', //返回可以用于 wx.openLocation 的经纬度
success (res) {
console.log(res);
const latitude = res.latitude
const longitude = res.longitude
wx.openLocation({
latitude,
longitude,
// name:res.name,
// address:res.address,
// scale: 18
})
},fail(res){
console.log(res);
that.openconfirm()
}
})
},
//通过选定位置打开地图
getopenLocation(){
wx.chooseLocation({
success(res){
console.log(res);
const latitude = res.latitude
const longitude = res.longitude
wx.openLocation({
latitude,
longitude,
name:res.name,
address:res.address,
scale: 18
})
},fail(res){
console.log(res);
}
})
},
//固定经纬度打开地图
fixopenLocation(){
console.log('1212');
wx.openLocation({
latitude:40.003643,
longitude:116.323044,
name:"清华大学",
address:"北京市海淀区双清路30号",
scale: 18,
success(res){
console.log(res);
},fail(res){
console.log(res);
}
})
},
//poi打开地图
poiLocation(){
wx.choosePoi({
success(res) {
console.log(res, '成功回调')
console.log(res);
const latitude = res.latitude
const longitude = res.longitude
wx.openLocation({
latitude,
longitude,
name:res.name,
address:res.address,
scale: 18
})
},
fail(res) {
console.log(res, '失败回调')
},
complete(res) {
console.log(res, '结束回调')
}
})
},
//根据地址解析经纬度
gettextlocation(e){
// var item = e.currentTarget.dataset.item;
let item={
address:'北京市海淀区彩和坊路海淀西大街74号',
title:'名称'
}
qqmapsdk.geocoder({ //根据输入的地址逆解析出经纬度并跳转地图导航
address:item.address,
success: res => {
console.log(res);
var lat = res.result.location.lat;
var lng = res.result.location.lng;
wx.getLocation({
type: 'wgs84',
success: function (res) {
wx.openLocation({
latitude: Number(lat),
longitude: Number(lng),
name: item.title,
address: item.addr
})
}
})
}
})
},
//根据输入搜索位置
getkeywords(){
let that=this
console.log(that.data.inputValue);
qqmapsdk.search({
keyword:that.data.inputValue,
success(res){
console.log(res);
that.setData({
list:res.data
})
console.log(that.data.list);
},fail(res){
console.log(res);
that.openconfirm()
}
})
},
bindKeyInput(e){
this.setData({
inputValue: e.detail.value
})
},
openitem(e){
console.log(e);
let item=e.currentTarget.dataset.item
wx.openLocation({
latitude:Number(item.location.lat),
longitude:Number(item.location.lng),
name:item.title,
address:item.address,
scale: 18
})
},
//通过关键词补充提示
getkeywordsbc(){
qqmapsdk.getSuggestion({
keyword:'',
success(res){
console.log(res);
}
})
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
// wx.getSetting({
// success (res) {
// console.log('success');
// console.log(res.authSetting)
// console.log(res);
// if(res.authSetting){
// console.log(res.authSetting["scope.userLocation"]);
// if(res.authSetting["scope.userLocation"]!=true){
// that.setData({
// showConfirm:true
// })
// }else{
// that.setData({
// showConfirm:false
// })
// }
// }
// // res.authSetting = {
// // "scope.userInfo": true,
// // "scope.userLocation": true
// // }
// },fail(res){
// console.log('fail');
// console.log(res);
// }
// })
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})
3、wxss
.testview view{
margin-top: 30rpx;
}
.iptbox{
display: flex;
}
.input{
border: 1px solid gray;
width: 400rpx;
margin-left: 20rpx;
border-radius: 8rpx;
}
.listbox{
padding: 20rpx 30rpx;
}
.item{
margin-bottom: 10rpx;
border-bottom: 1px solid gray;
}
.button{
background-color: pink;
width: 300rpx;
padding: 8rpx 0;
margin: 10rpx 0;
text-align: center;
border-radius: 8rpx;
}
4、json
{
"usingComponents": {
"confirm":"../components/confirmBox/confirmBox"
}
}
5、弹框组件参考博文
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)