geotrellis使用(二十三)动态加载时间序列数据

目录

  1. 前言
  2. 实现方法
  3. 总结

一、前言

       今天要介绍的绝对是华丽的干货。比如我们从互联网上下载到了一系列(每天或者月平均等)的MODIS数据,我们怎么能够对比同一区域不同时间的数据情况,采用传统的方法可能只能将所有要参考的数据用ArcGIS等打开,然后费劲的一一对比等,不仅操作繁琐,搞不好日期等还会对应错。本文就是介绍使用Geotrellis动态加载时间序列数据,使我们能够自由选择日期浏览或者像动画一样循环展示一系列数据。直接进入干货。

二、实现方法

2.1 前台界面

       前台与以往保持不变,但是你需要保证能够提供请求时间的时间序列范围,如想实现根据用户输入的日期展示当期数据,那么你需要提供一个日期选择器;如果你想动态加载系列数据那么你必须能够提供这一系列的日期范围,并能够自动改变日期。总之你需要将日期作为一个参数发送到后台已达到请求该日期数据的效果。

2.2 数据准备

       这一块与以往变化比较大,首先要对tiff数据进行预处理,重投影等自不需要多言,主要是要给tiff加个时间头信息。有两种方式,可以使用GDAL或者自己写程序,分布介绍如下:

1、使用GDAL实现添加时间头信息

       只需要一条命令即可:

gdal_edit -mo TIFFTAG_DATETIME="time" yourtiff.tif

       上述命令就会给tiff文件添加一个名为TIFFTAG_DATETIME的头文件信息,time表示你想添加的时间,需要符合ISO标准,否则你需要在导入数据的时候指定时间格式。

2、使用Geotrellis实现添加时间头信息

       主要步骤为读取tiff文件、修添加时间头信息、保存新的tiff文件。代码如下:

val tiff = SinglebandGeoTiff(path)
tiff.tags.headTags + (Tags.TIFFTAG_DATETIME -> time)
val newtiff = new SinglebandGeoTiff(tiff.tile, tiff.extent, tiff.crs, Tags(map, tiff.tags.bandTags), tiff.options)
newtiff.write(newTiffPath)

       代码同样很简单,但是说实话不如GDAL来的方便,仅供参考。

2.3 时间序列数据导入

       数据准备好之后我们就可以开始着手导入,这里面有很多需要改变的地方。

1、改变数据导入类

       普通tiff数据导入的时候调用ETL类的方式如下:

Etl.ingest[ProjectedExtent, SpatialKey, Tile](args)

       但是到了时间序列数据就要变为:

Etl.ingest[TemporalProjectedExtent, SpaceTimeKey, Tile](args)

       主要是添加时间支持,ProjectedExtent变为TemporalProjectedExtent,SpatialKey变为SpaceTimeKey,当然如果是多波段还需要将Tile替换为MultibandTile。

2、改变导入参数

       在geotrellis使用(二十)geotrellis1.0版本新功能及变化介绍一文中已经介绍过了1.0版Geotrellis导入数据的方式变为json文件,这里input.json中只需要将format由geotiff改为temporal-geotiff;output.json中需要将keyIndexMethod中的内容改成如下方式:

"keyIndexMethod":{  
  "type":"zorder",
  "temporalResolution": 86400000,
  "timeTag":"TIFFTAG_DATETIME",
  "timeFormat":"yyyy:MM:dd HH:mm:ss"
}

       其中temporalResolution表示时间精度,理论上来说,设置此值表示当你根据时间查询的时候在这个精度范围内的数据都应该能够查询出来,但是实际上好像并不是这样,不知道是其bug还是我操作方式有问题,需要后续进一步研究;timeTag指定时间头字段名称;timeFormat指定时间格式。

       完成以上步骤之后即可将时间序列数据导入到accumulo中。

2.4 获取对应时间数据瓦片

       前台将请求的时间已经瓦片的x、y、z编号传入后台,后台接收到之后根据此四个参数进行查询,相较普通tiff数据实际上只是多添加了时间条件。请求瓦片代码如下:

val dt = DateTimeFormat.forPattern("yyyy:MM:dd HH:mm:ss").parseDateTime(time)
val key = SpaceTimeKey(x, y, dt)
val layerId = LayerId(name, zoom)
respondWithMediaType(MediaTypes.`image/png`) {
val result = {
  val tile = tileReader.reader[SpaceTimeKey, Tile](layerId).read(key)
  tile.renderPng.bytes
}
complete(result)
}

       其中name表示上一步数据导入时存放的名字;tileReader为AccumuloValueReader实例。这样就能将用户请求的时间以及x、y、z瓦片数据渲染之后发送到前台,这里还需要强调的是Geotrellis中时间处理采用joda开源框架,关于其用法大家可以网上自行搜索。最后为大家附上两张截图,当然如果是动画效果会更好,由于没有录制,仅提供两张截图以达到展示动态的效果。

三、总结

       本文为大家简单介绍了如何动态加载时间序列数据,同样读者可以根据自己的需求任意发挥想象,达到自己需要的效果。比如可以实现动态展示全球洋流、大气、农作物、植被等变化情况。凡是在一段时间内有变化的数据,当我们搜集到足够多的数据并添加时间标签之后即可将其“动”起来,我想这种展示效果一定很棒。

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Leetcode名企之路

求求你别问我一致性hash了

首先,只有存储型的组件,我们才会使用一致性hash;计算型的服务增删节点对整个任务一般没影响,所以负载均衡直接用random就可以。那么像redis、memca...

1463
来自专栏Java技术栈

浅析负载均衡的6种算法,Ngnix的5种算法。

常见的几种负载均衡算法 ? 1、轮询法 将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。 2、...

32912
来自专栏Albert陈凯

2018-11-18 你知道Adoc文档是什么吗?

AsciiDoc 是一种轻量级标记语言,它可以让我们以纯文本的形式来书写笔记、文章、文档、书籍、网页、幻灯片和 man 帮助。 本指南是常用的 AsciiDoc...

722
来自专栏开源优测

如何参与到开源优测-积微速成计划任务

通过过完第一次任务,你应该掌握: 安装和部署git 学会git基本的命令 学会如何使用github来管理的你的学习任务 初步了解如何利用python编程 本...

2936
来自专栏杨建荣的学习笔记

通过shell抓取html数据(r2笔记74天)

最近看一些网站的时候,发现有些数据很有意思,想把数据截取出来,但是想把数据抽取出来很是困难。因为如下的小方框的数字都是上下两行排列,想要把数据抽取到一行是很难实...

2969
来自专栏云计算教程系列

如何在CentOS 7上使用Skyline检测异常

如果您使用监控系统(如Zabbix或Nagios),那么您就知道监控的工作原理。简而言之,它可以描述如下:监控系统接收各种指标(CPU /内存使用,网络利用率等...

5365
来自专栏小白安全

批量检测SQL注入工具

0×01 前言 SQL注入,这个类型的漏洞我真的学了好久好久好久好久,即是我刚刚开始接触安全就学习的第一种漏洞,也是一个迄今为止还在学习的漏洞类型,只...

8346
来自专栏王磊的博客

entity framework框架生成摘要文档为空(没有元数据文档可用)的bug解决方案

简介 entity framework在vs中生成的.edmx文件,会导致摘要(说明)为空的bug,具体bug信息为“没有元数据文档可用。”,导致我们表名打点去...

2785
来自专栏Greenplum

Greenplum Pgbench命令详解

TPC:Transactionprocessing Performance Council事务处理性能委员会

1421
来自专栏黑白安全

绕过CDN获取网站IP地址

基于masscan扫描IP端中开放的80端口,程序自动连接每个IP测试,筛选出符合条件的ip保存到result.txt 后续程序会提供”基于扫描子域名获取IP段...

1103

扫码关注云+社区

领取腾讯云代金券