span8
span4
World_Contours.zip
ffs2postgis.fmw
contour-rasterizationpostgis.fmw
rasterizerrunnerpostgis.fmw
最新(后释放)需要FME 2009年或2010 FME运行连接工作区!
这个场景展示了如何从矢量数据中为web映射平台准备栅格块。该场景使用微软Bing地图然而,平铺系统的结果可以用于谷歌映射和其他映射平台。
Bing地图(又名虚拟地球)是一种通过Internet提供数据的强大和灵活的工具。FME可以在Bing地图准备数据起着至关重要的作用。我已经发表了介绍如何栅格数据转换成光栅像素块的Bing地图图层的场景。
我发现Bing Maps tiles非常方便的一点是,我们总是知道地面单位的tile和像素大小,它们在整个地球的每个缩放级别上都是恒定的。这是由球面墨卡托投影定义的。它允许以一种简单的方式设置一些参数。
现在想象一下,我们想采取一些矢量数据并显示它在Bing地图或谷歌地图(注意这两个链接都指向同一个tile集合)。有这样做的几种方法;在这篇文章中,我将谈谈只有一个办法 - 光栅化,使Bing地图图块。
这篇文章意味着你知道Bing地图是如何工作的一些基础知识,什么是地砖,quadkeys和缩放级别。
作为一个源地图,我使用了等高线数据VMap 0级。此数据集在全球的覆盖面和1详细程度:100万的地图。
轮廓给我们一个有趣的挑战 - 如果我们以较低的缩放级别显示在每个缩放级别的所有线条,轮廓会简单地覆盖在山区的背景地图完全,所以我们要创造一种算法,将采取有关选择轮廓护理对于每个缩放级别一定升高。例如,千米轮廓应在任何缩放级别可以看出,而百米轮廓仅在比7级更接近时,我们放大。
在另一方面,它可以看到所有的轮廓让地球救济的感觉相当有用。此外,保持所有轮廓是FME Desktop和FME Server的一个精彩的压力测试,所以我公布这两种变型。
我们还想实现最高质量的光栅瓷砖在每个缩放级别。这意味着当我们进入下一个缩放级别时,我们不能重新采样为一个缩放级别创建的图像块——每个级别的栅格化应该分别进行。
请看下面的插图。我们可以看到当WebMapTiler从源栅格(上面的行)生成栅格时,栅格块是如何淡出的。当我们制作矢量贴图并分别对它们进行栅格化时,我们在所有缩放级别上的质量都是一致的,此外,我们还可以控制每个级别上的内容(如下行所示):
有在虚拟地球19个缩放级别。每一个新的层比以前的四倍以上的瓷砖。如果我们想再往缩放级别14-15,我们应该得到几千万瓦的,这就是为什么我也要去谈性能挑战,我们必须克服。该过程显示了如何使用FME的全部功能与空间功能的数据库和FME服务器。
在VPF格式源数据可以从下载国家地理空间情报局(NGA)网站。为了方便您,我下载并将数据转换为FFS格式。完整的归档文件可以从附加的world_context .zip下载。未压缩的完整数据集占用超过600兆字节。数据包含1000英尺间隔的等高线(有些地方是500英尺,其他一些等高线有不同的间隔)。
存储的最佳方式和检索这样的数据对于我们的目的是在空间上启用数据库。在我的例子中,我使用PostGIS的数据库(将FFS转换为PostGIS的工作空间是附件ffs2postgis.fmw)。
对于那些害怕数据库的人,我可以告诉他们,我花了一个多小时下载、安装并在上面运行PostgreSQL和PostGIS,尽管我根本不是数据库专家。
同时准备数据的光栅化,我添加了一个过滤器,这取决于该选择数据上轮廓间隔,使得比如说缩放水平14具有所有轮廓,放大级13 - 仅由10整除,电平12将具有轮廓整除20等我们可以使用测试为,但有时的ExpressionEvaluator简单的表达做了完美的工作:
@ value (_elevation) % 1000 = = 0 ? 8: (@ value (_elevation) % 500 = = 0 ?9:(@ value (_elevation) % 200 = = 0 ? 10: (@ value (_elevation) % 100 = = 0 ?11:(@ value (_elevation) % 20 = = 0 ? 12: (@ value (_elevation) % 10 ? 13:14)))))
这样,我们计算最高(最小号),变焦将在哪个轮廓应该被看作水平。
在此之后,一个小圈将使我们能够做出几个组的轮廓为每个缩放级别的。
因此,第一组将只包含千分之一轮廓,第二个 - 第1000和第500,第三,第1000,第500和第200,等等。
梯度的斜坡为宽的数值范围如轮廓隆起的一个很好的选择。用PythonCaller设置颜色是一种快速简便的方法来分配fme_color属性。这里是在所附的工作区使用的Python代码的示例:
导入pyfme logger = pyfme. fmelogfile()类ColorSetter(对象):def input(self, feature): self。elev = feature.getIntAttribute('elevation_ft')如果self。elev < 2000:如果自我。elev < 1000:自我。color = '0,' + str(0.24 + 0.0004*self.elev) + ',0' else: self。颜色= '0.5,' + str(0.24 + 0.0004*self.elev) + ',0.5' elif self。elev <= 6000:如果自己。elev <= 3500:自我。颜色= str(0.0002*(7000 - self.elev)) + ',' + str(0.0002*(7000 - self.elev)) + ',0' else: self。颜色= '0.7,' + str(0.0002*(7000 - self.elev)) + ',0' elif self。elev <= 15000:如果自己。elev < 10000:自我。颜色= ' 1 ' + str (0.0001 * (self.elev / 2)) +其他”,0 ':自我。颜色= '1,' + str(0.0001*(15000 self.elev)) + ',0.5' elif self。elev < 25000:自我。颜色= str(0.0001*(25000 - self.elev)) + ',0,' + str(0.0001*(self.elev/3))) else: self。颜色= '0.5,0.5,1'特征。setAttribute (fme_color, self.color)特性。setAttribute (fme_fill_color, self.color) self.pyoutput(特性)
通常,FME使用WebMapTiler转换器从一个传入的栅格中生成Bing地图块。这种方法可能不适用于向量数据集。将一张地图的栅格化到缩放级别10将产生一个沿每边262,144像素的图像,而这些栅格有点难以处理。我们可以对数据集的较小部分进行栅格化,然后在这些较小的栅格上使用WebMapTileron,但是这将涉及两个栅格操作(栅格化本身和栅格平铺)。此外,如果我们选择一个任意的网格,我们可能会得到不完整的瓦片,并且必须小心地将它们拼接在一起。经过一些测试后,我放弃了这条路线,决定尝试直接剪切和栅格化Bing Maps tiles。也就是说,ImageRasterizertransformer应该获得制作独立块所需的准确数据部分。现在我们只有一个光栅变压器。这种变化的另一个积极的副作用是,现在我们不会生产没有任何数据的磁贴。
我们怎样才能使这样的部分?答案很简单 - 在限幅器变压器。我们可以把向量瓷砖多边形充当快船,和数据集物资Clippees。这是理论。如果我们瓷砖我国从缩放级别1世界降至10的水平,我们要创造近150万快船。好多啊。尽管所有的改进,我们仍然有一些性能问题时,快船的数量超过20,000-60,000(取决于截取的数据量)。
我尝试过用Intersector来代替Clipper,这让我可以比Clipper放大两层,但是,这需要在计算四键上做一些额外的工作,而且,它仍然不能用于更深的平铺。
在我的近似值至最终工作流中的下一个逻辑步骤是使由两种(或更多)的步骤的过程。亚搏在线有了第一步,我会瓷砖原始数据集分成更小的数据集相匹配的一些缩放级别(比如,7或8在我的测试)的区块范围的程度,然后进行同样的瓷砖和最终的光栅化每个那些规模较小的数据集下来缩放级别14-15。
其实,不应该有一个过程太大必要,将采取一些数据,它平铺在整个变焦范围内级别从1级(世界)到19级(摩尔山)。世界和街道地图的地图具有完全不同的内容,即使一些元素是相同的(海岸线等),它们通常是由有很大的不同几何形状的代表 - 广义或详细说明。
为了管理这样一个工作流,我必须设置以下过亚搏在线程。在第一阶段,原始数据集被分割成更小的部分,并以某种方便的格式存储(最好使用空间索引—FFS或某种空间数据库)。在第二阶段有两个工作区,一个执行另一个WorkspaceRunner或ServerJobSubmitter变压器。
第一工作区决定哪一部分应该采取(什么文件或数据库表)中的数据,第二工作区懂得瓷砖和光栅化无论是进入它。
尽管如此,生成和保存多个较小的数据集而不是一个大型数据集的必要性并不是一个理想的解决方案——数据存储和分布的管理更加困难,更容易丢失某些部分,等等。这就是空间数据库在整个过程中发挥更大作用的原因。
Oracle、SQL Server、MySQL或PostGIS等空间数据库在快速读取空间数据子集方面非常有效。如果我们需要从传统的向量中提取一些数据格式如MapInfo或DGN,我们会阅读整个数据集,添加一个定义多边形的边界感兴趣的领域,然后,限幅器或一个覆盖物(如AreaOnAreaOverlayer)获取数据。对于数据库读取器,只需设置读取器参数就可以得到相同的结果,这些参数可以发布,因此可以从外部工作区进行设置。
这里发布的最终工作流亚搏在线如下所示。
我们用一个特征来表示我们的区域——它可以是一个国家区域或者简单的边界框。我们要求的参数——最小和最大缩放级别(缩放级别的数据应该见过),我们还必须指定所谓“瓷砖”(我习惯叫它阅读,但它不是很好单词的目的是用于)。
使用光栅化,我们做一个小的光栅(1 * 1或也许10个* 10像素,以避免任何四舍五入问题),并通过WebMapTiler通过这个光栅。我们得到VE的瓷砖,哪知道他们的名字quadkey。
然后用BoundsExtractor,我们得到的最小和最大X和Y,它们与quadkey共同作为参数传递给第二工作区。
在下面的例子中,我们有28个任务块,这意味着我们将执行28个工作空间,从缩放级别5到缩放级别7(这就是平铺级别)。顺便说一句,我们有一个人在马达加斯加用FME把TIFF转换成BMP,也许在下次会议上我会告诉你我们是怎么知道的,我们是怎么收集和使用用户的统计数据的。
现在,我们需要什么样的工作区28办?我们采用从外部工作区数据库读者发参数(瓦范围)。随着选项“夹”我们得到的只是数据就是我们提交quadkey内。
之后,我们做我们的经常性的工作 - 如果需要,着色和规模的选择。
然后,我们可以简单地根据读入平铺的内容对group进行光栅化并将其保存为PNG文件,或者执行附加平铺。
为什么有些瓷砖是直接写出来的,而有些是重新贴上去的?这取决于平铺水平。再一次,谈到上面的图像-数据读取与瓷砖的缩放级别5和6是光栅化和写入马上。
数据读取与缩放级别7的瓷砖也直接光栅化,而且在此之前,平铺,使缩放级别8和9的瓷砖。
这一切都给了我们极大的灵活性。现在我们可以控制将执行多少工作空间,以及每个工作空间将生成多少块。当我们在第一个工作空间中增加tile的数量(通过增加平铺级别的数量)时,我们增加了将要执行的工作空间的数量,这意味着每个工作空间要做的事情更少了。或者,如果我们提交更少的块,就意味着更少的工作空间,每个工作空间有更多的工作(更多的块)。
下图为平铺达到(或向下)放大8级。当我试图瓦都与一个工作区的图,我后36小时放弃 - 我没有看到任何工作进行下去。无论是我的FME止步不前,或者我是不是足够的耐心 - 数字其余告诉我们,进一步等待没有意义。
当工作区没有做出许多剪报,情况开始好转。每个工作区4000瓦似乎超过16,000好得多做的,并且每个工作区千瓦64之间的间隔似乎是最佳的。当我们有太多的工作区,有必要通过所有其它变压器传递数据远远超过越快裁剪任何优势。
每个wksp的工作空间平铺级别#
11 16384
2 16 4096
3 64 1024
4 320 256
5 1344 64
6 5440 16
7 21824 4
如果我们真的需要很多瓷砖,这个过程可能会非常慢。根据不同的条件,我的机器每秒可以生产6到10块瓦片,这意味着每天大约可以生产50万到85万块瓦片。然而,大项目,比如说加拿大范围内的大项目,如果把细节缩小到14-15级,将需要数百万块瓷砖。
工作流上亚搏在线述拟合解释真的很好到FME Server技术。
事实上,所有的东西必须做(假设FME Server是运行起来)是ServerJobSubmitter更换WorkbenchRunner。该变压器将采取相同的参数,一旦更改,我们准备做的瓷砖与FME Server中。
最初,我们尝试了一个FME Server的四核机具有单引擎,结果相当接近那些我们与FME桌面的计算机上得到的,并且预期。后来我们想,如果我们把四台发动机是四核的机器,我们将看到性能真正的改善上。然而,我们得到了很多的发动机比只用一个(列1和5)更糟糕的表现:
我们接下来的测试相比,性能上的四台机器单,然后在每两个引擎。正如你所看到的,结果是非常接近 - 无论是约2.5小时(列2和4)。
最快的结果是8台单引擎机器。也许,我们会有相同的两台发动机机器,但当你为一台发动机付钱时,可能没有多少意义有两倍多得到相同的结果。
为什么会这样呢?我们检查任务管理器的CPU消耗,并为过程的大部分是相当低的。更在技术上经历了Safers一些协商后,我们一致认为,瓶颈是I / O - 我们根本不能在给定的时间内写出更多的文件亚搏在线,所以多个引擎只会等待时,他们会得到他们的机会来写东西,但结果将是相同的或者更糟 - 只是因为我们做出这样的人群。
然后我们进行了一些简单的性能测试,以了解生成磁贴的速度有多快。我们将VMap的等高线平铺到缩放级别8。为此,我们使用1、2、4和8台机器运行了平铺过程,如您所见,我们将时间从两个小时减少到不到20分钟。
然后,我们尝试了,我们能多快,如果我们去到10级和11,和表显示的数字。250000个瓷砖可以做到在2小时左右,一米万元的瓷砖是6.4小时内完成。在一台机器,它会采取几乎两天。
等级瓷砖分钟(小时)
8 24500 18(0.3)
10245,000 105 (1.75)
11,000,000 384 (6.4)
现在很容易想象,平铺大面积多层下降到放大14级或15可以采取两种很长的时间或者大量的计算资源。
那么,如果我们有无限数量的电脑,我们能以多快的速度达到我们的目标呢?
此图不处理总时间;它示出了平均和每个工作区的最大时间。
与此曲线中所示的过程产生约3500瓦,取约半小时为一个工作区。当工作区数量的增长,平均和最大时间正在下降。82个工作区,即用82个发动机,这个过程可以完成在半分钟(如果没有其他瓶颈)。
FME Server现在可以工作在云端,上述测试亦由我们在WeoGeo。
这是很容易下手FME制造瓦片。仅需要FME桌面开始做他们只要区块的个数不超过几十万或几百万瓦。
平铺处理的结果不限于一个单一的映射平台Bing地图。它可以与谷歌地球和其他web地图平台上使用。
一般知道如何处理数据分割成多个工作空间不限定于所描述的过程,因此,是更有价值的。
FME服务器允许更快的数据生成,所以如果您的数据量很大或者需要频繁的更新,这是一个好办法。
即使FME服务器还不够,FME现在也生活在云里,可以向外扩展。
World_Contours.zip - 在FFS格式的源数据
ffs2postgis.fmw - 工作区翻译FFS到了PostGIS
RasterizerRunnerPostGIS。父工作空间执行辅助工作空间
contour_rasterizationPostGIS.fmw - 辅助工作区产生瓦片
结果Bing地图
结果谷歌地图
上述过程相当复杂,请随时联系技术支持有任何相关的问题,或者如果您发现任何不正常。
©2020安全亚搏在线软件公司|法律