openlayer 图层绘制成多种颜色的一个图层

技术栈:

因为是旧项目的优化功能,这里主要介绍实现思路。技术栈:openlayer 6.5^、jquery、layui组件。

背景:

在创建一个地图对象后,如何创建此处省略。这里主要讲解如何根据接口的数据来把水深测量时间的图层根据不同的条件(测量时间差)渲染成不同颜色。包括:一年以内【绿色】、1~2年【黄色】、2~3年【橘色】、3年以上【红色】

实现效果:

主要实现思路:

1.测量时间图层的初始化绘制就需要根据不同时间差,绘制不同的featrue。然后,layer.getSource().addFeature(feature)添加到此图层。

2.图层控件的颜色,要跟图层绘制的颜色保持一致。

3.图层控件能够控制相应图层的开关。

一、初始化测量时间的图层

 (1).根据接口绘制图层

核心思路:

写在前面,因为这是优化功能,之前的接口设计没有设计成根据不同的时间差返回对应的数据,接口不接受参数,接口返回的结果也没有按照时间差进行分组。而是一股脑的返回所有查询到的结果数组resData。

前端需要做的工作,

1.根据接口返回的数据,计算时间差,根据不同时间差给结果数组resData的每一个对象新增字段color、minVal、maxVal、isBoolean = true(默认渲染);

2.根据4种颜色分组,并分别添加上同组的索引值,之后会用到这个索引值,(会根据这个索引值查找到同组的所有对象,将其isBoolean更改为false,意为这组颜色的要素不渲染)

3.使用一个全局变量来存储这个originalData未筛选的数据,之后图层控件控制图层开关的时候会用带这个originalData,(会根据这个值,保证图层控件的开关更改的都是未筛选的初始化数据originalData)

封装方法:

  /**
   * 1.创建图层,根据不同时间差
   * 测量时间面
   */
  InitMeasuringTimePlane: function () {
    $.post('enavapi/data/basedata/getWaterDepthMeasurementLayer',{}, function (data) {
      if (data.code == 200 && data.data.length > 0) {
        var data = data.data
        var rootLayer = MAPutils.getLayerByTitle("测量时间");
        //计算时间差
        // 格式化当前日期
        let formattedDate = moment().format('YYYY-MM-DD HH:mm:ss');
        rootLayer.getSource().clear();
        $.each(data, function (i, v) {
          var color = MAPutils.getFormatColor(v.surend,formattedDate).color;
          var minVal = MAPutils.getFormatColor(v.surend,formattedDate).minVal;
          var maxVal = MAPutils.getFormatColor(v.surend,formattedDate).maxVal;
          v.color = color
          v.minVal = minVal
          v.maxVal = maxVal
          v.isBoolean = true
          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: color,
                width:3
              }),
            }),
          });

        });
        let groupedData = _.groupBy(data, 'color')
        let index = 0;
        // 遍历每个分组并添加索引值
        for (let groupKey in groupedData) {
          let group = groupedData[groupKey];
          for (let i = 0; i < group.length; i++) {
            group[i].index = index;
          }
          index++;
        }
        let originalData = _.flatMap(groupedData, group => group);
        MAPutils.measureTimeAllData =  originalData//未筛选的图层数据;用一个全局变量存储
      }

    });

  },

其它,

使用到封装好的图层绘制方法,如下:

  /**
   * 绘制图层
   * @param _title 图层title
   * @param object 必须包含geom字段
   * 达到效果:给对应的layer图层添加上featrue要素,已达到绘制图层的效果
   */
  drawVectorFeature: function (layer, object) {
    var geom = new ol.format.WKT().readGeometry(object.geom, {
      dataProjection: 'EPSG:4326',    // 设定数据使用的坐标系
      featureProjection: 'EPSG:3857' // 设定当前地图使用的feature的坐标系
    });
    var feature = new ol.Feature({
      geometry: geom
    });
    object.id && feature.setId(object.id);
    object.style && feature.setStyle(object.style);
    // kv值,调用set方法
    var obj = object.kv;
    if (obj) {
      Object.getOwnPropertyNames(obj).forEach(function (key) {
        feature.set(key, obj[key]);
      });
    }
    layer.getSource().addFeature(feature);
    return feature;
  },

 二、图层控件的静态布局

(1).根据已封装好的图层控制文件LayerControl.js文件,绘制图层控制组件。(定制化)

layerControl.js如下:

图层控件的渲染:

jqury创建标签元素并设置选中样式,默认:初始化图层都渲染,初始化图层控件都选中,通过点击图层控件控制对应图层的关闭或者打开。

三、图层控件控制图层的开关

核心思路:

在上面我们有说到一个变量isBoolean值,这里有用到。我们说的图层控件控制图层的开关,简单一点可以通过发起带参数的网络请求,根据接口的返回结果进行图层的重新绘制(但是因为这次是项目优化,接口没有变,所以前端需要多做功夫,这就用到了第2种解决方式)。

第2种解决方式:根据初始化创建图层的时候,我们对接口返回的数据进行添加字段的处理,我们添加的字段包括:color、minVal、maxVal、isBoolean = true(默认渲染)。并且把处理后的数据用一个originalData全局变量保存了起来,这里有用到。

封装方法:

  // 测量时间的点击事件
  _getSelectMeasureTime: function () {
    $('body').on('click', '.mt-sub-level2-group .' + MultiMarkShip.SUB_LEVEL2_SWITCHER, function () {
      // 切换样式
      var $this = $(this)
        checked = !$this.hasClass(MultiMarkShip.SUB_SELECTED_CLASS)
        _index = $this.attr('index')
        confDetails = CONFIG.initLayer.find(function (itme) { return itme.title === '测量时间' })
      $this.toggleClass(MultiMarkShip.SUB_SELECTED_CLASS)
      let filteredObjects = _.filter(confDetails.children, obj => obj.index == _index);
      _.forEach(filteredObjects, obj => {
          obj.notCreate = !checked;
      });

      if (checked) {
        $this.css({
          color: $this.attr('fontcolor'),
          background: $this.attr('bgcolor'),
        })
      } else {
        $this.css({
          color: '#999',
          background: '#ddd',
        })
      }
      var oldDataList = MAPutils.measureTimeAllData
      //筛选有效Features
      var newDataList = oldDataList.map(function (item,index) {
        if(item.index == _index){
          item.isBoolean = !item.isBoolean
        }
        return item
      })
      var rootLayer = MAPutils.getLayerByTitle("测量时间");
      //重新绘制
      MAPutils.getLayerByTitle("测量时间").getSource().clear();
      $.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
                }),
              }),
            });
        }
      });

    })
  },

这是一个跳转链接,会跳转到小破站,我写的,放心。。。 

小破站的屏幕录制,感兴趣的可以看一眼最终实现效果

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

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

相关文章

vue2的待办事项案例

头部组件 <template><div class"todo-header"><input type"text" placeholder"请输入你的任务名称&#xff0c;按回车键确认" keyup.enter"add"/></div> </template><script>import {nanoid} fro…

智能语音抽油烟机:置入WTK6900L离线语音识别芯片 掌控厨房新风尚

一、抽油烟机语音识别芯片开发背景 在繁忙的现代生活中&#xff0c;人们对于家居生活的便捷性和舒适性要求越来越高。传统的抽油烟机操作方式往往需要用户手动调节风速、开关等功能&#xff0c;不仅操作繁琐&#xff0c;而且在烹饪过程中容易分散注意力&#xff0c;增加安全隐…

【5G射频基本架构】

平台框架 平台演进及搭配 5G NR频谱 NSA/SA/ENDC

Java登录管理功能的自我理解(尚庭公寓)

登录管理 背景知识 1. 认证方案概述 有两种常见的认证方案&#xff0c;分别是基于Session的认证和基于Token的认证&#xff0c;下面逐一进行介绍 基于Session 基于Session的认证流程如下图所示 该方案的特点 登录用户信息保存在服务端内存&#xff08;Session对象&#xff…

安全技术和防火墙(iptables)

安全技术 入侵检测系统&#xff1a;特点是不阻断网络访问&#xff0c;主要是提供报警和事后监督&#xff0c;不主动介入&#xff0c;类似于监控。 入侵防御系统&#xff1a;透明模式工作&#xff0c;对数据包&#xff0c;网络监控&#xff0c;服务攻击&#xff0c;木马&#…

【数据结构】(C语言):栈

栈&#xff1a; 线性的集合。后进先出&#xff08;LIFO&#xff0c;last in first out&#xff09;。两个指针&#xff1a;指向栈顶和栈底。栈顶指向最后进入且第一个出去的元素。栈底指向第一个进入且最后一个出去的元素。两个操作&#xff1a;入栈&#xff08;往栈尾添加元素…

力扣最新详解5道题:两数之和三数之和四数之和

目录 一、查找总价格为目标值的两个商品 题目 题解 方法一&#xff1a;暴力枚举 方法二&#xff1a;对撞指针 二、两数之和 题目 题解 方法一&#xff1a;暴力枚举 方法二&#xff1a;哈希表法 三、三数之和 题目 题解 方法一&#xff1a;排序暴力枚举set去重 …

C++ | Leetcode C++题解之第200题岛屿数量

题目&#xff1a; 题解&#xff1a; class Solution { private:void dfs(vector<vector<char>>& grid, int r, int c) {int nr grid.size();int nc grid[0].size();grid[r][c] 0;if (r - 1 > 0 && grid[r-1][c] 1) dfs(grid, r - 1, c);if (r …

智能革新:AI写作工具如何重塑论文生成的艺术

在学术探索的征途中&#xff0c;AI论文工具本应是助力前行的风帆&#xff0c;而非让人陷入困境的漩涡。我完全理解大家在面对论文压力的同时&#xff0c;遭遇不靠谱AI工具的沮丧与无奈。毕竟&#xff0c;时间可以被浪费&#xff0c;但金钱和信任却不可轻弃。 作为一名资深的AI…

解锁数据资产的无限潜能:深入探索创新的数据分析技术,挖掘其在实际应用场景中的广阔价值,助力企业发掘数据背后的深层信息,实现业务的持续增长与创新

目录 一、引言 二、创新数据分析技术的发展 1、大数据分析技术 2、人工智能与机器学习 3、可视化分析技术 三、创新数据分析技术在实际应用场景中的价值 1、市场洞察与竞争分析 2、客户细分与个性化营销 3、业务流程优化与风险管理 4、产品创新与研发 四、案例分析 …

Redis 缓存一致性

Redis 业务结构 流程图 缓存一致性 Redis 和 MySQL 中数据保持一致 双检加锁策略 主要用于解决多线程环境下的并发问题&#xff0c;确保在高并发场景下对共享资源的访问是互斥的&#xff0c;避免因竞争条件导致的不一致状态 public User findUserById(Integer id) {User user …

使用新H5标签dialog,实现点击按钮显示分享链接弹出层交互功能

使用新H5标签&#xff0c;实现点击按钮显示分享链接弹出层交互功能 在现代网页开发中&#xff0c;使用新技术和标签来提升用户体验是非常重要的。今天&#xff0c;我们就来聊聊如何利用HTML5的<dialog>标签来实现一个简洁实用的分享链接功能。 在过去&#xff0c;我们通常…

简单的springboot整合activiti5.22.0

简单的springboot整合activiti5.22.0 1. 需求 我们公司原本的流程服务是本地workflow模块以及一个远程的webService对应的activiti服务&#xff0c;其中activiti版本为5.22.0&#xff0c;之前想将activiiti5.22.0进行升级&#xff0c;选择了camunda&#xff0c;也对项目进行了…

《梦醒蝶飞:释放Excel函数与公式的力量》6.1 DATE函数

6.1 DATE函数 第一节&#xff1a;DATE函数 1&#xff09;DATE函数概述 DATE函数是Excel中的一个内置函数&#xff0c;用于根据指定的年、月、日返回对应的日期序列号。这个函数非常有用&#xff0c;尤其是在处理日期数据时&#xff0c;它可以帮助你构建特定的日期&#xff0…

20-OWASP top10--XXS跨站脚本攻击

目录 什么是xxs&#xff1f; XSS漏洞出现的原因 XSS分类 反射型XSS 储存型XSS DOM型 XSS XSS漏洞复现 XSS的危害或能做什么&#xff1f; 劫持用户cookie 钓鱼登录 XSS获取键盘记录 同源策略 &#xff08;1&#xff09;什么是跨域 &#xff08;2&#xff09;同源策略…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《计及氢储能与需求响应的路域综合能源系统规划方法》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

在数据库领域是如何实现“多租户”的呢?

数据库多租技术介绍 随着云计算时代的到来&#xff0c;多租户的概念也逐渐广为人知。“多租户”使得租户之间可以共享物理资源&#xff0c;能够帮助用户节约硬件成本和运维成本&#xff0c;提高资源利用效率。同时&#xff0c;在实现的过程中&#xff0c;考虑到共享带来的安全…

【单片机毕业设计选题24031】-基于STM32的智能手环设计

系统功能: 使用12864OLED液晶屏显示当前的步数&#xff0c;温度值&#xff0c;心率和报警值&#xff0c;单位是心率/分钟设置步长&#xff0c;测量里程&#xff1b;可以设置温度心率的上下限报警值&#xff0c;设置、加、减&#xff1b;用红外传感器XL01实现心率的测量&#x…

华为云x86架构下部署mysql

华为云x86架构下部署mysql 1. 配置X86架构ESC2. 查看本系统中有没有安装mariadb相关的组件&#xff0c;有则卸载3. 安装mysql4. 启动mysql5. 登录MySQL&#xff0c;修改密码&#xff0c;开放访问权限 1. 配置X86架构ESC 2. 查看本系统中有没有安装mariadb相关的组件&#xff0c…

拥抱数字化未来,如何以费控驱动业务发展?

管理费用是企业运营中仅次于人力成本的第二大可控成本&#xff0c;一般会占到企业年度收入的5%—10%&#xff0c;但多数企业存在费用疏于管理、费用管理制度流于纸面难落地、费用浪费严重等问题。 如果不进行科学管理&#xff0c;有专家表示&#xff0c;估计企业每年至少有10%的…