geotrellis使用(二十三)动态加载时间序列数据
目录
一、前言
今天要介绍的绝对是华丽的干货。比如我们从互联网上下载到了一系列(每天或者月平均等)的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
geotrellis使用(二十三)动态加载时间序列数据的更多相关文章
- Java 反射理解(二)-- 动态加载类
Java 反射理解(二)-- 动态加载类 概念 在获得类类型中,有一种方法是 Class.forName("类的全称"),有以下要点: 不仅表示了类的类类型,还代表了动态加载类 编 ...
- Echarts使用及动态加载图表数据
Echarts使用及动态加载图表数据 官网:http://echarts.baidu.com/ 1.文档 2.实例 名词: 1.统计维度(说明数据) 维度就是统计致力于建立一个基于多方位统计(时间.地 ...
- Echarts动态加载后台数据
注意:1.用Ajax请求获取后台数据 2.Echarts只能处理Json数据 后台Controller:根据业务需求不同而返回不同数据,我前台要循环遍历Echarts的series进行数据添加,所以后 ...
- 使用 Cesium 动态加载 GeoJSON 数据
前言 需求是这样的,我需要在地图中显示 08 年到现在的地震情况,地震都是发生在具体的时间点的,那么问题就来了,如何实现地震情况按照时间动态渲染而不是一次全部加载出来. 一. 方案分析 这里面牵扯到两 ...
- selenium模块跳过用户名密码验证码输入,加载浏览器标签和cookie,进行翻页爬虫多页动态加载的数据(js)
能解决登陆一次后,之后不需要二次登陆的动态加载数据,网页保存的cookie和标签,加入到selenium自动化测试浏览器中 1 from selenium import webdriver 2 imp ...
- python获取动态网站上面的动态加载的数据(初级)
我们在处理一些网站数据的时候,有时候我们需要的数据很多都是动态加载的,而不都是静态的,以下以一个实例来介绍简单的获取动态数据,首先申明本人小白,还在学习python中,这个方法还是比较笨拙的,但是对于 ...
- Echarts使用及动态加载图表数据 折线图X轴数据动态加载
Echarts简介 echarts,缩写来自Enterprise Charts,商业级数据图表,一个纯JavaScript的图表库,来自百度...我想应该够简洁了 使用Echarts 目前,就官网的文 ...
- AJAX 动态加载后台数据 绑定select
<select id="select"> <!--下拉框数据动态加载--> </select> js:(使用jquery) $(document ...
- dhtmlxtree动态加载节点数据的小随笔
最近做了一个这个东西,颇有些感触,随笔记录一下自己的过程. 首先特别感谢:https://blog.csdn.net/cfl20121314/article/details/46852591,对我的帮 ...
随机推荐
- 前端CSS预处理器Sass
前面的话 "CSS预处理器"(css preprocessor)的基本思想是,用一种专门的编程语言,进行网页样式设计,然后再编译成正常的CSS文件.SASS是一种CSS的开发工 ...
- JS核心系列:浅谈函数的作用域
一.作用域(scope) 所谓作用域就是:变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的. function scope(){ var foo = "global&quo ...
- .NET Core系列 :4 测试
2016.6.27 微软已经正式发布了.NET Core 1.0 RTM,但是工具链还是预览版,同样的大量的开源测试库也都是至少发布了Alpha测试版支持.NET Core, 这篇文章 The Sta ...
- json与JavaScript对象互换
1,json字符串转化为JavaScript对象: 方法:JSON.parse(string) eg:var account = '{"name":"jaytan&quo ...
- 如何定位Oracle数据库被锁阻塞会话的根源
首先再次明确下,数据库因为要同时保证数据的并发性和一致性,所以操作有锁等待是正常的. 只有那些长时间没有提交或回滚的事物,阻塞了其他业务正常操作,才是需要去定位处理的. 1.单实例环境 2.RAC环境 ...
- Effective前端2:优化html标签
div { float: left; } .keyboard > div + div { margin-left: 8px; } --> div{display:table-cell;ve ...
- 分布式学习系列【dubbo入门实践】
分布式学习系列[dubbo入门实践] dubbo架构 组成部分:provider,consumer,registry,monitor: provider,consumer注册,订阅类似于消息队列的注册 ...
- [Android]使用Dagger 2进行依赖注入 - Producers(翻译)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/6234811.html 使用Dagger 2进行依赖注入 - P ...
- SQLServer2005创建定时作业任务
SQLServer定时作业任务:即数据库自动按照定时执行的作业任务,具有周期性不需要人工干预的特点 创建步骤:(使用最高权限的账户登录--sa) 一.启动SQL Server代理(SQL Server ...
- Linux测试环境搭建的学习建议
随着Linux应用的扩展许多朋友开始接触Linux,根据学习Windwos的经验往往有一些茫然的感觉:不知从何处开始学起.这里介绍学习Linux测试环境搭建的一些建议. 一.Linux测试环境搭建从基 ...