geotrellis使用(二十八)栅格数据色彩渲染(多波段真彩色)

目录

一、前言

       上一篇文章介绍了如何使用Geotrellis渲染单波段的栅格数据,已然很是头疼,这几天不懈努力之后工作又进了一步,整清楚了如何使用Geotrellis将多个(3个)波段的栅格数据渲染成真彩色,废话不多说,进入正题。

二、实现过程

       其实基本延续上一篇文章的思路,多波段真彩色就是要将三个波段数据分别作为rgb组合起来得到rgb值进行真彩色渲染。所以与单波段不同的是需要提前获取三个波段的整体信息,以及对波段进行rgb合并。

2.1 获取三个波段整体信息

       就是将上一篇文章(geotrellis使用(二十七)栅格数据色彩渲染)中的获取单个波段整体信息计算三次,分别与rgb波段对应。

2.2 三个波段合并

       多波段真彩色相较单波段就复杂在这里,我们需要首先将三个波段按照rgb的顺序拼成一个多波段瓦片,然后再将此多波段瓦片转成一个真彩色单波段瓦片,再根据真彩色颜色值进行渲染。这里面有很多细节需要注意,现逐一介绍之。

1、波段亮度值归一化操作

       由于三个波段中其亮度范围各不相同,而最后又需要将三个波段的亮度值合并成一个rgb的颜色值,那么必须将三个波段都归一化到[0, 255],否则最后无法得到真彩色效果。其实现代码如下:

tile.normalize(omin, omax, 0, 255).convert(ByteConstantNoDataCellType)

       其中tile为单波段的瓦片,omin、omax为该波段原始的亮度值范围(由2.1中方法获得),convert(ByteConstantNoDataCellType)表示将归一化的瓦片转换成Byte数据类型。

2、拼成多波段瓦片,代码如下:

val multiTile = MultibandTile(tiles)

       其中tiles为经过归一化并convert处理后的瓦片集合。

3、将多波段瓦片转变成真彩色单波段瓦片

       其实就是将三个波段的亮度值分别作为rgb的值,合并成一个波段的亮度值,在geotrellis中也已经实现了该转换方法,代码如下:

val colorTile = mmultiTIle.color

       其中multiTile即上一步中获取到的多波段瓦片,我们可以看一下geotrellis此块的源代码。

def color(): Tile = {
    assert(self.bandCount == 3 || self.bandCount == 4)

    if(self.bandCount == 3) {
      self.convert(IntConstantNoDataCellType).combine(0, 1, 2) { (rBand, gBand, bBand) =>
        val r = if (isData(rBand)) { rBand } else 0
        val g = if (isData(gBand)) { gBand } else 0
        val b = if (isData(bBand)) { bBand } else 0

        if(r + g + b == 0) 0
        else {
          ((r & 0xFF) << 24) | ((g & 0xFF) << 16) | ((b & 0xFF) << 8) | 0xFF
        }
      }
    } else {
      self.convert(IntConstantNoDataCellType).combine(0, 1, 2, 3) { (rBand, gBand, bBand, aBand) =>
        val r = if (isData(rBand)) { rBand } else 0
        val g = if (isData(gBand)) { gBand } else 0
        val b = if (isData(bBand)) { bBand } else 0
        val a = if (isData(aBand)) { aBand } else 0

        if(r + g + b == 0) 0
        else {
          ((r & 0xFF) << 24) | ((g & 0xFF) << 16) | ((b & 0xFF) << 8) | (a & 0xFF)
        }
      }
    }
  }

       可以看到其实现过程正如我们所想的,不同的是如果是4个波段的多波段瓦片,会有一个波段亮度值作为a的值,表示透明度。其中self就是我们的multiTile,此处运用了扩展方法,我会另起一篇博客专门介绍scala中的泛型以及扩展方法。

4、将真彩色瓦片转换为png图像传输到前台,代码如下:

colorTile.renderPng().bytes

       由于colorTile亮度值就是标准的rgb值,所以此处使用其默认的转换方法即可。将png发送到前台,前台即可浏览到真彩色瓦片。

三、总结

       本文简单为大家介绍了如何实现栅格数据的多波段真彩色渲染,有了单波段的基础之后真彩色貌似就没有那么复杂了。复杂的问题总是这样,只要拆分成一个个小问题,总能迎刃而解。

转载自:http://www.cnblogs.com/shoufengwei/p/6242425.html

You may also like...