目录

  1. 前言
  2. 图像渲染
  3. 总结
  4. 参考链接

一、前言

       前面几篇文章讲解了如何使用Geotrellis进行数据处理、瓦片生成等,今天主要表一下如何使用Geotrellis进行栅格渲染。

       昨日完成了两种数据叠加生成瓦片的工作,然而在进行瓦片渲染的时候始终得不到想要的漂亮的颜色效果,由于这块代码是从之前Geotrellis官方DEMO中拷贝过来的,从未进行深究,所以折腾半天也没能实现,无奈那么就看源代码吧,在源代码中找到了这样一篇文档(rendering.md),里面详细讲述了在系统中如何直接使用Geotrellis进行渲染。本文在对其翻译的基础上,添加自己的部分心得。

二、图像渲染

       在上一篇文章中讲述了如何进行矢量数据栅格化操作,以及geotrellis使用(三)geotrellis数据处理过程分析中讲解了如何将geotiff数据导入Accumulo中进行调用,这里不再讲述这些,直接讲解如何对Tile进行渲染,说白了就是如何使用renderPng方法,当然你也可以使用renderJpg,二者基本相同。

最简单的渲染方式

       最简单的方式就是直接使用下述代码:

tile.renderPng

其中tile表示一个瓦片实例,下文相同。

       看似简单的代码,其实也不是那么简单,这里需要注意的就是tile的数据值必须为颜色值才能得到正确的颜色显示,这里就简单讲解一下Geotrellis中的颜色值。

       Geotrellis中包含两个颜色类,RGBARGB,其中RGB表示普通的颜色、RGBA表示附加了透明度的颜色值。二者均用int类型进行表示,例如0xFF0000FF,前两位表示R值,紧接着两位表示G值,再后面两位表示B值,如果是RGBA模式,则还有两位表示A值。所以上述瓦片的数据类型必须为int32,然后为不同的点赋不同的颜色值,即可渲染成一个漂亮的瓦片。

使用ColorMap

       直接使用上述方式看似简单,其实比较麻烦,不易操作,因为要将瓦片数据值转成不同的颜色值,Geotrellis完全考虑到了这一点,为我们定义了一个ColorMap类,能够帮助我们实现瓦片值与颜色值之间的映射。使用方法如下:

val colorMap = ColorMap(...)
tile.renderPng(colorMap)

       那么如何定义一个ColorMap实例呢?其实也很简单,只需要传入一个数据值和颜色值对应的Map对象即可。代码如下:

val colorMap =
ColorMap(
Map(
3.5 -> RGB(0,255,0),
7.5 -> RGB(63,255,51),
11.5 -> RGB(102,255,102),
15.5 -> RGB(178,255,102),
19.5 -> RGB(255,255,0),
23.5 -> RGB(255,255,51),
26.5 -> RGB(255,153,51),
31.5 -> RGB(255,128,0),
35.0 -> RGB(255,51,51),
40.0 -> RGB(255,0,0)
)
)

       上述就可以得到一个ColorMap对象,其中数据在[-∞, 3.5]之内的都将对应成RGB(0,255,0)的颜色,(3.5, 7.5]之内的都将对应成RGB(63,255,51)的颜色,以此类推。然后将此对象传递给renderPng函数,即可得到想要的瓦片图像。

       当然ColorMap类中还定义了一个子类Options,用于定义ColorMap的一些选项。

case class Options(
classBoundaryType: ClassBoundaryType = LessThanOrEqualTo,
/** Rgba value for NODATA */
noDataColor: Int = 0x00000000,
/** Rgba value for data that doesn't fit the map */
fallbackColor: Int = 0x00000000,
/** Set to true to throw exception on unmappable variables */
strict: Boolean = false
)

classBoundaryType表示瓦片值与颜色值的对应方向,如刚刚的[-∞, 3.5]表示小于等于3.5,此处可以定义成GreaterThan, GreaterThanOrEqualTo, LessThan, LessThanOrEqualTo, Exact,意思非常清楚,不在这里赘述。

noDataColor表示瓦片的值为noData的时候显示的颜色。

fallbackColor表示不在映射范围内的值显示的颜色。

strict表示如果瓦片数据值不在定义之内,是报错还是使用fallbackColor进行渲染。

       当然定义上述对应关系未免显得繁琐,Geotrellis为我们定义了一个ColorRamp类,实现了简单的自定义颜色对应关系的方法。

val colorRamp =
ColorRamp(0xFF0000FF, 0x0000FFFF)
.stops(100)
.setAlphaGradient(0xFF, 0xAA)

表示定义一个从0xFF0000FF0x0000FFFF有100个渐变点的颜色对应,并且A值也从0xFF变至0xAA

       当然Geotrellis还为我们定义了一个ColorRamps类,里面封装了部分常用的颜色变化值,具体可以查看其源码。

final def BlueToOrange =
ColorRamp(
0x2586ABFF, 0x4EA3C8FF, 0x7FB8D4FF, 0xADD8EAFF,
0xC8E1E7FF, 0xEDECEAFF, 0xF0E7BBFF, 0xF5CF7DFF,
0xF9B737FF, 0xE68F2DFF, 0xD76B27FF
)
final def ...

根据瓦片自动生成ColorMap

       如果为瓦片直接定义ColorMap可以得到渲染的瓦片,但是存在颜色值固定无法动态调整以及非专业人员不能得到很好的颜色对应关系的问题。GeotrellisColorMap中定义了一个方法可以根据瓦片自动生成ColorMap,方法如下:

val colorMap = ColorMap.fromQuantileBreaks(tile.histogram, ColorRamp(0xFF0000FF, 0x0000FFFF).stops(10))

实现了将瓦片的值均匀对应到[0xFF0000FF, 0x0000FFFF]并分成10个等级,其中tile.histogram表示瓦片的值分布,从这我们不难看出,其完成的是根据瓦片的值统计分布,动态生成了一个ColorMap实例。

三、总结

       以上讲述了如何渲染瓦片,具体效果大家可以自行实验,不在这里展示。虽然实现方法有易有难,但是也都代表了不同的需求,大家可以根据自己的需求选择合适的方法进行渲染。

       本次实验再次证实了源码的重要性,还是要细致扎实的研读Geotrellis源代码方能更好的使用Geotrellis得到自己想要的结果。

四、参考链接

一、geotrellis使用初探

二、geotrellis使用(二)geotrellis-chatta-demo以及geotrellis框架数据读取方式初探

三、geotrellis使用(三)geotrellis数据处理过程分析

四、geotrellis使用(四)geotrellis数据处理部分细节

五、geotrellis使用(五)使用scala操作Accumulo

六、geotrellis使用(六)Scala并发(并行)编程

七、geotrellis使用(七)记录一次惨痛的bug调试经历以及求DEM坡度实践

八、geotrellis使用(八)矢量数据栅格化

九、geotrellis使用(九)使用geotrellis进行栅格渲染

geotrellis使用(九)使用geotrellis进行栅格渲染的更多相关文章

  1. World Wind Java开发之十——AnalyticSurface栅格渲染(转)

    http://blog.csdn.net/giser_whu/article/details/43017881 1.AnalyticSurfaceDemo ArcGIS下对栅格的各种分级渲染效果是非常 ...

  2. 【Unity Shader】(九) ------ 高级纹理之渲染纹理及镜子与玻璃效果的实现

    笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题. [Unity Shader](三) ----- ...

  3. geotrellis使用(二十九)迁移geotrellis至1.1.1版

    目录 前言 升级过程 总结 一.前言        由于忙着安装OpenStack等等各种事情,有半年的时间没有再亲密的接触geotrellis,甚至有半年的时间没能畅快的写代码.近来OpenStac ...

  4. Geotrellis系列文章链接

    本文存放了我在博客园中撰写的Geotrellis系列文章链接,方便查阅! 一.geotrellis使用初探 二.geotrellis使用(二)geotrellis-chatta-demo以及geotr ...

  5. geotrellis使用(十)缓冲区分析以及多种类型要素栅格化

    目录 前言 缓冲区分析 多种类型要素栅格化 总结 参考链接 一.前言        上两篇文章介绍了如何使用Geotrellis进行矢量数据栅格化以及栅格渲染,本文主要介绍栅格化过程中常用到的缓冲区分 ...

  6. geotrellis使用初探

    最近,单位领导要求我研究一下geotrellis(GITHUB地址:https://github.com/geotrellis/geotrellis,官网http://geotrellis.io/), ...

  7. geotrellis使用(七)记录一次惨痛的bug调试经历以及求DEM坡度实践

    眼看就要端午节了,屌丝还在写代码,话说过节也不给轻松,折腾了一天终于解决了一个BUG,并完成了老板安排的求DEM坡度的任务,那么就分两段来表. 一.BUG调试 首先记录一天的BUG调试,简单copy了 ...

  8. geotrellis使用(二十一)自动导入数据

    目录 前言 整体介绍 前台界面 后台控制 总结 一.前言        之前Geotrellis数据导入集群采用的是命令行的方式,即通过命令行提交spark任务来ingest数据,待数据导入完毕再启动 ...

  9. ArcEngine栅格和矢量渲染(含可视化颜色带)

    使用ArcEngine9.3开发的栅格和矢量的渲染. 开发环境:ArcEngine9.3,VS2008. 功能:栅格(拉伸和分级)和矢量(简单.唯一值.分级.比例)渲染. 开发界面如图所示. 图1 主 ...

随机推荐

  1. matlab环境配置

    一.环境变量设置 AMD处理器:右键单击我的电脑 属性 — >高级 —> 环境变量 —> 系统变量 —> 新建 变量名:BLAS_VERSION,值为安装目录\atlas_At ...

  2. 10分钟学会前端调试利器——FireBug

    概述 FireBug是一个用于网站前端开发的工具,它是FireFox浏览器的一个扩展插件.它可以用于调试JavaScript.查看DOM.分析CSS.监控网络流量以及进行Ajax交互等.它提供了几乎前 ...

  3. Android课程---序列化与反序列化(转)

    ava序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列的 ...

  4. java 遍历arrayList的四种方法

    package com.test; import java.util.ArrayList;import java.util.Iterator;import java.util.List; public ...

  5. Delphi自己隐藏自定义弹出列表

    先上代码 procedure TForm3.Timer1Timer(Sender: TObject); var Point: TPoint; Name: array[0..255] of Char; ...

  6. ENode框架Conference案例分析系列之 - 订单处理减库存的设计

    前言 前面的文章,我介绍了Conference案例的业务.上下文划分.领域模型.架构,以及代码整体流程.接下来想针对案例中一些重要的场景,分别做进一步的分析.本文想先介绍一下Conference案例的 ...

  7. UI控件(UISlider)

    @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; UISlider* slider = [[UISli ...

  8. 迷你MVVM框架 avalonjs 入门教程

    新官网 请不要无视这里,这里都是链接,可以点的 OniUI组件库 学习教程 视频教程: 地址1 地址2 关于AvalonJs 开始的例子 扫描 视图模型 数据模型 绑定 作用域绑定(ms-contro ...

  9. Javascript模拟继承(赠送.net吐槽一段)

    首先吐槽一句,今年的就业形势很不乐观啊,特别是搞.net的(相对java),特特别是还没出校门没有正式工作经验的,找个实习很难,前些天接了个面试电话,上来就质疑我“你一个在校大学生怎么可能做了那么多项 ...

  10. IoC在ASP.NET Web API中的应用

    控制反转(Inversion of Control,IoC),简单地说,就是应用本身不负责依赖对象的创建和维护,而交给一个外部容器来负责.这样控制权就由应用转移到了外部IoC容器,控制权就实现了所谓的 ...