一、前言
上一篇文章介绍了如何使用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)
<span class="hljs-keyword">if</span>(self.bandCount == <span class="hljs-number">3</span>) {self.convert(<span class="hljs-type">IntConstantNoDataCellType</span>).combine(<span class="hljs-number">0</span>, <span class="hljs-number">1</span>, <span class="hljs-number">2</span>) { (rBand, gBand, bBand) =&gt;<span class="hljs-keyword">val</span> r = <span class="hljs-keyword">if</span> (isData(rBand)) { rBand } <span class="hljs-keyword">else</span> <span class="hljs-number">0</span><span class="hljs-keyword">val</span> g = <span class="hljs-keyword">if</span> (isData(gBand)) { gBand } <span class="hljs-keyword">else</span> <span class="hljs-number">0</span><span class="hljs-keyword">val</span> b = <span class="hljs-keyword">if</span> (isData(bBand)) { bBand } <span class="hljs-keyword">else</span> <span class="hljs-number">0</span><span class="hljs-keyword">if</span>(r + g + b == <span class="hljs-number">0</span>) <span class="hljs-number">0</span><span class="hljs-keyword">else</span> {((r &amp; <span class="hljs-number">0xFF</span>) &lt;&lt; <span class="hljs-number">24</span>) | ((g &amp; <span class="hljs-number">0xFF</span>) &lt;&lt; <span class="hljs-number">16</span>) | ((b &amp; <span class="hljs-number">0xFF</span>) &lt;&lt; <span class="hljs-number">8</span>) | <span class="hljs-number">0xFF</span>}}
} <span class="hljs-keyword">else</span> {self.convert(<span class="hljs-type">IntConstantNoDataCellType</span>).combine(<span class="hljs-number">0</span>, <span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>) { (rBand, gBand, bBand, aBand) =&gt;<span class="hljs-keyword">val</span> r = <span class="hljs-keyword">if</span> (isData(rBand)) { rBand } <span class="hljs-keyword">else</span> <span class="hljs-number">0</span><span class="hljs-keyword">val</span> g = <span class="hljs-keyword">if</span> (isData(gBand)) { gBand } <span class="hljs-keyword">else</span> <span class="hljs-number">0</span><span class="hljs-keyword">val</span> b = <span class="hljs-keyword">if</span> (isData(bBand)) { bBand } <span class="hljs-keyword">else</span> <span class="hljs-number">0</span><span class="hljs-keyword">val</span> a = <span class="hljs-keyword">if</span> (isData(aBand)) { aBand } <span class="hljs-keyword">else</span> <span class="hljs-number">0</span><span class="hljs-keyword">if</span>(r + g + b == <span class="hljs-number">0</span>) <span class="hljs-number">0</span><span class="hljs-keyword">else</span> {((r &amp; <span class="hljs-number">0xFF</span>) &lt;&lt; <span class="hljs-number">24</span>) | ((g &amp; <span class="hljs-number">0xFF</span>) &lt;&lt; <span class="hljs-number">16</span>) | ((b &amp; <span class="hljs-number">0xFF</span>) &lt;&lt; <span class="hljs-number">8</span>) | (a &amp; <span class="hljs-number">0xFF</span>)}}
}}

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

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

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

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

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

  1. 关闭数字健康 android 魅族,数字体验 篇二十八:精雕细刻,只为给魅友更好的选择,魅族16s Pro体验分享...

    数字体验 篇二十八:精雕细刻,只为给魅友更好的选择,魅族16s Pro体验分享 2019-09-06 17:31:22 14点赞 10收藏 15评论 当我还一直在称赞魅族16s所拥有的舒适手感表现时, ...

  2. 2008R2Win7管理二十八Mail之基本使用

    2008R2Win7管理二十八Mail之基本使用 上篇我们已经安装好了exchange2010,呵呵本片简单介绍和看下ex2010的基本界面和使用 安装完成打开exchange控制台如图所示 汗,有试 ...

  3. 微信小程序把玩(二十八)image组件

    原文:微信小程序把玩(二十八)image组件 image组件也是一个程序不可缺少的,可以这样说一个app中image组件随处可以看到,一般 image有两种加载方式第一种是网络图片第二种是本地图片资源 ...

  4. Citrix 服务器虚拟化之二十八 XenApp6.5发布文档内容

    Citrix 服务器虚拟化之二十八  XenApp 6.5发布文档内容 XenApp可发布以下类型的资源向用户提供信息访问,这些资源可在服务器或桌面上虚拟化: 1)  服务器桌面:发布场中服务器的整个 ...

  5. OpenCV学习笔记(二十六)——小试SVM算法ml OpenCV学习笔记(二十七)——基于级联分类器的目标检测objdect OpenCV学习笔记(二十八)——光流法对运动目标跟踪Video Ope

    OpenCV学习笔记(二十六)--小试SVM算法ml 总感觉自己停留在码农的初级阶段,要想更上一层,就得静下心来,好好研究一下算法的东西.OpenCV作为一个计算机视觉的开源库,肯定不会只停留在数字图 ...

  6. (转载)Android项目实战(二十八):使用Zxing实现二维码及优化实例

    Android项目实战(二十八):使用Zxing实现二维码及优化实例 作者:听着music睡 字体:[增加 减小] 类型:转载 时间:2016-11-21 我要评论 这篇文章主要介绍了Android项 ...

  7. SAP UI5 初学者教程之二十八 - SAP UI5 应用的集成测试工具 OPA 介绍试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 初学者教程之一:Hello World SAP UI5 初学者教程之二:SAP UI5 ...

  8. FreeSql (二十八)事务

    FreeSql实现了四种数据库事务的使用方法,脏读等事务相关方法暂时未提供.主要原因系这些方法各大数据库.甚至引擎的事务级别五花八门较难统一. 事务用于处理数据的一致性,处于同一个事务中的操作是一个U ...

  9. 计算机英语翻译3000字,英语专四作文满分范文(二十八):计算机翻译

    英语专四作文满分范文(二十八):计算机翻译 2015年专四考试预计4月18日开考,考生们现在应该进入紧张的冲刺复习阶段,专四作文是很多同学感到头疼的,在这里新东方在线整理了英语专四作文满分范文供考生们 ...

最新文章

  1. [ZT]如何取得客户端的Windows登录用户名?
  2. 【连载】优秀程序员的45个习惯之39——架构师必须写代码
  3. windows免输密码登录
  4. 重建包含快照的vmdk描述文件。
  5. 2020 华为杯 数模 B题 数据挖掘
  6. mysql交叉编译 cmake_CMake交叉编译配置
  7. go语言快速刷《程序员面试金典》(2)
  8. 计算机仿真技术实际,计算机仿真技术详解.doc
  9. 大数据Hadoop(五):Hadoop架构
  10. 电脑右下角,电脑右下角的小喇叭不见了怎么办【解决方法】
  11. 虚幻浏览器插件 播放视频
  12. P1157 组合的输出(#define mian main)
  13. STM32F103C8T6 操作矩阵键盘
  14. 算法实现自动扫雷游戏
  15. react二级路由配置正确不显示页面的问题解决
  16. 《Python与硬件项目案例》— 基于Python的口罩检测与指纹识别签到系统设计
  17. Python+Vue计算机毕业设计BeatHouse伴奏交易平台z19pu(源码+程序+LW+部署)
  18. 用opencv和vc++6.0开发的五子棋游戏软件
  19. 火车头 采集 java 生成正文_火车头采集器使用教程–采集内容发布规则设置
  20. 惊喜!网易自媒体一星开通收益!

热门文章

  1. 去哪儿网网页版机票数据
  2. vue打包出来的dist如何查看js的占比,report生成分析图
  3. if与switch的性能比较
  4. 华为认证HCIP的持证人数
  5. IP SLA_icmp、udp、jitter、VoIP
  6. 松下PLC FP-XH C30T 和昆仑通态触摸屏 TPC7022Ex 程序下载步骤
  7. 基于 React video 视频打点
  8. OpenStack网络 - 使用vlan模式来剖析openstack网络相关概念及原理
  9. 数字麦克风PDM信号采集与STM32 I2S接口应用(一)
  10. Binary String