Как настроить источник данных czml?

У меня есть данные CZML, которые я извлек с помощью python. У меня есть здания с их геометрией, высотой, идентификатором здания и интервалами. каждый интервал имеет значение. После загрузки данных czml в Cesium я хотел бы получить доступ к атрибутам, а затем настроить цвет зданий в соответствии с заданным значением. Вот пример моего CZML:

[{ "id": "документ", "версия": "1.0" }, { "id": 32, "доступность": "2014-01-01T00:00:00Z/2014-12-31T00:00:00Z ", "polygon": { "positions": { "cartographicDegrees": [54.7162360431897, 24.4519912715277, 0, 54.716219612921, 24.4519754832587, 0, 54.7162501395131, 24.4519488635358, 0, 54.7162465684811, 24.4519454316688, 0, 54.7162670831639, 24.4519275432238, 0, 54.7162707308589, 24.4519310439514 , 0, 54.7163022563025, 24.4519035537608, 0, 54.7161962974502, 24.4518018819532, 0, 54.7161647729823, 24.4518293730395, 0, 54.7162035538772, 24.4520196028966, 0, 54.7162360431897, 24.4519912715277, 0] }, "someProperty": [{ "interval": "2014-00- 01T00:00:00Z/2014-01-01T00:00:00Z", "En_C_need": 0.7}, { "interval": "2014-01-01T00:00:00Z/2014-02-01T00:00:00Z" , "En_C_need": 1.0 }, { "interval": "2014-02-01T00:00:00Z/2014-03-01T00:00:00Z", "En_C_need": 2.6}, { "interval": "2014-03-01T00:00:00Z/2014-04-01T00:00:00Z", "En_C_need": 12.1}, { "interval": "2014-04 -01T00:00:00Z/2014-05-01T00:00:00Z", "En_C_need": 30.2 }, { "interval": "2014-05-01T00:00:00Z/2014-06-01T00:00:00Z ", "En_C_need": 37,8 }], "extrudedHeight": 6,0 } }]

У меня есть другие данные GeoJSON, которые я настроил, я попробовал тот же метод, но он не сработал.

Вот что я пытаюсь сделать (это не работает):

var test2 = Cesium.CzmlDataSource.load ('Data/czml/TESTING/example_8.czml');
test2.then(function (dataSource) {
    viewer.dataSources.add(test2);
    viewer.zoomTo (test2);
var entities = dataSource.entities.values; 

    var colorHash = {};
    var Energy = [];
    for (var i = 0; i < entities.length; i++) {
        var entity = entities[i];
        Energy = entity.someProperty.En_C_need;
        var color = colorHash [Energy];
        if(!color ) {
            if (Energy < 5 ) {
            color = Cesium.Color.DARKSALMON.withAlpha (0.95);
        } else if (Energy < 10) {
                color = Cesium.Color.BURLYWOOD.withAlpha (0.95);
        } else if (Energy < 20) {
                color = Cesium.Color.RED.withAlpha (0.95);
        } else {
                color = Cesium.Color.PINK.withAlpha (0.95); 
        };
        colorHash[Energy] = color;
        };
        entity.polygon.fill = true;
        entity.polygon.material = color;
        entity.polygon.outline = false;     
    };

});


person Pink Ama    schedule 15.08.2017    source источник


Ответы (1)


Чтобы начать с решения - вот рабочий plnkr: https://plnkr.co/edit/P1Cg4DNJYtK9r9XrLzxK?p=preview

Я изменил несколько вещей в вашем коде: 1) viewer.dataSources.add(test2); должно быть за пределами вашего промиса (на самом деле это не имеет значения, но это более чистый код - использование промиса внутри промиса кажется странным). 2) Согласно спецификации свойств CZML, вам необходимо разместить свойства в правильном месте в CZML. Он должен быть не внутри полигона, а в «корне»:

var czml = [{"id": "document", "version": "1.0"},
{
    "id": 32, "availability": "2014-01-01T00:00:00Z/2014-12-31T00:00:00Z", "properties": {
    "someProperty": [
        {"interval": "2014-00-01T00:00:00Z/2014-01-01T00:00:00Z", "En_C_need": 0.7}, 
        {"interval": "2014-01-01T00:00:00Z/2014-02-01T00:00:00Z", "En_C_need": 1.0},
        {"interval": "2014-02-01T00:00:00Z/2014-03-01T00:00:00Z", "En_C_need": 2.6},
        {"interval": "2014-03-01T00:00:00Z/2014-04-01T00:00:00Z", "En_C_need": 12.1},
        {"interval": "2014-04-01T00:00:00Z/2014-05-01T00:00:00Z", "En_C_need": 30.2},
        {"interval": "2014-05-01T00:00:00Z/2014-06-01T00:00:00Z", "En_C_need": 37.8}
        ],
},
    "polygon": {
        "positions": {
            "cartographicDegrees":
                [54.7162360431897, 24.4519912715277, 0, 54.716219612921, 24.4519754832587, 0, 54.7162501395131, 24.4519488635358, 0, 54.7162465684811, 24.4519454316688, 0, 54.7162670831639, 24.4519275432238, 0, 54.7162707308589, 24.4519310439514, 0, 54.7163022563025, 24.4519035537608, 0, 54.7161962974502, 24.4518018819532, 0, 54.7161647729823, 24.4518293730395, 0, 54.7162035538772, 24.4520196028966, 0, 54.7162360431897, 24.4519912715277, 0]
        },
        "extrudedHeight": 6.0
    }
}];

Затем вы можете запросить свойства в соответствии с интервалом (Energy = entity.properties.getValue(viewer.clock.currentTime).someProperty.En_C_need;) и получить Энергию в текущее время зрителя.

Обновление после комментирования: ваш код не предназначен для динамических изменений. Вам необходимо установить значение либо с помощью callbackProperty, как в этом примере: plnkr.co/edit/lm290uaQewEvfIOgXbDP?p=preview, либо с помощью timeIntervalCollection

person yccteam    schedule 21.08.2017
comment
Спасибо за ответ. Да, я понял, что в CZML неправильный порядок, но цвета не меняются даже в вашем решении. в любом случае, я придумал другой способ обойти это, я анимирую высоту здания количеством энергии, которое оно содержит, и связываю их с диаграммами, что облегчает понимание изменения высоты. Спасибо еще раз :) - person Pink Ama; 24.08.2017
comment
Он меняет цвет в зависимости от значения. Посмотрите на пример. В настоящее время отправляемое значение равно 1 (занимает первый интервал). Следовательно, он показывает цвет DARKSALMON. Если вы измените DARKSALMON на GREEN (или измените набор данных...), вы увидите зеленый многоугольник. - person yccteam; 24.08.2017
comment
Хм, это странно, я попробовал Chrome и Firefox, я попытался скопировать ваш код на свой локальный хост, и все равно он не изменился ... Ползунок времени работает до декабря только с Dark Salmon. - person Pink Ama; 24.08.2017
comment
О, теперь я понимаю, что вы имеете в виду. Ваш код не предназначен для динамических изменений. Вам нужно установить значение либо с помощью callbackProperty, как в этом примере: p=preview или с помощью timeIntervalCollection - cesiumjs.org/ Цезий/Сборка/Документация/ - person yccteam; 28.08.2017
comment
Большое тебе спасибо. это именно то, что мне нужно :) - person Pink Ama; 28.08.2017
comment
как вы думаете, вы можете помочь мне с его вопросом one-in" title="добавление выбранного объекта в массив возвращает неопределенное значение, за исключением текущего in">stackoverflow.com/questions/46294906/ Поскольку вы уже знаете о цезии. Я застрял, кажется, никто не знает, как мне с этим помочь. - person Pink Ama; 20.09.2017