克隆和修改 CZML 数据包
Cloning and modifiying CZML Packets
我希望在不同位置生成一定数量的 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);
加载 CzmlDataSource 时,Cesium 将 CZML 转换为 EntityCollection full of Entities。
但在我进一步解释之前,先澄清一下该数据源。如果您滚动到您发布的示例的底部,您会看到这两行。它们来自官方示例代码,但不幸的是它们误导了一些人:
var dataSource = Cesium.CzmlDataSource.load(czml);
viewer.dataSources.add(dataSource);
变量名用词不当。 load
是异步的,returns 是一个 Promise
到数据源,而不是实际的数据源。要获得对实际数据源的引用,您必须在 promise 解析时获得回调:
Cesium.CzmlDataSource.load(czml).then(function(dataSource) {
viewer.dataSources.add(dataSource);
// do more things with dataSource...
});
现在您有了一个真正的 dataSource
(在异步回调中),您可以找到像 dataSource.entities
这样的属性,这是您的 EntityCollection
.
您不能直接克隆实体,但您可以将 new Entity({ options... })
添加到通用选项对象的 EntityCollection 中,该对象可以保存并多次重复使用。您还可以实时编辑实体上的大部分属性以反映运行时的更改。编辑实体属性当然比销毁和重新创建实体更高效。
CZML 数据包在构建 EntityCollection 后被丢弃,但实体 ID 值仍然存在。您可以使用 dataSource.entities.getById('...') 来查找从特定 CZML 数据包构建的实体。
我希望在不同位置生成一定数量的 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);
加载 CzmlDataSource 时,Cesium 将 CZML 转换为 EntityCollection full of Entities。
但在我进一步解释之前,先澄清一下该数据源。如果您滚动到您发布的示例的底部,您会看到这两行。它们来自官方示例代码,但不幸的是它们误导了一些人:
var dataSource = Cesium.CzmlDataSource.load(czml);
viewer.dataSources.add(dataSource);
变量名用词不当。 load
是异步的,returns 是一个 Promise
到数据源,而不是实际的数据源。要获得对实际数据源的引用,您必须在 promise 解析时获得回调:
Cesium.CzmlDataSource.load(czml).then(function(dataSource) {
viewer.dataSources.add(dataSource);
// do more things with dataSource...
});
现在您有了一个真正的 dataSource
(在异步回调中),您可以找到像 dataSource.entities
这样的属性,这是您的 EntityCollection
.
您不能直接克隆实体,但您可以将 new Entity({ options... })
添加到通用选项对象的 EntityCollection 中,该对象可以保存并多次重复使用。您还可以实时编辑实体上的大部分属性以反映运行时的更改。编辑实体属性当然比销毁和重新创建实体更高效。
CZML 数据包在构建 EntityCollection 后被丢弃,但实体 ID 值仍然存在。您可以使用 dataSource.entities.getById('...') 来查找从特定 CZML 数据包构建的实体。