Я пытаюсь воссоздать часть примера, приведенного на 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)
Строка 328 файла map-nav.js, как указано в приведенной выше ошибке, соответствует следующей строке первого блока кода, представленного выше:
sources: [window["L8SourceNRG"]],
Из прочтения в другом месте, я полагаю, что вышеупомянутая ошибка - это неразрешенная проблема зависимости от pixelworks, которая затрагивает только ol-debug.js, а не ol.js, и, к сожалению, означает, что я не могу использовать ol-debug.js, хотя я могу быть неправильно в этом.
Я уверен, что мой источник TileImage в порядке, так как я могу использовать его в других слоях. Я могу только заключить, что при использовании источника TileImage для создания растрового источника требуется дополнительный шаг, который не требуется при использовании источника листов Bing Maps для создания растрового источника. Буду очень признателен за любые подсказки здесь.
РЕДАКТИРОВАТЬ: Добавлен код, чтобы показать, как исходный L8SourceNDVI2 загружается в слой 'L8NDVI2Layer', который изначально не виден, но затем установлен на видимость. Ни одна из этих строк не выдает никаких ошибок, и я не запускаю никакого кода после того, как эти строки выполнены - ошибка, кажется, происходит от какого-то процесса, который происходит в OL после этой точки, возможно, из-за рендеринга слоя или обновления карты
РЕДАКТИРОВАТЬ 2: Я заметил, что если я заменю L8SourceNDVI2 на новый ol.source.TileImage, а не на Растр, ошибка не сработает, но слой вообще не отобразится на карте. Не уверен, что это значит.