从Cesium Display加载和卸载GeoJSON

时间:2016-05-18 19:55:04

标签: javascript jquery cesium

我有一个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的正确方法吗?

1 个答案:

答案 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征税。