【问题标题】:OpenLayers: Creating NDVI raster from TileImage sourceOpenLayers:从 TileImage 源创建 NDVI 栅格
【发布时间】:2019-06-06 04:42:26
【问题描述】:

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

  • 我使用的是 TileImage 源而不是 Bing Maps Aerial 图层
  • 我计算的是 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,则不会触发错误,但图层根本不会显示在地图上。不知道这是什么意思。

【问题讨论】:

  • 我认为你不能把源放在源下。你的那个来源的图层在哪里?您应该按照地图 -> 图层 -> 来源
  • 我提到的示例 (openlayers.org/en/v4.6.5/examples/raster.html) 使用源结构下的源,所以我认为这不会导致问题。我已经编辑了我的问题以包含将 L8SourceNDVI2 放入图层的代码。
  • window['L8NDVI2Layer'] = new ol.layer.Tile({ 应该是window['L8NDVI2Layer'] = new ol.layer.Image({
  • 当然!我没想到要检查的一个地方。解决了它-感谢@Mike。如果您想将您的评论复制到答案中,我会接受它,您可以抓住积分。

标签: javascript openlayers


【解决方案1】:

ol.source.Raster 生成图像,而不管它使用的源类型如何。因此,必须使用ol.layer.Image 构建使用栅格源的图层@

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    相关资源
    最近更新 更多