我有一个Cesiumjs显示,我有一个复选框(类.checkbox
),我想控制地图上项目的显示。 :
var loadedGeometries = {};
// We want to load/unload geometries when clicking on the checkboxes
$('.checkbox').on('click', function (event) {
var geometryID = id; // some unique database ID for the object to be displayed
if ($(this).prop('checked')) {
// it's checked, load it onto the map
$.get('/geometry/' + geometryID, function (data) {
var myDataSource = Cesium.GeoJsonDataSource.load(data['points'], {
markerSize: 24,
markerColor: Cesium.Color.RED,
markerSymbol: 't'
}); // data['points'] is GeoJSON
// Add it to the viewer
viewer.dataSources.add(myDataSource);
// Remember the data source by ID so we can delete later
loadedGeometries[geometryID] = myDataSource;
}, 'json');
// SUCCESS! THIS PART WORKS!!
} else {
// unchecked, unload it from the map
viewer.dataSources.remove(loadedGeometries[geometryID], true);
delete loadedGeometries[geometryID];
// FAILURE: OBJECT STILL ON THE MAP?!
}
});
几何图形加载并按照我的预期显示,但是当我取消选中该框时,数据会保留在地图上。我不清楚remove
上的dataSource
函数是否正在做我期望它做的事情。这是从显示屏中删除DataSource
的正确方法吗?
答案 0 :(得分:2)
这里的根本问题是Cesium.GeoJsonDataSource.load
正在返回一个promise,而不是一个真正的dataSource。这意味着您尝试.remove
来自数据源列表的承诺,但这并不起作用。有趣的是,将承诺添加到dataSources 列表可以正常工作,它只是异步添加。无论如何试试这个:
Cesium.GeoJsonDataSource.load(data['points'], {
markerSize: 24,
markerColor: Cesium.Color.RED,
markerSymbol: 't'
}).then(function(myDataSource) {
// Add it to the viewer
viewer.dataSources.add(myDataSource);
// Remember the data source by ID so we can delete later
loadedGeometries[geometryID] = myDataSource;
});
我要做的另一个评论,请查看dataSource.show
标记。如果您认为用户将关闭和重新打开源,您可能不想从头开始卸载和重新加载。您可以将show
设置为false,同时切换为关闭状态,它会更快地恢复。它当然会继续消耗内存,但这并不是什么大不了的事情,除非它有半千兆字节的数据或更多。当show是假的时候,它不会不必要地对CPU或GPU征税。