Arcgis Javascript API v3.25:来自pixelFilter函数参数的不正确的Pixel数据

时间:2018-07-12 21:13:33

标签: javascript api arcgis raster

编辑:我用来处理栅格数据的脚本中有一个错误,因此,引起问题的是栅格中的数据,而不是我用来访问它的代码。

我正在尝试使用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兼容。

编辑2

我也对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";

0 个答案:

没有答案