【Cesium学习(五)】绘制基础形状

本文介绍了如何在Cesium中使用Entity和CZMLJSON格式绘制立方体、圆柱体和走廊,以及通过CZML创建广告牌的过程,展示了在WebGIS应用中添加3D模型的不同方法。

Cesium绘制形状

在Cesium上面绘制实体形状有两种方式:一个是通过Entity的方式来绘制,还有一种是通过CZML的JSON格式数据来绘制,下面就演示这两种方式。

第一种 Entity添加实体

首先来看看官网关于Entity的描述,如下图: 点击前往官网
在这里插入图片描述
可以看到,entity可以创建多种实体(立方体,圆柱体,椭圆,点,线等等),每一个实体创建的属性可以自行点击查看
在这里我演示创建(立方体,圆柱,走廊)

添加实体方法是add 官网

在这里插入图片描述

代码实现

话不多说,我直接上代码

// 初始化
let viewer = new Cesium.Viewer('cesiumContainer', {
    animation: true, //是否显示动画控件
    baseLayerPicker: true, //是否显示图层选择控件
    fullscreenButton: true, //是否显示全屏按钮
    vrButton: true, // vr部件
    geocoder: true, // 位置搜索部件
    homeButton: true, //是否显示Home按钮
    infoBox: false, //是否显示点击要素之后显示的信息
    sceneModePicker: true, // 二三维切换部件
    timeline: true, //是否显示时间线控件
    navigationHelpButton: true, //是否显示帮助信息控件
    //> 设置地图
    imageryProvider: new Cesium.UrlTemplateImageryProvider({ url }),
});
//> 绘制一个圆柱体
const blueCylinder = viewer.entities.add({
    name: 'Blue box',
    position: Cesium.Cartesian3.fromDegrees(-114.0, 40.0, 300000.0),
    cylinder: {
        length: 500000.0,
        topRadius: 200000.0,
        bottomRadius: 100000.0,
        material: Cesium.Color.BLUE, //> 设置材料的颜色
    },
});
//> 绘制立方体
const redBox = viewer.entities.add({
    name: 'Red box with black outline',
    position: Cesium.Cartesian3.fromDegrees(-107.0, 40.0, 300000.0),
    box: {
        dimensions: new Cesium.Cartesian3(400000.0, 300000.0, 500000.0), //>一个 Cartesian3 属性,用于指定框的长度,宽度和高度
        material: Cesium.Color.RED.withAlpha(0.5), //>指定用于填充框的材料。 withAlpha: 透明度
        outline: true, //>一个布尔型属性,指定是否对框进行概述。
        outlineColor: Cesium.Color.BLACK, //>指定轮廓的颜色
    },
});
//> 绘制一个走廊
const blueCorridor = viewer.entities.add({
    name: 'Blue extruded corridor with beveled corners and outline',
    corridor: {
        positions: Cesium.Cartesian3.fromDegreesArray([-95.0, 40.0, -100.0, 40.0, -100.0, 35.0]),
        height: 200000.0,
        extrudedHeight: 100000.0,
        width: 200000.0,
        cornerType: Cesium.CornerType.BEVELED,
        material: Cesium.Color.YELLOW.withAlpha(0.5),
        outline: true,
        outlineColor: Cesium.Color.WHITE,
    },
});
viewer.zoomTo(viewer.entities);

这里的zoomTo就是异步设置摄像机以查看提供的一个或多个实体或数据源。
在这里插入图片描述

运行起来就是如下图:**

第二种 CZML添加实体

首先需要写一个czml格式的数据,CZML是一种JSON格式的字符串,用于描述与实践有关的动画场景。
这里我写一个创建广告牌的czml数据

//> 绘制一个广告牌 (采用CZML格式创建)
const czml = [
    {
        id: 'document',
        name: 'Basic CZML billboard and label',
        version: '1.0',
    },
    {
        id: 'some-unique-id',
        name: 'AGI',
        description: "<p><a href='http://www.agi.com' target='_blank'>Analytical Graphics, Inc.</a> (AGI) founded Cesium.</p>",
        billboard: {
            image: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAACvSURBVDhPrZDRDcMgDAU9GqN0lIzijw6SUbJJygUeNQgSqepJTyHG91LVVpwDdfxM3T9TSl1EXZvDwii471fivK73cBFFQNTT/d2KoGpfGOpSIkhUpgUMxq9DFEsWv4IXhlyCnhBFnZcFEEuYqbiUlNwWgMTdrZ3JbQFoEVG53rd8ztG9aPJMnBUQf/VFraBJeWnLS0RfjbKyLJA8FkT5seDYS1Qwyv8t0B/5C2ZmH2/eTGNNBgMmAAAAAElFTkSuQmCC',
            scale: 1.5,
        },
        label: {
            fillColor: {
                rgba: [255, 255, 255, 255],
            },
            font: '12pt Lucida Console',
            horizontalOrigin: 'LEFT',
            pixelOffset: {
                cartesian2: [8, 0],
            },
            style: 'FILL',
            text: 'AGI',
            showBackground: true,
            backgroundColor: {
                rgba: [112, 89, 57, 200],
            },
        },
        position: {
            cartesian: [1216361.4096947117, -4736253.175342511, 4081267.4865667094],
        },
    },
   ];

通过czml的方式要创建实体,就需要用到viewer的dataSources属性,来看看官网介绍
在这里插入图片描述
dataSources里面有add属性,可以添加,介绍如下
在这里插入图片描述
如上图所说,add的参数要是一个dataSources的数据源,Cesium里面的CzmlDataSource有一个load方法,可以将czml数据转换
在这里插入图片描述
所以最后将我们上面创造好的czml数据就可以创建实体了

//> 通过CZML来添加模型
 viewer.dataSources.add(Cesium.CzmlDataSource.load(czml));

运行大功告成

在这里插入图片描述

Cesium绘制大量线条时,性能优化是确保应用流畅运行的关键。以下是一些有效的实现方法和优化策略: ### 使用 3D Tiles 格式 将线数据转换为 3D Tiles 格式(如 VectorTiles 或 PointCloud),可以显著提升渲染性能。Cesium 对 3D Tiles 有原生支持,并且该格式专为大规模地理空间数据设计,能够实现高效的分层细节(LOD)加载和渲染。 ### 数据简化与聚合 对原始线数据进行简化处理,例如减少点的数量,同时保持线的整体形状。工具如 MapShaper 或 TopoJSON 可用于此目的。此外,通过将多个相近的线合并为一条线或将线按地理区域分组,可以在 Cesium 中以群组形式加载,从而降低实体数量和内存占用。 ### 按需加载与视口裁剪 利用 Cesium 提供的视口裁剪功能,仅加载当前用户可见区域的数据。结合分页机制或懒加载策略,在用户缩放或平移地时动态加载新的数据块,避免一次性加载全部数据导致的性能瓶颈。 ### 合并实体与使用 EntityCluster 避免创建过多独立的 Cesium 实体,因为每个实体都会增加渲染负担。可以通过合并相似的线对象为一个实体来减少开销。另外,Cesium 提供了 `EntityCluster` 类,专门用于管理大量实体,自动处理聚类和解聚过程,进一步提升性能。 ### 优化样式与视觉复杂度 简化线的样式设置,减少不必要的视觉效果,例如复杂的纹理、阴影等。使用单一颜色和较细的线条宽度,有助于降低 GPU 的渲染压力。 ### 利用 WebGL 加速 Cesium 基于 WebGL 构建,充分利用 GPU 进行形渲染。确保前端代码高效,避免 CPU 上的冗余计算,同时使用最新的浏览器和 Cesium 版本,以获取最佳的硬件加速支持。 ### 服务器端优化 如果数据来自远程服务(如 GeoServer),确保服务器具备足够的性能来处理高并发请求。启用缓存机制,减少重复查询带来的延迟。GeoServer 支持多种优化手段,包括数据压缩和样式简化,可用于提升响应速度。 ### 用户交互反馈 在加载大规模线数据时,提供加载状态提示(如进度条或加载动画),改善用户体验。同时,允许用户通过界面控件(如限制缩放级别)控制加载的数据量,避免因过度渲染导致卡顿。 ### 示例代码:合并线实体 ```javascript const viewer = new Cesium.Viewer('cesiumContainer'); // 假设有两条线数据 const positions1 = Cesium.Cartesian3.fromDegreesArray([-115.0, 37.0, -115.0, 32.0]); const positions2 = Cesium.Cartesian3.fromDegreesArray([-115.0, 32.0, -107.0, 31.0]); // 合并为一个 PolylineGeometry 实例 viewer.entities.add({ polyline: { positions: [...positions1, ...positions2], width: 2, material: Cesium.Material.RadarType } }); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龟中的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值