openlayer 图层点击事件 鼠标单击

背景: 

接上一篇博客,如何渲染图层,渲染不同颜色的图层?

 一个图层创建好了,接下来我们要做的是,如何通过鼠标点击打开点击对象的详情弹框?鼠标点击的是layer图层里的featrue要素,这些要素包括的数据信息就是创建图层的那些数据。接着拿到这些数据信息,我们可以接着做之下的这些功能:

1.在创建的地图对象监听'singleclick'鼠标的单击事件,通过点击对象可以拿到这个点击的像素块上的featrue要素。

2.拿到的要素传递给一个封装好的方法,在这个方法内,主要做的事情是:根据鼠标点击的不同的图层,通过判断自定义的字段layerType,进行不同的操作。

3.点击要素弹出一个详情弹框。在这个弹框里我们可以做的操作,主要有如下几点:在打开的详情弹框,对接口返回的结果做了一个list数据展示,有一个按钮,通过点击按钮,按钮呈现选中状态且图层对应要素的高亮。通过重新绘制图层达到效果

 效果展示:

核心代码: 

1.图层点击事件

 2.打开测量时间图层——>对应的测量时间的弹框

这是一个封装好的方法。在这个方法里,做了这几种逻辑:

1.turf.js(一个类库)拿到当前点击对象的geom,之后有用到,一个网络请求的参数。

2.点击的这一个要素,选中状态,对应图层高亮样式。通过重新绘制图层达到效果

3.通过geom参数发起网络请求,根据接口设计,可以查询到当前geom的所有水深测量时间的数据。需要前端做的工作:对结果进行处理,按照图层控件绑定的事件,判断notCreate变量判断是否选中;然后判断接口返回数据res不同时间差,添加年份筛选。

4.对筛选后的数据,判断当前点击的要素是查询结果中的某一条,添加上isChoose = true,代表被选中,并设置为选中状态(通过选中样式体现)。

5.打开点击要素的详情弹框。

6.详情弹框点击查询结果的某一条,点击按钮添加高亮样式;且对应图层高亮样式。通过重新绘制图层达到效果

 

/**
   * 测量时间面弹窗
   * @param  {number} id 航标的id
   * @param  {Array} offset 弹窗位置
   */
  MeasuringTimePlanePop: function (id, offset,e) {
    const point = turf.point(ol.proj.toLonLat(e.coordinate));
    var geometry=`POINT(${point.geometry.coordinates[0]} ${point.geometry.coordinates[1]})`;
    let formattedDate = moment().format('YYYY-MM-DD HH:mm:ss');
    confDetails = CONFIG.initLayer.find(function (itme) { return itme.title === '测量时间' })
    MAPutils.redrawMeasuringTimePlane(id)
    $.post("enavapi/data/basedata/getWaterDepthMeasurementLayer", { 'param': JSON.stringify({
      geometry:geometry,
    }) }, function (data) {
      var res = data.data;
      var a = moment(formattedDate);
      var b 
      var timeDiff 
      var cLength= confDetails.children.filter(function(item){return item.notCreate == false})
      //添加年份筛选
      if(cLength && cLength.length !== 0){
        var filteredRes = res.filter(function (v) {
          b = moment(v.surend);
          timeDiff = a.diff(b, 'years', true); 
          return cLength.some(function(range) {
            return _.inRange(timeDiff, range.minVal, range.maxVal);
          });
        });
        res = filteredRes
      }else{
        return;
      }
      if (res &&res.length>0) {
        var timehtml=""
        var isChoose = false
        $.each(res,function(i,v){
          if(v.guid === id){
            isChoose = true
          }else{
            isChoose = false
          }
          timehtml +=` <tr style="height:30px" ${isChoose == true ? "class=measurTimeactive" : ""}><td style="width: 110px;">水深复核时间:</td><td>${v.surend ? moment(v.surend).format('YYYY-MM-DD'):""}</td><td style="width: 70px;"> <a class="layui-btn layui-btn-xs mtp_locate" guid=${v.guid}>${$.cookie("currentLanguage")=="cn"?"高亮":"hightLight"}</a></td> </tr>`
        })
        var str = `<style>
                      #measuringTimePlane_table td{
                        text-align: center;
                      }
                    </style>
                  <div style="padding:5px 0;font-size: 15px;" id="MeasuringTimePlanePage">
                    <table style="width: 100%;height:100%;table-layout: fixed;" id="measuringTimePlane_table" borderColor="#dddddd" cellSpacing="0" cellPadding="0" border="1">
                      <tbody>
                          ${timehtml}
                      </tbody>
                    </table>
                  </div>`;
        layer.close(MAPutils.DialogIndex);
        debounce(function () {
          MAPutils.DialogIndex = layer.open({
            type: 1,
            shade: 0,
            shift: MAPutils.getLayerAnim(),
            title: "<B i18n-text='tc_MeasuringTimePlane'>测量时间</B>",
            // area: ['500px', '300px'],
            offset: offset,
            content: str,
            maxmin: true,
            resize: false,
            success: function (layero, index) {
              I18n.language($(".lang-selected").attr('lang'))
              $(layero).css('height', '')
              $(layero).find(".mtp_locate").on("click",function(e){
                var element = $(this);
                var parentDom = element.parent().parent();
                var guid= element.attr("guid");
                //点击添加上高亮样式
                if(!parentDom.hasClass("measurTimeactive")){
                  parentDom.siblings().removeClass("measurTimeactive").end().addClass("measurTimeactive");
                }
                MAPutils.redrawMeasuringTimePlane(guid)
              })
            }
          })
        })
      } else {
        layer.msg("暂无数据", { icon: 5, anim: 6 });
      }
    });
  },

3.其它

以上调用到的方法,如下:

/**
   * 重新绘制
   */
  redrawMeasuringTimePlane: function (_key) {
    var rootLayer = MAPutils.getLayerByTitle("测量时间");
    rootLayer.getSource().clear();
    var oldDataList = MAPutils.measureTimeAllData
    var newDataList = oldDataList.filter(function (item,index) {
      return item.guid !== _key
    })
    let myFilterData = oldDataList.filter(item => item.guid == _key);
    $.each(newDataList, function (index, item) {
      if(item.isBoolean == true) {
          var v = item
          MAPutils.drawVectorFeature(rootLayer, {
            geom: v.geom,
            id: v.guid,
            kv: {
              // markType: "shoalWaterLayer",
              data: v,
              layerType: 'MeasuringTimePlaneLayer'
            },
            style: new ol.style.Style({
              fill: new ol.style.Fill({
                color: [200, 200, 200,0.4]
              }),
              stroke: new ol.style.Stroke({
                color: v.color,
                width:3
              }),
            }),
          });
      }
    });
    $.each(myFilterData, function (index, item) {
      if(item.isBoolean == true) {
          var v = item
          MAPutils.drawVectorFeature(rootLayer, {
            geom: v.geom,
            id: v.guid,
            kv: {
              // markType: "shoalWaterLayer",
              data: v,
              layerType: 'MeasuringTimePlaneLayer'
            },
            style: new ol.style.Style({
              fill: new ol.style.Fill({
                color: [78, 117, 227,0.6]
              }),
              stroke: new ol.style.Stroke({
                color: [78, 117, 227],
                width: 3
              }),
            }),
          });
      }
    });

  },

测量时间

 测量时间功能的录屏展示,如上

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/748925.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数字AI化银行数字化转型实战手册银行数字化转型大客户营销销售讲师培训师唐兴通谈存量客户理财金融科技与场景化

推动银行数字化转型的五个关键因素 推动银行数字化转型的五个关键因素&#xff1a; 客户体验。为客户提供便利和个性化是数字化转型的关键因素。银行应开发和实施创新的数字渠道&#xff0c;例如移动应用程序、网上银行、聊天机器人等&#xff0c;以方便获取金融服务并提高客户…

使用微信开发者工具创建运行项目全流程

小程序基础知识 1. 认识什么是小程序 什么是微信小程序 微信小程序是一种运行在微信内部的 轻量级 应用程序。 在使用小程序时 不需要下载安装&#xff0c;用户 扫一扫 或 搜一下 即可打开应用。它也体现了 “用完即走” 的理念&#xff0c;用户不用关心安装太多应用的问题…

LangChain让LLM带上记忆

最近两年&#xff0c;我们见识了“百模大战”&#xff0c;领略到了大型语言模型&#xff08;LLM&#xff09;的风采&#xff0c;但它们也存在一个显著的缺陷&#xff1a;没有记忆。 在对话中&#xff0c;无法记住上下文的 LLM 常常会让用户感到困扰。本文探讨如何利用 LangCha…

2024-6-27 石群电路-31

2024-6-27&#xff0c;星期四&#xff0c;12:52&#xff0c;天气&#xff1a;雨&#xff0c;心情&#xff1a;晴。今天没有什么事情发生&#xff0c;继续学习&#xff0c;加油&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 今日观看了石群老师电路课程的视频…

从此以后,将硬件接入大语言模型(LLM)将变得如此简单~

一、前言 本文中将使用ESP-AI开源库来实现将硬件接入AI&#xff0c;整个过程将非常的轻松~ 什么是ESP-AI? 为你的开发板提供全套的AI对话方案&#xff0c;包括但不限于 ESP32 系列开发板的 IATLLMTTS 集成方案。 交流群 QQ 交流群: 854445223 技术栈 ESP-AI 分为了服务端和…

Databend 怎么看 OpenAI 收购实时数仓 Rockset?

6月21日(上周五)&#xff0c;OpenAI 官方宣布完成对实时分析数据库 Rockset 的收购&#xff0c;一时引起数据库圈和 AI 圈热议&#xff0c;很多朋友也来询问 Databend 如何看待这个事件。这次收购表明了市场对实时数据分析和数据处理解决方案的高度重视&#xff0c;数据是 AI 发…

Win10扩充C盘(把其他盘存储空间分给C盘)

C盘虽然没有安装任何软件&#xff0c;但无奈安装某些软件&#xff08;例如VS&#xff0c;QuarC等&#xff09;总会占用C盘容量&#xff0c;且C盘内存很小&#xff08;只有60G左右&#xff09;&#xff0c;看着D盘的三四十空闲内存&#xff0c;决定把D盘内存分给C盘30G&#xff…

C++入门 list的模拟实现

目录 list的节点类 list的迭代器类 list的模拟实现 要模拟实现list&#xff0c;必须要熟悉list的底层结构以及其接口的含义&#xff0c;通过之前学习&#xff0c;这些内容已基本掌握&#xff0c;现在我们来模拟实现list。 参照带头双向循环链表的结构&#xff0c;我们可以建…

ConvMixer 论文与代码解析

paper&#xff1a;Patches Are All You Need? official implementation&#xff1a;https://github.com/locuslab/convmixer 精度上去了&#xff0c;推理速度只有卷积和ViTs的四分之一&#xff01; 出发点 文章讨论了卷积神经网络&#xff08;CNN&#xff09;在视觉任务中…

#### 广告投放 ####

以巨量引擎为例&#xff1a; 计费模式 eCPM&#xff08;expected Cost Per Mile&#xff0c;估计千次展示收入&#xff09; 概括&#xff1a; ecpm为千次展示的预估收益&#xff0c;是广告平台用来给广告排序的指标。 注意是展示而不是千次点击收益&#xff0c;展示了可能不…

从0到1:亮数据浏览器,为数据采集工作注入全新动力

亮数据浏览器提升数据采集效率 一、 导言1.1 引入亮数据浏览器的重要性1.2 简要介绍本文将涉及的主题和内容 二、 亮数据浏览器简介2.1. 什么是亮数据浏览器2.2. 亮数据浏览器的特点和优势 三、优化数据采集的核心功能3.1 自动化数据采集3.1.1 通过亮数据浏览器实现自动化数据采…

LangChain入门之 GPT 和小范大人不太熟?

前言 嗨&#xff0c;大家好&#xff01;我是海鸽。 《庆余年2》刚刚完结&#xff0c;热度不减&#xff0c;我忍不住好奇&#xff1a;我们的AI伙伴GPT&#xff0c;是否也对剧中那位机智过人的小范大人有所耳闻&#xff1f; 不仅如此&#xff0c;最近我们还尝试了LangChain的调…

Xcode安装Simulator失败问题解决方法

Xcode安装Simulator_Runtime失败&#xff0c;安装包离线安装保姆级教程 Xcode更新之后有时候会提示要安装模拟器运行时环境&#xff0c;但是用Xcode更新会因为网络原因&#xff0c;我觉得基本上就是因为苹果服务器的连接不稳定导致的&#xff0c;更可气的是不支持断点续…

介绍几种 MySQL 官方高可用方案

前言&#xff1a; MySQL 官方提供了多种高可用部署方案&#xff0c;从最基础的主从复制到组复制再到 InnoDB Cluster 等等。本篇文章以 MySQL 8.0 版本为准&#xff0c;介绍下不同高可用方案架构原理及使用场景。 1.MySQL Replication MySQL Replication 是官方提供的主从同…

记录dinky0.6.7+flink1.14.5集成问题

先说一句mmp&#xff0c;这个jar包冲突搞吐我。如果有遇到math3问题需要注意少个包 看相关issue 以下为flink的lib目录 一、yarn-application和perjob模式 yarn session模式不依赖dlink-app-1.14-0.6.7-jar-with-dependencies.jar这个包&#xff0c;。但是yarn-application…

新能源行业知识体系-------蒙西电网需求侧响应

新能源行业知识体系-------主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/139946830 目录 一、背景介绍二、需求响应电能量收益介绍三、超额回收需求响应减免收益介绍四、参与需求侧响应五、蒙西电力现货特点六、交易中…

1012:Joseph

网址如下&#xff1a; OpenJudge - 1012:Joseph 其中一个解法 只想到了一个快速找到下一位处决的人的方法&#xff0c;本质上还是遍历&#xff0c;暂时没想到更优的方法了 代码如下&#xff1a; #include<cstdio> int k;bool judge(int tt, int m, int r){if(tt k) …

GPU技术全景:推动未来计算的新动力-4

7.中国厂家 在中国市场&#xff0c;也有几家本土企业在GPU领域崭露头角&#xff0c;虽然市场份额相对较小&#xff0c;但在国产替代和自主可控的浪潮下发展迅速&#xff0c;包括但不限于&#xff1a; •沐曦集成电路、壁仞科技、燧原科技、登临科技、摩尔线程等&#xff0c…

信号处理——时频分析

经典傅里叶变换的限制&#xff1a; 1、只能反映信号的整体特性&#xff1b;&#xff08;完全是时域或频域&#xff09; 2、要求信号满足平稳条件&#xff1b; 3、必须获得时域中的全部信息。 所以引入时频分析&#xff0c;同时使用时间和频率的联合函数来表示信号。 1 时频…

单段时间最优S型速度规划算法

一&#xff0c;背景 在做机械臂轨迹规划的单段路径的速度规划时&#xff0c;除了参考《Trajectory Planning for Automatic Machines and Robots》等文献之外&#xff0c;还在知乎找到了这位大佬 韩冰 写的在线规划方法&#xff1a; https://zhuanlan.zhihu.com/p/585253101/e…