微信小程序开发之map地图组件定位并手动修改位置偏差


Posted in Javascript onAugust 17, 2019

环境搭建

注册,获取APPID(没有这个不能真鸡调试)

下载微信web开发者工具(挺多bug,将就用)

打开微信web开发者工具,扫码登录,新建小程序,输入APPID,勾选创建quick start项目。

工程结构

可以看到工程根目录中有个app.js,这里可以定义全局变量,通过getApp()获取。

项目中有了一些示例,已经有了获取用户信息的方法等。

开发地图定位,选择位置功能

我们直接修改index页面来做这个功能。

准备

新建imgs目录,加入2个图标(ic_location和ic_position),用于标记当前位置,和地图中央位置。

微信小程序开发之map地图组件定位并手动修改位置偏差微信小程序开发之map地图组件定位并手动修改位置偏差

添加定位功能

修改app.js,加入定位功能,获取当前位置。

//app.js
App({
 onLaunch: function () {
  //调用API从本地缓存中获取数据
  var logs = wx.getStorageSync('logs') || []
  logs.unshift(Date.now())
  wx.setStorageSync('logs', logs)
 }
 ,getUserInfo:function(cb){
  var that = this
  if(this.globalData.userInfo){
   typeof cb == "function" && cb(this.globalData.userInfo)
  }else{
   //调用登录接口
   wx.login({
    success: function () {
     wx.getUserInfo({
      success: function (res) {
       that.globalData.userInfo = res.userInfo
       typeof cb == "function" && cb(that.globalData.userInfo)
      }
     })
    }
   })
  }
 }
 //get locationInfo
 ,getLocationInfo: function(cb){
  var that = this;
  if(this.globalData.locationInfo){
    cb(this.globalData.locationInfo)
  }else{
    wx.getLocation({
     type: 'gcj02', // 默认为 wgs84 返回 gps 坐标,gcj02 返回可用于 wx.openLocation 的坐标
     success: function(res){
      that.globalData.locationInfo = res;
      cb(that.globalData.locationInfo)
     },
     fail: function() {
      // fail
     },
     complete: function() {
      // complete
     }
    })
  }
 }

 ,globalData:{
  userInfo:null
  ,locationInfo: null
 }
})

地图控件布局

修改pages/index/index.wxml文件,添加map标签,如下

<map id="map4select"
 longitude="{{longitude}}" latitude="{{latitude}}" 
 markers="{{markers}}"
 scale="20" 
 style="width:{{map_width}}px;height:{{map_height}}px"
 bindregionchange="regionchange"
 controls="{{controls}}">
</map>

需要给地图指定一个id,后面可以通过id获取地图的上下文。

监听bindregionchange事件,地图变化的时候可以监听到。

地图的大小不要写死,动态设置,我这里打算设置为宽高都是屏幕宽度。

controls是固定在map组件上面的。一开始我想用image替代,但是设置z-index也不能在地图上面,毕竟不是H5开发。

逻辑代码编写

编辑index.js

var app = getApp()

Page({
  data:{
   map_width: 380
   ,map_height: 380
  }
  //show current position
  ,onLoad: function(){
  var that = this;
  // 获取定位,并把位置标示出来
  app.getLocationInfo(function(locationInfo){
    console.log('map',locationInfo);
    that.setData({
     longitude: locationInfo.longitude
     ,latitude: locationInfo.latitude
     ,markers:[
      {
      id: 0
      ,iconPath: "../../imgs/ic_position.png"
      ,longitude: locationInfo.longitude
      ,latitude: locationInfo.latitude
      ,width: 30
      ,height: 30
      }
     ]
    })
  })

  //set the width and height
  // 动态设置map的宽和高
  wx.getSystemInfo({
   success: function(res) {
    console.log('getSystemInfo');
    console.log(res.windowWidth);
    that.setData({
      map_width: res.windowWidth
     ,map_height: res.windowWidth
     ,controls: [{
      id: 1,
      iconPath: '../../imgs/ic_location.png',
      position: {
       left: res.windowWidth/2 - 8,
       top: res.windowWidth/2 - 16,
       width: 30,
       height: 30
      },
      clickable: true
     }]
    })
   }
  })

 }
 //获取中间点的经纬度,并mark出来
 ,getLngLat: function(){
   var that = this;
   this.mapCtx = wx.createMapContext("map4select");
   this.mapCtx.getCenterLocation({
    success: function(res){

      that.setData({
      longitude: res.longitude
      ,latitude: res.latitude
      ,markers:[
       {
       id: 0
       ,iconPath: "../../imgs/ic_position.png"
       ,longitude: res.longitude
       ,latitude: res.latitude
       ,width: 30
       ,height: 30
       }
      ]
     })

    }
   })
 }
 ,regionchange(e) {
  // 地图发生变化的时候,获取中间点,也就是用户选择的位置
   if(e.type == 'end'){
     this.getLngLat()
   }
 }
 ,markertap(e) {
  console.log(e)
 }
})

展示

这样,就OK啦,用户可以看到自己的定位,如果觉得有偏差,可以移动地图,把中央点放到自己认为的准确位置上。

微信小程序开发之map地图组件定位并手动修改位置偏差
微信小程序开发之map地图组件定位并手动修改位置偏差
微信小程序开发之map地图组件定位并手动修改位置偏差

Javascript 相关文章推荐
JS 容错处理代码, 屏蔽错误信息
Mar 09 Javascript
Js event事件在IE、FF兼容性问题
Jan 01 Javascript
jquery中JSON的解析方式
Mar 16 Javascript
js实现的早期滑动门菜单效果代码
Aug 27 Javascript
谈谈AngularJs中的隐藏和显示
Dec 09 Javascript
非常棒的jQuery图片轮播效果
Apr 17 Javascript
[原创]javascript typeof id==='string'?document.getElementById(id):id解释
Nov 02 Javascript
js replace()去除代码中空格的实例
Feb 14 Javascript
Webpack常见静态资源处理-模块加载器(Loaders)+ExtractTextPlugin插件
Jun 29 Javascript
Vue 仿QQ左滑删除组件功能
Mar 12 Javascript
js使用formData实现批量上传
Mar 27 Javascript
vue中使用mxgraph的方法实例代码详解
May 17 Javascript
微信小程序移动拖拽视图-movable-view实例详解
Aug 17 #Javascript
微信小程序框架的页面布局代码
Aug 17 #Javascript
vue实现滑动到底部加载更多效果
Oct 27 #Javascript
vue实现页面滚动到底部刷新
Aug 16 #Javascript
vue-mugen-scroll组件实现pc端滚动刷新
Aug 16 #Javascript
JavaScript的查询机制LHS和RHS解析
Aug 16 #Javascript
jquery树形插件zTree高级使用详解
Aug 16 #jQuery
You might like
实现dedecms全站URL静态化改造的代码
2007/03/29 PHP
dedecms模版制作使用方法
2007/04/03 PHP
php 动态执行带有参数的类方法
2009/04/10 PHP
解析php获取字符串的编码格式的方法(函数)
2013/06/21 PHP
php处理复杂xml数据示例
2016/07/11 PHP
php字符串操作针对负值的判断分析
2016/07/28 PHP
Aster vs KG BO3 第三场2.19
2021/03/10 DOTA
写给想学习Javascript的朋友一点学习经验小结
2010/11/23 Javascript
用JS判断IE版本的代码 超管用!
2011/08/09 Javascript
jquery插件制作简单示例说明
2012/02/03 Javascript
JavaScript单元测试ABC
2012/04/12 Javascript
Javascript 面向对象(一)(共有方法,私有方法,特权方法)
2012/05/23 Javascript
页面载入结束自动调用js函数示例
2013/09/23 Javascript
JavaScript字符串对象fromCharCode方法入门实例(用于把Unicode值转换为字符串)
2014/10/17 Javascript
轻松创建nodejs服务器(10):处理上传图片
2014/12/18 NodeJs
浅谈jquery事件处理
2015/04/24 Javascript
JavaScript实现自动弹出窗口并自动关闭窗口的方法
2015/08/06 Javascript
html中通过JS获取JSON数据并加载的方法
2017/11/30 Javascript
js 实现碰撞检测的示例
2020/10/28 Javascript
Python实现基于二叉树存储结构的堆排序算法示例
2017/12/08 Python
python爬虫 使用真实浏览器打开网页的两种方法总结
2018/04/21 Python
python制作抖音代码舞
2019/04/07 Python
Python3.5以上版本lxml导入etree报错的解决方案
2019/06/26 Python
Python使用lambda表达式对字典排序操作示例
2019/07/25 Python
softmax及python实现过程解析
2019/09/30 Python
xadmin使用formfield_for_dbfield函数过滤下拉表单实例
2020/04/07 Python
Python selenium键盘鼠标事件实现过程详解
2020/07/28 Python
NARS化妆品官方商店:美国彩妆品牌
2017/08/26 全球购物
几个常见的消息中间件(MOM)
2014/01/08 面试题
家长会学生家长演讲稿
2013/12/29 职场文书
社区党员先进事迹
2014/01/22 职场文书
《囚绿记》教学反思
2014/03/01 职场文书
幼儿园中班教师个人总结
2015/02/05 职场文书
机关干部作风整顿心得体会
2016/01/22 职场文书
银行柜员工作心得体会
2016/01/23 职场文书
使用CSS实现音波加载效果
2023/05/07 HTML / CSS