前言

在上一篇文章中我讲了如何直接将Geotiff文件发布为TMS服务,在其中只讲了单幅Geotiff的操作,其实单幅这种量级的数据对Geotrellis来说就是杀鸡焉用牛刀,Geotrellis针对的是大数据量的操作。在进行完单幅Geotiff的操作后,就去出差了一周,这一周也没闲着,稍有空隙便在思索这个问题,并抽空写那么两行,回来一调试果然可以,于是就有了本文。下面我来介绍如何对大量Geotiff实时进行TMS服务化操作。

一、总体效果

上次使用的是北京首都国际机场影像数据,这次我又下载了部分北京市区影像数据,来看一下总体显示效果。

二、实现方案

总体思路如下:

  1. 判断当前请求瓦片的范围。
  2. 判断在此范围下有无Tiff文件。
  3. 若有则切割此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文件我们才需要进行切割,否则不进行操作,那么这里就牵涉三点:

  1. 获取所有需要切割的Tiff文件。
  2. 获取Tiff文件空间范围。
  3. 将上面得到的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服务的更多相关文章

  1. geotrellis使用(三十二)大量GeoTiff文件实时进行TMS服务

    前言 在上一篇文章中我讲了如何直接将Geotiff文件发布为TMS服务,在其中只讲了单幅Geotiff的操作,其实单幅这种量级的数据对Geotrellis来说就是杀鸡焉用牛刀,Geotrellis针对 ...

  2. SpringBoot | 第三十二章:事件的发布和监听

    前言 今天去官网查看spring boot资料时,在特性中看见了系统的事件及监听章节.想想,spring的事件应该是在3.x版本就发布的功能了,并越来越完善,其为bean和bean之间的消息通信提供了 ...

  3. NeHe OpenGL教程 第三十二课:拾取游戏

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  4. Java进阶(三十二) HttpClient使用详解

    Java进阶(三十二) HttpClient使用详解 Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们 ...

  5. ASP 三十二条精华代码 (1)

    ASP 三十二条精华代码 (1) 2009-08-10 09:53:03  www.hackbase.com  来源:互联网 1. oncontextmenu="window.event.r ...

  6. (转载)Android项目实战(三十二):圆角对话框Dialog

    Android项目实战(三十二):圆角对话框Dialog   前言: 项目中多处用到对话框,用系统对话框太难看,就自己写一个自定义对话框. 对话框包括:1.圆角 2.app图标 , 提示文本,关闭对话 ...

  7. 使用Typescript重构axios(三十二)——写在最后面(总结)

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  8. Android Studio(十二):打包多个发布渠道的apk文件

    Android Studio相关博客: Android Studio(一):介绍.安装.配置 Android Studio(二):快捷键设置.插件安装 Android Studio(三):设置Andr ...

  9. Bootstrap <基础三十二>模态框(Modal)插件

    模态框(Modal)是覆盖在父窗体上的子窗体.通常,目的是显示来自一个单独的源的内容,可以在不离开父窗体的情况下有一些互动.子窗体可提供信息.交互等. 如果您想要单独引用该插件的功能,那么您需要引用  ...

随机推荐

  1. Unity Shader-描边效果

    原文链接:http://blog.csdn.net/puppet_master

  2. ubuntu14.04 允许root用ssh登录

    重启ssh service ssh restart 查看ssh是否已安装 ssh进程 ps -e | grep ssh ssh占用端口 lsof -i:22 ssh服务已启动,但是用root账号无法连 ...

  3. showModalDialog介绍

    基本介绍:          showModalDialog()         (IE 4+ 支持)          showModelessDialog()      (IE 5+ 支持)    ...

  4. while 1要小心

    之前判断一个接口的返回,一定约定好了是返回retcode 1或者retcode 0,就用的这个判断,但是接口挂了的时候,一直返回未登录,找了很长时间为什么cpu一直消耗那么高. 使用wihle 1时候 ...

  5. VB2010新特性

    1.取消了连接符(1)","之后(2)"()"前后(3)"{}"前后(4)XML(5)连接字符"&"后(6)赋值 ...

  6. Java 流(Stream)、文件(File)和IO -- Java ByteArrayInputStream类

    字节数组输入流在内存中创建一个字节数组缓冲区,从输入流读取的数据保存在该字节数组缓冲区中.创建字节数组输入流对象有以下几种方式. 接收字节数组作为参数创建: ByteArrayInputStream ...

  7. PostgreSQL存储过程(5)-异常错误处理

    1. 异常错误处理 在PL/pgSQL函数中,如果没有异常捕获,函数会在发生错误时直接退出,与其相关的事物也会随之回滚.我们可以通过使用带有EXCEPTION子句的BEGIN块来捕获异常并使其从中恢复 ...

  8. /var/spool/postfix/maildrop/ 中有大量的文件

    今天查看硬盘剩余的容量,发现‘/’目录下占用了大量的空间:可我在这个目录下面没有放什么东西:仔细查看在/var/spool/postfix/maildrop/ 中发现了大量的文件.怎么会有这么多的文件 ...

  9. Splash Lua 脚本

    Splash 可以通过 Lua 脚本执行一系列渲染操作,这样我们就可以用 Splash 来模拟浏览器的操作了,Splash Lua 基础语法如下: function main(splash, args ...

  10. Unity读取配置文件

    config.ini存放在Assets目录下,项目打包之后存放在Data目录下exe同目录 // 从配置文件读取 string configFile = Application.dataPath + ...