Cesium中如何正确移除之前添加的Entity?

端木树萱 阅读 44

我在用Cesium做轨迹回放功能,每次重新加载数据前想清空之前的entity,但调用remove后地图上还是有残留,不知道是不是方法用错了。

我试过这样写:

const entity = viewer.entities.add({
  position: Cesium.Cartesian3.fromDegrees(116.4, 39.9),
  point: { pixelSize: 10, color: Cesium.Color.RED }
});
viewer.entities.remove(entity); // 这行执行了但点还在

控制台没报错,但地图上的红点没消失,是我漏了什么步骤吗?

我来解答 赞 11 收藏
二维码
手机扫码查看
2 条解答
程序员玉茂
你的代码写法没问题,viewer.entities.remove(entity) 确实可以移除单个entity。

但实际开发中轨迹回放这种场景,一般都是批量添加entity的,更常见的是用 removeAll() 一次性清空:

// 清空所有entity
viewer.entities.removeAll();

// 然后重新添加新的数据
const entity = viewer.entities.add({...});


如果你非要逐个移除,得确保你移除的是正确的引用。Cesium对entity的管理有点奇怪,有时候同一个id的entity你连续add两次,remove的时候只传id也能删:

// 用id移除
viewer.entities.removeById('your-entity-id');

// 或者拿到DataSourceCollection来管理会更清晰
const dataSource = new Cesium.CustomDataSource();
dataSource.entities.add({...});
viewer.dataSources.add(dataSource);

// 用完直接清掉整个dataSource
viewer.dataSources.remove(dataSource);


另外提醒一下,如果你用的是czml或者gpx加载的轨迹数据,最好是通过 viewer.dataSources 来管理,加载新数据前把旧的dataSource删掉,这样最干净。
点赞
2026-03-19 02:01
东方巧梅
Cesium的entity有时候会抽风,remove之后确实可能残留。直接暴力清空整个entities集合更靠谱:

viewer.entities.removeAll();
// 或者干脆重新创建viewer
viewer.entities = new Cesium.EntityCollection();


如果非要单个删,试试在remove之后加个viewer.scene.requestRender()强制刷新。
点赞 1
2026-03-09 15:02