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

本文首发微信小程序百度地图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移动选点

微信小程序百度地图API移动选点相关推荐

  1. 微信小程序连接百度地图API实现天气查询

    微信小程序连接百度地图API实现天气查询 一.获取百度地图开放平台天气查询API 二.添加百度天气查询域名 三.微信小程序代码 一.获取百度地图开放平台天气查询API 进入百度地图开放平台.(没有账号 ...

  2. 高德地图api调用demo_微信小程序----高德地图API实现的DEMO

    [实例简介] 微信小程序----高德地图API实现的周边,天气,路线规划,地址详情等的DEMO.简单的效果,问一下官方能不能不要乱涨积分,你们涨积分,作者被骂!我真的很失望,再这样,我就不上传资源了! ...

  3. right 微信小程序_微信小程序高德地图API

    本文章介绍微信小程序调用高德地图API的过程,使用高德定位功能做演示. 微信小程序目前支持百度地图.高德地图.腾讯地图.用法可以说是基本完全一样,本文章以高德为例,简单说一下他们的区别,高德地图精度应 ...

  4. 微信小程序---高德地图API

    本文章介绍微信小程序调用高德地图API的过程,使用高德定位功能做演示. 微信小程序目前支持百度地图.高德地图.腾讯地图.用法可以说是基本完全一样,本文章以高德为例,简单说一下他们的区别,高德地图精度应 ...

  5. 微信小程序调用地图和跟据经纬度打开手机地图导航

    微信小程序调用地图和跟据经纬度打开手机地图导航 第一步:输入地址位置 wxml<button bindtap="onChooseLocation">打开地图</b ...

  6. 腾讯位置服务--微信小程序JSSDK地图开发

    腾讯位置服务–微信小程序JSSDK地图开发 1.腾讯位置服务 文档传送门:https://lbs.qq.com/miniProgram/jsSdk/jsSdkGuide/jsSdkOverview [ ...

  7. 微信小程序-百度AI语音识别——(一)

    微信小程序-百度AI语音识别--(一) 一.百度AI 某天闲来无事在CSDN上看到有大神用百度语音识别+图灵机器人做了一个可以语音聊天(调戏人工智障 )的小demo,觉得挺有趣的,也想着实现一下. 百 ...

  8. 微信小程序如何封装api接口

    微信小程序如何封装api接口 一. 小程序接口请求流程 二,域名配置 一定要配置https,小程序上配置的域名必须是域名备案的 三.打开微信开发者工具,打开你的项目,点开详情.确认一下域名是否一一匹对 ...

  9. 微信小程序+OLAMI自然语言API接口制作智能查询工具--快递、聊天、日历等

    微信小程序最近比较热门,再加上自然语义理解也越来越被人关注,于是我想赶赶潮流,做一个小程序试试.想来想去快递查询应该是一种比较普遍的需求. 如果你也在通过自然语言接口做点什么,希望我的这篇博客能帮到你 ...

最新文章

  1. PDAL点云处理库介绍
  2. MCU(多点控制单元)
  3. PHP开发人员常犯的10个MysqL错误
  4. 荣耀50样张公布:直出1亿像素 实际效果更出色
  5. linux 删除和安装java
  6. Snake活动轮廓模型Matlab实现
  7. 基于Telink 825x Sdk上按键短按及长按的功能实现
  8. C#实现检测打印机状态(包括打印机是否缺纸、打印队列任务数)
  9. 《企业大数据系统构建实战:技术、架构、实施与应用》一2.3 大数据制度和流程规范...
  10. vue3 + crypto-js加密解密(普通版本/TS版本)
  11. CityEngine--comp() operator
  12. 微信支付之App支付
  13. AlexNet网络具体介绍
  14. nginx + uwsgi 搭建PYHTON web应用
  15. 2020清华计算机科学与技术录取分析总结
  16. UI自动化测试框架-从入门到精通
  17. Super Jumper:一个2DOpenGL ES游戏
  18. SAP MIGO生产订单入库校验BADI增强MB_MIGO_BADI
  19. 数据可视化分析教学课件——FineBI实验册节选====医药类专业
  20. 二叉堆的应用 —— TopK 问题求解

热门文章

  1. [Re]南邮ctf平台逆向题
  2. 大西洋月刊 2019年7月_Web开发人员月刊2018年10月
  3. 关于通过面试后谈薪资问题
  4. SpringSecurity的简单概述以及配置SpringSecurity的默认登录页面
  5. 程序人生:程序员要修炼的第一本秘诀--哲学
  6. java公路车官网,已整理成文档
  7. 软件项目中的风险应对策略
  8. 软件项目管理 数独游戏项目
  9. CSU-2220 Godsend
  10. 随身wifi刷机折腾记