有关更多详细信息,请参见此链接。
问题:
我想遍历一个连续的栅格(一个没有属性表的栅格),逐个像元,并获取像元的值。我想采用这些值并对它们运行条件,模拟下面详细介绍的地图代数步骤,而无需实际使用栅格计算器。
根据下面的评论请求,我添加了详细信息,为问题提供了背景,并证明有必要在下面称为“所需的分析:”的部分中实施这样的方法。
下面提出的分析虽然通过提供背景与我的问题相关,但无需在答案中进行。问题的范围仅涉及对连续栅格进行迭代以获取/设置像元值。
分析需要:
如果满足以下任一条件,则将输出单元格的值设置为1。如果不满足任何条件,则仅将输出单元格的值设置为0。
条件1:如果单元格值大于顶部和底部单元格,则给出值1:
Con("raster" > FocalStatistics("raster", NbrIrregular("C:\filepath\kernel_file.txt"), "MAXIMUM"), 1, 0)
内核文件如下所示:
3 3
0 1 0
0 0 0
0 1 0
条件2:如果单元格值大于左右单元格,则给定值1:
Con("raster" > FocalStatistics("raster", NbrIrregular("C:\filepath\kernel_file.txt"), "MAXIMUM"), 1, 0)
内核文件如下所示:
3 3
0 0 0
1 0 1
0 0 0
条件3:如果单元格的值大于左上角和右下角的单元格,则将值设为1:
Con("raster" > FocalStatistics("raster", NbrIrregular("C:\filepath\kernel_file.txt"), "MAXIMUM"), 1, 0)
内核文件如下所示:
3 3
1 0 0
0 0 0
0 0 1
条件4:如果单元格值大于左下和右上单元格,则将值设为1:
Con("raster" > FocalStatistics("raster", NbrIrregular("C:\filepath\kernel_file.txt"), "MAXIMUM"), 1, 0)
内核文件如下所示:
3 3
0 0 1
0 0 0
1 0 0
条件5:如果任何相邻像元的值等于中心像元的值,则将输出栅格的值设为1(使用具有两次最近邻域计算的焦点变化)
为什么不使用地图代数?
下文已指出,可以使用地图代数解决我的问题,但是如上所示,这是总共六个栅格计算,再加上一个将所有创建的栅格合并在一起的计算。在我看来,这是很多更有效的去细胞通过细胞和做所有比较的同时在每个单元而不是通过各自单独七次循环和利用相当多的内存来创建7个栅格。
应该如何解决该问题?
上面的链接建议使用IPixelBlock接口,但是从ESRI文档中尚不清楚您是通过IPixelBlock本身访问单个单元格值,还是从设置的IPixelBlock大小访问多个单元格值。一个好的答案应该提出一种访问连续栅格像元值的方法,并提供对代码背后的方法的解释(如果不是很明显的话)。
综上所述:
遍历连续栅格(没有属性表)中的每个像元以访问其像元值的最佳方法是什么?
一个好的答案不需要实现上述分析步骤,它仅需要提供一种访问栅格像元值的方法即可。