cesium新建EntityCollection (CustomDataSource)

本文解释了在Cesium中如何通过CustomDataSource创建和管理EntityCollection,强调直接使用viewer.entities是无效的,需先创建数据源并添加实体。

在Cesium中重新创建一个新的EntityCollection,而不是直接使用viewer.entities的对象。

首先要看viewer到entity的关系:
Viewer ==> DataSourceDisplay ==> DataSourceCollection ==> CustomDataSource ==> EntityCollection ==> Entity

也就是说直接添加一个EntityCollection在viewer是不会渲染的,必须指定数据源才行,否则无效。可以看出来这个类属于底层类,实用性不强,如果想加实体集群使用new Cesium.CustomDataSource(name) 

官方例子:

const dataSource = new Cesium.CustomDataSource('myData');

const entity = dataSource.entities.add({//EntityCollection直接创建无效只能通过数据源添加
   position : Cesium.Cartesian3.fromDegrees(1, 2, 0),
   billboard : {
       image : 'image.png'
   }
});

viewer.dataSources.add(dataSource);

 

<think> 我们在Cesium中,使用`new Cesium.CustomDataSource`创建的数据源(图层)被添加到Viewer的`dataSources`集合中。获取这些数据源的方法主要有以下几种: ### 1. **通过数据源名称获取** 在创建`CustomDataSource`时可以指定名称(建议使用唯一标识): ```javascript // 创建时指定名称 const myDataSource = new Cesium.CustomDataSource('myLayer'); viewer.dataSources.add(myDataSource); ``` 通过`viewer.dataSources.getByName()`获取: ```javascript // 获取所有名为"myLayer"的数据源(返回数组) const dataSources = viewer.dataSources.getByName('myLayer'); if (dataSources.length > 0) { const targetDataSource = dataSources[0]; targetDataSource.show = false; // 示例:隐藏该图层 } ``` ### 2. **通过数据源ID获取** 每个数据源实例都有唯一`id`属性(创建时未指定则Cesium自动生成): ```javascript // 创建时指定ID(推荐) const myDataSource = new Cesium.CustomDataSource('myLayer', { id: 'uniqueId123' }); viewer.dataSources.add(myDataSource); // 通过ID获取 const targetDataSource = viewer.dataSources.getById('uniqueId123'); ``` ### 3. **遍历所有数据源** 使用`viewer.dataSources`集合遍历: ```javascript viewer.dataSources.forEach(dataSource => { if (dataSource.name === 'myLayer') { // 操作目标数据源 } }); ``` ### 4. **创建时保留引用(最简单)** 直接保存数据源变量引用: ```javascript // 创建后保留引用 let myDataSource; function addLayer() { myDataSource = new Cesium.CustomDataSource('myLayer'); viewer.dataSources.add(myDataSource); } // 后续直接使用myDataSource变量操作 function hideLayer() { myDataSource.show = false; } ``` --- ### 方法对比 | **方法** | 优点 | 缺点 | |------------------|--------------------------|--------------------------| | 保存变量引用 | 直接快速,无需查找 | 需管理变量作用域 | | `getByName()` | 通过语义化名称查找 | 名称可能重复 | | `getById()` | 精确查找(ID唯一) | 需提前记录ID | | 遍历`dataSources`| 可灵活筛选 | 效率较低 | --- ### 完整示例 ```javascript // 创建并添加两个数据源 const dataSource1 = new Cesium.CustomDataSource('roads', { id: 'transport' }); const dataSource2 = new Cesium.CustomDataSource('buildings', { id: 'architecture' }); viewer.dataSources.add(dataSource1); viewer.dataSources.add(dataSource2); // 场景1:通过名称获取(返回数组) const roadLayers = viewer.dataSources.getByName('roads'); roadLayers.forEach(layer => layer.show = false); // 隐藏所有名为"roads"的图层 // 场景2:通过ID获取(精确获取单个) const buildingLayer = viewer.dataSources.getById('architecture'); buildingLayer.entities.add({ /* 添加实体 */ }); // 场景3:通过保留的引用操作 const riverDataSource = new Cesium.CustomDataSource('rivers'); viewer.dataSources.add(riverDataSource); // ...在其他函数中直接使用riverDataSource ``` > **最佳实践**:若图层需要频繁操作,推荐创建后保留引用(方法4);若无法保留引用,则优先使用`getById()`[^1]。 §§相关问题§§ 1. 如何在Cesium中检查数据源是否已添加到Viewer? 2. `viewer.dataSources`与`viewer.entities`有何区别? 3. 如何监听Cesium数据源的添加和移除事件? [^1]: Cesium官方文档:DataSourceCollection管理方法 </think> ### 在Cesium中获取使用 `new Cesium.CustomDataSource` 创建的图层的方法 在Cesium中,获取通过 `CustomDataSource` 创建的图层主要有以下三种方法(按推荐度排序): #### 1. **创建时保留引用(最推荐)** ```javascript // 创建时保存引用 const myLayer = new Cesium.CustomDataSource('myLayer'); viewer.dataSources.add(myLayer); // 后续直接使用引用操作图层 myLayer.show = false; // 隐藏图层 ``` **优点**: - 直接访问,无需查找 - 性能最佳 - 代码简洁直观[^1] #### 2. **通过唯一名称查找** ```javascript // 创建时指定唯一名称 const myLayer = new Cesium.CustomDataSource('uniqueLayerName'); viewer.dataSources.add(myLayer); // 通过名称获取 const foundLayers = viewer.dataSources.getByName('uniqueLayerName'); if (foundLayers.length > 0) { const targetLayer = foundLayers[0]; targetLayer.show = false; } ``` **注意**: - `getByName()` 返回数组(可能多个同名) - 名称建议使用唯一标识符(如`buildingLayer_2024`) #### 3. **遍历所有数据源** ```javascript // 遍历Viewer中的所有数据源 viewer.dataSources.forEach(dataSource => { if (dataSource.name.includes('myLayer')) { dataSource.show = false; console.log('找到图层:', dataSource.name); } }); ``` **适用场景**: - 需要批量操作多个图层时 - 无法确定精确名称时 --- ### 方法对比表 | **方法** | 直接访问 | 性能 | 适用场景 | |----------------------|----------|------|------------------------------| | 保存创建引用 | ★★★★★ | ★★★★★ | 图层在局部作用域内操作 | | 按名称查找(`getByName`) | ★★☆☆☆ | ★★★☆☆ | 跨作用域访问 | | 遍历数据源 | ★☆☆☆☆ | ★★☆☆☆ | 批量操作或模糊查找 | --- ### 完整示例 ```javascript // 创建图层并保存引用 const buildingLayer = new Cesium.CustomDataSource('buildings'); viewer.dataSources.add(buildingLayer); // 添加实体到图层 buildingLayer.entities.add({ id: 'buildingA', position: Cesium.Cartesian3.fromDegrees(116.39, 39.91), box: { dimensions: new Cesium.Cartesian3(500, 500, 200) } }); // 示例1:直接通过引用操作 document.getElementById('hideBuildings').addEventListener('click', () => { buildingLayer.show = false; }); // 示例2:通过名称查找操作 document.getElementById('showBuildings').addEventListener('click', () => { const layers = viewer.dataSources.getByName('buildings'); if (layers.length) layers[0].show = true; }); // 示例3:遍历所有数据源 document.getElementById('findLayers').addEventListener('click', () => { viewer.dataSources.forEach(ds => { if (ds.name.startsWith('building')) { console.log('找到建筑图层:', ds.name); } }); }); ``` > **最佳实践**:在创建图层时立即保存引用变量,这是最高效可靠的方式。若必须在不同模块间传递,建议使用图层名称作为标识符配合`getByName()`[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值