geotrellis使用(三十二)大量GeoTiff文件实时发布TMS服务
2017-09-08 23:56
309 查看
前言
在上一篇文章中我讲了如何直接将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使用(三十一)使用geotrellis直接将GeoTiff发布为TMS服务
- geotrellis使用(三十一)使用geotrellis直接将GeoTiff发布为TMS服务
- geotrellis使用(三十一)使用geotrellis直接将GeoTiff发布为TMS服务
- geotrellis使用(三十一)使用geotrellis直接将GeoTiff发布为TMS服务
- 怎么使用外部配置文件发布WFS服务(基于Arcgis Server)
- 使用Python创建.sd服务定义文件,实现脚本自动发布ArcGIS服务
- 使用Python创建.sd服务定义文件,实现脚本自动发布ArcGIS服务
- ArcMap 生成SLD文件及wms服务发布及使用
- [置顶] 使用ArcGIS Portal10.5直接发布三维3D服务及文件支持哪些格式?
- WCF步步为营(二):使用配置文件改变发布服务的方式
- WCF系列(二) -- 使用配置文件构建和使用WCF服务
- WCF系列(一) -- 完全不使用配置文件构建和使用WCF服务【转】
- 在一个目录下边快速创建大量文件及目录(使用dos batch)
- WCF步步为营(三):使用配置文件改变使用服务的方式
- (转)使用Ant编译大量java文件时出java.lang.OutOfMemoryError
- 当局域网内某台主机使用P2P进行下载时,P2P软件会占用局域网到互联网出口的大量的带宽,导致其他用户网速慢、卡等现象。BT等软件在下载的同时又作为种子为其他人提供下载服务
- How to :发布内部网络中的文件共享服务
- 5G网络硬盘,100M文件大小,联想研究院发布联想社区化数据服务
- [WS]使用Axis发布简单的Web服务
- 实时管理Linux内核——使用 /proc 文件系统来控制系统