微信小程序开发之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日历 推荐
Dec 03 Javascript
THREE.JS入门教程(4)创建粒子系统
Jan 24 Javascript
通过javascript获取iframe里的值示例代码
Jun 24 Javascript
js中生成map对象的方法
Jan 09 Javascript
Backbone.js中的集合详解
Jan 14 Javascript
jQuery动态星级评分效果实现方法
Aug 06 Javascript
JavaScript中的FileReader图片预览上传功能实现代码
Jul 24 Javascript
微信小程序获取手机号授权用户登录功能
Nov 09 Javascript
JS简单生成由字母数字组合随机字符串示例
May 25 Javascript
JavaScript实现的滚动公告特效【基于jQuery】
Jul 10 jQuery
使用vuex较为优雅的实现一个购物车功能的示例代码
Dec 09 Javascript
Vue 数据响应式相关总结
Jan 28 Vue.js
微信小程序移动拖拽视图-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
php 数组使用详解 推荐
2011/06/02 PHP
PHP数组遍历知识汇总(包含遍历方法、数组指针操作函数、数组遍历测速)
2014/07/05 PHP
使用PHPExcel导出Excel表
2018/09/08 PHP
用函数式编程技术编写优美的 JavaScript
2006/11/25 Javascript
ArrayList类(增强版)
2007/04/04 Javascript
File, FileReader 和 Ajax 文件上传实例分析(php)
2011/04/27 Javascript
JavaScript获取多个数组的交集简单实例
2013/11/11 Javascript
使用js检测浏览器是否支持html5中的video标签的方法
2014/03/12 Javascript
javascript常用的正则表达式实例
2014/05/15 Javascript
Javascript中With语句用法实例
2015/05/14 Javascript
简单实现兼容各大浏览器的js复制内容到剪切板
2015/09/09 Javascript
简要了解jQuery移动web开发的响应式布局设计
2015/12/04 Javascript
jQuery Easyui实现左右布局
2016/01/26 Javascript
Jquery ui datepicker设置日期范围,如只能隔3天【实现代码】
2016/05/04 Javascript
自己封装的一个原生JS拖动方法(推荐)
2016/11/22 Javascript
jQuery中的select操作详解
2016/11/29 Javascript
jqGrid翻页时数据选中丢失问题的解决办法
2017/02/13 Javascript
js时间戳和c#时间戳互转方法(推荐)
2017/02/15 Javascript
vue element table 表格请求后台排序的方法
2018/09/28 Javascript
Vue的双向数据绑定实现原理解析
2020/02/17 Javascript
Vue将props值实时传递 并可修改的操作
2020/08/09 Javascript
Vue封装全局过滤器Filters的步骤
2020/09/16 Javascript
python实现根据图标提取分类应用程序实例
2014/09/28 Python
Python设计模式之享元模式原理与用法实例分析
2019/01/11 Python
Python中遍历列表的方法总结
2019/06/27 Python
python实现图片插入文字
2019/11/26 Python
OpenCV+python实现实时目标检测功能
2020/06/24 Python
布局和排版教程 纯css3实现图片三角形排列
2014/10/17 HTML / CSS
浅谈移动端网页图片预加载方案
2018/11/05 HTML / CSS
捷克家电和家具购物网站:OKAY.cz
2020/07/23 全球购物
旅游管理毕业生自荐书
2014/02/02 职场文书
党支部公开承诺书
2014/03/28 职场文书
葬礼司仪主持词
2014/03/31 职场文书
转变工作作风心得体会
2016/01/23 职场文书
祝福语集锦:朋友新店开业祝福语
2019/12/10 职场文书
SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询
2022/05/25 SQL Server