我正在开发一个网络应用程序,它可以在 map 上显示集群闪电事件(因此一个巨大的集群就像雷暴形成)。
为了避免“卡住”用户界面,我使用 Javascript Worker 来执行集群。当算法完成时,问题就会发生,因为它返回一个自定义对象,在我将其发送到主页后,该对象“丢失”了一些属性:
//inside Worker.js
var cluster = new DBSCAN(e.data.params).run();
self.postMessage({"cluster": cluster});
cluster 对象基本上是 GeoPoint 对象的数组,因此:
cluster[0]
是一个像这样的 GeoPoint 对象
function GeoPoint(lat, lng){
this.lat_ = lat;
this.lng_ = lng;
}
GeoPoint.prototype.lat = function(){ return this.lat_;}
GeoPoint.prototype.lng = function(){ return this.lng_;}
当我使用 self.postMessage
发送此对象时,我丢失了 lat()
和 lng()
函数,需要绘制多边形。不过,lat_
和 lng_
属性完好无损。
我可以做什么来克服这个问题?现在我只是简单地循环结果并重建 GeoPoint
对象,它可以工作,但看起来很糟糕。
感谢您的建议!
编辑:我需要这些函数,因为绘图代码将在计算凸包之前对经纬度点执行排序。
最佳答案
What can i do to overcome this?
什么都没有 - cloning algorithm postMessage
使用的不传输原型(prototype)和函数。在另一侧重建它们是必要的。
Right now i'm simply looping over the results and reconstructing the GeoPoint objects, it works but seems very bad.
不,这就是需要做的:
var newCluster = messageData.cluster.map(function(likeapoint) {
var point = new GeoPoint();
for (p in likeapoint) // maybe a static list of copied property names
point[p] = likeapoint[p];// is faster, but not as flexible
return point;
})
// since all properties are settable as arguments in this specific case:
var newCluster = messageData.cluster.map(function(likeapoint) {
return new GeoPoint(likeapoint.lat_, likeapoint.long_);
})
关于Javascript Worker 丢失属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21408985/