微信小程序开发之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中最常看到切最容易迷惑的语法(转)
Oct 29 Javascript
jQuery数组处理方法汇总
Jun 20 Javascript
javascript如何动态加载表格与动态添加表格行
Nov 27 Javascript
鼠标经过tr时,改变tr当前背景颜色
Jan 13 Javascript
在myeclipse中如何加入jquery代码提示功能
Jun 03 Javascript
javascript自定义右键弹出菜单实现方法
May 25 Javascript
javascript表单验证大全
Aug 12 Javascript
全面解析Bootstrap表单使用方法(表单按钮)
Nov 24 Javascript
浏览器兼容性问题大汇总
Dec 17 Javascript
JS控制FileUpload的上传文件类型实例代码
Oct 07 Javascript
AngularJs中 ng-repeat指令中实现含有自定义指令的动态html的方法
Jan 19 Javascript
vue cli使用融云实现聊天功能的实例代码
Apr 19 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
《魔兽争霸3》重制版究竟重制了什么?玩家:这么糊弄真的好吗?
2020/05/04 魔兽争霸
php对二维数组进行排序的简单实例
2013/12/19 PHP
学习php设计模式 php实现工厂模式(factory)
2015/12/07 PHP
PHP数组的定义、初始化和数组元素的显示实现代码
2016/11/05 PHP
2017年最好用的9个php开发工具推荐(超好用)
2017/10/23 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
Aster vs Newbee BO3 第三场2.18
2021/03/10 DOTA
共享自己写一个框架DreamScript
2007/01/20 Javascript
js 文件引入实现代码
2010/04/23 Javascript
JS面向对象编程浅析
2011/08/28 Javascript
javascript jscroll模拟html元素滚动条
2012/12/18 Javascript
鼠标经过tr时,改变tr当前背景颜色
2014/01/13 Javascript
js的Prototype属性解释及常用方法
2014/05/08 Javascript
jQuery实现的Tab滑动选项卡及图片切换(多种效果)小结
2015/09/14 Javascript
谈谈jQuery Ajax用法详解
2015/11/27 Javascript
js实现精确到秒的日期选择器完整实例
2016/04/30 Javascript
微信小程序实现下拉刷新和轮播图效果
2017/11/21 Javascript
jQuery滚动条美化插件nicescroll简单用法示例
2018/04/18 jQuery
vue项目中将element-ui table表格写成组件的实现代码
2019/06/12 Javascript
vue任意关系组件通信与跨组件监听状态vue-communication
2020/10/18 Javascript
[03:43]2014DOTA2西雅图国际邀请赛 newbee战队巡礼
2014/07/07 DOTA
[57:22]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第五场
2018/04/10 DOTA
对python中两种列表元素去重函数性能的比较方法
2018/06/29 Python
python 字典操作提取key,value的方法
2019/06/26 Python
Python 实现顺序高斯消元法示例
2019/12/09 Python
HTML5视频支持检测(检查浏览器是否支持视频播放)
2013/06/08 HTML / CSS
2014年元旦联欢会活动策划方案
2014/02/16 职场文书
荷叶母亲教学反思
2014/04/30 职场文书
感恩的演讲稿
2014/05/06 职场文书
2015年师德师风自我评价范文
2015/03/05 职场文书
nginx网站服务如何配置防盗链(推荐)
2021/03/31 Servers
写好Python代码的几条重要技巧
2021/05/21 Python
spring项目中切面及AOP的使用方法
2021/06/26 Java/Android
mybatis 获取无数据的字段不显示的问题
2021/07/15 Java/Android
bat批处理之字符串操作的实现
2022/03/16 Python
Hive HQL支持2种查询语句风格
2022/06/25 数据库