2017-03-09 2 views
1

shape1shape2의 특정 수를 런타임에 다른 위치에 알리고 프로그램 적으로 다른 속성도 변경할 수 있기를 원합니다.CZML 패킷 복제 및 수정

CZML 패킷을 참조, 복제 및 수정하는 데 선호되는 방법은 무엇입니까? CzmlDataSource로드시

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); 

답변

1

세슘 Entities 가득 EntityCollection로 CZML 변.

하지만 앞서 자세히 설명하기 전에 해당 데이터 소스에 대한 설명이 나와 있습니다. 게시 한 예제의 맨 아래로 스크롤하면이 두 줄을 볼 수 있습니다. 공식 샘플 코드에서 나온 것입니다. 그러나 불행히도 몇 사람을 오해했습니다.

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

변수 이름은 잘못된 것입니다. load은 비동기이며 Promise을 실제 데이터 소스가 아닌 dataSource에 반환합니다. 약속이 해결 될 때 실제 데이터 소스와 참조를 얻으려면, 당신은 콜백을 얻을 수 있습니다

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

을 지금이다 dataSource.entities처럼 당신이, 당신이 찾을 수 dataSource (비동기 콜백 내부) 실제 속성을 가지고 당신의 EntityCollection.

직접 개체를 복제 할 수는 없지만 여러 번 저장하고 다시 사용할 수있는 일반 옵션 개체에서 new Entity({ options... })을 EntityCollection에 추가 할 수 있습니다. 또한 런타임시 변경 사항을 반영하기 위해 대부분의 속성을 실시간으로 편집 할 수 있습니다. 물론 엔티티 속성을 편집하는 것은 엔티티를 파괴하고 다시 만드는 것보다 훨씬 더 효과적입니다.

CZML 패킷은 EntityCollection을 만든 후에 삭제되지만 엔터티 ID 값은 그대로 유지됩니다. dataSource.entities.getById('...')을 사용하여 특정 CZML 패킷에서 작성된 엔터티를 찾을 수 있습니다.

+0

감사합니다. 제비 뽑기를 명백하게한다. "직접 엔티티를 복제 할 수는 없지만 여러 번 저장하고 재사용 할 수있는 일반 옵션 오브젝트에서 새로운 엔티티 ({options ...})를'EntityCollection'에 추가 할 수 있습니다. " CZML 패킷 (재사용을 위해 일반 옵션 객체에 저장)에서 생성 된'Entity' 객체에서 속성을 어떻게 추출합니까? 내 어리 석음을 참아주십시오. 나는 C와 C++의 땅에서 왔고 JS 관용구에 정통하지 않습니다. – Slaiyer

+1

@Slaiyer는 일반적인 코드 경로가 아니며 Cesium은이를 직접 지원하지 않습니다. 하나의 옵션은 CZML을 완전히 건너 뛰고 서버가 엔티티 생성 템플리트 객체를 대신 제공하도록하는 것입니다. 또 다른 옵션은 [CzmlDataSource.process] (http://cesiumjs.org/Cesium/Build/Documentation/CzmlDataSource.html#process)를 사용하여 ID가 ​​변경된 czml 패킷을 루프에서 다시 가져 오는 것입니다. – emackey