java实现大气污染排放传输路径模拟(iClientOpenlayer前端渲染)

news2024/11/17 17:33:46

开头先看下模拟实现效果图

一、技术应用及背景说明

了解大气污染传输路径模拟可以帮助我们更好地了解空气污染的来源和传播方式,从而采取更有效的控制措施。这种模拟技术可以根据大气环境和气象条件,模拟出污染物在大气中的传播路径和影响范围,提供科学依据来指导环保政策制定和实施。

利用科技手段来探究大气污染的传输路径是一项重要的研究工作。通过模拟分析,我们可以更全面地了解污染物在空气中的流动情况,为环境保护和治理提供有力支持。

在现代社会中,空气污染已经成为了一个普遍存在的问题。尽管这是一个复杂的问题,但是我们可以采用各种手段来减少大气污染的影响,比如提高环保意识、使用清洁能源、建设绿色城市等。

除了我们个人和企业的努力,科技也可以帮助我们更好地理解和应对大气污染。例如,大气污染传输路径模拟技术可以帮助我们了解污染物在大气中的传播规律和来源,并制定相应的治理措施。这种技术的应用不仅可以提高我们的环境治理能力,也可以为科学家提供数据和信息,促进环境科学研究的发展。

同时,大气污染传输路径模拟技术的应用也需要政府的支持和监管。政府可以制定更加严格的环保法规和标准,规范企业的生产行为,减少大气污染物的排放。此外,政府还可以通过资金投入和科技支持,推动环境科学研究和技术创新,为环境治理提供更多的手段和资源。

二大气污染排放场景

污染排放

三、技术实现

1、风场数据抓取可参照

风场数据抓取程序实现(java+python实现)_兴诚的博客-CSDN博客

2、Java接口代码编写实现

//http://localhost:8945/api/TrajectoryTracking/TrajectoryTrackingForward?lon=126&lat=45
@ApiOperation(value = "TrajectoryTracking")
@GetMapping(value = "/TrajectoryTrackingForward")
public String TrajectoryTrackingForward(double lon,double lat) {
    JSONArray datalist = JSON.parseArray(HttpUtils.sendGet("http://localhost:8213/wind/windresult/20230412/2023041202.json",""));
    String geoStr = InterpolationTraceUtils.calForwardPoints(lon,lat,datalist);
    return geoStr;
}

3、iClientOpenlayer实现可视化代码部分代码配置

<template>
  <div class="layerPanel">
    <div v-if="isPanelShow" class="layerPanel-content">
      <el-container>
        <el-header style="height: 30px">大气污染传输轨迹模拟计算</el-header>
        <el-main>
          <div>
            <div style="margin: 3px">
              <span>起点坐标:</span>
              <el-input v-model= 'startLonLat' style="width: 90%;" clearable></el-input>
            </div>
            <div style="margin: 3px">
              <span>模拟计算:</span>
              <el-button type="primary" round @click="simulationCalculate">计算</el-button>
            </div>
          </div>
        </el-main>
      </el-container>
    </div>
    <div class="layer-collapse" @click="layersPanelCollapse">
      <i class="layerlist"></i>
    </div>
  </div>
</template>

<script>
export default {
  data () {
    return {
      layers: 11,
      isPanelShow: false,
      clayersInfo: [],
      opacityValue: 100,
      dh: 40,
      dz: 60,
      u: 3,
      q: 300000,
      gRows: 25,
      gColums: 50,
      gScale: 8,
      windOptions: [{
        value: '0',
        label: '北风'
      }, {
        value: '45',
        label: '东北风'
      }, {
        value: '90',
        label: '东风'
      }, {
        value: '135',
        label: '东南风'
      }, {
        value: '180',
        label: '南风'
      },{
        value: '225',
        label: '西南风'
      }, {
        value: '270',
        label: '西风'
      }, {
        value: '315',
        label: '西北风'
      }],
      windValue: '225',
      airStableOptions: [{
        value: 'A',
        label: '强不稳定'
      }, {
        value: 'B',
        label: '不稳定'
      }, {
        value: 'C',
        label: '弱不稳定'
      }, {
        value: 'D',
        label: '中性'
      }, {
        value: 'E',
        label: '较稳定'
      },{
        value: 'F',
        label: '稳定'
      }],
      airStableValue: 'F'
    }
  },
  mounted () {

  },
  methods: {
    layersPanelCollapse () {
      this.isPanelShow = !this.isPanelShow
    },
    simulationCalculate(){
      this.$emit("GaussPlumeSimulation", this.windValue,this.dz,this.dh,this.u,this.q,this.startLonLat.split(',')[0], this.startLonLat.split(',')[1],this.gColums,this.gRows,this.gScale,this.airStableValue)
    },
    locationToItem () {
      this.$emit("zoomToC", this.startLonLat.split(',')[0], this.startLonLat.split(',')[1], 14.2)
    }
  },
  props: {
    startLonLat: Object
  }
}
</script>

<style lang="less" scoped>
@import "./assets/css/index";
</style>
<template>
  <div>
    <div id="map" style="width: 100%;">
      <popHover :popHoverInfo="popHoverInfo" :popHoverScreenPoint="popHoverScreenPoint" :popHoverVisible="popHoverVisible"></popHover>
      <popClick :popAspect="popAspect" :popClickScreenPoint="popClickScreenPoint" :popClickVisible="popClickVisible" :popClickTitleInfo="popClickTitleInfo" :popClickContentInfo="popClickContentInfo"></popClick>
    </div>
    <div id="gisToolPopoup">
      <GisTool :sMap="smap" @tdtSwitchBase="tdtSwitchBase"></GisTool>
    </div>
    <div id="layersPanel">
      <layerPanel :layersInfo="layersInfo" @setLayerVisible="setLayerVisible" @setLayerOpacity="setLayerOpacity" @zoomToC="zoomToC"></layerPanel>
    </div>
    <div id="GaussPlumeCalculate">
      <GaussPlumePanel :startLonLat="startLonLat" @zoomToC="zoomToC" @GaussPlumeSimulation="GaussPlumeSimulation"></GaussPlumePanel>
    </div>
  </div>
</template>
<script>
import GisTool from './gisTool'
import layerPanel from './widgets/layerPanel/index'
import GaussPlumePanel from './widgets/GaussPlumePanel/index'
import Map from 'ol/Map'
import View from 'ol/View'
import * as control from 'ol/control'
// import { Logo,ScaleLine } from '@supermap/iclient-ol'
import {Logo} from '@supermap/iclient-ol/control/Logo'
import {ScaleLine} from '@supermap/iclient-ol/control/ScaleLine'
import {iCOLMapConfig} from './Store/iCOLMapConfig'
import {layersInfo} from './LayersInfo/LayersInfo'
import {layerMsgClick} from './layerMsg/LayerMsgClick'
import {layerMsgMouseOver} from './layerMsg/LayerMsgMouseOver'
import popHover from './widgets/popHover/index'
import popClick from './widgets/popClick/index'
import {WindyUtil} from './gisUtils/WindyUtil.js'
import {
  initTdtBaseMap,
  CommonCreateLayers,
  getLayerByCode,
  tdtSwitchBase,
  MapMouseoverEvent,
  MapClick,
  addElementToMap,
  getGeojsonByLayerCode,
  setLayersVisible,
  setLayersVisibleByCode,
  zoomC,
  commonRefreshVectorGeojsonLayer,
  CommonCreateVectorLayerGroup,
  refreshCv, CommonRemoveLayers, commonCreatePoint
} from './MapCommon'
import $ from 'jquery'
import {windData} from './data/windData'
import {LayersRenderSet} from "@/components/iClientOpenLayers/RendersInfo/LayersRenderSet";
let icolMap,_this
export default {
  components: {
    GisTool,
    layerPanel,
    GaussPlumePanel,
    popHover,
    popClick
  },
  name: 'iCOLMapCommon',
  data () {
    return {
      smap: null,
      startLonLat: '115.76745223366264,34.40937666512325',
      layersInfo: layersInfo,
      baseLayerArr:[],
      popHoverScreenPoint: {x: null, y: null},
      popHoverInfo: '',
      popHoverVisible: false,
      popClickScreenPoint: {x: null, y: null},
      popAspect: {cWidth: 600, cHeight: 400},
      popClickPoint: null,
      windyUtil: null,
      popClickTitleInfo: '',
      popClickContentInfo: '',
      popClickVisible: false,
    }
  },
  methods: {
    initMap: function () {
      $('#map').css('height', window.innerHeight)
      icolMap = new Map({
        target: 'map',
        controls: control.defaults({attributionOptions: {collapsed: true}})
            .extend([new Logo()]),
        view: new View({
          center: iCOLMapConfig.defaultMapViewCenter,
          zoom: iCOLMapConfig.defaultMapViewLevel,
          minZoom: iCOLMapConfig.minZoom,
          maxZoom: iCOLMapConfig.maxZoom,
          projection: iCOLMapConfig.projection,
          multiWorld: true
        })
      })
      this.smap = icolMap
      initTdtBaseMap(icolMap)
      icolMap.addControl(new ScaleLine())
      CommonCreateLayers(icolMap, layersInfo,_this)
      tdtSwitchBase(icolMap, 'img', true)
      // let windyUtil = new WindyUtil(this.smap)
      // windyUtil.addWindyLayer(windData)
      // windyUtil.clearWindyLayer()
      // debugger
      // var detail=windyUtil.getWindyDetail([103,45])

      let source = getLayerByCode(icolMap, 'CRegion').getSource()
      let vector = getLayerByCode(icolMap, 'CRegion')
      source.layer = vector
      // icolMap.addLayer(vector);
      // console.log(new Modify({source: source}))
      // let modify = new Modify({source: source})
      // icolMap.addInteraction(modify);
      let displayFeatureInfo = function (coordinate) {
        let pixel = icolMap.getPixelFromCoordinate(coordinate)
        console.log('longitude: ' + icolMap.getView().getCenter()[0].toString() + ', latitude: '+ icolMap.getView().getCenter()[1].toString() + ', level: '+ icolMap.getView().getZoom().toString())

        // var details = windyUtil.getWindyDetail(coordinate);
        // console.log(details);
        // alert(' 风向:' + details.direction + '\n 风级:' + details.level + '\n 风速:' + details.speed)
        let features = {length: 0}
        icolMap.forEachFeatureAtPixel(pixel, function (feature, layer) {
          if (layer == null){
            return
          }
          // debugger
          features.length = features.length + 1
          let code = layer.get('code')
          let obj = features[code]
          if (!obj) {
            obj = []
          }
          obj.push(feature)

          features[code] = obj
        })
        //console.log(features.length);

        let laysers = Object.keys(features)
        if (laysers.length > 1) {
          features[laysers[1]][0]["code"] = laysers[1]
          MapClick(_this,layerMsgClick,features[laysers[1]][0], laysers[1])
          if (layersInfo[laysers[1]].CustomPopupTemplate) {
            _this.popHoverVisible = false
            _this.popClickTitleInfo = features[laysers[1]][0].values_.values_[layersInfo[laysers[1]].CustomPopupTemplate.titleField]
            _this.popClickContentInfo = layersInfo[laysers[1]].CustomPopupTemplate.content
            let attrs = Object.keys(features[laysers[1]][0].values_.values_)
            for (let i = 0; i < attrs.length; i++) {
              _this.popClickContentInfo = _this.popClickContentInfo.replaceAll('{' + attrs[i] + '}', features[laysers[1]][0].values_.values_[attrs[i]])
            }
            _this.popAspect.cWidth = layersInfo[laysers[1]].CustomPopupTemplate.width
            _this.popAspect.cHeight = layersInfo[laysers[1]].CustomPopupTemplate.height
            _this.popClickVisible = true
          }
        }
        return features.length > 0
      }
      let displayFeatureInfoOver = function (coordinate) {
        let pixel = icolMap.getPixelFromCoordinate(coordinate)
        let features = {length: 0}
        icolMap.forEachFeatureAtPixel(pixel, function (feature, layer) {
          if (layer == null){
            return
          }
          features.length = features.length + 1
          let code = layer.get('code')
          let obj = features[code]
          if (!obj) {
            obj = []
          }
          obj.push(feature)

          features[code] = obj
        })
        //console.log(features.length);

        let laysers = Object.keys(features)
        if (laysers.length > 1) {
          features[laysers[1]][0]["code"] = laysers[1]
          features[laysers[1]][0]["pixel"] = pixel
          MapMouseoverEvent(_this,layerMsgMouseOver,features[laysers[1]][0], laysers[1])
          if (layersInfo[laysers[1]] && layersInfo[laysers[1]].floatLabelInfo) {
            _this.popHoverScreenPoint.x = pixel[0] + layersInfo[laysers[1]].floatLabelInfo.offsetX
            _this.popHoverScreenPoint.y = pixel[1] + layersInfo[laysers[1]].floatLabelInfo.offsetY
            _this.popHoverInfo = features[laysers[1]][0].values_.values_[layersInfo[laysers[1]].floatLabelInfo.floatLabelField]
            _this.popHoverVisible = true
          } else {
            _this.popHoverVisible = false
          }
        } else {
          _this.popHoverVisible = false
        }
        return features.length > 0
      }

      /**
       * Add a click handler to the map to render the popup.
       */
      icolMap.on('click', function (evt) {
        // let geojson=getGeojsonByLayerCode(icolMap,'Measure')

        // if (evt.dragging) {
        //     //处于多边形查询工具操作下
        //     return;
        // }
        let coordinate = evt.coordinate
        _this.startLonLat = evt.coordinate[0]+','+evt.coordinate[1]
        commonCreatePoint(icolMap,layersInfo,"LS",LayersRenderSet,[{id:1,lon:evt.coordinate[0],lat:evt.coordinate[1]}],"lon","lat")
        // var details = _this.getWindyDetail(coordinate);
        // console.log(details);
        // alert(' 风向:' + details.direction + '\n 风级:' + details.level + '\n 风速:' + details.speed);
        //console.log(coordinate);
        //点击事件
        if (displayFeatureInfo(coordinate)) {
          return
        }
      })
      icolMap.on('dblclick', function (evt) {
        // if (evt.dragging) {
        //     //处于多边形查询工具操作下
        //     return;
        // }
      })
      icolMap.on('moveend', function (evt) {
        //缩放等级控制解析器
        let laysers = Object.keys(layersInfo);
        let cZoom = icolMap.getView().getZoom()
        for (let i = 0; i < laysers.length; i++) {
          if (layersInfo[laysers[i]].sourceType === "Overlay" && layersInfo[laysers[i]].visible == true ) {
            if(layersInfo[laysers[i]].minZoom < cZoom && cZoom <= layersInfo[laysers[i]].maxZoom){
              _this.setLayerVisibleOverly(laysers[i],true)
            }else {
              _this.setLayerVisibleOverly(laysers[i],false)
            }
          }
          if((layersInfo[laysers[i]].isGroupLayer||false == true)&&layersInfo[laysers[i]].visible == true) {
            if(layersInfo[laysers[i]].minZoom < cZoom && cZoom <= layersInfo[laysers[i]].maxZoom && layersInfo[laysers[i]].outRes.length>0) {
              refreshCv(layersInfo[laysers[i]].outRes,icolMap,layersInfo,laysers[i])
            }
          }
        }


        // var pixel = icolMap.getPixelFromCoordinate([115.783878,34.308761])
      })
      icolMap.on('pointermove', function (evt) {
        if (evt.dragging) {
          return
        }
        let coordinate = evt.coordinate
        displayFeatureInfoOver(coordinate)
      })
      // let el = document.createElement('div')
      // el.innerHTML = "<span style='color: red;font-size: larger;font-weight: bold'>gis创造美好未来</span>"
      // addElementToMap(this.smap,el,115.783878,34.308761,'popoupid')
      // let echartsLayerUtil = new EchartsLayerUtil(this.smap)
      // echartsLayerUtil.createTransferLayer(transferData,'code','entName')
      // let info = new control.Control({element: document.getElementById('popup')})
      // info.setMap(icolMap)
      // icolMap.addControl(info)

      // debugger
    },
    tdtSwitchBase (type, isLabel) {
      tdtSwitchBase(this.smap,type,isLabel)
    },
    refreshXZQH(regionCode){
      commonRefreshVectorGeojsonLayer('/image/duoyuanronghe/'+regionCode+'/XZQH.json',layersInfo,'XZQHRegion',this.smapm)
    },
    setLayerVisibleOverly (layerId, visible) {
      if(layersInfo[layerId].sourceType == 'Overlay'){
        for(let i = 0; i < layersInfo[layerId].overlays.length; i++){
          layersInfo[layerId].overlays[i].setVisible(visible)
        }
      }
    },
    setLayerVisible (layerId, visible) {
      let _this = this
      // debugger
      // CommonCreateVectorLayerGroup(_this.smap,layersInfo,'point1')
      // setInterval(function () {
      //   debugger
      //   CommonCreateVectorLayerGroup(_this.smap,layersInfo,'point1')
      // },13000)
      if(layersInfo[layerId].sourceType == 'Overlay'){
        for(let i = 0; i < layersInfo[layerId].overlays.length; i++){
          layersInfo[layerId].overlays[i].setVisible(visible)
        }
        // layersInfo[layerId].visible = visible
      }else {
        setLayersVisibleByCode(this.smap, [layerId], visible)
      }
      (layersInfo[layerId]||{}).visible = visible

    },
    setLayerOpacity (layerId, opacity) {
      getLayerByCode(this.smap, layerId).setOpacity(opacity)
    },
    GaussPlumeSimulation(wd,z,h,u,q,lon,lat,colums,rows,scale,airStable){
      let lyifs = {
        geoJsonFeP: {
          layerCode: 'geoJsonFeP',
          isRLayerPanel: true,
          sourceType: 'Vector',
          title: '轨迹点',
          url: '/api/TrajectoryTracking/TrajectoryTrackingForward?lon='+lon+'&lat='+lat,
          dataPath:'',
          floatLabelInfo: {floatLabelField: 'val', offsetX: 8, offsetY: -16},
          geoType: 'geojson',
          maxZoom: Infinity,
          minZoom: -Infinity,
          wrapX: false,
          opacity: 1,
          location: {longitude: 116.11704458402367, latitude: 34.25804927841997, level: 9.808516864898834},
          visible: layersInfo['geoJsonFeP'].visible
        },
      }
      CommonRemoveLayers(icolMap, lyifs)
      CommonCreateLayers(icolMap, lyifs,this)
    },
    zoomToC (x, y, level) {
      zoomC(this.smap, x, y, level, false)
    },
    getGeojsonByLayerCode(layerCode){
      return getGeojsonByLayerCode(this.smap,layerCode)
    }
  },
  updated () {

  },
  mounted () {
    _this = this
    this.initMap()
  }
}
</script>
<style>
@import url('../../../public/static/gis/css/ol.css');
@import url('../../../public/static/css/css/mapoperatestyle.css');
#popup1 {
  position: absolute;
  top: 50px;
  right: 20px;
}
.ol-zoom{
  display: none;
}
#gisToolPopoup{
  position: absolute;
  top: 50px;
  left: 20px;
}
#layersPanel{
  position: absolute;
  top: 50px;
  right: 300px;
}
#GaussPlumeCalculate{
  position: absolute;
  bottom: 20px;
  right: 30px;
}
.ol-attribution{
  display: none;
}
.ol-control-logo{
  display: none;
}
.ol-rotate{
  display: none;
}
.ol-scale-line{
  display: none;
}
</style>

//如果对您有所帮助, 请点赞支持              !

//技术合作交流qq:2401315930     

四、接口调用及geojson数据成果返回

五、前端可视化模拟效果 

         

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

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

相关文章

树的储存结构和表示法_20230506

树的储存结构和表示法 前言 树是一类非常重要的数据结构&#xff0c;它是图和其它更高阶数据的基础&#xff0c;人们对树的储存结构和表示法进行了大量研究&#xff0c;这里介绍三种常见的链表结构来表示树的基本方法。 树的双亲表示法 假设以一组连续空间储存数据的结点&a…

MySQL基础(六)多表查询

多表查询&#xff0c;也称为关联查询&#xff0c;指两个或更多个表一起完成查询操作。 前提条件&#xff1a;这些一起查询的表之间是有关系的&#xff08;一对一、一对多&#xff09;&#xff0c;它们之间一定是有关联字段&#xff0c;这个关联字段可能建立了外键&#xff0c;…

密码学【java】初探究加密方式之非对称加密

文章目录 非对称加密1 常见算法2 生成公钥和私钥3 私钥加密4 私钥加密 公钥解密5 公钥和私钥的保存和读取5.1 **保存公钥和私钥**5.2 读取公钥和私钥 非对称加密 非对称加密算法又称现代加密算法。非对称加密是计算机通信安全的基石&#xff0c;保证了加密数据不会被破解。与对…

argument type mismatch

后端接收前端传来的数据 id&#xff0c;进行批量删除&#xff0c;报错如下&#xff1a; 错误一 removeByIds(ids) com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: java.lang.IllegalArgumentException: argument type mismatch at com.baomidou.mybati…

华为OD机试 - 各位相加(Java)

一、题目描述 给定一个非负整数 num&#xff0c;反复将各个位上的数字相加&#xff0c;直到结果为一位数。 二、思路与算法 各位相加&#xff0c;使用递归&#xff0c;出口是结果的长度等于1。 三、Java算法源码 public static int addDigits(int num) {recursion(num);re…

vs2017如何创建一个asax文件

VS2017无法为网站创建Global.asax文件&#xff0c;导致出现错误WebForms UnobtrusiveValidationMode 需要“jquery”ScriptResourceMapping。 解决方案如下&#xff1a; 勾选要应用的网站&#xff0c;这里我要应用的是ExSite 点击安装&#xff0c;然后点击确定即可。 此时&am…

单片机+PHY芯片+Powerlink协议实现高效数据采集探究(工业总线485和CAN的升级)

CAN总线和RS-485总线作为常用的工业通信总线&#xff0c;在许多工业领域中得到广泛使用。但随着工业应用的不断扩展和网络化的需求增加&#xff0c;它们面临着一些局限性。例如CAN总线虽然具有较高的通信速率和可靠性&#xff0c;但存在节点数量受限、数据传输距离短等问题。而…

Nginx总结

目录 Nginx介绍 Nginx的作用 反向代理 项目架构 实战&#xff1a;访问nginx服务器反向代理到另一台虚拟机上的tomcat服务器 负载均衡 项目架构 实战&#xff1a;访问nginx服务器&#xff0c;是否反向代理到集群中的任意一台tomcat服务器&#xff0c;停止一台tomcat服务器&…

JAVA16新特性

JAVA16新特性 概述 2021年3月16日正式发布,一共更新了17JEP https://openjdk.java.net/projects/jdk/16/ 一 语法层面 1_JEP 397&#xff1a;密封类&#xff08;第二次预览&#xff09; sealed class 第二次预览 通过密封的类和接口来增强Java编程语言,这是新的预览特性,用…

stream的collectors

起因的话&#xff0c;新进公司&#xff0c;看见了一段有意思的代码。 public final class MyCollectors {private MyCollectors() {}static final Set<Collector.Characteristics> CH_ID Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.IDENTITY_F…

开源中国面试准备

dockerFile常见命令 1、FROM 设置要制作的镜像基于哪个镜像&#xff0c;FROM指令必须是整个Dockerfile的第一个指令&#xff0c;如果指定的镜像不存在默认会自动从Docker Hub上下载 2、MAINTAINER 镜像作者的信息&#xff0c;比如名字或邮箱地址 语法&#xff1a;MAINTAINER n…

HTTP第三讲——四层模型、七层模型

四层模型 TCP/IP 协议&#xff0c;它是 HTTP 协议的下层协议&#xff0c;负责具体的数据传输 工作。TCP/IP 协议是一个“有层次的协议栈”。 TCP/IP 当初的设计者真的是非常聪明&#xff0c;创造性地提出了“分层”的概念&#xff0c;把复杂的网络通信划分出多个层次&#xff…

免费矢量图标网站有哪些?

图标作为UI设计的必要元素&#xff0c;矢量图标是质量的保证。据说完美的用户体验应该从灵活性开始 。在响应设计盛行的当下&#xff0c;灵活矢量图标的重要性不言而喻。在这种情况下&#xff0c;风格齐全、质量上乘的矢量图标网站堪称设计宝藏。在这篇文章中&#xff0c;我们…

基于springboot的医院信管系统

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&…

读书笔记--数据治理之法

继续延续上一篇文章&#xff0c;对数据治理之法进行学习。数据治理之法是战术层面的方法&#xff0c;是一套涵盖8项举措的数据治理实施方法论&#xff0c;包括梳理现状与确定目标、能力成熟度评估、治理路线图规划、保障体系建设、技术体系建设、治理策略执行与监控、绩效考核与…

c++学习:STL之string类初识

目录 1.关于STL 1.什么是STL 2.STL的六的组件 2.关于string类的学习 1.为何学习string类 2.何为string类 3.string类对象的构造 4.容量操作 5.元素访问的操作 6.迭代器&#xff08;Iterators&#xff09; 7.修改类的操作 8.字符串操作 1.关于STL 1.什么是STL STL&a…

理解多态的实现原理

目录 概念&#xff1a; 特例&#xff1a; 协变&#xff1a; final&#xff1a; override: 抽象类、纯虚函数&#xff1a; 查表&#xff1a; 动态绑定&#xff1a; 概念&#xff1a; 就是多个不同的对象&#xff0c;在完成某种相同动作时&#xff0c;会产生多种不同的状态…

佩戴更舒适的骨传导耳机,音质也很出色,南卡 NEO体验

现在天气越来越好&#xff0c;特别适合户外运动&#xff0c;很多人跑步健身时都喜欢戴上一副骨传导耳机&#xff0c;听音乐的同时&#xff0c;还可以随时留意周围的交通状况。在国产的骨传导耳机里面&#xff0c;南卡是很受欢迎的一个品牌&#xff0c;而且旗下产品非常丰富&…

基于Redis优化验证码登录流程, 解决登录状态刷新问题

文章目录 1 问题: 多台Tomcat间session共享问题2 Redis代替session的业务流程分析2.1 设计key的结构2.2 设计Key的具体细节2.3 整体访问流程 3 基于Redis实现短信登录4 解决状态登录刷新问题4.1 初始方案问题4.2 优化方案4.3 代码 1 问题: 多台Tomcat间session共享问题 书接上…

Linux 内存分配/内存管理 相关接口

Linux 内存分配/内存管理 相关接口 分配栈内存alloca() 分配堆内存直接分配malloc() 分配初始化空间calloc() 分配对齐空间posix_memalign()aligned_alloc()过时&#xff1a;memalign()过时&#xff1a;valloc()过时&#xff1a;pvalloc() 修改块的大小realloc()reallocarray()…