FME中的栅格数据操作之十三——生成应用于网络制图平台的瓦片(三)

原文发布时间:2010-06-13

作者:毛毛虫

对于前面讲述的生成瓦片的处理,如果要处理的数据集不很大的时候,或许能顺利运行。但是通常要处理的数据会很大,这是会出现FME内存不足的情况。

我们这里再说一下前面我们生成瓦片的过程:先读入shp文件,然后选择一小部分需要生成瓦片的区域;之后栅格化这部分数据,然后生成瓦片输出。

这时存在下面一些问题:一是数据管理起来可能会很麻烦;二、产生的瓦片可能不完整。我们随机选择的区域(没有按Bing Maps网格的划分)可能会把一个瓦片分成几个部分,也就是这个瓦片一部分可能会在你选择的一个区域,而另一部分在另一个区域,这时候需要它们融合为一张。

我们改进下这个流程,即使用Bing Maps瓦片的边界作为边界来选择裁剪区域。同时,为了方便的管理数据,我们最好能采用一些方便的格式存储(最好是使用空间索引,如FFS或一些空间数据库的方式)。

这个改进的方法大致流程是:沿着Bing Maps瓦片的边界读入生成瓦片的区域,然后设置显示比例和颜色,使用转换器Clipper,用由Bing Maps瓦片生成的多边形裁剪设置好显示比例和颜色后的矢量数据,然后使用ImageRasterizer栅格化数据。

具体做法:创建两个工作空间,使用转换器WorkspaceRunner把两个工作空间连接起来。其中第一个工作空间用来生成裁剪区域,并运行第二个工作空间。第一个工作空间选定一个区域,当然用户可以在这里设置相关的参数(如显示级别)。再把这个区域发送到VirtualEarthTiler转换器中,生成需要Bing Maps的边界。然后从每个瓦片中提取最大/最小的X/Y的坐标值,作为运行第二个工作空间的参数。最用使用转换器WorkspaceRunner运行第二个工作空间。转换器WorkspaceRunner设置如下:

FME中的栅格数据操作之十三——生成应用于网络制图平台的瓦片(三)

在FME WorkSpace参数中输入要运行的第二个工作空间,然后在参数列表中设置下第二个工作空间需要的参数值,就可以运行在这个工作空间中按设置的参数值运行第二个工作空间。

例如下图:

FME中的栅格数据操作之十三——生成应用于网络制图平台的瓦片(三)

图中橘黄色区域是我们选择的区域,如果在5-7级进行切片的话,需要用到28个工作空间(用到的工作空间图中都用了Quadkey标识出来了)。对于这些瓦片的选择,我们可以使用Clipper转换器,在生成的5-7级的瓦片中选择落在提供的区域内部和跟该区域有交集的部分。然后提取每个选中瓦片的边界,即最大/最小的X/Y的坐标值传入到第二个工作空间。第二个工作空间的相关参数如下:

FME中的栅格数据操作之十三——生成应用于网络制图平台的瓦片(三)

其中Minimum X、Minimum Y、Maximum X和Maximum Y就是第二个工作空间需要切片的范围。

第二个工作空间读入根据第一个工作空间设置的区域内的数据,对矢量数据进行显示级别设置和着色,裁剪数据最后进行栅格化。有时需要进一步切片数据。这时也是使用一个瓦片生成转换器VirtualEarthTiler和边界提取转换器BoundingBoxReplacer:

FME中的栅格数据操作之十三——生成应用于网络制图平台的瓦片(三)

这是因为有一个工作空间数目与每个工作空间每秒切片情况的对比。

FME中的栅格数据操作之十三——生成应用于网络制图平台的瓦片(三)

FME中的栅格数据操作之十三——生成应用于网络制图平台的瓦片(三)

当工作空间太多时,电脑的运行开销也会激增,这样快速切片节省的开销无法抵消工作空间的消耗,也就达不到快速切片的目的,所有工作空间太多是不可取的。通过FME的相关测试,最佳的情况是每个workspace处理大概64-1000个瓦片的时候。

另一种途径是可以通过FME Server。今后我会写一个FME Server的相关专题再来讨论这个问题。