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


    目录

    1. 前言
    2. 实现过程
    3. 总结

    一、前言

           上一篇文章介绍了如何使用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发送到前台,前台即可浏览到真彩色瓦片。

    三、总结

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

    Geotrellis系列文章链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html

  • 相关阅读:
    求原根
    koa2-router中间件来请求数据获取
    koa2 快速开始
    如何修改host
    bzoj 2480——扩展BSGS
    bzoj 4128: Matrix ——BSGS&&矩阵快速幂&&哈希
    Ubuntu 16.04LTS 安装和配置Bochs
    2019ICPC徐州网络赛 A.Who is better?——斐波那契博弈&&扩展中国剩余定理
    求十亿内所有质数的和
    MYSQL的随机查询的实现方法
  • 原文地址:https://www.cnblogs.com/shoufengwei/p/6242425.html
Copyright © 2020-2023  润新知