美文网首页gisGIS文章集webGIS
arcgis js多线程克里金插值初体验

arcgis js多线程克里金插值初体验

作者: polong | 来源:发表于2017-05-21 19:17 被阅读170次

最近做关于雨量插值的项目,本来使用后台的GP工具做的,但是处理时间比较长需要十几秒钟左右,所以研究怎么通过前台来计算。
  参考下克里金例子,思路是生成要计算区域的100乘以100网格,然后通过函数进行计算该网格克里金值,最后利用网格和值进行渲染,使用该方法绘制速度有所提高,七秒左右就能绘制完成,不过速度还是能提高的,提高的要诀是使用多线程。
  多线程使用比较简单,只要new worker('krigingworker.js'),然后通过postmessage以及onmessage与主线程和多线程中通讯。下面给出例子
<code>
var myWorker = new Worker("krigingworker.js");
myWorker.postMessage = myWorker.webkitPostMessage || myWorker.postMessage;
myWorker.postMessage();
</code>
  krigingworker.js中
<code>
importScripts("kriging.js")
self.postMessage = self.webkitPostMessage || self.postMessage;
self.onmessage = function(e) {
self.postMessage();
}
</code>
  worker中使用别的脚本要使用importScripts导入,当需要传递参数可以transferable object(通讯时会比较快,参考worker使用),本次项目中使用Float64Array.看几个初始化范例
<code>
//定义一个字节为10248的Float64Array
var buffer=new ArrayBuffer(1024
8)
var a =new Float64Array(buffer);
//定义一个长度为1000的Float64Array
var a =new Float64Array(1000);
//定义一个[1,1,1]的Float64Array
var a =new Float64Array([1,1,1])
</code>
  我们尝试定义一个
<code>
var size =1000;
var result = new ArrayBuffer(size);
var gridPoint = new Float64Array(result);
self.postMessage(gridPoint.buffer, [gridPoint.buffer]);
</code>
  接收到数据后
<code>
myWorker.onmessage = function(e) {
var data = new Float64Array(e.data);
};
</code>

效果图

相关文章

网友评论

  • gis之家:8G的内存,可以开几个worker呢,多开几个worker的话,岂不是更快了?
    polong: @gis之家 看内核,和内核数相同最好,多开不一定快
  • 四爷在此:唐兄,你开了几个worker?效率是线性提升的吗:grin:
    四爷在此: @polong 那提升还是挺明显的😬
    polong: @四爷在此 不是线性提升
    polong: @四爷在此 开了四个,跟电脑核数有关吧,四个worker用了两秒多,原先是六七秒
  • Giser1993:点赞

本文标题:arcgis js多线程克里金插值初体验

本文链接:https://www.haomeiwen.com/subject/mokvxxtx.html