OpenLayers:从TileImage源创建NDVI栅格

时间:2019-01-11 09:17:49

标签: javascript openlayers

我正在尝试重新创建https://openlayers.org/en/v4.6.5/examples/raster.html中给出的示例的一部分,并进行一些调整:

  • 我使用的是TileImage源,而不是“必应地图”空中图层
  • 我正在计算NDVI而不是VGI
  • 我想将NDVI显示为灰度图,其中0值为黑色,而1值为白色
  • 我不需要在图表中计算或显示统计数据

这是我代码的相关部分:

function ndvi(pixel) {
  var n = pixel[0] / 255;
  var r = pixel[1] / 255;
  var g = pixel[2] / 255;
  return (n - r) / (n + r);
}

window["L8SourceNRG"] = new ol.source.TileImage({
  url: NRGtileURL,
  crossOrigin: 'anonymous',
  transition: 0,
  tileGrid: ol.tilegrid.createXYZ({maxZoom : maxZoomLevel})
});

window["L8SourceNDVI2"] = new ol.source.Raster({
  sources: [window["L8SourceNRG"]],
  operation: function(pixels, data) {
    var pixel = pixels[0];
    var value = ndvi(pixel);
    if (value > 0) {
      pixel[0] = value * 255;
      pixel[1] = value * 255;
      pixel[2] = value * 255;
      pixel[3] = 128;
    } else {
      pixel[3] = 0;
    }
    return pixel;
  },
  lib: {
    ndvi: ndvi
  }
});

window['L8NDVI2Layer'] = new ol.layer.Tile({ source:window["L8SourceNDVI2"], visible: false });

window['L8NDVI2Layer'].set('visible', true);

当OpenLayers尝试渲染该图层时,我收到以下无用的错误消息:

Uncaught TypeError: l.eb is not a function

我尝试使用ol-debug.js而不是ol.js运行脚本,在这种情况下,我得到以下信息:

ol-debug.js:78547 Uncaught TypeError: Cannot read property 'Processor' of undefined
    at ol.source.Raster.setOperation (ol-debug.js:78547)
    at new ol.source.Raster (ol-debug.js:78532)
    at Object.<anonymous> (map-nav.js:328)
    at Object.<anonymous> (VM23112 jquery.min.js:2)
    at j (VM23112 jquery.min.js:2)
    at Object.fireWith [as resolveWith] (VM23112 jquery.min.js:2)
    at Object.<anonymous> (VM23112 jquery.min.js:2)
    at j (VM23112 jquery.min.js:2)
    at Object.fireWith [as resolveWith] (VM23112 jquery.min.js:2)
    at x (VM23112 jquery.min.js:4)

如上面的错误所述,map-nav.js的第328行对应于上面提供的第一段代码的以下行:

sources: [window["L8SourceNRG"]],

从其他地方阅读,我认为以上错误是一个尚未解决的pixelworks依赖问题,仅影响ol-debug.js而不影响ol.js,不幸的是,尽管我可能会使用ol-debug.js,这是错误的。

我确定我的TileImage源是可以的,因为我可以在其他图层中使用它。我只能得出结论,使用TileImage源创建栅格源时需要执行一些额外的步骤,而使用Bing Maps磁贴源创建栅格源时则不需要这样做。非常感谢您提供任何线索。

编辑:添加了代码,以显示如何将源L8SourceNDVI2加载到“ L8NDVI2Layer”层中,该层最初不可见,但随后设置为可见。这些行都不会引发任何错误,并且在执行这些行之后我不会运行任何代码-该错误似乎是由于在那一点之后OL中发生的某些过程引起的,这可能与渲染图层或刷新地图有关?

编辑2:我注意到,如果将L8SourceNDVI2更改为新的ol.source.TileImage而不是Raster,则不会触发该错误,但是该图层根本不会显示在地图上。不知道这意味着什么。

1 个答案:

答案 0 :(得分:1)

$factory->define(User::class, function (Faker\Factory::create('ko_KR') $faker) 会生成图像,无论其使用的源类型如何。因此,必须使用ol.source.Raster

构造使用栅格源的图层。
ol.layer.Image