geotrellis使用(三十二)大量GeoTiff文件实时进行TMS服务
前言
在上一篇文章中我讲了如何直接将Geotiff文件发布为TMS服务,在其中只讲了单幅Geotiff的操作,其实单幅这种量级的数据对Geotrellis来说就是杀鸡焉用牛刀,Geotrellis针对的是大数据量的操作。在进行完单幅Geotiff的操作后,就去出差了一周,这一周也没闲着,稍有空隙便在思索这个问题,并抽空写那么两行,回来一调试果然可以,于是就有了本文。下面我来介绍如何对大量Geotiff实时进行TMS服务化操作。
一、总体效果
上次使用的是北京首都国际机场影像数据,这次我又下载了部分北京市区影像数据,来看一下总体显示效果。

二、实现方案
总体思路如下:
- 判断当前请求瓦片的范围。
- 判断在此范围下有无Tiff文件。
- 若有则切割此Tiff文件并返回对应的瓦片。
2.1 判断当前请求瓦片范围
每次请求,前台会向后台发送一个需要的瓦片编号,包含zoom、x、y,根据这三个值以及当前地图的投影方式我们就能算出此瓦片的空间范围。代码如下:
val key = SpatialKey(x, y)
val layoutScheme = ZoomedLayoutScheme(crs, tileSize = 256)
val layout = layoutScheme.levelForZoom(zoom)
val extent = MapKeyTransform(crs, LayoutLevel(zoom, layout.layout))(key)
其中crs表示地图投影,多为WebMercator,最终得到的extent即位该瓦片在此投影下的空间范围。
2.2 判断在此范围下有无Tiff文件
显而易见,如果此范围下有Tiff文件我们才需要进行切割,否则不进行操作,那么这里就牵涉三点:
- 获取所有需要切割的Tiff文件。
- 获取Tiff文件空间范围。
- 将上面得到的extent与每一幅tiff的范围进行相交判断,若有交集则切割此瓦片。
- 获取所有tiff文件。
文件存储在HDFS中,传入路径,获取其下所有文件即可。代码如下:
val hdfsPath = new org.apache.hadoop.fs.Path(path)
val fs = FileSystem.get(new Configuration())
val files = fs.listStatus(hdfsPath)
其中path为HDFS中的目录路径。这样就能得到该路径下所有文件。
- 获取Tiff文件空间范围。
每一个Tiff文件都有一个范围, 普通方式可以直接读取Tiff文件的角点坐标等信息,在此我使用Geotrellis的方式来读取。代码如下:
val rdd = HadoopGeoTiffRDD.spatialMultiband(path)
val sm = rdd
.map { case (key, grid) =>
val ProjectedExtent(extent, crs) = key.getComponent[ProjectedExtent]
// Bounds are return to set the non-spatial dimensions of the KeyBounds;
// the spatial KeyBounds are set outside this call.
val boundsKey = key.translate(SpatialKey(0,0))
val cellSize = CellSize(extent, grid.cols, grid.rows)
HashMap(crs -> RasterCollection(crs, grid.cellType, cellSize, extent, KeyBounds(boundsKey, boundsKey), 1))
}
.reduce { (m1, m2) => m1.merged(m2){ case ((k,v1), (_,v2)) => (k,v1 combine v2) } }
.values.toSeq.head
val layoutScheme = ZoomedLayoutScheme(crs, tileSize = 256)
val layoutDefinition = layoutScheme.levelForZoom(zoom).layout
val tiffExtent = TileLayerMetadata[SpatialKey](
sm.cellType,
layoutDefinition,
sm.extent,
sm.crs,
sm.bounds.setSpatialBounds(layoutDefinition.mapTransform(sm.extent))
).extent
path为tiff文件路径,这样便能获得当前tiff的空间范围。
- 判断瓦片与tiff是否相交。
extent.intersects(tiffExtent)
2.3 返回瓦片
在判断此瓦片下有tiff文件后即可采用上一篇文章中讲述的方式进行切割并返回瓦片。
三、总结
本文简单讲述了如何使用Geotrellis将大量Geotiff文件发布为TMS服务,针对大批量的数据才是Geotrellis的核心所在,然而只有也只要掌握了对单一数据的处理将能很快实现大批量的数据,所以“大数据”其实并没有那么可怕。
Geotrellis系列文章链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html
geotrellis使用(三十二)大量GeoTiff文件实时进行TMS服务的更多相关文章
- geotrellis使用(三十二)大量GeoTiff文件实时发布TMS服务
前言 在上一篇文章中我讲了如何直接将Geotiff文件发布为TMS服务,在其中只讲了单幅Geotiff的操作,其实单幅这种量级的数据对Geotrellis来说就是杀鸡焉用牛刀,Geotrellis针对 ...
- NeHe OpenGL教程 第三十二课:拾取游戏
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- Java进阶(三十二) HttpClient使用详解
Java进阶(三十二) HttpClient使用详解 Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们 ...
- ASP 三十二条精华代码 (1)
ASP 三十二条精华代码 (1) 2009-08-10 09:53:03 www.hackbase.com 来源:互联网 1. oncontextmenu="window.event.r ...
- (转载)Android项目实战(三十二):圆角对话框Dialog
Android项目实战(三十二):圆角对话框Dialog 前言: 项目中多处用到对话框,用系统对话框太难看,就自己写一个自定义对话框. 对话框包括:1.圆角 2.app图标 , 提示文本,关闭对话 ...
- 使用Typescript重构axios(三十二)——写在最后面(总结)
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- Bootstrap <基础三十二>模态框(Modal)插件
模态框(Modal)是覆盖在父窗体上的子窗体.通常,目的是显示来自一个单独的源的内容,可以在不离开父窗体的情况下有一些互动.子窗体可提供信息.交互等. 如果您想要单独引用该插件的功能,那么您需要引用 ...
- COJ968 WZJ的数据结构(负三十二)
WZJ的数据结构(负三十二) 难度级别:D: 运行时间限制:5000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给你一棵N个点的无根树,边上均有权值,每个点上有 ...
- 三十二、Java图形化界面设计——布局管理器之CardLayout(卡片布局)
摘自 http://blog.csdn.net/liujun13579/article/details/7773945 三十二.Java图形化界面设计--布局管理器之CardLayout(卡片布局) ...
随机推荐
- java 常见数据结构
1)tree 2) queue 3) list 4) stack 5) heap 6) map
- JVM GC(整理)
1 GC类型 1 )YGC 一般情况下,当新对象生成,并且在Eden申请空间失败时,就好触发YGC ,堆Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区.然后整理S ...
- Angular4.0从入门到实战打造在线竞拍网站学习笔记之三--依赖注入
Angular4.0基础知识之组件 Angular4.0基础知识之路由 依赖注入(Dependency Injection) 正常情况下,我们写的代码应该是这样子的: let product = ne ...
- 29. leetcode 167. Two Sum II - Input array is sorted
167. Two Sum II - Input array is sorted Given an array of integers that is already sorted in ascendi ...
- ASP.NET Core 源码学习之 Logging[3]:Logger
上一章,我们介绍了日志的配置,在熟悉了配置之后,自然是要了解一下在应用程序中如何使用,而本章则从最基本的使用开始,逐步去了解去源码. LoggerFactory 我们可以在构造函数中注入 ILogge ...
- 自定义Git之搭建Git服务器
在远程仓库一节中,我们讲了远程仓库实际上和本地仓库没啥不同,纯粹为了7x24小时开机并交换大家的修改. GitHub就是一个免费托管开源代码的远程仓库.但是对于某些视源代码如生命的商业公司来说,既不想 ...
- 如何在centos7上安装redis
解压缩 tar zxvf redis-3.0.4.tar.gz 进入解压后的目录 cd redis-3.0.4 使用Make 编译源文件 make 安装 进入源文件的目录 cd src 复制 Redi ...
- Entity Framework Core 2.0 新特性
本文翻译来自:https://docs.microsoft.com/en-us/ef/core/what-is-new/index 一.模型级查询过滤器(Model-level query filte ...
- CSS3基础(4)——CSS3 渲染属性
一. CSS3 计数器详解 CSS3计数器(CSS Counters)可以允许我们使用CSS对页面中的任意元素进行计数,实现类似于有序列表的功能. 与有序列表相比,它的突出特性在于可以对任意元素 ...
- Orleans稍微复杂的例子—互动
这是Orleans系列文章中的一篇.首篇文章在此 我费力费心的翻译过官方的教程,但是本人英语词汇量不高,可是架不住电子词典啊-只要肯花时间,我这些内容谁都可以做出来.所以这个事例告诉我们一个道理,那就 ...