2014-01-15 141 views
11

我目前正在考虑使用Cesium作为一种可视化个人项目数据的方式,实时更新将是一件很棒的事情。使用HTML5将CZML流式传输为铯EventSource

阅读维基,我发现this section概述了如何使用HTML EventSource API实现在Cesium中动态更新对象的方式。

我在Node.js中编写了一个相当简单的服务器,它创建了一个定期发送对象位置更新的text/event-stream。这部分工作正常,我可以成功连接并记录这些数据到控制台。

我的问题在于铯。我花了好几个小时仔细阅读文档(包括下载的Github wiki和JSDoc文档),但我无法弄清楚如何让我的CZML被添加到全球。使用随源代码提供的Cesium Viewer应用程序,我可以看到如何从本地和远程资源加载CZML文件,但我无法弄清楚如何修改此方法来从EventSource事件中获取CZML数据包。

我CZML包的样品:

{ 
    'id': 'myObject', 
    'availability': '2014-01-15T00:00Z/2014-01-01T24:00Z', 
    'point': { 
    'color': { 
     'rgba': [255, 255, 0, 255] 
    }, 
    'outlineWidth': 2.0, 
    'pixelSize': 3.0, 
    'show': true 
    }, 
    'position': { 
    'cartesian': [0.0, -2957000.0, -840000.0, 5581000.0], 
    'epoch': '2014-01-01T00:00Z', 
    'interpolationAlgorithm': 'LINEAR', 
    'interpolationDegree': 1 
    } 
} 

我目前的做法如下:

var czmlStream; 
var czmlStreamUrl = 'http://127.0.0.1:8080/czml-stream'; 

viewer.dataSources.add(czmlStream); 

var czmlEventSource = new EventSource(czmlStreamUrl); 
czmlEventSource.addEventListener('czml', function(czmlUpdate) { 
    czmlStream.load(JSON.parse(czmlUpdate.data)); 
}, false); 

不幸的是,这是行不通的。我根据它的静态CZML文件如何被加载:

var source; 
var sourceURL = 'http://127.0.0.1/czml-static.czml'; 

source.loadUrl(sourceURL).then(function() { 
    viewer.dataSources.add(source); 
} 

有谁知道我错了,或者更好的是,这样做的正确方法吗?如果有区别,我使用铯b24。如果您需要更多的信息来帮助我,请提问,我会更新问题。

我试过谷歌搜索解决方案和示例代码,但我找不到任何东西,除了描述如何使用EventSource的wiki page

回答

8

我知道这个问题是几个星期大,但你有没有解决这个问题?从上面的例子中,我注意到的第一件事是您调用czmlStream.load而不是czmlStream.process。 load清除了现有数据,而process没有。对于流式传输,调用加载只会导致最后一个数据包出现。