Cesium:CZML 的流媒体示例

Ste*_*man 4 cesium czml

之前好像有人问过这个问题,但我一直找不到合适的例子。我熟悉 PHP,但不熟悉 Javascript,无法弄清楚如何流式传输 CZML。

我想在地图上显示大约 6.500 个资产。为了防止网页在加载完所有内容后显示(并测试用户的耐心),我希望它显示然后在后台加载资产。

有人可以指出我如何做到这一点的例子吗?我可以像这样加载 czml 文件:

var czmlDataSource = new Cesium.CzmlDataSource(); 
viewer.dataSources.add(czmlDataSource); 
czmlDataSource.loadUrl('some_file.czml'); 
Run Code Online (Sandbox Code Playgroud)

但这就是我得到的 :-( 我知道我应该在某处使用 .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 
      ] 
    } 
  } 
] 
Run Code Online (Sandbox Code Playgroud)

如果有人可以提供一个工作样本,那么一个 .czml 文件和一个 .js 文件,那就太好了。谢谢!

Jas*_*nM1 5

如果有一个流式 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);
Run Code Online (Sandbox Code Playgroud)

请注意,要使上述代码正常工作,流媒体源必须将 HTTP 响应中的内容类型设置为text/event-stream.

要取消来自客户端的流,只需调用:

czmlEventSource.close();
Run Code Online (Sandbox Code Playgroud)

要取消来自服务器的流,请使用非“文本/事件流”内容类型进行响应或返回 200 OK 以外的 HTTP 状态(例如 404 Not Found)。

如果您从静态 CZML 文件加载,则使用 URL 或相关文件引用调用 load()。

var dataSource = Cesium.CzmlDataSource.load('some_file.czml');
viewer.dataSources.add(dataSource);
Run Code Online (Sandbox Code Playgroud)