最近在开发微信小程序涉及到地图开发方面,效果虽然不理想,但还是想记录下开发中遇到的一些坑,梳理一下自己的解决思路,总结一下知识点。文中如有错误,欢迎大家评论留言。

一、需求:

在微信小程序添加一个景区导航,即在地图上面添加一层覆盖物,还要能实时定位。具体效果类似于微信小程序(腾讯智慧景区),上边覆盖着一个很炫的手绘地图还能够实时定位。如下图所示

二、开发过程遇到的问题:

1、问题:刚开始做的时候就是想先把覆盖物实现出来,看了微信小程序腾讯智慧景区能实现,自己就想尝试根据微信小程序开发文档进行实现,可是翻遍整个微信小程序开发文档以及网上的资料只有找到微信小程序JavaScript SDK、API>位置、API>媒体>地图、组件>地图等,这些支持微信小程序但都没有看到支持覆盖物的API。

解决:微信小程序新建页面嵌入H5,在H5页面上引入腾讯地图,并使用腾讯地图web开发>JavaScript API>覆盖物>GroundOverlay即可将覆盖物添加到地图上,然后H5页面上传到服务器后还需将该页面域名添加到微信小程序后台的合法业务域名中(开发过程中也可以在开发工具中勾选上‘不校验域名’,开发过程可以打开),最后在微信小程序增加一个点击事件触发新建页面。相关API文档。

关键代码:

新建页面map.wxml中代码片段,使用web-view标签可将H5页面嵌入到新建页面中

<view class="container"><web-view src="https://ssl.sunnyday365.cn/address/address.html"></web-view>
</view>

H5页面address.html中代码片段,引入腾讯地图,并使用GroundOverlay将覆盖物叠加到地图之上

<head><script charset="utf-8" src="https://map.qq.com/api/js?v=2.exp&key=ZG6BZ-UGZW5-UG2I6-QZ4O3-HS2Z3-I7BQA"></script>
</head><body onload="init()"><script>var map;  var init = function() {var center = new qq.maps.LatLng(23.122700,113.555999);//中心点坐标map = new qq.maps.Map(document.getElementById('container'), {center: center,zoom: 17 //地图放大级数});var groundOverlay = new qq.maps.GroundOverlay({//设置显示地面覆盖层的地图map: map,//设置图片地址imageUrl: 'pm.png',//设置显示图片的地图上的矩形区域,左下角以及右上角坐标bounds: new qq.maps.LatLngBounds(new qq.maps.LatLng(23.120643,113.553850), new qq.maps.LatLng(23.123816,113.558466)),//设置覆盖层的透明度opacity: 1,//设置地面覆盖层可响应鼠标事件,默认为trueclickable: true,//设置覆盖层可见,默认为truevisible: true});            </script><div style="width:100%;height:100vh" id="container"></div>
</body>

2、 问题:覆盖物该怎么生成,怎么弄才能让覆盖物更自然的嵌入到地图上,以及缩放时是否自然和如何对齐问题

解决:我是先把腾讯地图放大到最大级别进行截图,然后把图片交给UI进行绘制,完成后只需将目标区域截取出来保存为png格式,如不明白可参考如何制作手绘地图?如何将图片图层精确地对准在地图上?

效果如下图所示:

3、问题:覆盖图生成后就需要开始弄实时定位了,一开始就在想有没有办法引入地图就有自己附带定位功能的,就好像打开高德地图APP那样的,或者有没有API可以直接引用然后就会有那个自我定位的点出现,不过好像不能这么弄的,而且也一直不知道那些地图APP的自我定位图标是怎么生成的。

解决:使用腾讯地图前端定位组件>调用方式三>getLocation获取到自己的定位,然后使用marker标记自己的位置,最后再用watchPosition监听触发函数showMap。有个需要注意的就是微信7.0版本升级了对https的安全限制,即在微信7.0版本及以上版本使用http协议访问定位组件会导致定位失败。相关API文档。而且最近发现手机的定位方式是GPS和网络结合,定位相对准确,但耗电大。

关键代码:

在H5页面引入封装好的JS文件,通过调用js api的接口获取定位信息。

<head><script charset="utf-8" src="https://map.qq.com/api/js?v=2.exp&key=ZG6BZ-UGZW5-UG2I6-QZ4O3-HS2Z3-I7BQA"></script><script type="text/javascript" src="https://apis.map.qq.com/tools/geolocation/min?key=ZG6BZ-UGZW5-UG2I6-QZ4O3-HS2Z3-I7BQA&referer=黄埔花海-小程序"></script>
</head>
<body onload="init()"><script>var map,marker,geolocation;    var init = function() {var center = new qq.maps.LatLng(23.122700,113.555999);map = new qq.maps.Map(document.getElementById('container'), {center: center,zoom: 17});var groundOverlay = new qq.maps.GroundOverlay({//设置显示地面覆盖层的地图map: map,//设置图片地址imageUrl: 'pm.png',//设置显示图片的地图上的矩形区域bounds: new qq.maps.LatLngBounds(new qq.maps.LatLng(23.120643,113.553850), new qq.maps.LatLng(23.123816,113.558466)),//设置覆盖层的透明度opacity: 1,//设置地面覆盖层可响应鼠标事件,默认为trueclickable: true,//设置覆盖层可见,默认为truevisible: true});            marker = new qq.maps.Marker({map : map,position : new qq.maps.LatLng(23.123405,113.557375)}); geolocation=new qq.maps.Geolocation(); function Geolocations() {geolocation.getLocation(showMap,showError)};function showMap(position){// alert(position.lat+','+position.lng)marker.position=new qq.maps.LatLng(position.lat,position.lng)};               Geolocations();//执行Geolocation()函数  geolocation.watchPosition(showMap)  //监听函数 }; function showError(error){switch(error.code) {   case 1:   alert("定位失败,用户拒绝请求地理定位");   break;   case 5:   alert("定位失败,请求获取用户位置超时");   break;   default:   alert("定位失败")  }   };</script><div style="width:100%;height:100vh" id="container"></div>
</body>

效果如下:

三、注意点:

1、H5和腾讯前端定位组件都有getCurrentPosition() 和 watchPosition()事件,对比实例可发现引用方法不一样,定位失败返回的code也不同,网上的资料大家要注意区分,引用错了就没效果了,由于腾讯定位组件旨在优化纯HTML5 Geolocation定位能力弱,定位成功率不高的问题,所以我选用了腾讯前端定位组件。但后面发现糟老头坏得很,害我花费了很长时间去找定位不准的原因。

2、腾讯前端定位组件getCurrentPosition()事件获取定位的方式未知,但定位点没有像地图APP里的定位使用GPS和网络结合那么准确,所以定位不准可能不是代码问题造成的。刚开始不知道,然后就上网找资料,就发现了地图在国内原来是存在着几套坐标系的,WGS-84坐标系是GPS原始坐标系,腾讯高德等使用GCJ-02 坐标系也叫火星坐标系,百度用自家的BD-09坐标系,百度使用的坐标系可能是需要转化的,加密方式不同存在位置偏差。坐标系相关知识。就猜想会不会是这个原因导致的,后来我把获取到的经纬度拿出来,在在线地图经纬度查询(可输入不同地图经纬度,以及显示不同地图上点的位置)网站进行测试可发现就是拿到的经纬度不准的问题。

3、在这次开发过程中还学到了手机端开发者模式,一般PC端不带定位功能,然后就只能在PC端开本地服务器,把网页放到根目录下,通过手机端看效果,可是手机端就看不到控制台,最后发现手机可以用数据线连接PC端进入开发者模式的,但万万想不到的是chrome也是要求getCurrentPosition() and watchPosition()事件在HTTPS域名下使用的,最后我是用UC浏览器使用控制变量法通过alert弹出内容查看效果以及推测原因的。

关于地图开发的那些坑儿相关推荐

  1. 百度地图开发 之 坑中坑

    环境:Xcode 9.3.1     百度地图pods集成后,pod 'BaiduMapKit' 此文章是在百度地图用了很久之后才写的,所以集成的坑我这里就不写了 坑A:   以前只用pod 'Bai ...

  2. 通过腾讯地图、高德地图、百度地图开发接口获取坐标对应的周边相关信息

    通过腾讯地图.高德地图.百度地图开发接口获取坐标对应的周边相关信息 更新: 以前出于好意暴露了个人的KEY,现已被烂用.为不影响您的业务,请使用我的KEY的朋友去申请自己的KEY,我的KEY将在不久后 ...

  3. Android studio百度地图SDK开发 2020最新超详细的Android 百度地图开发讲解(3) 路线规划步行骑行驾车路线规划

    2020最新超详细的Android 百度地图开发讲解(3) 路线规划步行骑行驾车路线规划 开发前配置,显示基本地图,实时定位等查看之前代码,此博客紧接上一博客:https://blog.csdn.ne ...

  4. 在iOS中进行Mapbox地图开发杂谈

    最近因项目需要,在app中要集成Mapbox,并且要能与苹果地图切换使用.从最早认识Mapbox到最终集成完毕,中间有一些断断续续,但总的时间也不算短了,关于这方面的资料其实是比较少的,能参考的基本都 ...

  5. AndroidStudio百度地图开发之显示地图

    最近打算研究一些百度地图相关的东西,由于官方网站给的都是基于Eclipse开发的例子,所以在研究过程中遇到不少的坑,在这里记录一下,对 后来初用AndroidStudio 开发百度地图的兄弟们也算有个 ...

  6. EC20定位模块+百度地图API使用踩坑

    1 模块获得定位数据 模块装上gps天线,使用usb线连接电脑.安装模块usb驱动,成功后打开设备管理器,可以看见模块虚拟了3个串口.主要使用到AT和NMEA两个串口(本设备为COM10和COM9). ...

  7. 干货 | 携程酒店安卓地图开发实践

    作者简介 亦枫,携程资深软件工程师,负责酒店业务 Android 客户端的相关研发工作. 当前大多数移动互联网 App 都会存在地图相关功能,尤其是 LBS(基于位置服务)相关的业务,依赖性更强,携程 ...

  8. Android studio 百度地图开发(3)地图导航

    Android studio 百度地图开发(3)地图导航 email:chentravelling@163.com 工程下载地址:http://blog.csdn.net/chentravelling ...

  9. 新手入门百度地图开发的(0,0)坐标问题

    对于大部分人来讲,由于百度地图资料众多,过度依赖搜索引擎等等原因.新接触百度地图开发工作其实并不容易.今天说说关于坐标(0,0)的问题. 首先仍然介绍坐标系,我们先不管采用的和wgs84还是gcj02 ...

最新文章

  1. EDM HTML编写建议和规范
  2. Codeforces Round #628 (Div. 2) F. Ehab‘s Last Theorem dfs树
  3. NEC Programming Contest 2021 (AtCoder Beginner Contest 229)
  4. tomcat(14)服务器组件和服务组件
  5. 陶陶摘苹果(升级版)(洛谷-P1478)
  6. XP下卸载IE8还原到IE7的解决方法
  7. 诸多老牌数据仓库厂商当前,Snowflake如何创近12年最大IPO金额
  8. CHD4B1(hadoop-0.23)实现NameNode HA安装配置
  9. NAT穿透解决方案介绍
  10. [msi]启动msi日志记录
  11. springboot 控制台输出错误信息_springboot(6)——整合日志
  12. Spring Boot Restful API 构建实战!
  13. Spring boot initialization failed for https://start.spring.io
  14. 生信分析矫正P值_万字长文+诚意满满 | 单细胞转录组分析最佳思路综述
  15. 再好的技术,再完美的规章,也无法取代人自身的素质和责任心
  16. GVM升级后启动异常处理
  17. 如何使用商业化广告赚取收益
  18. Android 面试指南
  19. M2M系统是什么,你知道吗?
  20. 递归实现n阶螺旋矩阵问题

热门文章

  1. 雪球python爬虫炒股_如何使用 Python 抓取雪球网页?
  2. office2003、2010、2013下载资源
  3. 怎么退出自适应巡航_什么是ACC自适应巡航
  4. 递归删除符合条件的目录,文件, kotlin,java
  5. python在tk界面播放本地视频_如何使用python3在tkinter窗口中插入视频播放器?
  6. unity-光照实时GI(Realtime GI)
  7. web前端期末大作业——基于HTML+CSS+JavaScript实现中国茶文化(30页)
  8. 数字图像处理艺术化效果——彩色图像转化为灰度图像(黑白照片)
  9. 项目、习惯以及Todolist的区别
  10. 神经网络入门经典书籍,人工神经网络书籍推荐