编辑:我用来处理栅格数据的脚本中有一个错误,因此,引起问题的是栅格中的数据,而不是我用来访问它的代码。
我正在尝试使用ArcGis Javascript API v3.25来根据速度数据即时为RasterLayer重新着色。我将速度存储在数组中,并按地形类型排序,而RasterLayer具有值的地形类型。但是,在我的pixelFilter函数中,当我拉 pixelData.pixelBlock.pixels [0] 时,RasterLayer尝试刷新时将其作为参数传递(据我所知) all的元素具有相同的值,-2147483648。
这太奇怪了,因为它看起来不像我可以从最大整数值上获得的东西,而且我再次检查了属性表,并且terrain类型值大致在(0,1100)范围内。此外,除了着色逻辑外,所有renderPixels内容与示例中的内容基本相同。由于我可以在示例中找到关于RasterLayers的几乎所有有用信息(在很多情况下esri文档几乎没有用),所以我什至不十分确定还要尝试什么或如何调试它。
我在ArcMap中查看了 NoData值为-2147483648 (与pixelBlock.pixels [0]中的每个值相同,但是在ascii文件中,它从NoData转换为-9999。 ImageService或RasterLayer都丢失了所有数据,并认为每个单元格都是NoData(当我查看ArcMap中的属性表时就可以了) 另外,我使用的是默认的.adf Esri网格栅格格式,而不是.tif,而且不确定是否与ImageService / RasterLayer兼容。
我也对RasterLayer使用.tif文件尝试了该操作,它给出了相同的错误,所有元素均为-2147483648。我尝试弄乱RasterLayer构造函数的选项,但是找不到关于它们做什么的大量文档,因此我目前仅使用pixelFilter。 ImageServiceParams重要吗? 这是我的代码的相关部分
rasterlayers[0] = new RasterLayer("https://------------------------/rest/services/Mobility/2928/ImageServer")
map.addLayer(rasterLayers[0]);
...
var recolor = terrain[0].on( "update-end", function ()
{
var terrain = getRaster(focusedTerrain)[0];
terrain.setPixelFilter( renderPixels);
terrain.redraw();
});
...
function renderPixels(pixelData){
var pixelBlock = pixelData.pixelBlock;
var pixels = pixelBlock.pixels;
var mask = pixelBlock.mask;
var numPixels = pixelBlock.width * pixelBlock.height;
if (pixels == null) {
return;
}
var p1 = pixels[0];//this array is
var pr = new Uint8Array(p1.length); //set up array for red values
var pg = new Uint8Array(p1.length); //set up array for green values
var pb = new Uint8Array(p1.length); //set up array for blue values
if (mask == null) {
mask = new Uint8Array(p1.length); //mask = new Uint8Array(p1.length);
pixelBlock.mask = mask;
}
...
var last = speedBreaks.length-1;
if(speed <= speedBreaks[1].speedInput.value){
pr[i] = speedBreaks[0].color.r;
pg[i] = speedBreaks[0].color.g;
pb[i] = speedBreaks[0].color.b;
}
for(var j = 1; j < last; j++)
if(speed > speedBreaks[j].speedInput.value && speed <= speedBreaks[j+1].speedInput.value){
pr[i] = speedBreaks[j].color.r;
pg[i] = speedBreaks[j].color.g;
pb[i] = speedBreaks[j].color.b;
}
if(speed > speedBreaks[last].speedInput.value){
pr[i] = speedBreaks[last].color.r;
pg[i] = speedBreaks[last].color.g;
pb[i] = speedBreaks[last].color.b;
}
...
pixelData.pixelBlock.pixels = [pr, pg, pb];
pixelData.pixelBlock.statistics = null;
pixelData.pixelBlock.pixelType = "U8";