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发送到前台,前台即可浏览到真彩色瓦片。
三、总结
本文简单为大家介绍了如何实现栅格数据的多波段真彩色渲染,有了单波段的基础之后真彩色貌似就没有那么复杂了。复杂的问题总是这样,只要拆分成一个个小问题,总能迎刃而解。
Geotrellis系列文章链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html
geotrellis使用(二十八)栅格数据色彩渲染(多波段真彩色)的更多相关文章
- geotrellis使用(二十七)栅格数据色彩渲染
目录 前言 复杂原因及思路分析 实现过程 总结 一.前言 今天我们来研究一下这个看似简单的问题,在地理信息系统中颜色渲染应当是最基本的操作和功能,比如我们将一幅Landsat数据拖拽到A ...
- Web 前端开发人员和设计师必读文章推荐【系列二十八】
<Web 前端开发精华文章推荐>2014年第7期(总第28期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
- Bootstrap <基础二十八>列表组
列表组.列表组件用于以列表形式呈现复杂的和自定义的内容.创建一个基本的列表组的步骤如下: 向元素 <ul> 添加 class .list-group. 向 <li> 添加 cl ...
- Citrix 服务器虚拟化之二十八 XenApp6.5发布文档内容
Citrix 服务器虚拟化之二十八 XenApp 6.5发布文档内容 XenApp可发布以下类型的资源向用户提供信息访问,这些资源可在服务器或桌面上虚拟化: 1) 服务器桌面:发布场中服务器的整个 ...
- WCF技术剖析之二十八:自己动手获取元数据[附源代码下载]
原文:WCF技术剖析之二十八:自己动手获取元数据[附源代码下载] 元数据的发布方式决定了元数据的获取行为,WCF服务元数据架构体系通过ServiceMetadataBehavior实现了基于WS-ME ...
- VMware vSphere 服务器虚拟化之二十八 桌面虚拟化之安装View传输服务器
VMware vSphere 服务器虚拟化之二十八 桌面虚拟化之安装View传输服务器 View 传输服务器用于管理和简化数据中心与在最终用户本地系统上检出使用的 View 桌面之间的数据传输.必须安 ...
- Bootstrap入门(二十八)JS插件5:工具提醒
Bootstrap入门(二十八)JS插件5:工具提醒 工具提示在使用过程中比较常见,但是实现起来有些麻烦,而bootstrap则很好地解决了这个问题. 我们来写一个简单的实例 先引入CSS文件和JS文 ...
- mysql进阶(二十八)MySQL GRANT REVOKE用法
mysql进阶(二十八)MySQL GRANT REVOKE用法 MySQL的权限系统围绕着两个概念: 认证->确定用户是否允许连接数据库服务器: 授权->确定用户是否拥有足够的权限执 ...
- JAVA之旅(二十八)——File概述,创建,删除,判断文件存在,创建文件夹,判断是否为文件/文件夹,获取信息,文件列表,文件过滤
JAVA之旅(二十八)--File概述,创建,删除,判断文件存在,创建文件夹,判断是否为文件/文件夹,获取信息,文件列表,文件过滤 我们可以继续了,今天说下File 一.File概述 文件的操作是非常 ...
随机推荐
- 【每日一linux命令3】参数(或称选项)顺序
一般除了特殊情况,参数是没有顺序的.举例而言,输入"–a –v"与输入"–v –a"以及"–av" 的执行效果是相同的.但若该参数后指定了要 ...
- ABP文档 - Javascript Api - AJAX
本节内容: AJAX操作相关问题 ABP的方式 AJAX 返回信息 处理错误 HTTP 状态码 WrapResult和DontWrapResult特性 Asp.net Mvc 控制器 Asp.net ...
- JavaScript 字符串实用常操纪要
JavaScript 字符串用于存储和处理文本.因此在编写 JS 代码之时她总如影随形,在你处理用户的输入数据的时候,在读取或设置 DOM 对象的属性时,在操作 Cookie 时,在转换各种不同 Da ...
- SQLServer执行命令出现“目录无效的提示”
异常处理汇总-数据库系列 http://www.cnblogs.com/dunitian/p/4522990.html 一般都是清理垃圾清理过头了,把不该删的目录删了 网上说法: 问题描述: 1.s ...
- 客户端的验证插件validator
简单,智能,令人愉悦的表单验证~~~ 官方文档:http://www.niceue.com/validator/ <!DOCTYPE html> <html> <head ...
- javascript动画系列第四篇——拖拽改变元素大小
× 目录 [1]原理简介 [2]范围圈定 [3]大小改变[4]代码优化 前面的话 拖拽可以让元素移动,也可以改变元素大小.本文将详细介绍拖拽改变元素大小的效果实现 原理简介 拖拽让元素移动,是改变定位 ...
- ASP.NET MVC5----常见的数据注解和验证
只要一直走,慢点又何妨. 在使用MVC模式进行开发时,数据注解是经常使用的(模型之上操作),下面是我看书整理的一些常见的用法. 什么是验证,数据注解 验证 从全局来看,发现逻辑仅是整个验证的很小的一部 ...
- Android菜单项内容大全
一.介绍: 菜单是许多应用中常见的用户界面组件. Android3.0版本以前,Android设备会提供一个专用"菜单"按钮呈现常用的一些用户操作, Android3.0版本以后, ...
- iOS10之Expected App Behaviors
昨天上架到appStore的时候碰到个问题,构建好后上传到itunesconnect的的包都用不了, 显示错误为:此构建版本无效. 或者英文显示为:ITC.apps.preReleaseBuild.e ...
- iOS:以前笔记,未整理版。太多了,先放着吧。。。。。。。
1. -(void)timetick { _d = 0; NSTimer *newtime =[NSTimer scheduledTimerWithTimeInterval:1 target:self ...