在OpenLayers Map上使用GIF作为ImageWMS的源

时间:2018-01-26 15:01:55

标签: javascript canvas openlayers animated-gif wms

OpenLayers版本2似乎显示没有任何问题的GIF。

OpenLayers:4.6.4(我现在使用的版本)只显示gif的第一帧:https://prnt.sc/i5xrun

Andreas Hocevar建议解决这个问题(https://github.com/openlayers/openlayers/issues/4133):

  

使用"自定义imageLoadFunction作为图像源。代替   返回图像本身,返回带有gif框架的画布,   您可以使用第三方库获得(例如   http://themadcreator.github.io/gifler/docs.html#animator::createBufferCanvas())"

我尝试使用他的方法,但没有设法在地图上显示画布。有人可以建议如何在地图上显示gif或如何显示持有该gif的画布吗?

这是我使用的代码:

var ImageSource = new ol.source.ImageWMS({ url: 'http://weather-services.telventdtn.com/basic/wms_v1/wms.wsgi?', params: { 'REQUEST' : 'GetAnimationFile', 'VERSION' : '1.3.0', 'SERVICE' : 'WMS', 'STYLES' : '', 'LAYERS' : 'RADAR_US_CURRENT', 'CRS' : 'EPSG:900913', 'BBOX' : '-16730536.751059378,2397065.207023127,-3629841.5992064495,8198941.401981145', 'FORMAT' : 'image/gif', 'WIDTH' : '2678', 'HEIGHT' : '1186', 'FRAMEDELAY' : '20', 'TRANSPARENT': 'TRUE' }, imageLoadFunction: function (image, src) { var client = new XMLHttpRequest(); client.open('GET', src, true); client.setRequestHeader('Authorization', "Basic " + btoa("login:password")); client.responseType = "arraybuffer"; client.onload = function () { var byteArray = new Uint8Array(this.response); var blob = new Blob([byteArray], {type: "image/png"}); var urlCreator = window.URL || window.webkitURL; var imageUrl = urlCreator.createObjectURL(blob); gifler(imageUrl) .get() .then(function(animator) { var BufferCanvas = animator.constructor.createBufferCanvas(animator._frames[0], animator.width, animator.height); animator.animateInCanvas(BufferCanvas); image.setImage(BufferCanvas); }); }; client.send(); } }); var Image = new ol.layer.Image({ name: 'precip_layer', opacity: 0.8, zIndex: 1, source: ImageSource });

{{1}}

{{1}}

2 个答案:

答案 0 :(得分:0)

解决方案是在OpenLayers v4.6.5的新版本中。以下是其官方网站上有关如何实现动画WMS图层的示例:

https://openlayers.org/en/latest/examples/wms-time.html

答案 1 :(得分:0)

我对通过imageWMS(为此使用ncWMS)下载的gif进行了成功的动画制作。

  1. 创建ImageWMS源图像图层,以从ncWMS或其他提供动画gif的WMS服务中获取动画gif。
  2. 然后,我将使用gifuct-js.js库在ImageWMS“ imageLoadFunction”中解压缩gif。
  3. 然后,我有了另一个使用ImageCanvasSource的ImageLayer,在其中我具有canvasFunction创建画布,并将其提供给gif库函数以在其上呈现。

最终结果是一层下载imageWMS,另一层将其显示为ImageCanvasSource。您可能需要进行一些投影对齐,但是现在您可以使用控件在另一个图层中对gif进行动画处理。