cesium学习记录05-加载数据(矢量、影像、地形、3D模型)

news2025/2/24 8:07:33

1. 矢量数据:

1.1. GeoJSON
定义:

一个基于JSON的地理数据格式,Cesium支持GeoJSON的直接加载。

例子:

加载一个简易故宫建筑的GeoJSON数据。
在这里插入图片描述

代码:
 /**
   * 添加故宫geojson数据
   */
  AddGuGong() {
    var viewer = this.viewer;
    Cesium.GeoJsonDataSource.load("../static/geojson/故宫.geojson").then(
      function(data) {
        viewer.dataSources.add(data);
        const entities = data.entities.values;
        for (let i = 0; i < entities.length; i++) {
          let entity = entities[i];
          var height = entity.properties.height._value;
          entity.polygon.heightReference =
            Cesium.HeightReference.CLAMP_TO_GROUND;
          entity.polygon.outline = false;
          // 将高度拉伸至高度属性值
          entity.polygon.extrudedHeight = height != null ? height : 5;
        }
      }
    );
  },
获取并修改样式(下面的KML和CZML也一样):

viewer.dataSources.add(data);可以看出,数据被添加到viewer.dataSources里面了,那如何获取就显而易见了。
viewer.dataSources.add(data);添加数据之前,为data加个name属性data.name="故宫geojson",然后遍历获取并修改属性

// 获取已加载的数据源
var dataSources = viewer.dataSources;
// 遍历所有数据源
for (var i = 0; i < dataSources.length; i++) {
    var dataSource = dataSources.get(i);
    // 检查是否是你加载的故宫数据源
    if (dataSource.name === "故宫geojson") {  // 注意替换成实际的数据源名称
        var entities = dataSource.entities.values;
        // 遍历故宫数据源中的实体
        for (var j = 0; j < entities.length; j++) {
            var entity = entities[j];
            // 进行属性修改,例如修改颜色
            entity.polygon.material = Cesium.Color.RED;
        }
    }
}

在这里插入图片描述

1.2. KML/KMZ
定义:

KML (keyhole markup language)是以XML语言为基础开发的一种文件格式,用来描述和存储地理信息数据(点、线、面、图片等),是纯粹的xml文本格式, KMZ是Google Earth默认的输出文件格式,是一个经过ZIP格式压缩过的KML文件。

例子:

添加山东省边界kml数据。
在这里插入图片描述

代码:
 /**
   * 添加山东省边界kml数据
   */
  AddKml() {
    var viewer = this.viewer;
    viewer.dataSources
      .add(Cesium.KmlDataSource.load("../static/山东省边界.kml"))
      .then(function(dataSource) {});
  },
1.3. CZML (Cesium Language)
定义:CZML是Cesium的JSON格式,用于描述时间动态的图形场景。
例子:添加卫星轨迹czml数据。

在这里插入图片描述

代码:
 /**
   * 添加卫星轨迹czml数据
   */
   AddCzml() {
    var viewer = this.viewer;
    viewer.dataSources
      .add(Cesium.CzmlDataSource.load("../static/卫星轨迹.czml"))
      .then(function(dataSource) {});
  },

2. 影像服务:

2.1. WMS (Web Map Service)
定义:

Cesium可以直接加载和显示WMS服务提供的图层。

例子:

加载三国州郡地图WMS服务。
在这里插入图片描述

代码:
/**
   * 向当前视图添加geoserver发布的WMS服务(多个图层)
   */
  AddGeoserverService: function() {
    let viewer = this.viewer;
    let _this = this;
    const layerConfigs = [
      {
        layers: "sanmap:州界面"
      },
      {
        layers: "sanmap:河流湖泊面"
      },
      {
        layers: "sanmap:河流线"
      },
      {
        layers: "sanmap:郡治点"
      }
    ];
    layerConfigs.forEach(config => {
      const wmsImageryProvider = new Cesium.WebMapServiceImageryProvider({
        url: "http://******/geoserver/sanmap/wms",
        layers: config.layers,
        parameters: {
          transparent: true,
          format: "image/png",
          srs: "EPSG:4326"
        }
      });
      viewer.imageryLayers.addImageryProvider(wmsImageryProvider);
    });
  },
获取并修改样式(下面的WMTS和XYZ也差不多,但获取方式略有差别,反正都在viewer.imageryLayers里查找就是了)

viewer.imageryLayers.addImageryProvider(wmsImageryProvider);这一句不难看出,影像图层是保存到viewer.imageryLayers了,同样的获取方式

   // 获取已加载的影像图层列表
var imageryLayers = viewer.imageryLayers;
// 遍历影像图层列表
for (var i = 0; i < imageryLayers.length; i++) {
    var layer = imageryLayers.get(i);
    // 检查是否是你加载的图层
    if (layer.imageryProvider.layers === "sanmap:州界面") {
       layer.alpha = 0.3;
    }
}

在这里插入图片描述

2.2. WMTS (Web Map Tile Service)
定义:

Cesium可以直接加载和显示WMTS服务提供的预渲染瓦片图层。

例子:

加载天地图WMTS地图服务。
在这里插入图片描述

代码:
/**
   * 加载天地图wmts服务
   */
  AddWmts(){
    let _this = this;
    let viewer = _this.viewer;
    //天地图token
    let token = window.tiandituToken;
    //加载在线天地图
    let obj=({
      url: "http://t0.tianditu.com/cia_w/wmts?tk=" + token,
      label: "天地图影像",
      loadType: "WebMapTileServiceImageryProvider",
      layer: "cia",
      style: "default",
      tileMatrixSetID: "w",
      format: "tiles",
      maximumLevel: 18
    });
    var wmtsImageryProvider = new Cesium.WebMapTileServiceImageryProvider(obj);
    viewer.imageryLayers.addImageryProvider(wmtsImageryProvider);
  },
2.3.TMS /XYZ(Tile Map Service)
定义:

用于加载地图瓦片,Cesium支持这种服务,尤其是加载卫星影像和其他地图底图。

例子:

加载一个OpenStreetMap的XYZ格式瓦片图层作为地球的底图。
在这里插入图片描述

代码:
   /**
   * 加载XYZ瓦片服务
   */
  AddXyz(){
    let _this=this
    let viewer=_this.viewer
    var osmProvider = new Cesium.UrlTemplateImageryProvider({
      url: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png'
  });
  viewer.imageryLayers.addImageryProvider(osmProvider);
  },
2.4.TMS、XYZ与WMTS的不同:
(1)TMS (Tile Map Service):

它是由OSGeo组织提出的开放标准。
定义了如何访问和组织地图瓦片。
在TMS中,瓦片的y坐标是从下至上递增的,这意味着当你向北移动时,y值会增加。

(2)XYZ:

这不是一个正式的标准或规范,但它已经成为了事实上的标准,被许多现代Web地图服务采用,如Google Maps、OpenStreetMap等。
与TMS相反,瓦片的y坐标是从上至下递增的。
在实际应用中,XYZ通常被认为是更直观和简单的,因为它更符合Web浏览器的坐标系统(其中y坐标从上至下递增)。

(3)WMTS (Web Map Tile Service):

它是由Open Geospatial Consortium (OGC) 提出的标准。
是一个比TMS更复杂、更完整的服务规范,它包括了不仅仅是如何访问瓦片,还有如何描述服务、如何列出可用的瓦片集等。
WMTS支持多种“瓦片矩阵集”,这些矩阵集中的一种就是TMS格式。因此,可以说TMS是WMTS的一个子集或一个选项。

(4)关系总结:

TMS 和 XYZ 主要的区别在于瓦片的y坐标如何增加:在TMS中从下至上,而在XYZ中从上至下。
WMTS 是一个比TMS更广泛、更完整的标准。WMTS支持多种瓦片编址方案,其中TMS是其中之一。XYZ格式并不是WMTS的正式部分,但由于它的普遍性,很多WMTS实现也支持XYZ格式作为非正式的扩展。
从实际应用的角度看,XYZ格式已经被广大Web开发者接受并广泛使用,尽管它并没有像TMS和WMTS那样的正式规范背书。

2.5.WMTS与WMS的关系:
数据提供方式:

WMS (Web Map Service): WMS按请求提供地图图像。当用户或客户端发送一个包含地理范围、图像大小等参数的请求时,WMS会生成一个对应的地图图像并返回。这意味着每次你浏览或缩放地图时,WMS都需要动态渲染一个新的图像。

WMTS: 与WMS不同,WMTS提供预渲染的地图瓦片。这些瓦片是按照特定的规模和范围提前渲染的,当用户请求时,只需要选择和提供相应的瓦片,而不需要每次都进行渲染。

性能:

由于WMTS使用预渲染的瓦片,其性能通常优于WMS,尤其是在高并发的情况下。预渲染的瓦片可以在CDN或缓存中存储,从而进一步提高数据的提取速度。
灵活性:
WMS由于是按需渲染的,因此可以提供更高的灵活性,如动态样式、过滤特定的数据等。然而,这种灵活性通常以性能为代价。
WMTS由于是预渲染的,灵活性较低,但是在需要快速提供地图内容的情境中,其性能表现优越。

应用场景:

WMS: 当你需要根据用户的需求动态生成地图内容,或者需要特定的样式和数据过滤时,WMS可能是更好的选择。

WMTS: 当你需要为大量用户快速提供地图内容,尤其是常用的地图层时,WMTS是更好的选择。

总的来说,WMTS是WMS的一个补充。在选择使用哪种服务时,应根据应用的需求、预期的用户量以及性能需求来进行决策。

3. 地形服务:

3.1.CesiumTerrainProvider
描述:

这是Cesium为了处理高精度的全球地形数据而创建的API。地形数据切片使用quantized-mesh v1.0格式,它允许高效的流式传输和渲染。

特点:

除了地形高度外,这种地形还支持实时的太阳光照效果和真实的水体渲染效果。

如何调用:

使用Cesium中的CesiumTerrainProvider API可以很容易地调用并加载这种地形数据。
在这里插入图片描述

代码:
 // 加载地形数据
   //viewer.terrainProvider = Cesium.createWorldTerrain();
    // viewer.terrainProvider = Cesium.createWorldTerrain({
    //   requestVertexNormals: true,
    //   requestWaterMask: true
    // });
    // 或
    const terrainProvider = new Cesium.CesiumTerrainProvider({
      url: Cesium.IonResource.fromAssetId(1), //这使用了Cesium Ion的默认全球地形
      requestWaterMask: true, //请求水体效果所需要的海岸线数据
      requestVertexNormals: true //请求地形照明数据
    });
    viewer.terrainProvider = terrainProvider;

    //地形夸张
    viewer.scene.globe.terrainExaggeration = 1.3;

4. 三维数据:

4.1. glTF (GL Transmission Format)/glb
定义:

是3D模型的一种格式,Cesium使用这种格式来优化3D模型的加载和渲染。

不同:

glTF: 这是 glTF 的标准格式,使用JSON格式表示3D内容,并且通常以 .gltf 为扩展名。与此相关的资源(如纹理和二进制网格数据)通常存储在与主 gltf 文件分开的文件中。
glb: 这是 glTF 的二进制格式,通常以 .glb 为扩展名。所有相关的资源(如纹理、着色器、网格等)都嵌入到单一的二进制文件中,使其更容易传输。

例子:

添加飞机glb模型(键盘控制移动)
在这里插入图片描述

代码:
/**
   * 添加glb模型(键盘控制移动)
   * @param {Number} x 经度
   * @param {Number} y 纬度
   * @param {Number} z 高度
   */
  AddCesiumglb(x, y, z) {
    var viewer = this.viewer;
    let url = "../static/Cesium_Air.glb";
    // 模型姿态变化
    let headingPitchRoll = new Cesium.HeadingPitchRoll();
    // 模型初始位置
    let position2 = new Cesium.Cartesian3.fromDegrees(x, y, z);
    // 局部变换坐标系
    let fixedFrameTransform = Cesium.Transforms.localFrameToFixedFrameGenerator(
      "north",
      "west"
    );
    // 每次操作姿态变化为5°
    let deltaRadians = Cesium.Math.toRadians(5.0);
    // 速度
    let speed = 10;
    // 速度向量
    let speedVector = new Cesium.Cartesian3();

    // 添加实体
    // 使用primitive方式加载模型
    const modelEntity = viewer.scene.primitives.add(
      Cesium.Model.fromGltf({
        url: url,
        scale: 20.0,
        modelMatrix: Cesium.Transforms.headingPitchRollToFixedFrame(
          position2,
          headingPitchRoll,
          Cesium.Ellipsoid.WGS84,
          fixedFrameTransform
        ),
        minimumPixelSize: 12,
        maximumScale: 200
      })
    );
    // 添加键盘监听事件
    document.addEventListener("keydown", function(e) {
      switch (e.keyCode) {
        // 抬头
        case 38:
          headingPitchRoll.pitch += deltaRadians;
          // 判断是否超过2π范围
          if (headingPitchRoll.pitch > Cesium.Math.TWO_PI) {
            headingPitchRoll.pitch -= Cesium.Math.TWO_PI;
          }
          console.log("抬头:pitch+");
          break;

        // 低头
        case 40:
          headingPitchRoll.pitch -= deltaRadians;
          if (headingPitchRoll.pitch < -Cesium.Math.TWO_PI) {
            headingPitchRoll.pitch += Cesium.Math.TWO_PI;
          }
          console.log("低头:pitch-");

          break;

        // 左转
        case 37:
          headingPitchRoll.heading -= deltaRadians;
          // 判断是否超过2π范围
          if (headingPitchRoll.heading < -Cesium.Math.TWO_PI) {
            headingPitchRoll.heading += Cesium.Math.TWO_PI;
          }
          console.log("左转:heading+");
          break;

        // 右转
        case 39:
          headingPitchRoll.heading += deltaRadians;
          // 判断是否超过2π范围
          if (headingPitchRoll.heading > Cesium.Math.TWO_PI) {
            headingPitchRoll.heading -= Cesium.Math.TWO_PI;
          }
          console.log("右转:heading-");
          break;

        // 顺时针
        case 96:
          headingPitchRoll.roll += deltaRadians;
          // 判断是否超过2π范围
          if (headingPitchRoll.roll > Cesium.Math.TWO_PI) {
            headingPitchRoll.roll -= Cesium.Math.TWO_PI;
          }
          console.log("顺时针翻滚:roll+");
          break;

        // 逆时针
        case 110:
          headingPitchRoll.roll -= deltaRadians;
          // 判断是否超过2π范围
          if (headingPitchRoll.roll < -Cesium.Math.TWO_PI) {
            headingPitchRoll.roll += Cesium.Math.TWO_PI;
          }
          console.log("逆时针翻滚:roll-");
          break;

        // 加速
        case 187:
          speed += 10;
          speed = Math.min(speed, 10000);
          console.log("加速:" + speed);
          break;
        // 减速
        case 189:
          speed -= 10;
          speed = Math.max(speed, 100);
          console.log("减速:" + speed);
          break;

        default:
          break;
      }
    });

    // 渲染更新前阶段添加监听
    viewer.scene.preUpdate.addEventListener(() => {
      if (window.fly) {
        speedVector = Cesium.Cartesian3.multiplyByScalar(
          Cesium.Cartesian3.UNIT_X,
          speed / 10,
          speedVector
        );
        position2 = Cesium.Matrix4.multiplyByPoint(
          modelEntity.modelMatrix,
          speedVector,
          position2
        );
        // 更新模型姿态与位置
        Cesium.Transforms.headingPitchRollToFixedFrame(
          position2,
          headingPitchRoll,
          Cesium.Ellipsoid.WGS84,
          fixedFrameTransform,
          modelEntity.modelMatrix
        );
        // 俯视跟随
        viewer.camera.lookAt(position2, new Cesium.Cartesian3(0, 0, 2000));
        // 第一视角跟随
        //viewer.camera.lookAt(position2, new Cesium.HeadingPitchRange(headingPitchRoll.heading, headingPitchRoll.pitch, 2000))
      }
    });
  },
获取并修改样式(下面的3D Tiles也差不多,不过是Cesium.Cesium3DTileset)

const modelEntity = viewer.scene.primitives.add不难看出,模型保存在这里viewer.scene.primitives。给模型赋上名称modelEntity.name="飞机模型",然后获取

// 获取已加载的3D模型列表
          var primitives = viewer.scene.primitives;

          for (var i = 0; i < primitives.length; i++) {
            var primitive = primitives.get(i);

            // 判断是否为3D模型(glTF)
            if (primitive instanceof Cesium.Model&&primitive.name=="飞机模型") {
              console.log(primitive)
              primitive.color = new Cesium.Color(1.0, 0.0, 0.0, 1.0);
            }
          }

在这里插入图片描述

4.2.3D Tiles
定义:

这是Cesium推出的一个规范,用于流式传输和加载大型3D数据集。

例子:

加载大雁塔3D建筑模型。
在这里插入图片描述

代码:
/**
   * 添加大雁塔模型
   */
  Add3DTileset(){
    let _this=this
    let viewer = _this.viewer;
  let tileSetModel = new Cesium.Cesium3DTileset({
    url: "./static/3DT/dayanta/tileset.json"
  });
  
  tileSetModel.readyPromise.then( tileset=> {
    console.log("加载完成")
    viewer.scene.primitives.add(tileset);
    viewer.zoomTo(tileset, new Cesium.HeadingPitchRange(0.5, -0.2, tileset.boundingSphere.radius * 1.0));
  }).catch(function (error) {
    console.log(error);
  });
  },

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

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

相关文章

提取有像素的掩码和原图

有些数据集给的掩码是全黑图片&#xff0c;需要将全黑的掩码剔除&#xff0c;保留有标签的掩码。 DDR-dataset 眼底图像处理 from PIL import Image import cv2 import osdef extract_mask_and_original(mask_path, original_path, output_folder):# 读取黑白掩码图片和同名原…

UDP 的报文结构和注意事项

目录 一. UDP的特点 二. UDP协议 1. UDP协议端格式 2.UDP的报文结构 3. 基于UDP的应用层协议 三. (高频面试题) 一. UDP的特点 无连接&#xff1a;知道对端的IP和端口号就直接进行传输&#xff0c;不需要建立连接。不可靠&#xff1a;即使因为网络故障等原因无法将数据报发送…

重磅!软考或全部改为机考?

最近&#xff0c;有同学分享了一张署名为“工业和信息化部教育与考试中心”的文件截图。 注&#xff1a;该截图来源于网络&#xff0c;而非官方 以下为该截图文件全文&#xff1a; 关于2023年下半年计算机软件资格考试有关工作调整的通知 各省、自治区、直辖市及计划单列市…

医疗PACS源码,支持三维多平面重建、三维容积重建、三维表面重建、三维虚拟内窥镜

C/S架构的PACS系统源码&#xff0c;PACS主要进行病人信息和影像的获取、处理、存储、调阅、检索、管理&#xff0c;并通过网络向全院提供病人检查影像及诊断报告&#xff1b;各影像科室之间共享不同设备的病人检查影像及诊断报告;在诊断工作站上&#xff0c;调阅HIS中病人的其它…

ThreadLocal的内存泄漏是怎么发生的

前言 在分析ThreadLocal导致的内存泄露前&#xff0c;需要普及了解一下内存泄露、强引用与弱引用以及GC回收机制&#xff0c;这样才能更好的分析为什么ThreadLocal会导致内存泄露呢&#xff1f;更重要的是知道该如何避免这样情况发生&#xff0c;增强系统的健壮性。 内存泄露 …

元宇宙核能发电VR模拟仿真实训教学为建设新型电力系统提供重要支撑

随着“碳达峰、碳中和”目标与建设新型能源体系的提出&#xff0c;在元宇宙环境下建设电力系统是未来发展的趋势。以物联网、区块链、数字孪生、混合现实等技术为主要代表的元宇宙技术体系及其在电力和能源系统中的应用&#xff0c;将会促进智能电网的发展&#xff0c;为建设新…

Win10启动Jmeter报错提示jmeter.log拒绝访问问题

jmeter版本&#xff1a;5.4.1 查看版本 在dos命令窗口中进入jmeter安装目录下的bin目录中&#xff1a;执行jmeter - v命令 我启动的方式是&#xff1a;进入jmeter安装目录下的bin目录中双击jmeter.bat启动的。结果报错&#xff0c;但是不影响使用。 报错日志如下&#xff1a; …

ip地址修改器软件哪个好 ip地址切换器有哪些

IP地址修改器是一种常用的网络工具&#xff0c;用于修改计算机或网络设备的IP地址。在网络连接中&#xff0c;IP地址被用于标识每个设备的唯一地址&#xff0c;通过它来实现设备之间的通信和数据传输。然而&#xff0c;有时候我们需要修改IP地址以解决一些网络问题或实现特定的…

网络基础知识:Trunk、Bond、mode4

【背景】 近期项目涉及到硬件服务器的交付&#xff0c;组网涉及到Trunk、Bond、mode4&#xff0c;做一个学习笔记。 【为什么要做mode4 &#xff1f;】 硬件都有故障率&#xff0c;为了做到硬件冗余高可用&#xff0c;通过软件配置将两个或多个&#xff08;一般是两个&#xf…

恒运资本:申购新股不买可以吗?

跟着商场改变&#xff0c;现在申购新股已成为许多出资者的热门论题。可是&#xff0c;许多人对于申购新股后不购买的处理方式存在疑惑。在现实中&#xff0c;申购新股后不购买的状况是常常发生的&#xff0c;本文将深入探讨这个论题并从不同的视点进行剖析。 首先&#xff0c;从…

ASEMI快恢复二极管APT80DQ40BG封装尺寸

编辑-Z APT80DQ40BG参数描述&#xff1a; 型号&#xff1a;APT80DQ40BG 最大峰值反向电压(VRRM)&#xff1a;400V 最大直流阻断电压VR(DC)&#xff1a;400V 平均整流正向电流(IF)&#xff1a;80A 非重复峰值浪涌电流(IFSM)&#xff1a;600A 工作接点温度和储存温度(TJ, …

新华三超融合态势感知标准版

产品概述&#xff1a; H3C SecCenter CSAP-XS 超融合态势感知一体机产品集合了态势感知和安全流量分析探针设备能无需复杂配置&#xff1b;态势感知平台具备强大的安全分析和可视化呈现功能&#xff1b;同时具备远程专家会诊功能&#xff0c;通过云端协同实现外部安全服务资源的…

企业产品手册5大核心功能,附产品手册在线制作工具Baklib

企业产品手册的5大核心功能 企业产品手册是企业向用户传达产品信息、功能和使用方法的重要工具。下面将介绍企业产品手册的五个核心功能。 1. 产品介绍和特点展示 产品手册的首要功能是介绍和展示企业的产品。它应该提供清晰、详细的产品信息&#xff0c;包括产品的特点、优势…

锚框【动手学深度学习】

生成多个锚框 假设输入图像高为h,宽为w,我们以图像每个像素为中心生成不同形状的锚框,缩放比 s∈(0,1],宽高比为r>0。那么锚框的宽度和高度分别为和。当中心位置给定时, 已知宽和高的锚框是确定的。缩放比为锚框高与图像高的比值,然后得到一个正方形锚框面积。 ​​…

Postman 汉化及下载

Postman 是一款常用的 API 测试工具&#xff0c;可以方便地进行接口测试、调试和文档编写。本文将详细介绍如何下载安装 Postman 并汉化&#xff0c;包括每个步骤的详细说明。 下载安装 Postman 1、打开浏览器&#xff0c;访问 Postman 官网&#xff0c;下载适用于自己系统的…

常见病原菌属——嗜血杆菌(Haemophilus)

谷禾健康 嗜血杆菌属&#xff08;Haemophilus spp&#xff09; 是变形菌门&#xff0c;小的、多形性、不活动、无孢子的革兰氏阴性杆菌或球杆菌。它们是需氧的和兼性厌氧的。主要寄居于人和动物的咽喉和口腔黏膜&#xff0c;少数见于生殖道&#xff0c;不过很多时候在粪便中也能…

流域梯级开发影响下:eDNA在乌江流域鱼类资源保护中的应用

连续的河流生境对水生生物尤其是鱼类具有重要的意义&#xff0c;但梯级水电引起的河流生境片段化会导致鱼类生物多样性下降。梯级水电使河流连通性受到阻隔&#xff0c;鱼类洄游受阻&#xff0c;以及水文情势的改变导致鱼类原有的栖息生境消失&#xff0c;鱼类繁殖受到影响。水…

腾讯云服务器CPU大全_处理器主频型号清单

腾讯云服务器CPU采用什么处理器型号&#xff1f;主频睿频多少&#xff1f;腾讯云服务器CPU性能如何&#xff1f;云服务器CVM规格不同CPU型号也不同&#xff0c;轻量应用服务器的CPU处理器性能如何&#xff1f;腾讯云服务器网分享腾讯云服务器CPU处理器大全&#xff1a; 目录 …

C#多线程开发详解

C#多线程开发详解 持续更新中。。。。。一、为什么要使用多线程开发1.提高性能2.响应性3.资源利用4.任务分解5.并行计算6.实时处理 二、多线程开发缺点1.竞态条件2.死锁和饥饿3.调试复杂性4.上下文切换开销5.线程安全性 三、多线程开发涉及的相关概念常用概念&#xff08;1&…

python压缩pdf文件大小

pdf文件过大&#xff0c;经常会是一个问题&#xff0c;但是市面上基本上都是收费的工具&#xff0c;wps需要开会员才能使用。因此找了一个python库进行试验&#xff1a; 首先需要安装 pip install aspose-pdf 运行的代码&#xff1a; import aspose.pdf as apcompressPdfDo…