漏刻有时百度地图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

相关文章

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

从入门到进阶讲解Python自动化Playwright实战指南

《从入门到进阶讲解Python自动化Playwright实战指南》Playwright是针对Python语言的纯自动化工具,它可以通过单个API自动执行Chromium,Firefox和WebKit... 目录Playwright 简介核心优势安装步骤观点与案例结合Playwright 核心功能从零开始学习

MySQL逻辑删除与唯一索引冲突解决方案

《MySQL逻辑删除与唯一索引冲突解决方案》本文探讨MySQL逻辑删除与唯一索引冲突问题,提出四种解决方案:复合索引+时间戳、修改唯一字段、历史表、业务层校验,推荐方案1和方案3,适用于不同场景,感兴... 目录问题背景问题复现解决方案解决方案1.复合唯一索引 + 时间戳删除字段解决方案2:删除后修改唯一字

Java docx4j高效处理Word文档的实战指南

《Javadocx4j高效处理Word文档的实战指南》对于需要在Java应用程序中生成、修改或处理Word文档的开发者来说,docx4j是一个强大而专业的选择,下面我们就来看看docx4j的具体使用... 目录引言一、环境准备与基础配置1.1 Maven依赖配置1.2 初始化测试类二、增强版文档操作示例2.

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

PowerShell中15个提升运维效率关键命令实战指南

《PowerShell中15个提升运维效率关键命令实战指南》作为网络安全专业人员的必备技能,PowerShell在系统管理、日志分析、威胁检测和自动化响应方面展现出强大能力,下面我们就来看看15个提升... 目录一、PowerShell在网络安全中的战略价值二、网络安全关键场景命令实战1. 系统安全基线核查

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语