码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 百度地图高级进阶开发:圆形区域周边搜索地图监听事件(覆盖物重叠显示层级\图像标注监听事件、setZIndex和setTop方法)


    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方法)
      在这里插入图片描述

    百度地图API

    1. 使用百度地图API添加多覆盖物渲染时,会出现覆盖物被相互覆盖而导致都无法触发它们自己的监听;
    2. 在百度地图API里,map的z-index为0,但是触发任意覆盖物的监听如click时也必定会触发map的监听;

    项目需求

    在开发过程中,需要单击地图,以当前坐标为中心点,搜索周边N公里半径内的搜索圆形区域内的图像标注POI,展示出来,同时支持信息弹窗。

        //地图监听事件
        map.addEventListener('click', function (e) {
            //清除覆盖物;
            map.clearOverlays();
            var x = e.point.lng;
            var y = e.point.lat;
            var newPoint = new BMap.Point(x, y);
            //新标注
            addSurroundMarker(newPoint, 1);
            searchMaker(x, y);//圆形周边标注;
            addCircle(newPoint, radiusLength);//范围
        })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    结论:map的监听事件最优级别,无法获取marker的监听事件。

    项目分析

    1.使用z-index属性设置是否可以?

    通过在F12调试工具,元素面板下,可以清楚查看包括map在内的各个覆盖物的显示层级。
    在这里插入图片描述
    但是图像标注比较多的情况下,通过该方式设置,仍旧避免不了被覆盖的情况。

    2.图像标注setZIndex(无效)

    在使用百度地图API时,可以使用setZIndex方法来设置图像标注的层级。下面是使用setZIndex方法的示例代码:

    // 创建百度地图实例
    var map = new BMap.Map("mapContainer");
    
    // 添加地图中心点
    map.centerAndZoom(new BMap.Point(116.397428, 39.90923), 11);
    
    // 创建一个标注点
    var point = new BMap.Point(116.40738, 39.91601);
    
    // 创建自定义标注
    var marker = new BMap.Marker({
      position: point,
      title: "标注",
      map: map
    });
    
    // 设置标注的 zIndex 值
    marker.setZIndex(100);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在上面的示例中,首先创建了一个百度地图实例,然后通过centerAndZoom方法设置地图的中心点和缩放级别。接下来,使用BMap.Point类创建了一个标注点的坐标。然后,使用BMap.Marker类创建了一个自定义标注,并将其显示在地图上。最后,通过setZIndex方法将标注的zIndex值设置为100。

    请注意,zIndex值越大,标注的层级越高。
    根据需要设置适当的zIndex值来调整标注在地图上的层级关系。

    setTop(isTop: Boolean)

    将标注置于其他标注之上。默认情况下,纬度较低的标注会覆盖在纬度较高的标注之上,从而形成一种立体效果。通过此方法可使某个标注覆盖在其他所有标注之上。注意:如果在多个标注对象上调用此方法,则这些标注依旧按照纬度产生默认的覆盖效果

        marker.setTop(true);
        // 将标注添加到地图中
        map.addOverlay(marker);
    
    • 1
    • 2
    • 3

    4.使用map监听回调函数overlay属性

    能否通过map监听回调函数入参中的overlay属性来判断是否该事件是否有其他覆盖物呢?

    要判断map上的覆盖物是否还有其他覆盖物,使用以下步骤:

    1. 在添加地图事件监听器之前,确保已经将所有覆盖物添加到地图上。通过使用Map对象的addOverlay()方法将覆盖物添加到地图上。
    2. 在地图事件监听器的回调函数中,通过检查event.targets数组来判断是否有其他覆盖物。event.targets数组将包含所有与事件相关的覆盖物。
    3. 在回调函数中,如果event.targets数组的长度大于1,则表示有其他覆盖物与事件相关联。您可以进一步处理这些覆盖物,例如显示它们的信息或执行其他操作。

    下面是一个示例代码片段,演示如何使用addEventListener来监听地图的点击事件并判断是否有其他覆盖物:

    var map = new BMap.Map("mapContainer");
    
    // 添加覆盖物到地图
    var overlay1 = new BMap.Overlay(/* 第一个覆盖物的参数 */);
    var overlay2 = new BMap.Overlay(/* 第二个覆盖物的参数 */);
    map.addOverlay(overlay1);
    map.addOverlay(overlay2);
    
    // 添加地图事件监听器
    map.addEventListener("click", function(event) {
      // 判断是否有其他覆盖物
         var targets = e.overlay;
            // 判断是否有其他覆盖物
            if (targets != null) {
        console.log("有其他覆盖物被点击");
        // 处理其他覆盖物
        // ...
      } else {
        console.log("没有其他覆盖物被点击");
      }
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在这里插入图片描述

    在上述示例中,我们创建了一个地图实例并将两个覆盖物添加到地图上。然后,我们使用addEventListener为地图添加了一个点击事件监听器。在回调函数中,我们检查event.targets数组的长度是否大于1,以确定是否有其他覆盖物与点击事件相关联。根据判断结果,我们可以在控制台输出相应的信息并处理其他覆盖物(在示例中未显示具体处理方式)。

    终极解决方案

    在这里插入图片描述

        //地图监听事件
        map.addEventListener('click', function (e) {
            var targets = e.overlay;
            // 判断是否有其他覆盖物
            if (targets != null) {
                console.log("There are OverLays on the current map");
                return false;
            }
            //清除覆盖物;
            map.clearOverlays();
            var x = e.point.lng;
            var y = e.point.lat;
            var newPoint = new BMap.Point(x, y);
            //新标注
            addSurroundMarker(newPoint, 1);
            searchMaker(x, y);//圆形周边标注;
            addCircle(newPoint, radiusLength);//范围
        })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    @漏刻有时

  • 相关阅读:
    【100个 Unity实用技能】| Unity读取本地文件(Json,txt等)的三种方法示例
    ICMP重定向(ICMP redirect)实验分析
    线性代数 | 矩阵运算 加减 数乘 矩阵的幂运算
    【日常记录】offensive-ad(一个很好的内网机器)
    flutter webrtc搭建1v1通信服务
    C++——多态
    CloudCompare 二次开发(19)——三维点云边界提取
    zookeeper:服务器有几种状态?
    【重拾C语言】十二、C语言程序开发(自顶向下、逐步求精;结构化程序设计原则;程序风格)
    MyBatis使用注解操作及XML操作
  • 原文地址:https://blog.csdn.net/weixin_41290949/article/details/133914181
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号