Цезий: потоковый пример CZML

Похоже, этот вопрос уже задавался, но я не смог найти подходящий пример. Я знаком с PHP, но плохо знаком с Javascript и не могу понять, как транслировать CZML.

Я хочу показать около 6,500 активов на карте. Чтобы веб-страница не отображалась ПОСЛЕ того, как все загружено (и проверяется терпение пользователей), я хочу, чтобы она отображалась, а затем загружала ресурсы в фоновом режиме.

Может кто-нибудь указать мне пример, как это сделать? Я могу загрузить файл czml следующим образом:

var czmlDataSource = new Cesium.CzmlDataSource(); 
viewer.dataSources.add(czmlDataSource); 
czmlDataSource.loadUrl('some_file.czml'); 

Но это все, что я получил:-(Я знаю, что где-то должен быть.processUrl, и я понял, что должен использовать разные пакеты в файле CZML, чтобы мой файл CZML выглядел так:

[ 
event: czml 
data: { 
    "id":"document", 
    "version":"1.0" 
  } 

event: czml 
data: { 
    "id":"1", 
    "billboard":{ 
      "image":"label.png", 
      "verticalOrigin":"BOTTOM", 
      "show":true 
    }, 
    "position":{ 
      "cartographicDegrees":[ 
        20.0, 50.0, 0 
      ] 
    } 
  } 

event: czml 
data: { 
    "id":"2", 
    "billboard":{ 
      "image":"label.png", 
      "verticalOrigin":"BOTTOM", 
      "show":true 
    }, 
    "position":{ 
      "cartographicDegrees":[ 
        10.0, 52.0, 0 
      ] 
    } 
  } 
] 

Было бы здорово, если бы кто-нибудь смог предоставить рабочий образец, например, файл.czml и файл.js. Спасибо!

2 ответа

Если у вас есть сетевой потоковый источник CZML, клиентский JavaScript-код должен вызывать process(), а не load() для настройки потокового источника.

var czmlStream = new Cesium.CzmlDataSource();
var czmlEventSource = new EventSource('some_url_to_czml');
czmlEventSource.addEventListener('czml', function(czmlUpdate) {
      try {
         var json = JSON.parse(czmlUpdate.data);
         console.log('czml event id=', json.id);
         //process the 'data:' coming across as JSON into the datasource 
         czmlStream.process(json);
      } catch (t) {
         console.error(t)
      }       
    }, false);

//put the streaming datasource into Cesium 
viewer.dataSources.add(czmlStream);

Обратите внимание, что для работы вышеуказанного кода источник потоковой передачи должен установить тип содержимого в ответе HTTP на text/event-stream,

Чтобы отменить поток от клиента, просто позвоните:

czmlEventSource .close();

Чтобы отменить поток с сервера, ответьте не с типом "текст / поток событий" Content-Type или верните HTTP-статус, отличный от 200 OK (например, 404 Not Found).

Если вы загружаете из статического файла CZML, тогда вызовите load() с URL или относительной ссылкой на файл.

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

Одна часть вопроса, на которую не дан ответ, касается формата файла czml. Пример, размещенный в вопросе, имеет несколько ошибок / недоразумений. Все ваши данные JSON должны быть в одной строке для каждого data поле, или вы можете добавить data поле для каждой строки, как у меня. Вы также должны иметь два возвращаемых символа после каждого пакета, иначе поток не будет знать, где заканчиваться, это также верно и для последнего пакета в конце файла! Я также недавно боролся с этим, и причина, по которой вы ничего не нашли на сайте Cesium, заключается в том, что это технически является частью определения форматов потока событий, а не czml. Вы можете найти больше информации о формате здесь. Ниже приведен правильный пример вашего czml, отформатированного правильно (Примечание: фрагмент удалил последние два возвращаемых символа после последнего пакета, не забудьте их!):

event: czml
data: {
data:    "id":"document",
data:    "version":"1.0"
data:  }


event: czml
data: {"id":"1",
data:        "billboard":{
data:          "image":"label.png",
data:          "verticalOrigin":"BOTTOM",
data:          "show":true
data:        },
data:        "position":{
data:          "cartographicDegrees":[
data:            20.0, 50.0, 0
data:          ]
data:        }
data:      }


event: czml
data: {"id":"me",
data:        "billboard":{
data:          "image":"label.png",
data:          "verticalOrigin":"BOTTOM",
data:          "show":true
data:        },
data:        "position":{
data:          "cartographicDegrees":[
data:            10.0, 50.0, 0
data:          ]
data:        }
data:      }

Другие вопросы по тегам