2

我希望在不同位置生成一定数量的副本,这些副本shape1只能shape2在运行时知道,并且能够以编程方式更改它们的其他属性。

引用、克隆和修改 CZML 数据包的首选方法是什么?

var czml = [{
"id" : "document",
    "name" : "CZML Geometries: Cones and Cylinders",
    "version" : "1.0"
}, {
    "id" : "shape1",
    "name" : "Green cylinder with black outline",
    "position" : {
        "cartographicDegrees" : [-100.0, 40.0, 200000.0]
    },
    "cylinder" : {
        "length" : 400000.0,
        "topRadius" : 200000.0,
        "bottomRadius" : 200000.0,
        "material" : {
            "solidColor" : {
                "color" : {
                    "rgba" : [0, 255, 0, 128]
                }
            }
        },
        "outline" : true,
        "outlineColor" : {
            "rgba" : [0, 0, 0, 255]
        }
    }
}, {
    "id" : "shape2",
    "name" : "Red cone",
    "position" : {
        "cartographicDegrees" : [-105.0, 40.0, 200000.0]
    },
    "cylinder" : {
        "length" : 400000.0,
        "topRadius" : 0.0,
        "bottomRadius" : 200000.0,
        "material" : {
            "solidColor" : {
                "color" : {
                    "rgba" : [255, 0, 0, 255]
                }
            }
        }
    }
}];

var dataSource = Cesium.CzmlDataSource.load(czml);
viewer.dataSources.add(dataSource);
4

1 回答 1

2

当 CzmlDataSource 被加载时,Cesium将 CZML 变成一个充满实体的EntityCollection 。

但在我进一步解释之前,先澄清一下该数据源。如果您滚动到您发布的示例的底部,您会看到这两行。它们来自官方示例代码,但不幸的是它们误导了一些人:

var dataSource = Cesium.CzmlDataSource.load(czml);
viewer.dataSources.add(dataSource);

变量名用词不当。 load是异步的并返回一个Promise数据源,而不是一个实际的数据源。要获得对实际数据源的引用,您必须在 promise 解决时获得回调:

Cesium.CzmlDataSource.load(czml).then(function(dataSource) {
    viewer.dataSources.add(dataSource);
    // do more things with dataSource...
});

现在您有了一个真实的dataSource(在异步回调中),您可以找到类似dataSource.entitieswhich is your EntityCollection.

您不能直接克隆实体,但您可以new Entity({ options... })从可以保存和重复使用多次的通用选项对象添加到 EntityCollection。您还可以实时编辑实体上的大多数属性以反映运行时的更改。编辑实体属性当然比销毁和重新创建实体要高效得多。

CZML 数据包在构建 EntityCollection 后被丢弃,但实体 ID 值保留。您可以使用dataSource.entities.getById('...')来查找从特定 CZML 数据包构建的实体。

于 2017-03-10T16:15:10.100 回答