span8号
斯潘4
世界轮廓.zip
FFS2PASGIS.FMW
轮廓-光栅化postgis.fmw
光栅或传感器.fmw
运行所附工作区需要最新的(发布后)FME 2009或FME 2010!
这个场景展示了如何从矢量数据为Web映射平台准备光栅图块。场景使用微软必应地图瓷砖系统,然而,结果可以用于谷歌地图和其他地图平台。
Bing地图(又称虚拟地球)是一个强大而灵活的工具,可以通过互联网提供数据服务。FME可以在为必应地图准备数据时发挥重要作用。我已经发布了一个场景,解释了如何将光栅数据转换为Bing地图的光栅图层。
我发现Bing地图瓷砖非常方便的地方是,我们总是知道瓷砖和像素的地面单位大小,它在整个地球上每一个变焦级别都是恒定的。这是由球面墨卡托投影定义的。它允许以一种简单的方式设置一些参数。
现在想象一下,我们想获取一些矢量数据,并将其显示在Bing地图或谷歌地图中(请注意,两个链接指向同一个图块集)。有几种方法可以做到这一点;在本文中,我将只讨论一种方法——光栅化和制作Bing地图瓷砖。
这篇文章意味着你知道一些关于Bing地图工作原理的基础知识,什么是瓷砖?四脚架,和缩放级别。
作为源地图,我使用了来自Vmap级别0。该数据集覆盖全球,细节级别为1:1000000地图。
轮廓给了我们一个有趣的挑战——如果我们在每个缩放级别上显示所有线条,在较低的缩放级别,轮廓将完全覆盖山区的背景地图,因此,我们必须发明一种算法,可以为每个缩放级别选择特定高度的轮廓。例如,在任何缩放级别上都应能看到1000米的轮廓。而只有当我们放大到接近7级时,才有100米的轮廓。
另一方面,它可以非常有用地看到所有的轮廓,以获得地球的救济感。此外,保持所有轮廓对于FME桌面和FME服务器来说是一个很好的压力测试,所以我发布了这两个变体。
我们还希望在每个缩放级别上获得最高质量的光栅图块。这意味着,当我们进入下一个缩放级别时,我们无法对为一个缩放级别创建的分片重新取样–光栅化应分别对每个级别进行。
请看下图。我们可以看到当webmaptiler从源光栅(上面的行)制作图块时,光栅图块是如何淡出的。当我们制作矢量图块并分别对它们进行栅格化时,我们在所有缩放级别上都有一致的质量,另外,我们可以控制每个级别的内容(下一行):
虚拟地球有19个缩放级别。每层新瓷砖的数量是前一层的四倍。如果我们想缩小到14-15级,我们应该得到数以千万计的瓷砖,这就是为什么我还要讨论我们必须克服的性能挑战。该过程展示了如何在空间上启用数据库和FME服务器的情况下使用FME的全部功能。
vpf格式的源数据可以从国家地理空间情报局(NGA)网站.为了您的方便,我下载数据并将其转换为FFS格式。完整的档案可以从附加的world\u outlines.zip下载。未压缩,完整的数据集占用超过600兆字节。数据包含1000英尺间隔的轮廓(在某些地方为500英尺,其他一些轮廓线具有不同的间隔)。
为了我们的目的存储和检索这些数据量的最佳方法是在一个支持空间的数据库中。在我的例子中,我用过PostGIS数据库(将ffs转换为postgis的工作区是附件ffs2postgis.fmw)。
对于那些,害怕数据库,我知道我花了一个多小时才下载,安装,能够在上面运行PostgreSQL和Postgis,尽管我根本不是数据库专家。
在为光栅化准备数据时,我加了一个过滤器,根据轮廓间隔选择数据,也就是说,缩放级别14有所有的轮廓,缩放级别13–只能被10整除,12级的轮廓可以被20整除,等等,我们可以用测试仪来测试,但有时,表达评估师的一个简单表达可以做到完美:
@值(_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(\u elevation)%10?13∶14
通过这种方式,我们计算出应该看到轮廓的最高(最小数目)缩放级别。
之后,一个小循环将允许我们为每个缩放级别制作多组轮廓。
所以第一组只包含千分之一的轮廓,第二个-1000和500,第三,第1000名,第500和第200,等等。
渐变渐变是一个很好的选择范围广泛的值,如轮廓高程。使用pythoncaller设置颜色是分配fme_颜色属性的快速简便的方法。下面是附加工作区中使用的python代码示例:
import pyfmelogger=pyfm.fmelogfile()类colorsetter(object):def input(self,功能):self.elev=feature.getInttribute('elevation_ft'),如果self.elev<2000:if self.elev<1000:self.color='0',str(0.24+0.0004*self.elev)+,0'否则:self.color='0.5',str(0.24+0.0004*self.elev)+,0.5'elif self.elev<=6000:if self.elev<=3500:self.color=str(0.0002*(7000-self.elev))+','+str(0.0002*(7000-self.elev))+',0'其他:self.color='0.7',+str(0.0002*(7000-self.elev))+',0'elif self.elev<=15000:如果self.elev<10000:self.color='1',+str(0.0001*(self.elev/2))+',0'其他:self.color='1,'+str(0.0001*(15000 self.elev))+,0.5'elif self.elev<25000:self.color=str(0.0001*(25000-self.elev))+,0,+str(0.0001*(self.elev/3))否则:self.color='0.5,0.5,1'feature.setattribute('fme\u color',self.color)feature.setattribute('fme_fill_color',self.color)self.pyoutput(功能)
通常,FME使用WebMaptiler Transformer从输入光栅生成Bing映射图块。这种方法可能对向量数据集不太适用。将地图光栅化到缩放级别10将产生一幅每边262144像素的图像,这些刺耳的声音有点难以控制。我们可以将数据集的较小部分光栅化,然后在较小的光栅上使用WebMaptiler,但这将涉及两个光栅操作(光栅化本身和光栅平铺)。此外,如果我们选择一个任意的网格,我们可能会以不完整的瓷砖结束,还要注意把它们拼接在一起。经过一些测试,我放弃了这条路线,决定尝试直接剪切和光栅化到必应地图瓷砖。也就是说,ImageRasterizerTransformer应获取制作单独瓷砖所需的准确数据部分。所以现在我们只有一个光栅变压器。这一变化的另一个积极的副作用是,我们现在不会生产没有任何数据的瓷砖。
我们怎样才能做出这样的部分呢?答案很简单剪刀变压器。我们可以制作矢量瓷砖多边形作为裁剪器,数据集提供剪辑。这就是理论。如果我们把我们的世界从1级放大到10级,我们必须制造近150万台快船。那太多了。尽管改进了很多,当裁剪器的数量超过20000-60000(取决于裁剪数据的数量)时,我们仍然存在一些性能问题。
我试着用交叉线代替剪子,这让我可以比剪子再放大两级,然而,它需要一些额外的工作来计算四键,尽管如此,它不能用于更深层的铺砖。
在我对最终工作流的近似中,下一个合乎逻辑的步骤是制定一个由两个(或更多)步骤组成的过程。亚搏在线第一步,我将把原始数据集平铺成更小的数据集,其范围与某个缩放级别的平铺范围相匹配(例如,7或8,如在我的测试中)。然后,对每个较小的数据集进行相同的平铺和最终光栅化,将其缩小到14-15级。
事实上,不应该有太多的需要在一个过程中,会采取一些数据,并瓦片它的整个缩放级别范围从1级(世界)到19级(摩尔山)。世界地图和街道地图的内容各不相同,即使有些元素是相同的(海岸线,例如,它们通常用完全不同的几何图形来表示——广义的或详细的。
为了管理这样的工作流程,亚搏在线我必须设置以下程序。在第一阶段,原始数据集被分割成更小的部分,并以某种方便的格式存储(最好是使用空间索引-一个FFS或一些空间数据库)。第二阶段有两个工作区,一个用另一个执行工作空间管理器或ServerJobSubmitter Transformer。
第一个工作区决定应获取数据的哪个部分(文件或数据库表),第二个工作区知道如何平铺和光栅化进入它的内容。
不过,生成和保留多个较小的数据集而不是一个较大的数据集的必要性不是一个理想的解决方案——很难管理数据存储和分发,一些零件更容易松动,等。这就是为什么空间数据库在整个过程中发挥着更重要的作用。
空间数据库,如Oracle,SQL服务器,MySQL或PostGIS在快速读取空间数据子集方面非常有效。如果我们需要从传统的向量格式(如mapinfo或dgn)中提取一些数据,我们必须读取整个数据集,添加一个定义感兴趣区域边界的多边形,然后,使用裁剪器或其中一个覆盖器(例如AreaOnAreaOverlayer)获取数据。对于数据库读卡器,获得相同的结果只是设置读卡器参数的问题,可以出版,因此,从外部工作区设置。
此处发布的最终工作流亚搏在线如下所示。
我们采用了一个代表我们所在区域的功能——它可以是一个国家区域或简单的边界框。我们要求参数-最小和最大缩放级别(从中可以看到缩放级别数据)。我们还必须指定所谓的“平铺级别”(我以前称之为“读取”,但就其用途而言,这不是一个很好的词。
使用光栅化器,我们制作一个小的光栅(1*1或10*10像素,以避免任何舍入问题)。并通过WebMaptiler传递此光栅。我们有瓷砖,知道他们的四键名称。
然后用边界提取程序,我们得到最小和最大的x和y,它们和Quadkey一起作为第二个工作区的参数。
在下面的示例中,我们有28块瓷砖,这意味着我们将执行从缩放级别5到缩放级别7(即平铺级别)的28个工作区。顺便说一句,我们有人在马达加斯加用FME把TIFF转换成BMP,也许在下次会议上我会告诉你我们是怎么知道的,我们如何收集和使用有关用户的统计数据。
现在,我们在这28个工作区中做什么?我们将从外部工作区发送的参数(平铺区)应用于数据库读取器。使用“clip”选项,我们只获取我们提交的QuadKey中的数据。
在那之后,我们做我们的常规工作——如果需要的话,染色和比例选择。
然后,我们要么简单地按读取到图块的内容分组,然后将其保存为PNG文件,或者我们做额外的瓷砖。
为什么有些瓷砖会马上写出来,有些又被铺了瓷砖?这取决于瓷砖的水平。再一次,说到上面的图像,用5级和6级变焦的图像块读取的数据立刻被光栅化和写入。
使用缩放级别7的分片读取的数据也直接光栅化,但在此之前,是瓷砖,以制作缩放级别8和9的平铺。
这一切都给了我们很大的灵活性。现在我们可以控制将执行多少工作区,以及每个工作区将生成多少个图块。当我们增加第一个工作区中的平铺数量(通过增加平铺级别编号)时,我们增加了将要执行的工作区的数量,这意味着每个工作区的工作量都会减少。或者,如果我们提交较少的瓷砖,这意味着更少的工作空间,每个工作区有更多的工作(更多的图块)。
下图显示平铺到(或向下)缩放级别8。当我试图用一个工作区来平铺所有东西时,36小时后我不得不放弃——我没有看到任何工作在进行。或者我的故障模式与影响分析停止了,或者我没有足够的耐心——其余的数字告诉我们,进一步的等待是没有意义的。
当工作区不需要做那么多的剪报时,情况开始好转。每个工作区有4000块瓷砖的效果似乎比16000块要好得多,每个工作区的间隔在64到1000块之间似乎是最佳的。当我们有太多的工作空间时,通过所有其他变压器传递数据的必要性超过了快速剪切的任何优点。
每个WKSP的工作区瓷砖铺设水平
1 1 1
2 16 4096个
3 64 1024个
4 320 320
5 1344 1344
6 5440 5440
7 21824 4个
如果我们真的需要很多瓷砖,这个过程可能会很慢。根据不同的条件,我的机器每秒能生产6到10块瓷砖,这意味着每天大约50万到85万块瓷砖。然而,大项目,比如说加拿大全境,如果将细节降低到缩放级别14-15,则需要数百万个瓷砖。
上面解释亚搏在线的工作流程非常适合于FME服务器技术。
事实上,所有需要做的(假设FME服务器已经启动并运行)就是用ServerJobSubmitter替换WorkbencRunner。该变压器将采用相同的参数,一旦发生变化,我们已经准备好用FME服务器制作磁贴。
最初,我们尝试了一台单引擎的FME服务器四核机器,结果与我们在带FME桌面的机器上得到的结果非常接近。这是意料之中的。然后我们想,如果我们在那台四核机器上安装四个引擎,我们会看到性能的真正改进。然而,许多引擎的性能比只有一个引擎的性能差(第1列和第5列):
我们接下来的两个测试比较了四台机器的性能,分别是单引擎和双引擎。正如你所看到的,结果非常接近——都在2.5小时左右(第2列和第4列)。
8台单引擎机器取得了最快的结果。也许,两台发动机的机器也一样,但是,当你为一台发动机买单时,要得到相同的结果,可能没有多大的意义。
为什么会这样?我们检查了任务管理器的CPU消耗情况,在这个过程的大部分时间里,它是相当低的。在与技术经验更丰富的安全人员进行了一些磋商之后,亚搏在线我们一致认为瓶颈是I/O——我们只是不能在给定的时间段内写入更多的文件,所以多个引擎会等他们有机会写东西,但结果将是相同或更糟的——仅仅是因为我们制造了这样的人群。
然后我们做了一些简单的性能测试,以了解我们可以多快地生成瓷砖。我们将vmap轮廓平铺到缩放级别8。为此,我们用1运行了平铺过程,2,4个,8台机器,如你所见,我们把休息时间从两小时缩短到20分钟以下。
然后我们尝试了如果我们达到10级和11级的速度,表格显示了这些数字。25万块瓷砖可以在大约2小时内完成,在6.4小时内完成了100万块瓷砖。在一台机器上,这需要将近两天的时间。
水平平铺分钟(小时)
8 24500 18(0.3)
10 245000 105(1.75)
11 1000000 384(6.4)
现在很容易想象,将一个具有多层的大区域平铺到缩放级别14或15可能需要很长的时间或大量的计算资源。
所以,如果我们有无限数量的计算机,我们能以多快的速度达到我们的目标?
此图不处理总时间;它显示每个工作区的平均时间和最大时间。
图中所示的过程生成约3500块瓷砖,一个工作区大约需要半小时。当工作空间数量增加时,平均值和最大值都在下降。有82个工作区,也就是说,有82台发动机,这个过程可以在半分钟内完成(如果没有其他瓶颈)。
FME服务器现在可以工作云,上述测试也由我们的同事在维奥吉奥.
用FME制作瓷砖真的很容易。只要瓦片的数量不超过数十万或几百万,就只需要使用FME桌面就可以开始制作它们。
平铺过程的结果并不局限于单个映射平台Bing映射。它可以与谷歌地球和其他网络地图平台一起使用。
如何将数据处理拆分为多个工作区的一般思想并不局限于所描述的过程,因此,更有价值。
FME服务器允许更快的数据生成,因此,如果您的卷很大或需要频繁更新,这就是我们要走的路。
即使FME服务器不够,FME现在生活在云中,它可以扩展到非常宽的范围。
world_outlines.zip-FFS格式的源数据
ffs2postgis.fmw-将ffs转换为postgis的工作区
rasterizerrunnerpostgis.fmw-执行助手工作区的父工作区
Contour_RasterizationPostgis.fmw-帮助工作区生成瓷砖
结果在必应地图
结果在谷歌地图
上述过程相当复杂,随时联系技术支持有任何相关问题或发现任何不正常工作。
?2019安全亚搏在线软件公司|合法的