以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 SVG/GML/VRML/X3D/XAML 』  (http://bbs.xml.org.cn/list.asp?boardid=21)
----  SVG高手看过来,从GML到SVG,我这么做怎么不对?  (http://bbs.xml.org.cn/dispbbs.asp?boardid=21&rootid=&id=33545)


--  作者:yuelongming
--  发布时间:6/1/2006 11:04:00 PM

--  SVG高手看过来,从GML到SVG,我这么做怎么不对?
各位:
   我要把GML转为SVG,通过编写一个XSLT完成,我的GML文件很简单,就是一个点,但总是不对,帮帮忙找下我错在哪里了.谢谢你们!!!
GML文件:
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>

<ex:Layer xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ex="http://www.opengis.net/examples"  xsi:schemaLocation="http://www.opengis.net/examples e:\masterpaper\base\dp.xsd">
 <gml:boundedBy>
  <gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
   <gml:pos>32.560001373291016 15.361444473266602</gml:pos>
   <gml:pos>54.61927032470703 38.08097839355469</gml:pos>
  </gml:Envelope>
 </gml:boundedBy>
 <ex:EntityMember>
  <ex:Property>
   <ex:PropertyName>building1</ex:PropertyName>
   <ex:value dataType="C">school</ex:value>
  </ex:Property>
  <gml:Point>
   <gml:coord>
                       <gml:X>46.29011917114258</gml:X>
                       <gml:Y>38.08097839355469</gml:Y>
                    </gml:coord>
  </gml:Point>
 </ex:EntityMember>
</ex:Layer>


XSL文件如下:
<?xml version="1.0"?  encoding="ISO-8859-1">
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:gml="http://www.opengis.net/gml"
                version=="1.0">

<xsl:output method="xml" indent="yes" standalone="no" media-type="image/svg+xml"
" doctype-public="-//W3C//DTD SVG 20000303 Stylable//EN"/>

<xsl:template match="/">
  <svg xmlns:svg="http://www.w3.org/2000/svg">
   <xsl:for-each select="ex:Layer/ex:EntityMember/gml:Point">
                          <xsl:variable name="x0">
                             <xsl:value-of  select="/ex:Layer/ex:EntityMember/gml:Point/gml:coord/gml:X"/>
                          </xsl:variable>
                          <xsl:variable name="y0">
                             <xsl:value-of select="/ex:Layer/ex:EntityMember/gml:Point/gml:coord/gml:Y"/>
                          </xsl:varible>
                          <circle cx="$x0" cy="$y0" r="5"  fill="red" stroke="black" />
   </xsl:for-each>
  </svg>
</xsl:template>
</xsl:stylesheet>


--  作者:yuelongming
--  发布时间:6/2/2006 9:30:00 AM

--  
自己顶一下,问题解决了,正确的如下:
<?xml version="1.0"  encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:gml="http://www.opengis.net/gml"
                xmlns:ex="http://www.opengis.net/examples">

<xsl:output method="xml" indent="yes" standalone="no" media-type="image/svg+xml"
     doctype-public="-//W3C//DTD SVG 20000303 Stylable//EN"/>

<xsl:template match="/">
  <svg xmlns:svg="http://www.w3.org/2000/svg">
   <xsl:for-each select="ex:Layer/ex:EntityMember/gml:Point">
                          <xsl:variable name="x0">
                             <xsl:value-of  select="/ex:Layer/ex:EntityMember/gml:Point/gml:coord/gml:X"/>
                          </xsl:variable>
                          <xsl:variable name="y0">
                             <xsl:value-of select="/ex:Layer/ex:EntityMember/gml:Point/gml:coord/gml:Y"/>
                          </xsl:variable>
                          <circle cx="{$x0}" cy="{$y0}" r="5"  fill="red" stroke="black" />
   </xsl:for-each>
  </svg>
</xsl:template>
</xsl:stylesheet>


--  作者:yuelongming
--  发布时间:6/2/2006 9:40:00 AM

--  
但新的问题产生了,我想问的是,在GML中,一个图层的最大边界盒:
<gml:boundedBy>
  <gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
   <gml:pos>31.672675647391934 14.856775591394925</gml:pos>
   <gml:pos>56.98753633499146 38.45801494014156</gml:pos>
  </gml:Envelope>
 </gml:boundedBy>
其中存储的是地理坐标,我的问题是,如何根据它得到SVG中的viewbox,而且得到viewbox后,对GML中其他的地理坐标如何变换才能得到SVG中的屏幕坐标???很急,向高手请教,跟新手探讨,谢谢回帖!!!!
--  作者:fangxu1979
--  发布时间:6/2/2006 10:09:00 AM

--  
我是新手,也在做这方面的东西。
我做的恰恰相反,就是在gml转化成svg后如果维持它的地理坐标。
下面是zhou_gong在他的帖子,我转发给你,里面说的很详细。

大地坐标系与SVG DOM屏幕坐标之间的变换
在SVG DOM里,显示给用户是的真实世界的坐标系,视图的放大、缩小、平移及对空间对象的创建、操作都是基于真实世界的坐标系。这要求设计出一套真实坐标与屏幕坐标之间变换。
在本 选项题中使用的大地坐标系是X轴向北,Y轴向东,称为(realX,realY),单位m,而SVG DOM有两套坐标系,一为屏幕坐标系,X轴向东(右),Y轴向南(下),下称为(clientX,clientY),单位px,原点(0,0)在SVG DOM视窗的左上角, 屏幕坐标系的位置是固定的。另一套坐标为用户坐标系,下称为(userX,userY),初始时, 用户坐标系与屏幕坐标系重叠一致(图12)。在SVG DOM 我们使用的是用户坐标系,通过对用户坐标系旋转、平移、缩放以到达能在SVG DOM的矩形视窗范围内显示用户关心的图象。

图 12    各种坐标系关系
可以看出,用户坐标系逆时针旋转90度后与大地坐标系一致,因此设定大地坐标系与用户坐标为1:1对应关系,现在要解决的是用户坐标系与屏幕坐标系之间的变换关系就行了。要在SVG DOM中显示大地坐标系中比例系数为s(px/m,1真实坐标单位m等于s个屏幕坐标单位px),左上角的大地坐标为(realX0,realY0),则用户坐标系必须做如下顺序变换(图 5-2):(1)平移(-realX0,-realY0);(2)放大S倍;(3)旋转(-90)度。参看图13所示。

图 13   大地坐标系与SVG DOM屏幕坐标系转换
在SVG的规范中,此变换由属性transform描述定义这种坐标变换:
transform=”rotate(-90) scale(S) translate(-realX0,-realY0)”
三种坐标的关系为:
  realX = userX = realX0 - clientY/S;
  realY = userY = realY0 + clientX/S;
几何解释为:SVG DOM当前呈现视图,左上角的位置是大地坐标(realX0,realY0),S个像素(px)相当于一个大地坐标单位(m)。 每次放大、缩小、平移视窗,都必须重新计算设置realX0,realY0及比例S,可动态维持大地坐标系与屏幕坐标系之间的映射对应关系。


--  作者:yuelongming
--  发布时间:6/2/2006 1:21:00 PM

--  
谢谢回帖,看得似懂非懂,但相信我,我会弄明白的!!!你也多多加油!
--  作者:yaowei666
--  发布时间:10/31/2006 8:55:00 PM

--  
我也是GML新手,请问能把你编写的dp.xsd的代码发给我吗?非常感谢!!!
我的邮箱:yaowei666@163.com
--  作者:collar_lu
--  发布时间:11/1/2006 10:16:00 AM

--  
我也很关注这个问题,怎么没人出来说个明白呢?
--  作者:msnow
--  发布时间:12/8/2006 2:33:00 PM

--  
大侠,我是个SVG的初学者,能不能把你的“大地坐标系与SVG DOM屏幕坐标之间的变换“的详细资料(含图示说明)给我发一份,谢谢!我的E-mail:  hswmxr@tom.com

W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
125.000ms