Cesium项目功能实现记录

news2024/11/24 15:26:01

在这里插入图片描述


目录

  • 1 切换二维地图
  • 2 删除默认图层
  • 3 隐藏版权信息
  • 4 加载cesiumlab切片影像出现栅格阴影
  • 5 解决相机控制问题
  • 6 cesium中限制地图浏览范围
  • 7 鼠标移动显示经纬度
  • 8 禁用cesium选取实体操作
    • 8.1 禁用操作
    • 8.2 双击事件改写
    • 8.3 信息隐藏(index.html页面)
  • 9 自定义动画
  • 10 小车轨迹切分
  • 11 label跟随模型
  • 12 自定义label样式
  • 13 轨迹输出坐标点
  • 14 识别实体模型
    • 14.1 识别3D Titles模型
    • 14.2 识别一般实体
  • 15 修改3DTitles高度
  • 16 解决影像拼接黑色锯齿
  • 17 去除cesium默认功能
  • 18 vite全局整合cesium
  • 19 相机定位问题


我将对我在最近与数字孪生项目的对接过程中所实现的一些功能进行总结。这些功能主要涉及到地理信息系统方面的Cesium详细功能设计。具体来说,我在这个项目中实现了一些功能,包括对接不同地图平台和引擎,实现地图数据可视化和交互式控制,以及在Cesium中添加和操作各种地图元素等。

1 切换二维地图

    viewer = new Cesium.Viewer('cesiumContainer', {
        sceneMode: Cesium.SceneMode.SCENE2D,//切换2D
    })

2 删除默认图层

viewer.imageryLayers.removeAll()

3 隐藏版权信息

viewer._cesiumWidget._creditContainer.style.display = "none"

4 加载cesiumlab切片影像出现栅格阴影

原因:未设置切片影像加载区域

// 矩形区域
bestRect= Cesium.Rectangle.fromRadians(
  2.086396706185367,
  0.6039399681488924,
  2.086691132076495,
  0.6042171535375767)
const xinWeiImagery = new Cesium.UrlTemplateImageryProvider({
    url: '',
    rectangle:bestRect
})

5 解决相机控制问题

// 如果为真,则允许用户旋转相机。如果为假,相机将锁定到当前标题。此标志仅适用于2D和3D。
scene.screenSpaceCameraController.enableRotate = false;
// 如果为true,则允许用户平移地图。如果为假,相机将保持锁定在当前位置。此标志仅适用于2D和Columbus视图模式。
scene.screenSpaceCameraController.enableTranslate = false;
// 如果为真,允许用户放大和缩小。如果为假,相机将锁定到距离椭圆体的当前距离
scene.screenSpaceCameraController.enableZoom = false;
// 如果为真,则允许用户倾斜相机。如果为假,相机将锁定到当前标题。这个标志只适用于3D和哥伦布视图。
scene.screenSpaceCameraController.enableTilt = false;

viewer.scene.screenSpaceCameraController.minimumZoomDistance = 80//相机的高度的最小值
viewer.scene.screenSpaceCameraController.maximumZoomDistance = 40000 //相机高度的最大值
// viewer.scene.screenSpaceCameraController._minimumZoomRate = 100 // 设置相机缩小时的速率
// viewer.scene.screenSpaceCameraController._maximumZoomRate = 12000 //设置相机放大时的速率

6 cesium中限制地图浏览范围

概述:鼠标只能在指定地点移动,出界则返回

// 控制鼠标左键移动问题
let setCameraMove = () => {

    viewer.scene.preRender.addEventListener(() => {
        let rectangle = viewer.camera.computeViewRectangle();
       
        //设置可浏览经纬度范围
         let maxRange = { west: 118.30112, north: 35.21500, east: 120.78832, south: 34.26431 };
        //地理坐标(弧度)转经纬度坐标
        // 弧度转为经纬度,west为左(西)侧边界的经度,以下类推
        
        let west = Cesium.Math.toDegrees(rectangle.west).toFixed(5)
        let south = Cesium.Math.toDegrees(rectangle.south).toFixed(5)
        let east = Cesium.Math.toDegrees(rectangle.east).toFixed(5)
        let north = Cesium.Math.toDegrees(rectangle.north).toFixed(5)



        // 119.13933 34.45136 120.02731 34.79189
        //  console.log(rectangle);
        // console.log(west,south,east,north);
        //如果视角超出设置范围则跳转视角
        if (west < maxRange.west || south < maxRange.south  || east > maxRange.east  || north > maxRange.north) {
            setCameraPos()
        }
    })
}

参考文章:cesium中限制地图浏览范围

7 鼠标移动显示经纬度

概述:悬浮框跟随屏幕坐标,将屏幕坐标转为经纬度展示

const showInfoDom = document.querySelector('.show-info')
const handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas)

// 鼠标移动显示经纬度
handler.setInputAction((target) => {

    // console.log(viewer.scene.camera.heading, viewer.scene.camera.pitch, viewer.scene.camera.roll);
    // 鼠标移动终点
    const position = target.endPosition
    // 椭球面
    const ellipsoid = viewer.scene.globe.ellipsoid
    const cartesian = viewer.camera.pickEllipsoid(position, ellipsoid)

    // 只选取地球表面
    if (cartesian && isShowMouseMoveInfo.value) {
        // 空间笛卡尔转换为弧度
        const cartographic = Cesium.Cartographic.fromCartesian(cartesian)
        // 弧度转为经纬度
        const lon = Cesium.Math.toDegrees(cartographic.longitude).toFixed(5)
        const lat = Cesium.Math.toDegrees(cartographic.latitude).toFixed(5)
        const height = cartographic.height;
        // console.log(`经度为:${lon},纬度为:${lat},高度为:${height}`);
        showInfoDom.innerHTML = `经度为:${lon},<br>纬度为:${lat}`
        showInfoDom.style.display = 'block'
        showInfoDom.style.top = `${position.y}px`
        showInfoDom.style.left = `${position.x + 30}px`

    } else {
        showInfoDom.style.display = 'none'
    }
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE)

8 禁用cesium选取实体操作

概述:当我们鼠标双击实体时,cesium默认相机定位并在右侧显示实体的名称

8.1 禁用操作

viewer = new Cesium.Viewer('cesiumContainer', {

    selectionIndicator: false,//双击选中实体
    sceneModePicker: false,
})

8.2 双击事件改写

handler.setInputAction(() => {
     viewer.trackedEntity = undefined
}, Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK)

8.3 信息隐藏(index.html页面)

<style>
  /* 禁止双击事件弹出框 */
  .cesium-viewer-infoBoxContainer{
    display: none;
    /* background-color: rgb(133, 207, 236); */
  }
</style>

9 自定义动画

概述:一般可以用cesium官方的时钟搞,这个我试了一下定时器的效果

// 添加小车模型
let car7
const staticCar = carStore.staticCar
const dynamicCar = carStore.dynamicCar
let loadCarTrail = () => {


    // 加载静态小车
    for (let i = 0; i < staticCar.length; i++){
        viewer.entities.add({
            name: staticCar[i].name,
            position: Cesium.Cartesian3.fromDegrees(staticCar[i].position.lon,staticCar[i].position.lat,staticCar[i].position.height),
            model: {
                uri: 'model/car/CesiumMilkTruck.glb'
            },
            label: {
                text: staticCar[i].name,
                font: "20px sans-serif",
                // showBackground: true,
                distanceDisplayCondition: new Cesium.DistanceDisplayCondition(
                    0,
                    500
                ),
                eyeOffset: new Cesium.Cartesian3(0, 3.5, 0),
            }
        })
    }

    // 加载动态小车
    car7= viewer.entities.add({
        name: dynamicCar.name,
        position: Cesium.Cartesian3.fromDegrees(dynamicCar.position.lon, dynamicCar.position.lat, dynamicCar.position.height),
        model: {
            uri: 'model/car/CesiumMilkTruck.glb',
            scale:2
        },
        label:{
            text: '装载机',
            font: "15px sans-serif",
            // showBackground: true,
            distanceDisplayCondition: new Cesium.DistanceDisplayCondition(
                0,
                500
            ),
            eyeOffset: new Cesium.Cartesian3(0, 6.6, 0),
        }
    })
}
// 车辆开始作业
let timer,i=0
let startDynamicCar = () => {

  // 规律:经度增加10,纬度减小2
  // 经度偏移量0.0005
  setdynamicCarCamera()
  if (!timer) {
    console.log('开始作业!!!');
    let car7Pos = car7.position._value
    let temp
    if (!timer) {
      timer = setInterval(() => {
        temp = Cesium.Cartesian3.fromDegrees(dynamicCar.trail[i].lon, dynamicCar.trail[i].lat,0)
        car7Pos.x = temp.x
        car7Pos.y = temp.y
        car7Pos.z = temp.z


        i++
        if (i >= dynamicCar.trail.length) {
          i = 0
        }
      }, 100);
    }
  }
}

// 车辆结束作业
let endDynamicCar = () => {
  console.log('结束作业!!!');
  clearInterval(timer)
  timer = null
}

10 小车轨迹切分

概述:比如给定任意三个坐标,将相邻的两个坐标中间的点进行切分,这样动画会流畅,下面的代码还没有写完,但思路差不多

// 轨迹切分
let sliceCarTrail = () => {

    const sliceArr = [
        { lon: 119.54520, lat: 34.61526, height: 0 },
        { lon: 119.54750, lat: 34.61496, height: 0 },
        { lon: 119.54980, lat: 34.61462, height: 0 }
    ]
    const startPos = { lon: 119.54520, lat: 34.61525, height: 0 }
    const endPos = { lon: 119.54990, lat: 34.61466, height: 0 }


    const lonNum = 0.00010
    const latNum = 0.00002
    
    
    const num=0.00005
    for (let i = 0; i < sliceArr.length - 1; i++){
        // 计算经纬度切片数量
        const k1 = Math.abs(Math.round((sliceArr[i + 1].lon - sliceArr[i].lon) / lonNum))
        const k2 = Math.abs(Math.round((sliceArr[i + 1].lat - sliceArr[i].lat) / latNum))
        const k = Math.max(k1, k2)

        for (let j = 0; j < k; j++){

            const middlePos = { lon: parseFloat((sliceArr[i].lon + j * lonNum).toFixed(5)), lat: parseFloat((sliceArr[i].lat + j * lonNum).toFixed(5)), height: 0 }
            
            dynamicCar.trail.push(middlePos)
        }
    }
    dynamicCar.trail.push(sliceArr[sliceArr.length - 1])
    console.log(dynamicCar.trail);
}

11 label跟随模型

概述:可以在添加实体模型同时添加label实体

viewer.entities.add({
      name: loaderCar[i].name,
      position: Cesium.Cartesian3.fromDegrees(loaderCar[i].position.lon, loaderCar[i].position.lat, loaderCar[i].position.height),
      model: {
          uri: 'model/car/CesiumMilkTruck.glb'
      },
      label: {
          text: new Cesium.CallbackProperty((result) => {
              let carInfo =`车辆名称:${loaderCar[i].name}\n车辆类型:${loaderCar[i].type}\n工作信息:${loaderCar[i].jobInfo}\n其他信息:${loaderCar[i].other}`

              return carInfo

          }, false),
          font: labelStore.font,
          showBackground: labelStore.showBackground,
          backgroundColor: labelStore.backgroundColor,
          outlineColor: labelStore.outlineColor,
          horizontalOrigin: labelStore.horizontalOrigin,
          verticalOrigin: labelStore.verticalOrigin,
          // pixelOffset: new Cesium.Cartesian2(0,0),
          disableDepthTestDistance: labelStore.disableDepthTestDistance,//被建筑物遮挡问题
          scaleByDistance: labelStore.scaleByDistance,
              distanceDisplayCondition: labelStore.distanceDisplayCondition
      }
  })

12 自定义label样式

概述:一般来说,label实体内置了很多属性,但是样式比较单一,如果想自定义样式可以构造组件

在Cesium中,Label实体的配置项包括:

text:标签中显示的文本内容。

font:标签的字体样式。

pixelOffset:标签相对于实体位置的偏移量。

showBackground:是否显示标签的背景。

backgroundColor:标签背景的颜色。

backgroundPadding:标签背景的内边距。

fillColor:标签文本的填充颜色。

outlineColor:标签文本的轮廓线颜色。

outlineWidth:标签文本的轮廓线宽度。

scale:标签的缩放比例。

verticalOrigin:标签垂直方向的定位方式。

horizontalOrigin:标签水平方向的定位方式。

translucencyByDistance:标签的透明度随距离变化的效果。

pixelOffsetScaleByDistance:标签的偏移量随距离变化的效果。

distanceDisplayCondition:标签的显示距离条件。

这些配置项可以用于创建和修改Cesium中的Label实体。

参考链接:cesium自定义label标签

13 轨迹输出坐标点

概述:需求按照一定的时间间隔逐步输出打印的点,这里有两种方法

  • 先把点实体全部加载到场景(设置为隐藏),通过定时器逐步显示
  • 添加点前延时1s添加,这里用的是第二种
// 开始绘制小车打点轨迹
const points = trailCar[0].points
let drawPointTimer=null
let drawPointTrail = async () => {


  // viewer.camera.
  viewer.camera.setView({
    destination: Cesium.Cartesian3.fromDegrees(119.54876, 34.61479,300), // 设置位置,北京的坐标
    orientation: {
      heading: 0,
      pitch: Cesium.Math.toRadians(-90.0),
      roll: 0
    }
  })
  console.log('开始绘制轨迹!!!');
  isShowPointTrail.value=true
  for (let i = 0; i < points.length; i++) {
    await new Promise(resolve => setTimeout(resolve, 1000)); // 设置延迟,观察效果
    viewer.entities.add({
      position: Cesium.Cartesian3.fromDegrees(points[i].position.lon, points[i].position.lat, points[i].position.height),
      point: {
        color: Cesium.Color.RED,
        outlineColor: Cesium.Color.PINK,
        outlineWidth: 5,
        pixelSize: 20,
        // heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,逐步添加有问题注释掉
        scaleByDistance: new Cesium.NearFarScalar(100, 1, 1000, 0.05)
      },
      label: {
        text: new Cesium.CallbackProperty((result) => {
          let carInfo = `${points[i].time}`

          return carInfo

        }, false),
        showBackground: true,
        font: "12px monospace",
        horizontalOrigin: Cesium.HorizontalOrigin.LEFT,
        verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
        // pixelOffset: new Cesium.Cartesian2(0,0),
        disableDepthTestDistance: Number.POSITIVE_INFINITY,//被建筑物遮挡问题
        scaleByDistance: new Cesium.NearFarScalar(100, 2, 500, 0.1)
      }
    });

  }

}

14 识别实体模型

概述:需要鼠标点击或移动经过实体的时候,识别出来实体并显示信息

14.1 识别3D Titles模型

// 定义一个点击事件
const handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas)
handler.setInputAction(function(movement) {
    const feature = viewer.scene.pick(movement.position);
    if (feature instanceof Cesium.Cesium3DTileFeature) {
        feature.color = Cesium.Color.RED; // 将拾取到的3D tiles颜色修改为红色
    }
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

14.2 识别一般实体

// 鼠标左键弹出选择框
handler.setInputAction((target) => {
    const position= target.position
    // 返回拾取顶端的具有primitive属性的一个对象
    const feature = viewer.scene.pick(position)

    if (feature && feature.id._id === 'test001' && !isShowPointTrail.value) {
            ElMessageBox.confirm(
                '是否显示小车近十分钟轨迹?',
                {
                    confirmButtonText: '确认',
                    cancelButtonText: '取消',
                }
            )
            .then(() => {
            
                drawPointTrail()
                 ElMessage({
                    type: 'success',
                    message: '成功显示',
                })
            })
            .catch(() => {
                ElMessage({
                    type: 'info',
                    message: '取消显示',
                })
            })           
    } 
    
    }, Cesium.ScreenSpaceEventType.LEFT_CLICK)

15 修改3DTitles高度

// 接下来解决模型移动缩放的问题
let changeModel = (tileset, height) => {
    // 显示3D Tiles包围盒
    // tileset.debugShowContentBoundingVolume = true

    const cartographic = Cesium.Cartographic.fromCartesian(
        tileset.boundingSphere.center
    );
    const surface = Cesium.Cartesian3.fromRadians(
        cartographic.longitude,
        cartographic.latitude,
        0.0
    );
    const offset = Cesium.Cartesian3.fromRadians(
        cartographic.longitude,
        cartographic.latitude,
        height
    );
    const translation = Cesium.Cartesian3.subtract(
        offset,
        surface,
        new Cesium.Cartesian3()
    );
    tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
}

16 解决影像拼接黑色锯齿

概述:在大疆智图导出的2D影像,进行多个拼接时,边缘部分出现明显的锯齿痕迹。但是后期通过抗锯齿化没有办法解决,这里可以利用加载影像的最大范围缩小。

let loadImageryLayer = () => {
    const slice_total = new Cesium.UrlTemplateImageryProvider({
        url: 'http://localhost:9003/image/wmts/21Q3Ey3F/{z}/{x}/{y}',
        rectangle: Cesium.Rectangle.fromDegrees(119.21356, 34.60827, 119.21464, 34.60928),

    })
    viewer.imageryLayers.addImageryProvider(slice_total)

    const slice_cehui = new Cesium.UrlTemplateImageryProvider({
        url: 'http://localhost:9003/image/wmts/mC7YGixZ/{z}/{x}/{y}',
        rectangle: Cesium.Rectangle.fromDegrees(119.21362, 34.60876, 119.21451, 34.6090),


    })
    viewer.imageryLayers.addImageryProvider(slice_cehui)

    const slice_wensi = new Cesium.UrlTemplateImageryProvider({
        url: 'http://localhost:9003/image/wmts/v46lxY3m/{z}/{x}/{y}',
        rectangle: Cesium.Rectangle.fromDegrees(119.21384, 34.60534, 119.21464, 34.60866),


    })
    viewer.imageryLayers.addImageryProvider(slice_wensi)


    const slice_cehui_right = new Cesium.UrlTemplateImageryProvider({
        url: 'http://localhost:9003/image/wmts/QvyCMwx1/{z}/{x}/{y}',
        // 设置纹理过滤选项
        rectangle: Cesium.Rectangle.fromDegrees(119.2144, 34.609, 119.21449, 34.60909)


    })
    viewer.imageryLayers.addImageryProvider(slice_cehui_right)
}

17 去除cesium默认功能

概述:一般来说,部署的时候cesium很多的功能需要去掉,这里我们可以直接选择CesiumWidget或者添加配置选项。

viewer = new Cesium.Viewer('cesiumContainer', {
      geocoder: false, // 隐藏查找位置
      homeButton: false, // 隐藏返回视角到初始位置
      sceneModePicker: false, // 隐藏视角模式的选择
      baseLayerPicker: false, // 隐藏图层选择器
      navigationHelpButton: false, // 隐藏帮助
      animation: false, // 隐藏动画速度控制器
      timeline: false, // 隐藏时间轴
      fullscreenButton: false, // 隐藏全屏按钮
      shouldAnimate: true
})

18 vite全局整合cesium

// 创建vue项目
npm create vite

//导入cesium和依赖插件

地址:https://github.com/nshen/vite-plugin-cesium

19 相机定位问题

viewer.camera.setView({
    destination: Cesium.Cartesian3.fromDegrees(119.54876, 34.61479, 300), 
    orientation: {
        heading: 0,
        pitch: Cesium.Math.toRadians(-90.0),
        roll: 0
    }
})

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

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

相关文章

聚合生态 深耕行业——2023用友生态峰会成功举办

近日&#xff0c;2023用友BIP技术大会生态峰会在北京隆重开幕。来自中国电信、毕马威、上海汉得信息、百度、滴滴、金山云、外企德科、上海诺捷、上海熵央等伙伴代表与全国各行业生态伙伴、企业客户等齐聚一堂&#xff0c;解读企业生态新变革&#xff0c;畅谈行业生态新合作&am…

如何使用阿里云短信服务实现登录页面,手机验证码登录?

1&#xff1a;个人如何使用阿里云短信服务&#xff1f; 2022如何使用个人阿里云短信服务&#xff1f;_linxiMY的博客-CSDN博客添加完成之后&#xff0c;等待审核&#xff01;一般2个小时就会出来审核结果了&#xff0c;这里我因为注册申请时填写规则有误&#xff0c;足足审核了…

MyBatis的缓存、逆向工程、以及分页插件的使用

1、MyBatis的缓存 1.1、MyBatis的一级缓存 一级缓存是SqlSession级别的&#xff0c;通过同一个SqlSession查询的数据会被缓存&#xff0c;下次查询相同的数据&#xff0c;就会从缓存中直接获取&#xff0c;不会从数据库重新访问 使一级缓存失效的四种情况&#xff1a; 不同的…

Spring简介

二、Spring 1、Spring简介 1.1、Spring概述 官网地址&#xff1a;https://spring.io/ Spring 是最受欢迎的企业级 Java 应用程序开发框架&#xff0c;数以百万的来自世界各地的开发人员使用 Spring 框架来创建性能好、易于测试、可重用的代码。 Spring 框架是一个开源的 Jav…

人工大猩猩部队优化器:一种新的面向全局优化问题的自然启发元启发式算法(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 元启发式在解决优化问题方面发挥着关键作用&#xff0c;其中大多数都受到自然界中自然生物集体智慧的启发。本文提出了一种新的…

流程图的简单操作

流程图是一种对过程进行梳理的工具&#xff0c;利用简单的图形符号来将组织步骤连接起来&#xff0c;从而形成完整信息流转图形。该图直观地描述一个工作过程的具体步骤&#xff0c;对准确了解事情是如何进行的&#xff0c;以及决定应如何改进过程有指导性意义。 流程图如何进行…

SwiftUI 中 TabView 如何原生使用类 UIPageView 的翻页样式?

功能需求 我们知道 TabView 是 SwiftUI 中非常好用的布局组织容器,它可以分类组织视图并依次展示给用户。 从 SwiftUI 2.0 开始(iOS 14.0+),TabView 除了常规的以标签(Tab Label)样式显示外,还可以用类似 UIPageView 的样式分页原生显示视图,显得更加简洁: 如上图所…

远程控制软件有哪些

在当今的数字时代&#xff0c;远程访问软件已成为各种规模企业的必备工具。 它允许员工在任何地方工作并远程访问他们的工作计算机和数据。 当今市场上三种最流行的远程访问软件解决方案是 TeamViewer、Splashtop 和 Microsoft Remote Desktop。 在本文中&#xff0c;我们将深入…

【MYSQL】MYSQL数据库命令大全

文章目录 &#x1f337; 1. root 用户登录&#x1f337; 2. 数据库的操作&#x1f337; 3. 常用数据类型&#x1f337; 4. 表的操作⭐ 4.1 创建表&#x1f341; 约束类型 ⭐ 4.2 插入⭐ 4.3 查询&#x1f341; 去重&#xff1a;DISTINCT&#x1f341; 排序&#xff1a;ORDER BY…

Mysql设置表只存储一段时间的数据

使用MySQL的事件调度器&#xff08;Event Scheduler&#xff09;来定期删除表中的数据。 假设你要删除的表是mytable&#xff0c;并且表中有一个名为created_at的日期时间类型的列&#xff0c;存储了每条记录的创建时间。你可以通过以下步骤设置表只存储30天的数据&#xff1a…

CentOS7.x docker安装Oracle11g并使用navicat连接

1.拉取Oracle11g镜像 #因为国内访问docker官方镜像源速度很慢,所以这里使用阿里的 docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g#名字太长,重新打标签 docker tag registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g:latest helowin/oracle_11g 2.启…

采用海明窗,设计FIR滤波器

clc; % 清空命令行窗口 clear; %清空工作区 close all;% fir1函数使用方法 b fir1(48,[0.35 0.65]); freqz(b,1,512)figure b1 fir1(11,0.2); plot(20*log(abs(fft(b1)))/log(10))% E4_1_fir1.m文件的源码 % % 采用海明窗&#xff0c;分别设计长度为41&#xff08;阶数为40…

python基基基基基基础知识

python 基础入门 一、python介绍和安装 1. python语言的特点 语法简洁类库丰富跨平台可扩展源码开放 2. python版本 官方版本 只包含python的解释程序和一些标准库 https://www.python.org/downloads/&#xff0c;安装后打开终端输入python&#xff0c;显示python版本即为安…

手推FlinkML2.2(二)

FeatureHasher&#xff08;特征哈希器&#xff09;是一种用于处理高维分类特征&#xff08;如文本或类别特征&#xff09;的方法。它将特征转换为固定长度的数值向量&#xff0c;以便在机器学习模型中使用。特征哈希通过哈希函数将特征映射到较低维度的向量空间&#xff0c;可以…

【Linux网络】PXE高效批量网络装机

PEX高效批量网络装机 一、部署PXE远程安装服务1.1PXE的优点1.2搭建PXE网络体系的前提条件 二、实现Kincksatrt无人值守安装2.1实验思路&#xff0c;2.2实验&#xff1a;无人值守远程安装2.2.1实现 Kickstart 无人值守安装 一、部署PXE远程安装服务 PXE&#xff08;预启动执行环…

Apple 的 plist 编辑器入门指南:基础操作与高级功能详解

PlistEdit Pro是一款专为macOS编写的最高级属性列表Plist编辑器。对于Mac和IOS开发人员来说&#xff0c;编写应用程序时必须编辑各种列表文件。PlistEdit Pro通过提供直观且功能强大的界面&#xff0c;使编辑这些文件更加容易。它不仅能够复制和粘贴或拖放属性列表数据&#xf…

三种线程安全的List

在单线程开发环境中&#xff0c;我们经常使用ArrayList作容器来存储我们的数据&#xff0c;但它不是线程安全的&#xff0c;在多线程环境中使用它可能会出现意想不到的结果。 多线程中的ArrayList&#xff1a; 我们可以从一段代码了解并发环境下使用ArrayList的情况&#xff…

用友滴滴:商旅费控领域现实中的1+1>2

当前&#xff0c;AI、5G、大数据等数智技术持续演进&#xff0c;千行百业数智化正在加速。在行业数字化之下&#xff0c;企业服务生态也进入新发展阶段&#xff0c;同时也孕育着新合作、新机遇。 在2023用友生态峰会上&#xff0c;用友与滴滴签署战略合作。用友依托数智化商旅费…

塔望3W消费战略产品案丨筷手小厨:筷手功夫饭的差异化致胜之道

筷手小厨 自热米饭 客户&#xff1a;颐海国际控股有限公司 品牌&#xff1a;筷手小厨 服务&#xff1a;3W消费战略 自热米饭产品案 项目背景 颐海国际控股有限公司,成立于2013年。2016年在香港主板上市&#xff08;股票代码&#xff1a;01579.HK&#xff09;。是一家集研…

使用随机森林回归填补缺失值

文章目录 一、概述二、实现1. 导入需要的库2. 加载数据集3. 构造缺失值4. 使用0和均值填充缺失值5. 使用随机森林填充缺失值6. 对填充好的数据进行建模7. 评估效果对比 一、概述 现实中收集的数据&#xff0c;几乎不可能是完美无缺的&#xff0c;往往都会有一些缺失值。面对缺…