时态图根据时间轴动态播放热力图

news2024/9/21 0:42:09

效果图如下:

<!DOCTYPE html>
<html>
  <head>
    <title>时态图</title>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />

    <!-- 引入样式 -->
    <!-- <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css"> -->
    <link rel="stylesheet" href="../../lib/element-ui@2.13.0/index.css" />
    <style>
      html,
      body,
      #map {
        height: 100%;
        padding: 0;
        margin: 0;
      }

      .timeslider {
        position: absolute;
        z-index: 999;
        width: 100%;
        height: 100px;
        background: lightseagreen;
        bottom: 0px;
        display: flex;
        align-items: center;
        justify-content: center;
      }

      .block {
        width: 80%;
        display: flex;
      }

      .block .icon {
        display: flex;
        align-items: center;
        color: rgb(64, 158, 255);
        justify-content: center;
        width: 100px;
        cursor: pointer;
      }

      .block .timestool {
        flex: 1;
      }

      .timeslider .slider-demo-block {
        display: flex;
        align-items: center;
      }

      .slider-demo-block .el-slider {
        margin-top: 0;
        margin-left: 12px;
      }

      .el-slider__marks-text {
        position: absolute;
        -webkit-transform: translateX(-50%);
        transform: translateX(-50%);
        font-size: 14px;
        color: #fff;
        margin-top: 15px;
      }

      .icon:hover {
        color: #66b1ff;
      }

      .el-slider__marks :last-child {
        right: -60px;
      }
    </style>
    <script src="../../lib/vue@2.6.11/vue.js"></script>
    <!-- <script src="https://unpkg.com/vue@2.6.11/dist/vue.js"></script> -->
    <!-- 引入组件库 -->
    <!-- <script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script> -->
    <script src="../../lib/element-ui@2.13.0/index.js"></script>
    <script src="../../js/prjconfig.js" maptype="leaflet"></script>
    <!-- 引入插件 -->
    <script src="../../lib/leaflet/plugins/leaflet.polylineDecorator.js"></script>
    <script src="../../lib/leaflet/plugins/Leaflet.AnimatedMarker.js"></script>
  </head>

  <body>
    <div id="map"></div>
    <div id="app" class="timeslider">
      <div class="block">
        <div v-if="show" class="icon">
          <i
            class="icon el-icon-video-play"
            style="font-size: 32px"
            @click="playChange('stop')"
          ></i>
        </div>
        <div v-if="!show" class="icon">
          <i
            class="icon el-icon-video-pause"
            style="font-size: 32px"
            @click="playChange('play')"
          ></i>
        </div>
        <div class="icon">
          <i
            class="icon el-icon-arrow-left"
            style="font-size: 32px"
            @click="prevStep()"
          ></i>
        </div>
        <div class="timestool">
          <el-slider
            v-model="currIndex"
            :max="maxIndex"
            :step="10"
            :marks="marks"
            :show-tooltip="false"
            @change="change"
          >
          </el-slider>
        </div>
        <div class="icon">
          <i
            class="icon el-icon-arrow-right"
            style="font-size: 32px"
            @click="nextStep()"
          ></i>
        </div>
      </div>
    </div>
    <script>
      //'http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetPurplishBlue/MapServer/tile/{z}/{y}/{x}'
      var map = L.map("map", {
        crs: L.CRS.EPSG4326, //L.CRS.EPSG3857
        center: [MAPINIT.Location.lat, MAPINIT.Location.lon], //[40.76339, 106.9477844],
        zoom: MAPINIT.Location.zoom,
        minZoom: MAPINIT.zoomsExtent[0],
        maxZoom: MAPINIT.zoomsExtent[1],
        zoomControl: true,
      });
      // 使用WMTS Key-Value加载地图服务
      let _getc =
        "http://192.168.1.212:8095/server/default/getTile/wmts?request=GetCapabilities&service=wmts&layer=yx";
      MAPCONFIG.MAPWMTS_IMG =
        "http://192.168.1.212:8095/server/vtile/getTile/wmts";
      let ls =
        "http://192.168.1.212:8095/server/vtile/getTile/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=yx&STYLE=default&TILEMATRIXSET=w&FORMAT=image/png&TILEMATRIX={z}&TILECOL={x}&TILEROW={y}&tk=''";
      L.tileLayer(ls, {
        zoomOffset: 1,
      }).addTo(map);
      map.setView(L.latLng(37.550339, 104.114129), 4); //设置缩放级别及中心点

      var heatmapLayer;
      // 初始化热力图
      function initHeatMap(data, cfg) {
        heatmapLayer = new HeatmapOverlay(cfg);
        heatmapLayer.addTo(map);
        heatmapLayer.setData(data);
      }

      function clear() {
        map.removeLayer(heatmapLayer);
      }

      let app = new Vue({
        el: "#app",
        data: {
          message: "Hello Vue!",
          // 数据
          testData: {
            max: 8,
            data: [
              {
                lat: 36.793094 + Math.random(),
                lng: 118.054241 + Math.random(),
                count: 8,
              },
              {
                lat: 36.405841 + Math.random(),
                lng: 118.159911 + Math.random(),
                count: 5,
              },
              {
                lat: 36.215321 + Math.random(),
                lng: 118.17456 + Math.random(),
                count: 9,
              },
              {
                lat: 36.527985 + Math.random(),
                lng: 118.400512 + Math.random(),
                count: 8,
              },
              {
                lat: 36.512117 + Math.random(),
                lng: 118.401366 + Math.random(),
                count: 7,
              },
              {
                lat: 36.332074 + Math.random(),
                lng: 118.360107 + Math.random(),
                count: 6,
              },
              {
                lat: 36.244085 + Math.random(),
                lng: 118.595214 + Math.random(),
                count: 7,
              },
            ],
          },
          // 配置
          cfg: {
            radius: 0.5, //设置每一个热力点的半径
            maxOpacity: 0.9, //设置最大的不透明度
            // minOpacity: 0.3,     //设置最小的不透明度
            scaleRadius: true, //设置热力点是否平滑过渡
            blur: 0.95, //系数越高,渐变越平滑,默认是0.85,
            //滤镜系数将应用于所有热点数据
            useLocalExtrema: true, //使用局部极值
            latField: "lat", //纬度
            lngField: "lng", //经度
            valueField: "count", //热力点的值

            gradient: {
              0.99: "rgba(255,0,0,1)",
              0.9: "rgba(255,255,0,1)",
              0.8: "rgba(0,255,0,1)",
              0.5: "rgba(0,255,255,1)",
              0: "rgba(0,0,255,1)",
            },
          },
          currIndex: 0,
          maxIndex: 50,
          show: true,
          curPage: 3,
          curMonth: "",
          marks: {
            0: "2023-01",
            10: "2023-02",
            20: "2023-03",
            30: "2023-04",
            40: "2023-05",
            50: "2023-06",
          },
        },
        mounted() {
          // console.log([119.23 + Math.random(), 30.14 + Math.random()]);
          this.getCurrentMonth();
          this.getBeforeMonth();
          initHeatMap(this.testData, this.cfg);
        },
        watch: {
          // watch第一次绑定值的时候不会执行监听,修改数据才会触发函数
          currIndex(newVal, oldVal) {
            console.log(newVal);
            let step = newVal.toString();
            if (Object.keys(this.marks).indexOf(step) > -1) {
              // console.log(this.marks[step], 222);
              // 先清除原来的
              clear();
              let data = {
                max: 8,
                data: [
                  {
                    lat: 36.60976 + Math.random(),
                    lng: 117.067686 + Math.random(),
                    count: 8,
                  },
                  {
                    lat: 36.60976 + Math.random(),
                    lng: 117.067686 + Math.random(),
                    count: 5,
                  },
                  {
                    lat: 36.60976 + Math.random(),
                    lng: 117.067686 + Math.random(),
                    count: 9,
                  },
                  {
                    lat: 36.60976 + Math.random(),
                    lng: 117.067686 + Math.random(),
                    count: 8,
                  },
                ],
              };
              initHeatMap(data, this.cfg);
            }
          },
        },
        methods: {
          change(e) {
            let step = e.toString();
            // console.log(Object.keys(this.marks));
            if (Object.keys(this.marks).indexOf(step) > -1) {
              console.log(this.marks[step]);
            }
            // console.log(this.currIndex);
          },
          // 获取当前月份
          getCurrentMonth() {
            let data = new Date();
            let year = data.getFullYear();
            // getMonth()返回的数字范围从0到11,因此需要加1来得到正确的月份
            let mth = data.getMonth() + 1;
            let month =
            mth < 10 ? "0" + mth : mth;
            this.curMonth = data.getFullYear() + "-" + month;
          },
          // 获取当月之前半年的月份
          getBeforeMonth() {
            let dataArr = [];
            let data = new Date();
            let year = data.getFullYear();
            data.setMonth(data.getMonth() + 1, 1); //获取到当前月份,设置月份
            for (let i = 0; i < 6; i++) {
              data.setMonth(data.getMonth() - 1); //每次循环一次,月份值减1
              let m = data.getMonth() + 1;
              m = m < 10 ? "0" + m : m;
              dataArr.push(data.getFullYear() + "-" + m);
            }
            let list = dataArr.reverse();
            let obj = {};
            let labelArr = Object.keys(this.marks);
            labelArr.forEach((item, index) => {
              obj[item] = list[index];
            });
            this.marks = obj;
          },
          // 获取指定月之前半年的月份数组
          getBeforeCurMonth(mon) {
            let dataArr = [];
            let data = new Date(mon);
            let year = data.getFullYear();
            data.setMonth(data.getMonth(), 1); //获取到当前月份,设置月份
            for (let i = 0; i < 6; i++) {
              data.setMonth(data.getMonth() - 1); //每次循环一次,月份值减1
              let m = data.getMonth() + 1;
              m = m < 10 ? "0" + m : m;
              dataArr.push(data.getFullYear() + "-" + m);
            }
            let list = dataArr.reverse();
            let obj = {};
            let labelArr = Object.keys(this.marks);
            labelArr.forEach((item, index) => {
              obj[item] = list[index];
            });
            this.marks = obj;
          },
          // 获取指定月份之后半年的月份数组
          getAfterMonth(mon) {
            let dataArr = [];
            let data = new Date(mon);
            let year = data.getFullYear();
            data.setMonth(data.getMonth(), 1); //获取到当前月份,设置月份
            for (let i = 0; i < 6; i++) {
              data.setMonth(data.getMonth() + 1); //每次循环一次,月份值加1
              let m = data.getMonth() + 1;
              m = m < 10 ? "0" + m : m;
              dataArr.push(data.getFullYear() + "-" + m);
            }
            let list = dataArr;
            let obj = {};
            let labelArr = Object.keys(this.marks);
            labelArr.forEach((item, index) => {
              obj[item] = list[index];
            });
            this.marks = obj;
          },
          playChange(val) {
            let that = this;
            let data = new Date();
            let year = data.getFullYear();
            let mth = data.getMonth()+1;
            let month =
            mth < 10 ? "0" + mth : mth;
            var curMonth = data.getFullYear() + "-" + month;
            if (val == "stop") {
              if (that.timer) {
                clearInterval(that.timer);
              }
              that.show = false;
        
              that.timer = setInterval(() => {
                that.currIndex += 10;
                const lastValue = that.marks[that.maxIndex];
                let customM = curMonth.replace("-", "");
                let curMaxIndexM = lastValue.replace("-", "");
                if (that.currIndex > that.maxIndex) {
                  that.currIndex = 0;
                  // that.show = true;
                  // clearInterval(that.timer);

                  // 自动循环播放
                  if (parseInt(curMaxIndexM) < parseInt(customM)) {
                    that.getAfterMonth(lastValue.replace("-", "/"))
                  }
                  if (lastValue == curMonth) {
                    that.show = true;
                    clearInterval(that.timer);
                  }
                }
              }, 3000);
            } else {
              clearInterval(that.timer);
              that.show = true;
            }
          },
          // 往前播放
          prevStep() {
            clearInterval(this.timer);
            this.show = true;
            if (this.currIndex === 0) {
              let curMonth = this.marks[this.currIndex];
              let customM = this.curMonth.replace("-", "/");
              var d = new Date(customM);
              d.setMonth(d.getMonth() - 12);
              let year = d.getFullYear();
              let month =
              d.getMonth() < 10 ? "0" + d.getMonth() : d.getMonth();
              let beforeM = year + "-" + month;
              // console.log(year + "-" + month)
              let curMaxIndexM = curMonth.replace("-", "");
              let customMs = beforeM.replace("-", "");
              if (parseInt(curMaxIndexM) < parseInt(customMs)) {
                return
              } else {
                this.getBeforeCurMonth(curMonth.replace("-", "/"))
              }

            } else {
              this.currIndex -= 10;
            }
          },
          // 往后播放
          nextStep() {
            clearInterval(this.timer);
            this.show = true;
            if (this.currIndex === this.maxIndex) {
              const lastValue = this.marks[this.maxIndex];
              const curMonth = this.marks[this.currIndex];
              // console.log(this.curMonth);
              // console.log(lastValue);
              // console.log(curMonth);

              let customM = this.curMonth.replace("-", "");
              let curMaxIndexM = lastValue.replace("-", "");
              let curM = curMonth.replace("-", "");
              if (parseInt(curMaxIndexM) < parseInt(customM)) {
                this.getAfterMonth(lastValue.replace("-", "/"))
                  this.currIndex = 0;
              } else {
                this.currIndex = this.maxIndex;
              }
            } else {
              this.currIndex += 10;
            }
          },
        },
      });
    </script>
  </body>
</html>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用于 syslog 收集的协议:TCP、UDP、RELP

系统日志是从 Linux/Unix 设备和其他网络设备&#xff08;如交换机、路由器和防火墙&#xff09;生成的日志 可以通过将 syslog 聚合到称为 syslog 服务器、syslog 守护程序或 syslogd 的服务器来集中 syslog。在TCP、UDP和RELP协议的帮助下&#xff0c;系统日志从设备传输到系…

VMware 系列:Vmware Workstation 嵌套 Vmware Vsphere Hypervisor(ESXI)部署后虚拟机无法上网的问题

【背景】 现有日常机器配置结构:NUCmini主机(硬件)->Deepin Linux(物理机操作系统,日常办公用)->Vmware Workstation 16->N多虚拟机 最近Vmware发布了Vsphere Hypervisor 8,也就是我们常说的ESXI 8,想要测试下新的系统,后面把自己的服务器从ESXI 7迁移到ESXI 8…

用HALCON标定助手对相机进行标定

任务要求&#xff1a; 已知相机镜头焦距f为8mm&#xff0c;相机单个CCD像素在水平和竖直两个方向上的尺寸均为3.75微米&#xff0c;相机为普通透光镜头和面阵相机&#xff0c;对相机进行标定&#xff0c;测量相机的内外参数。 操作步骤&#xff1a; 1. 在HALCON中运行gen_ca…

PHP如何持续监听Redis的消息订阅并推送到前端?

PHP如何持续监听Redis的消息订阅并推送到前端&#xff1f; 概述: 在许多Web应用程序中&#xff0c;实时推送消息是很常见的需求。当我们需要向前端实时发送消息时&#xff0c;往往会使用轮询或长轮询的方式去获取最新数据。但这种方式对服务器资源的消耗较大&#xff0c;同时响…

Python实现四个组成不相同且无重复的三位数

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 1.题目&#xff1a;有四个数字&#xff1a;1、2、3、4&#xff0c;能组成多少个互不相同且无重复数字的三位数&#xff1f;各是多少&#xff1f; for i in range(1,…

企业网盘哪家好?值得信赖的品牌推荐

企业网盘可谓是当下热门的企业服务之一&#xff0c;市面上也出现了非常多企业网盘工具。那么&#xff0c;企业网盘哪家好&#xff1f;哪个品牌更值得信赖呢&#xff1f; 企业网盘哪家好&#xff1f; Zoho Workdrive企业网盘一定榜上有名&#xff0c;Zoho Workdrive企业网盘是著…

【Windows 常用工具系列 13 -- Confluence 如何快速输入代码块 code block】

文章目录 Confluence 如何快速输入代码块方法二 Confluence 如何快速输入代码块 在使用使用 confluence 进行文档编辑时&#xff0c;有时需要贴上部分代码&#xff0c;但是直接贴代码在 confluence上&#xff0c;显示效果不是太好看&#xff0c;所以confluence 给我们提供了符…

城市易涝点监测,内涝积水监测仪的作用

近些年城市内涝问题格外突出&#xff0c;市民心中总在担心是不是哪一天自己的家园因为内涝&#xff0c;从而短时间内无法正常生活。并且内涝过后的淤泥可能堆积到路边或者居民住宅区等地&#xff0c;这会影响城市生态环境和公共卫生。 内涝积水监测仪为解决城市内涝问题提供了更…

【Android】声浪 UI 效果并附上详细代码

声浪效果是基于第三方实现的。 https://github.com/xfans/VoiceWaveView 将三方的 Kotlin 代码转 java 使用&#xff08;按照他的readme 进行依赖&#xff0c;好像少了点东西&#xff0c;至少本项目跑不起来&#xff09; 声浪效果在android 8 以上都是比较好的&#xff0c;不会…

prometheus热更新失败failed to reload config

一、问题描述 k8s部署的prometheus服务在请求热更新时报错: failed to reload config: one or more errors occurred while applying the new configuration (--config.file"/etc/prom/config/file/prometheus.yml")请求命令:curl -X POST http://monitor-cp-prom:…

echarts实现如下图功能代码

这里写自定义目录标题 const option {tooltip: {trigger: axis},legend: {left: "-1px",top:15px,type: "scroll",icon:rect,data: [{name:1, textStyle:{color: theme?"#E5EAF3":#303133,fontSize:14}}, {name: 2, textStyle:{color: theme…

【面试HOT300】滑动窗口篇

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于【CodeTopHot300】进行的&#xff0c;每个知识点的修正和深入主要参…

焦炉加热系统简述

烟道吸力 焦炉负压烘炉分烟道的吸力会影响立火道温度&#xff0c;具体影响因素如下&#xff1a; 烟道吸力过大会导致热量被抽走&#xff0c;使立火道温度降低。烟道吸力不足会导致烟气在烘炉内停留时间过长&#xff0c;使热量无法充分利用&#xff0c;也会导致立火道温度降低…

监控摄像头连接NAS,实现监控管理一体化

嗯&#xff1f;你问干嘛要把摄像头连到NAS&#xff1f; 小马给家里安了个监控摄像头 本意是想家里有啥事也能查监控 却没想到这些监控不仅存储回放有限制 要想更多功能还是得多花钱 恰好&#xff0c;我有铁威马NAS 打开Surveillance Manager 轻松搭建网络摄像头管理系统 …

Pytorch中的tensor维度理解

Pytorch中的tensor维度理解 文章目录 Pytorch中的tensor维度理解摘要打消心理恐惧&#xff0c;从三维学起三维tensor参考文献 摘要 面对pytorch编程中的tensor时&#xff0c;我不时会感到恐惧。对里面数据是怎么排布的&#xff0c;一直没有一个直观的理解。今天我想把这个事情…

【Windows 常用工具系列 12 -- win11怎么设置不睡眠熄屏 |win11设置永不睡眠的方法】

文章目录 win11 怎么设置不睡眠熄屏 使用笔记本电脑的时候&#xff0c;如果离开电脑时间稍微长一点就会发现息屏了&#xff0c;下面介绍 设置 Win11 永不睡眠息屏的方法&#xff0c;有需要的朋友们快来看看以下详细的教程。 win11 怎么设置不睡眠熄屏 在电脑桌面上&#xff0c…

Missing file libarclite_iphoneos.a 问题解决方案

问题 在Xcode 运行项目会报以下错误 File not found: /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphoneos.a解决方案 打开URL https://github.com/kamyarelyasi/Libarclite-Files &#xff0c;下载liba…

坚鹏:中国工商银行数字化转型发展现状与成功案例培训圆满结束

中国工商银行围绕“数字生态、数字资产、数字技术、数字基建、数字基因”五维布局&#xff0c;深入推进数字化转型&#xff0c;加快形成体系化、生态化实施路径&#xff0c;促进科技与业务加速融合&#xff0c;以“数字工行”建设推动“GBC”&#xff08;政务、企业、个人&…

【uni-app】uniapp中弹出输入框的示例

uni.showModal({title: 请输入企业名称,content: ,editable: true, //是否显示输入框placeholderText: 请输入企业名称, //输入框提示内容confirmText: 确认,cancelText: 取消,success: (res) > {if (res.confirm) {this.checkDesc.name res.content;// console.log(输入的…