Как я могу удалить только экземпляры геометрии, добавленные к примитивам в Cesium

Я видел несколько похожих вопросов, например, как удалить все примитивы и так далее, но ни один из ответов мне не помог. Я загружаю несколько файлов CZML в свой цезий, и в то же время мне нужно добавить некоторые экземпляры геометрии, такие как код, который я предоставил здесь, в мой цезиевый файл, используя данные из моего CZML.

В моей модели есть две ситуации, в одной из них я хочу удалить все свои примитивы, источники данных и объекты, для которых я использовал следующий метод reset(). Когда я пытался удалить примитивы и объекты, у меня было DeveloperError: This object was destroyed, i.e., destroy() was called.Error, а когда я просто удалял примитив, он говорил, что некоторые объекты уже существуют в коллекции, что означает, что он не может удалить все объекты.

Во втором случае я просто хочу удалить те экземпляры геометрии, которые я создал, но я хочу сохранить другие объекты и источники данных. Если я удалю все примитивы, я потеряю некоторые сущности, которые мне нужны.

У меня есть метод загрузки CZML для создания экземпляров геометрии следующим образом:

function createMap(West,East,South,North,hNumber,VNumber){
var baseSouth=South;
    var vdivid=(North-South)/VNumber;
    var hdivid=(East-West)/hNumber;
for (var i=0;i<hNumber;i++){        
    for(var j=0;j<vNumber;j++){
    var rectangleInstance = new Cesium.GeometryInstance({
      geometry : new Cesium.RectangleGeometry({
      rectangle : Cesium.Rectangle.fromDegrees((West+j*vdivid), baseSouth,(West+(j+1)*vdivid) , baseSouth+hdivid)
      }),
      id : 'rectangle'+i+'.'+j,
      attributes : {
        color : new Cesium.ColorGeometryInstanceAttribute.fromColor(getRandomColor(0.2))
      }
    });
    scene.primitives.add(new Cesium.GroundPrimitive({
      geometryInstance : rectangleInstance
    }));        
    baseSouth=baseSouth+hdivid;
}
};

Мой метод сброса следующий:

   function reset(){
   clock.multiplier = 1.0;
   var primitives = scene.primitives.removeAll();
   viewer.dataSources.removeAll();
   viewer.entities.removeAll();
   };

getRandomColor — это функция для случайной генерации определенных цветов цезия. Я определяю этот метод, потому что хочу генерировать определенные случайные цвета (например, только ЗЕЛЕНЫЙ, ЖЕЛТЫЙ, СИНИЙ и КРАСНЫЙ).


person azar    schedule 20.10.2015    source источник
comment
Комментарий не по теме, но Cesium включает Color.fromRandom встроенная вспомогательная функция.   -  person emackey    schedule 20.10.2015
comment
Кроме того, можете ли вы опубликовать более полный пример, показывающий, как вы пытались удалить примитивы?   -  person emackey    schedule 20.10.2015
comment
@emackey Я обновил вопрос, теперь у него есть функция сброса.   -  person azar    schedule 20.10.2015


Ответы (1)


Спасибо за публикацию функции сброса. Я считаю, что проблема здесь в том, что ваш вызов scene.primitives.removeAll() удаляет примитивы, принадлежащие источнику данных. Но в этом случае, я думаю, безопасно просто изменить порядок удаления.

Попробуйте это:

function reset() {
    clock.multiplier = 1.0;

    // First, remove all dataSources.  Removing a dataSource will
    // automatically remove its associated entities & primitives.
    viewer.dataSources.removeAll();

    // Next, remove any remaining entities that weren't part of a dataSource.
    viewer.entities.removeAll();

    // Finally, it is safe to remove any remaining primitives, as we can
    // now be certain they did not belong to any dataSource or entity.
    scene.primitives.removeAll();
};
person emackey    schedule 21.10.2015