4

微信小程序百度地图API移动选点

 2 years ago
source link: https://yanmymickey.github.io/2020/11/05/Note/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E7%99%BE%E5%BA%A6%E5%9C%B0%E5%9B%BEapi%E7%A7%BB%E5%8A%A8%E9%80%89%E7%82%B9/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

微信小程序百度地图API移动选点

因为业务需要使用百度地图API,参考一位大佬编写腾讯API的思路和方法,改造成百度地图API移动选点。

wxml前端部分就不改了,用用大佬的。

微信地图API获取当前位置经纬度信息->百度地图API逆地址解析方法,获取当前位置名称,省市区等信息->setData

mapChange函数监听地图移动->设置一个定时器达到轮询的目的,设置isGet参数判断onLoad中的wx.getlocation是否执行完。->nearby_search以当前的地址名称为搜索关键字,带上经纬度进行POI检索获取附近地址列表

注意:页面初始化时会因为scale改变触发一次mapChange函数,由于JS单线程的特性,页面初始化与page初始化时同时进行的,如果先执行wx.getlocation那没有问题,执行完给经纬度赋值了,mapChange可以正常执行,如果mapChange先执行,那么此时经纬度没有初始值为空,mapChange返回的经纬度信息也为空,导致获取附近地址信息也为空。也可以使用getLocation中也执行一次获取附近地址信息的函数,但是这样会多调用一次API,调用API还是挺耗时。

getsuggest根据用户在输入框输入的关键字进行POI热词检索,搜索当前城市的热词列表。

这三个是主要功能,其他的关于选择省市区三级联动的部分,由于百度地图API没有提供完整的省市区县列表(可能有是我没找到),我也懒得封装了,就阉割掉了。

贴一下关键的JS部分的代码,详细代码查看Github,记得在app.js填写的你的百度地图调用密匙ak

import bmap from '../../utils/bmap-wx';
import '../../utils/util'
let app = getApp();
let BMap = new bmap.BMapWX({
ak: app.globalData.ak,
});
Page({
data: {
addListShow: false,
addressName: '',
currentRegion: {
province: '选择城市',
city: '选择城市',
district: '选择城市',
},
isGet: false,
latitude: '',
longitude: '',
centerData: {},
nearList: [],
selectedId: 0,
},
onLoad: function () {
let that = this;
let fail = function (data) {
console.log(data)
};
let success = function (data) {
// console.log(data);
let wxMarkerData = data.wxMarkerData;
that.setData({
isGet: true,
addressName: wxMarkerData[0].address,
currentRegion: data.originalData.result.addressComponent,
centerData: wxMarkerData,
latitude: wxMarkerData[0].latitude,
longitude: wxMarkerData[0].longitude
});
}
that.mapCtx = wx.createMapContext('myMap')
//微信API定位,获取当前位置经纬度
wx.getLocation({
type: 'wgs84',
success(res) {
//console.log(res)
BMap.regeocoding({
location: res.latitude + ',' + res.longitude,
fail: fail,
success: success,
});
},
fail(err) {
//console.log(err)
wx.hideLoading({});
wx.showToast({
title: '定位失败',
icon: 'none',
duration: 1500
})
setTimeout(function () {
wx.navigateBack({
delta: 1
})
}, 1500)
}
})
},
onReady: function () {

},
//监听拖动地图,拖动结束根据中心点更新页面
mapChange: function (e) {
let that = this;
let fail = function (data) {
console.log(data)
};
let success = function (data) {
let wxMarkerData = data.wxMarkerData[0];
// console.log(wxMarkerData);
that.setData({
addressName: wxMarkerData.address,
currentRegion: data.originalData.result.addressComponent,
});
let location = wxMarkerData.latitude + ',' + wxMarkerData.longitude;
that.nearby_search(wxMarkerData.address, location);
};
//&& (e.causedBy == 'scale' || e.causedBy == 'drag')
if (e.type == 'end' && (e.causedBy == 'scale' || e.causedBy == 'drag')) {
/*用一个轮询判断getlocation是否执行完,
保证定位完再执行mapchange,
主要是解决map组件初始化时会因为scale改变触发一次当前函数
*/
let i = setInterval(function () {
let {
isGet
} = that.data;
if (isGet) {
clearInterval(i);
//先调用微信组件获取地图中心点位置经纬度
that.mapCtx.getCenterLocation({
success: function (res) {
// console.log(res)
that.setData({
nearList: [],
latitude: res.latitude,
longitude: res.longitude,
});
//百度逆地址解析,将经纬度转换为地址信息
BMap.regeocoding({
location: res.latitude + ',' + res.longitude,
fail: fail,
success: success,
});
}
});
}
}, 500)
}
},
//重新定位
reload: function () {
this.onLoad();
},

onShow: function () {

},
// 根据关键词搜索附近位置
nearby_search: function (addressName, location) {
let that = this;
/*发起POI检索请求,搜索当前位置附近地址信息
如果不知道参数可以通过ctrl+鼠标左键进入类内部查看方法
*/
BMap.search({
"query": addressName || '房地产',
location: location,
page_size: 20,
page_index: 1,
success: function (res) {
// console.log(res);
let sug = [];
let wxMarkerData = res.wxMarkerData;
// console.log(wxMarkerData)
for (let i of wxMarkerData) {
// console.log(i)
sug.push({ // 获取返回结果,放到sug数组中
title: i.title,
id: i.id,
addr: i.address,
latitude: i.latitude,
longitude: i.longitude
});
}
if (sug.length > 0) {
that.setData({
selectedId: 0,
centerData: sug[0],
nearList: sug,
});
}
},
fail(err) {
console.log(err)
wx.hideLoading({});
wx.showToast({
title: '获取附近地址信息失败',
icon: 'none',
duration: 1500
})
setTimeout(function () {
wx.navigateBack({
delta: 1
})
}, 1500)
},
});
},

//显示搜索列表
showAddList: function () {
this.setData({
addListShow: true
})
},
//根据关键词搜索匹配位置
getsuggest: function (ev) {
let that = this;
that.setData({
addListShow: true
})
let keyWold = ev.detail.value.trim(),
{
currentRegion
} = that.data,
searchCity = currentRegion.city;

if (keyWold != "") {
/* 根据输入的关键字,在当前城市搜索关键字地址信息 */
BMap.suggestion({
query: keyWold,
region: searchCity, //市
city_limit: true,
// 搜索结果处理
success: res => {
let newList = res.result.filter(item => {
return item.location;
});
// console.log(newList)
that.setData({
nearList: newList,
});
},
fail(err) {
console.log(err)
}
});
} else {
if (!that.data.addListShow) {
that.setData({
addListShow: true
})
}
}
},

//点击选择地图下方列表某项
chooseCenter: function (e) {
let that = this;
let id = e.currentTarget.id;
let nearList = that.data.nearList;
that.setData({
selectedId: id,
centerData: nearList[id],
latitude: nearList[id].latitude,
longitude: nearList[id].longitude,
});
},

//点击选择搜索结果
backfill: function (e) {
let that = this;
let id = e.currentTarget.id;
let nearList = that.data.nearList;
that.setData({
selectedId: id,
centerData: nearList[id],
addListShow: false,
latitude: nearList[id].latitude,
longitude: nearList[id].longitude
});
// 选择完返回地图页面
// let location = nearList[id].latitude + ',' + nearList[id].longitude;
// that.nearby_search(nearList[id].title, location);
// console.log(that.data.centerData)
//选择完返回上一页
wx.navigateBack({
delta: 1
})
},

//返回上一页或关闭搜索页面
back1: function () {
wx.navigateBack({
delta: 1
})
// if (this.data.addListShow) {
// this.setData({
// addListShow: false
// })
// }
//返回上一页
// else {
// wx.navigateBack({
// delta: 1
// })
// }
},
//确认选择地址
selectedOk: function () {
console.log(this.data.centerData)
}
})

Reference

微信小程序——打开地图 选择位置 完整功能实现代码(定位,检索周边,可移动选点,可搜索,腾讯地图API)

代码GitHub——微信小程序百度地图API移动选点


Recommend

  • 171

    分享发现 - @razios - 一条绝大多数人会选择的路,很明显是最优路线,怎么都导航不上。在国道上开始导航都要返回绕很远的高速口上,要么只是走国道。而没有选择国道继续走下去下个最近高速路口上去。 百度我也用了好几年了,这次让人

  • 114

    来源:南方都市报今天(12日),百度地图抽风了!一大早,不少网友在微博上吐槽:百度地图语音播报和提示信息,出现大规模故障,语音提示和地图显示信息不符,很多人走错了路。从网友们的反馈来看,全国多地的用户都遇到了问题,故障主要表现为地图规划的路

  • 54

    前言 怕过不了审,先声明一下,这不是广告,因为这个小程序没上架。 从5年前入行的时候就一直想做一个社交产品,最近工作略闲,加之小程序火爆,下班后时间多,于是就花费了一个月业余时间,动手做了一个基于地理位置的信息社交类小应用,由于个人资质无法上线此类...

  • 58

    腾讯地图 + - 腾讯地图官方小程序,为你提供路线方案查询、驾车导航、公交地铁换乘方案 - NEXT

  • 8
    • zhuanlan.zhihu.com 4 years ago
    • Cache

    WEPT 已支持全部微信小程序 API

    WEPT 已支持全部微信小程序 API

  • 5

    目录 1,起因 哪天,正在蚂蚁森林疯狂偷能量的我被boss叫过去,告知我司要做一个线上直播公开课功能的微信小程序,博主第一次写小程序,复习了下文档,看了看腾讯云直播sdk,开工了。 写着写着就发现不对劲...

  • 5
    • segmentfault.com 3 years ago
    • Cache

    高德地图 API Loca 动画的说明

    高德地图 API Loca 动画的说明我们在使用 Loca 制作地图动画时,里面有几个对应的动画效果,有center: 平移pitch: 视角zoom: 缩放rotation: 旋转

  • 3

    第一次使用腾讯位置服务也算是挺早的,当时是在web端使用。后来,个人慢慢接触到小程序,有一次的需求是能够展示附近的各类店铺,方便自己快速定位周围有什么好吃好逛的地方。再后来每次到一个地方旅游,我们必不可少的一个需求就是需要上WC,当时就在想如何通...

  • 2

    编辑导语:小程序是以“无需安装、触手可及、用完即走”著称的“轻应用”,秉持着体验为王的价值观和少即是多的产品逻辑。本文就支付宝、微信、百度的小程序新逻辑作出分析和探讨,一起来看看吧!

  • 8

    V2EX  ›  iPhone iOS16 的 Apple 地图终于修复了在隧道内位置不移动的 bug 了  

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK