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

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

作者:毛毛虫

前一篇中我们说了下如何把我们自己的栅格数据发布到Bing Map上,这一篇文章中主要是说了下如何从矢量数据生成用于网络制图平台的栅格瓦片(本例中是应用的Microsoft Bing Maps瓦片系统)。

有几种方法可以把矢量数据发布到Bing Maps 或 Google Maps上,这里我们用的方法是栅格化矢量数据并把栅格化后的数据生成Bing Maps瓦片。这里我们用的数据是全球覆盖面等高线图,这个数据的间隔为1000英尺(一些地区为500英尺,还有一些地区间隔不定)。

源数据如图:

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

部分放大后数据: 

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

首先要对数据进行下预处理。

因为这个数据量非常大,且在级别较高(级别数目较小)时,数据分布太密,所以在栅格化数据前,我们添加一个过滤,根据等高线的间距选择。如,缩放级别为14时,显示所有的等高线,在13级别时只显示能被10整除的,12级别时显示20的倍数,依次类推。我们可以使用一个tester和ExpressionEvaluator做个循环,如图:

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

Tester转换器的设置如下:

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


ExpressionEvaluator转换器的设置如下:

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

也可以用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整除的(本例中的级别是8),然后是能被1000和500整除的(本例中的级别是9),下面是 1000、500和200整除的(本例中的级别是10),等等依次类推。

为了更清楚的显示数据,我们下面给数据着色。

给数据着色后,我们可以更清楚的看到全球的高程分布。使用转换器PythonCaller 来生成一组渐变色,示例代码如下:

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

import pyfme

logger = pyfme.FMELogfile()

class ColorSetter(object):

    def input(self, feature):

       

        self.elev = feature.getIntAttribute('elevation_ft')

       

        if self.elev < 2000:

            if self.elev < 1000:

                self.color = '0,' + str(0.24 + 0.0004*self.elev) + ',0'

            else: 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'

            else: self.color = '0.7,' + str(0.0002*(7000 - self.elev)) + ',0'

        elif self.elev <= 15000:

            if self.elev < 10000:

                self.color = '1,' + str(0.0001*(self.elev/2)) + ',0'

            else: 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))

        else:

            self.color = '0.5,0.5,1'

       

        feature.setAttribute('fme_color', self.color)

        feature.setAttribute('fme_fill_color', self.color)

        self.pyoutput(feature)

    着色后生成的数据如下:

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

对照上面的颜色渐变条可以清楚的看到高程分布情况。

栅格化数据

在使用VirtualEarthTiler转换器之前,需要先栅格化矢量数据,考虑到我们的数据非常大,可以选择一小部分区域来做测试(具体如何操作参照FME中的栅格数据操作之十三——生成应用于网络制图平台的瓦片(一))。

Bing Maps (http://www.fmepedia.com/attachments/APlaceToHoldVETiles/VirtualEarth.htm)中的效果

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

Google Maps (http://www.fmepedia.com/attachments/APlaceToHoldVETiles/googlemaps.html) 中的效果

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

本文中简单讲了下把矢量数据预处理后,进行栅格化应用到网络地图应用平台上。在这一部分中,对于栅格化后切片操作没有详细论述,在下一篇中谈一下对数据量较大的数据的处理及优化等相关问题。