2017-03-09 4 views
1

Je souhaite engendrer un certain nombre de copies de shape1 et shape2 dans différentes positions qui ne seront connues qu'à l'exécution, et de pouvoir modifier par programme leurs autres propriétés.Clonage et modification des paquets CZML

Quelle est la méthodologie préférée pour faire référence, cloner et modifier des paquets 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); 

Répondre

1

Cesium se CZML dans un EntityCollection plein de Entities lorsque le CzmlDataSource est chargé.

Mais avant d'expliquer plus loin, quelques précisions sur cette source de données. Si vous faites défiler vers le bas de l'exemple que vous avez posté, vous voyez ces deux lignes. Ils viennent de code officiel de l'échantillon, mais malheureusement ils ont induits en erreur quelques personnes:

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

Le nom de variable est un terme impropre. load est asynchrone et renvoie un Promise à une source de données, et non une source de données réelle. Pour obtenir une référence à la source de données réelle, vous devez obtenir un rappel lorsque la promesse résout:

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

Maintenant que vous avez un vrai dataSource (dans le rappel async), vous pouvez trouver des propriétés comme dataSource.entities qui est votre EntityCollection.

Vous ne pouvez pas cloner directement une entité, mais vous pouvez ajouter new Entity({ options... }) à un EntityCollection à partir d'un objet d'options génériques qui peut être enregistré et réutilisé plusieurs fois. Vous pouvez également modifier en direct la plupart des propriétés d'une entité pour refléter les modifications au moment de l'exécution. Bien sûr, éditer les propriétés de l'entité est beaucoup plus performant que de détruire et de recréer une Entité.

Les paquets CZML sont ignorés après la construction d'EntityCollection, mais les valeurs d'ID d'entité restent. Vous pouvez utiliser dataSource.entities.getById('...') pour rechercher l'entité qui a été créée à partir d'un paquet CZML particulier.

+0

Merci; clarifie beaucoup. "Vous ne pouvez pas cloner directement un' Entity', mais vous pouvez ajouter 'new Entity ({options ...})' à un 'EntityCollection' à partir d'un objet d'options génériques qui peut être sauvegardé et réutilisé plusieurs fois. " Comment extraire les propriétés d'un objet 'Entity' créé à partir d'un paquet CZML (à enregistrer dans un objet d'options générique pour réutilisation)? S'il vous plaît supporter avec ma stupidité; Je viens du pays du C et du C++ et je ne connais pas bien les idiomes de JS. – Slaiyer

+1

@Slaiyer ce n'est pas un chemin de code typique, et le césium ne le supporte pas directement. Une option peut être d'ignorer complètement CZML et de faire en sorte que le serveur fournisse des objets de modèle de création d'entité à la place. Une autre option pourrait être d'utiliser [CzmlDataSource.process] (http://cesiumjs.org/Cesium/Build/Documentation/CzmlDataSource.html#process) pour réintégrer un paquet czml avec l'ID modifié, dans une boucle. – emackey