GML到SVG的转换

尽管 GML 适用于地理信息交换和共享,但它并不是为图像显示而设计的,所以 GML 文档是无法以图像的形式显示给用户的。要将地理时空信息发布出去,就要将 GML 文档转换为合适的图像格式文件。此数据发布组件采用 SVG 作为系统的地理信息发布格式,因此需要将 GML 文档转换为 SVG 文档。

GML文档向SVG文档转换,是通过将编写好的样式表(XSL)和GML源文件,传递给XSLT处理器进行执行实现的。用户查询是变化的,相应的GML文档也是变化的,则GML文档向SVG文档转化时所用的样式表也是变化的,所以样式表应该动态生成。因此,在中介器上有一个元数据数据库,每一个元数据对应一个样式表,如元数据LineString对应一个名为LineString.xsl的样式表。当GML文档向SVG转化时,先对GML文档进行遍历,将出现的元数据所对应的样式表集成,生成一个新的样式表,根据这个样式表将GML文档转化为SVG图像,再将SVG图像返回给用户。

创建样式表,最主要的问题就是如何定义模板。根据源文档的结构,在样式表中寻找匹配的模板片断,进行相应的转换。

下面是XSL样式表文件中如何将点元素进行转换的代码片断。

<xsl:param name="pointWidth" select="5" />

<xsl:template match="gml:pointMember/gml:Point | gml:pointProperty/ gml:Point">

  <xsl:variable name="x0" select="gml:coord/gml:X" />

  <xsl:variable name="y0" select="gml:coord/gml:Y" />

  <xsl:element name="circle">

    <xsl:attribute name="cx">

      <xsl:value-of select="$x0" />

    </xsl:attribute>

    <xsl:attribute name="cy">

      <xsl:value-of select="$y0" />

    </xsl:attribute>

    <xsl:attribute name="r">

       <xsl:value-of select="$pointWidth" />

    </xsl:attribute>

  </xsl:element>

</xsl:template>

这里首先定义了pointWidth,将其定义为5GML中有point元素,而在SVG中没有point元素,所以在这里我们用5个象素的circle来代替point。可以看到,程序首先找到Point节点,将其坐标XY值读入变量x0y0中;然后输出一个上下文节点元素circle,并设置其属性cx的值为变量x0的值,设置其属性cy的值为变量y0的值,设置其属性r的值为pointWidth的值。通过此段XSL片断,就可以将GML规范中的point转换为SVG规范文档中的circle。其它的类似。GML元素到SVG元素的对应关系如下表所示:

GML元素

SVG元素

Point

circle

MultiPoint

grouped circles

LineString

polyline

MultiLineString

grouped polylines

Polygon

path

MultiPolygon

grouped paths

GML元素转换到SVG元素的对应关系

    这里只是一个最简单的说明转换过程的例子,如何将GML文档完善的转换为SVG文档,需要考虑的问题还非常的多。

 

你可能感兴趣的:(数据库,文档,Path,XSL,XSLT)