漏刻有时百度地图API实战开发(5)区域限制移动端鬼畜抖动的解决方案

本文主要是介绍漏刻有时百度地图API实战开发(5)区域限制移动端鬼畜抖动的解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  1. 漏刻有时百度地图API实战开发(1)华为手机无法使用addEventListener click 的兼容解决方案
  2. 漏刻有时百度地图API实战开发(2)文本标签显示和隐藏的切换开关
  3. 漏刻有时百度地图API实战开发(3)自动获取地图多边形中心点坐标
  4. 漏刻有时百度地图API实战开发(4)显示指定区域在移动端异常的解决方案
  5. 漏刻有时百度地图API实战开发(5)区域限制移动端鬼畜抖动的解决方案
  6. 漏刻有时百度地图API实战开发(6)多个标注覆盖层级导致不能响应点击的问题
  7. 漏刻有时百度地图API实战开发(7)JavaScript开源库几何运算判断点是否在多边形内(电子围栏)
  8. 漏刻有时百度地图API实战开发(8)圆形区域周边搜索地图监听事件(覆盖物重叠显示层级\图像标注监听事件、setZIndex和setTop方法)
    在这里插入图片描述
    百度地图浏览区域限制类,对外开放。 允许开发者输入限定浏览的地图区域的Bounds值, 则地图浏览者只能在限定区域内浏览地图。

一、百度区域限制计算JS库-PC端

区域限制计算JS库

    <!--百度地图核心库--><script type="text/javascript" src="//api.map.baidu.com/library/AreaRestriction/1.2/src/AreaRestriction_min.js"></script>

设置可视视野范围

  //设置可视视野范围var b = new BMap.Bounds(new BMap.Point(121.2790142755745, 29.675582699353967),//左上new BMap.Point(121.83093318072264, 29.945334949391032)//右下);
try {BMapLib.AreaRestriction.setBounds(map, b); // 以map为中心,已b为范围的地图} catch (e) {console.log(e);}

在PC端以上的解决方案,很完美。但是在移动端,就会出现上图的鬼畜抖动。

二、移动端的避开指南

1.设置响应式CSS - 失败

#lock_map {float: left;width: 100%;height: 100%;overflow: hidden;margin: 0;padding: 0;transform: translate(0, 0);-webkit-transform: translate(0, 0); /* Safari */-moz-transform: translate(0, 0); /* Firefox */-ms-transform: translate(0, 0); /* IE */-o-transform: translate(0, 0); /* Opera */
}

见《移动端响应式设计中出现 “抖动” 现象如何解决?》

2.超出编辑,回弹自中心点

这个操作有点不知如何评价,边缘的标注就不看了?还是要小心翼翼的拖动,体验性也是极差。

map.addEventListener("dragend", function (type, target) {//console.log(b.containsBounds(map.getBounds()));if (b.containsBounds(map.getBounds())) {//map.panTo(new BMap.Point(114.18882611986866, 36.475437590543926), 4);} else {map.centerAndZoom(pointCenter, 11);}});

三、不完美的方案

不完美但是能用,修改AreaRestriction_min.js在移动端中心点的计算方式。

1.原文件算法

 /*** 需要绑定在地图移动事件中的操作,主要控制出界时的地图重新定位* @param {Event} e e对象** @return 无返回值*/AreaRestriction._mapMoveendEvent = function(e) {// 如果当前完全没有出界,则无操作if (_bounds.containsBounds(_map.getBounds())) {return;}// 两个需要对比的bound区域的边界值var curBounds = _map.getBounds(),curBoundsSW = curBounds.getSouthWest(),curBoundsNE = curBounds.getNorthEast(),_boundsSW = _bounds.getSouthWest(),_boundsNE = _bounds.getNorthEast();// 需要计算定位中心点的四个边界var boundary = {n : 0, e : 0, s : 0, w : 0};// 计算需要定位的中心点的上方边界boundary.n = (curBoundsNE.lat < _boundsNE.lat) ? curBoundsNE.lat :_boundsNE.lat;// 计算需要定位的中心点的右边边界boundary.e = (curBoundsNE.lng < _boundsNE.lng) ? curBoundsNE.lng :_boundsNE.lng;// 计算需要定位的中心点的下方边界boundary.s = (curBoundsSW.lat < _boundsSW.lat) ? _boundsSW.lat :curBoundsSW.lat;// 计算需要定位的中心点的左边边界boundary.w = (curBoundsSW.lng < _boundsSW.lng) ? _boundsSW.lng :curBoundsSW.lng;// 设置新的中心点var center = new BMap.Point(boundary.w + (boundary.e - boundary.w) / 2,boundary.s + (boundary.n - boundary.s) / 2);setTimeout(function() {_map.panTo(center, {noAnimation : "no"});}, 1);};

2.优化算法

 /*** 需要绑定在地图移动事件中的操作,主要控制出界时的地图重新定位* @param {Event} e e对象** @return 无返回值*/AreaRestriction._mapMoveendEvent = function (e) {// 如果当前完全没有出界,则无操作if (_bounds.containsPoint(_map.getCenter())) {return;}// 两个需要对比的bound区域的边界值var curBounds = _map.getCenter(),_boundsSW = _bounds.getSouthWest(),_boundsNE = _bounds.getNorthEast(),nextBounds = curBounds;if (curBounds.lng >= _boundsNE.lng)nextBounds.lng = _boundsNE.lng;else if (curBounds.lng <= _boundsSW.lng)nextBounds.lng = _boundsSW.lng;if (curBounds.lat >= _boundsNE.lat)nextBounds.lat = _boundsNE.lat;else if (curBounds.lat <= _boundsSW.lat)nextBounds.lat = _boundsSW.lat;//console.log(nextBounds);// 设置新的中心点setTimeout(function () {_map.panTo(nextBounds, {noAnimation: "no"});}, 1);};

四、完美的方案

使用百度地图webgl版本开发和区域限制。

    <script src="//api.map.baidu.com/api?type=webgl&v=1.0&ak=3HGqGo1***"></script><script type="text/javascript"src="//mapopen.cdn.bcebos.com/github/BMapGLLib/AreaRestriction/src/AreaRestriction.min.js"></script>

@漏刻有时

这篇关于漏刻有时百度地图API实战开发(5)区域限制移动端鬼畜抖动的解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/376864

相关文章

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

Pandas使用SQLite3实战

《Pandas使用SQLite3实战》本文主要介绍了Pandas使用SQLite3实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1 环境准备2 从 SQLite3VlfrWQzgt 读取数据到 DataFrame基础用法:读

Linux samba共享慢的原因及解决方案

《Linuxsamba共享慢的原因及解决方案》:本文主要介绍Linuxsamba共享慢的原因及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux samba共享慢原因及解决问题表现原因解决办法总结Linandroidux samba共享慢原因及解决

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

浅谈mysql的sql_mode可能会限制你的查询

《浅谈mysql的sql_mode可能会限制你的查询》本文主要介绍了浅谈mysql的sql_mode可能会限制你的查询,这个问题主要说明的是,我们写的sql查询语句违背了聚合函数groupby的规则... 目录场景:问题描述原因分析:解决方案:第一种:修改后,只有当前生效,若是mysql服务重启,就会失效;

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作