前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >geotrellis使用(二十八)栅格数据色彩渲染(多波段真彩色)

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

作者头像
魏守峰
发布2018-04-28 17:10:44
1.2K0
发布2018-04-28 17:10:44
举报
文章被收录于专栏:点滴积累

目录

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

一、前言

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

二、实现过程

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

2.1 获取三个波段整体信息

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

2.2 三个波段合并

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

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

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

代码语言:javascript
复制
tile.normalize(omin, omax, 0, 255).convert(ByteConstantNoDataCellType)

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

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

代码语言:javascript
复制
val multiTile = MultibandTile(tiles)

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

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

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

代码语言:javascript
复制
val colorTile = mmultiTIle.color

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

代码语言:javascript
复制
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图像传输到前台,代码如下:

代码语言:javascript
复制
colorTile.renderPng().bytes

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

三、总结

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-01-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
  • 一、前言
  • 二、实现过程
    • 2.1 获取三个波段整体信息
      • 2.2 三个波段合并
      • 三、总结
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档