目录

  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. Tomcat7 配置 ssl

    运行一个配置了ssl的项目时tomcat总是启动不成功,报错:“requires the APR/native library which is not available”,后来发现是找不到apr的 ...

  2. sqlplus运行sql文件

    当sql文件的数据比较多的时候,pl/sql运行比较慢,可以通过oracle的sqlplus进行导入: sqlplus user/password@tnsname@sqlfile.sql; 注意如果文 ...

  3. JS键盘KEYCODE值参考

    keycode 1 = 鼠标左键keycode 2 = 鼠标右键keycode 3 = Cancelkeycode 4 = 鼠标中键keycode 8 = BackSpace keycode 9 = ...

  4. HTML5可视化编辑与微数据

    1.HTML 5 全局 contenteditable 属性 contenteditable 属性规定是否可编辑元素的内容. <p contenteditable="true" ...

  5. 关于Node.js的总结

    Node是个啥? 1.Node 是一个服务器端 JavaScript 解释器,可是真的以为JavaScript不错的同学学习Node就能轻松拿下,那么你就错了,总结:水深不深我还不知道,不过确实不浅. ...

  6. 输出 n=6 的三角数字阵(JAVA基础回顾)

    package itcast.feng; import java.util.Scanner; //需求:输出 n=6 的三角数字阵 //1 //2 3 //4 5 6 //7 8 9 10 //11 ...

  7. PostgreSQL的.NET驱动程序Npgsql

    Npgsql是PostgreSQL的一个.NET数据提供程序,它可以自由获取.它可以通过下列选项获得独立的下载,也可以安装PostgreSQL数据库程序时选择安装. 最新的_npgsql2 Npgsq ...

  8. TDDL分库分表规则

    规则如下: 判断一个ID在哪个库里的公式是:id % 4 / 2判断一个ID在哪个表里的公式是:id % 4 % 2 其中4表示总共有多少个分表,2表示总共有多少个数据库:上面这个例子,表示总共有2个 ...

  9. 玩转动态编译 - 高级篇:二,IL设置静态属性,字段和类型转换

    静态属性赋值 先来看 Reflector反射出的IL源码(感谢Moen的提示),这次用 Release模式编译,去掉那些无用的辅助指令 public void AAA(string s) { MyCl ...

  10. Java ServletContextListener用法

    ServletContext 被 Servlet 程序用来与 Web 容器通信.例如写日志,转发请求.每一个 Web 应用程序含有一个Context,被Web应用内的各个程序共享.因为Context可 ...