efan2000 发表于 2004-3-31 12:05:00

[GIS]用SVG技术实现基于Web的GIS

本帖最后由 作者 于 2004-3-31 13:22:47 编辑 <br /><br /> <TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR vAlign=top>
<TD>用SVG技术实现基于Web的GIS</TD>
<TD width=8><IMG alt="" border=0 height=1 src="http://www-900.ibm.com/developerWorks/cn/i/c.gif" width=8></TD>
<TD width=6><IMG alt="" border=0 height=1 src="http://www-900.ibm.com/developerWorks/cn/i/c.gif" width=6></TD></TR><!-- Black line separator-->
<TR vAlign=top>
<TD bgColor=#000000 colSpan=5><IMG alt="" border=0 height=1 src="http://www-900.ibm.com/developerWorks/cn/i/c.gif" width=100></TD></TR>
<TR vAlign=top>
<TD bgColor=#ffffff colSpan=5><IMG alt="" border=0 height=8 src="http://www-900.ibm.com/developerWorks/cn/i/c.gif" width=100></TD></TR></TBODY></TABLE>
<A name=1>引言</A>


SVG(Scalable Vector Graphics)是一种基于XML 的用来描述二维矢量图形和矢量/点阵混合图形的置标语言,是一种全新的矢量图形规范。 SVG规范定义了SVG的特征、语法和显示效果,包括模块化的XML命名空间(namespace)和SVG文档对象模型(DOM)。 SVG的绘图可以通过动态和交互式方式进行,在实际操作中,则是以嵌入方式或脚本方式来实现的。SVG不仅提供超链接功能,还定义了丰富的事件。由于SVG支持脚本语言(script),可以通过Script编程,访问SVG DOM的元素和属性,即可响应特定的事件,从而提高了SVG的动态和交互性能。 SVG实现了图形、图象和文字的有机统一。 SVG除了支持HTML中常用的标记,如文本、图象、链接、交互性、CSS的使用、脚本(Script)外,还提供了大量针对图形、图象、动画的特定标记。这就为实现GIS提供了可能。


作者根据实际工作需要,在Web浏览器中采用SVG及相关技术实现了Web的GIS管理系统(以下简称WebGIS),取得了很好的效果。此系统包括服务端及客户端的设计,服务器端出要处理数据的存储及数据的动态装载,客户端主要完成SVG数据的显示及交互。本文主要对基于SVG的WebGIS的客户端实现的一些基本知识及实现技术作一个简单介绍。


<A name=2>基础知识</A>


SVG浏览插件


要实现SVG图形的显示,必须要在客户端安装SVG浏览器,Adobe开发的SVG Viewer功能强大,显示效果好,是网络上使用最多的,其最新的版本是3.0。可以到Adobe的网站(<A href="http://www.adobe.com/svg/viewer/install/main.html" target="_blank" >http://www.adobe.com/svg/viewer/install/main.html</A>)上去下载,为了保证中文能正确显示,请下载简体中文版本。下载后安装程序,第一次使用时回弹出用户许可信息,点击"接受"即可。


在网页中嵌入SVG


将实现基于浏览器的GIS系统,需要将SVG图形对象嵌入到网页中,使用如下HTML代码来实现:



<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD><PRE><CODE>
&lt;embed width="640" height="560" type="image/svg-xml" id="svgmapctrl"
pluginspage="http://www.adobe.com/svg/viewer/install/" src="default.svg" &gt;&lt;/embed&gt;
</CODE></PRE></TD></TR></TBODY></TABLE>其中embed标签指定为一个嵌入的对象,width,height分别指定该对象的宽度、高度,type指定类型为image/svg-xml ,src指定为svg数据文件的URL地址,指定这样的标签并在浏览器中打开,浏览器便回调用SVG Viewer在指定区域进行显示。此处,src指定的是一个svg文件,在GIS系统中,要求根据不同的请求获取不同的数据,则可以将其改为动态的url,如服务端的Java Servlet,由服务端动态生成。需要注意的是,SVG目前不支持GB编码,在使用中文字符时,请使用UTF-8编码。


SVG图形对象简介


SVG提供了丰富的图形对象,包括直线(line)、路径(path)、圆(circle)、图标(symbol)文字(text)、图像(image)等,满足了GIS系统的需要。这些图形对象可以通过设置不同的属性、显示样式来达到不同的显示效果。对象在SVG文件中以XML标签的形式存在,而对象属性以标签的属性来存取,可以通过访问SVG的DOM对象的方法来方便的存取这些对象及属性。同时SVG中还提供了组的管理(&lt;g&gt;标签),定义(defs)及引用等功能。这些特征在GIS中得到了广泛的应用。


SVG的事件简介


SVG提供了丰富的消息触发及事件响应函数,获取用户消息。如在地图上移动、点击鼠标等。事件的相应可以定义到整个文档对象中,也可以定义在单个图形对象上。如要给某个路径(path)定义鼠标一定事件,可以这样&lt;path onmousemove="mouseMoved(evt)" …../&gt;, onmousemove指定事件触发的条件(即鼠标在path上移动时),mouseMoved为要触发的响应函数,evt表示事件本身,可以通过evt获取与当前事件相关的信息,用户可以在script中定义响应函数,进行相应的处理。同样,SVG也提供丰富的状态事件,如数据装载完毕,就可以触发onload事件,作一些初始化的处理。


<A name=3>功能实现</A>


地图的交互及控制


在浏览器中打开SVG文件时,SVG图形作为浏览器的一个嵌入对象出现,可以很方便的通过script函数来获取SVG图形对象及其内部的图形属性。通过获取这些对象和属性,就可以很方便地实现交互功能。


GIS系统最基本的功能是地图控制,SVG Viewer本身提供图形的缩放功能,但要通过操作鼠标时按指定的功能键才能实现,不适合GIS功能的需要,在WebGIS系统中将其屏蔽。但由于SVG提供了丰富的消息触发及事件响应函数,通过捕捉这些消息,来实现自定义的地图控制功能。一个放大地图的实现流程是:用户点击地图,触发onmousedown事件,调用消息响应函数,在消息响应函数中将地图的变换矩阵以当前点击的点为中心放大1.1倍,更新显示图形。消息响应的函数如下:



<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD><PRE><CODE>
Function zoom(evt, scale)
{ // scale = 1.1;表示放大1.1倍
   point = new GDPoint();
   point.x = evt.clientX;
   point.y = evt.clientY; //point为当前点击的坐标点 为屏幕坐标
   absPoint = pointInvert(point);//转换为绝对最表
   scale = curTransform.scale*scale; //设置当前的缩放系数
   curTransform.scale = scale;
   point1 = pointApply(absPoint);//绝对坐标应用当前的变换系数
curTransform.x += point.x-point1.x;
curTransform.y += point.y-point1.y;//缩放中心平移到当前点击的位置
   matrix= trans2String(curTransform);//生成新的变换矩阵
   maproot.setAttribute("transform",matrix);//应用新的变换矩阵
}
</CODE></PRE></TD></TR></TBODY></TABLE>其他的如地图缩小、全图显示、区域放大、局部定位等功能与之类似,这里就不一一作介绍。


图层管理


SVG采用基于XML的DOM文档管理结构,很方便实现层次管理,其组&lt;g&gt;对象就可以将其下面的所有图形管理起来。节点中的childNodes属性可以获取所有的子节点的集合,getElementsByTagName()方法可以获取某种类型对象的列表,如要获取某组(g)下的所有路径(path)对象的集合,就可以调用getElementsByTagName("path")。 作者通过采用组对象来实现图层管理功能,不同图层的对象包含在不同的组中。通过设置组的属性,就可以实现如可见性、颜色、透明度等设置以及选中、删除所有对象等操作。SVG中的对象的样式属性具有继承性,如果下一级没有某样式属性,则直接使用其上一级的属性,以此类推,直到顶级为止。如:对某层设置某个显示透明度,则其下级元素显示时,均采用该透明度,除非其下级元素指定了透明度属性。


下面的图显示GIS系统中的图层控制界面。



<CENTER><IMG alt="" border=0 height=245 src="http://www-900.ibm.com/developerWorks/cn/xml/x-webgis/1.gif" width=283> <BR></CENTER>



图标管理


图标表示的是信息点的信息,在GIS系统中广泛使用图标来标志信息点,其特点是图标引用相同的预定义的图形组。增加新的图标只是在不同的位置增加一个引用而已。在不增加实际的绘图数据。减少了数据量;同时,如果要修改某类信息的显示图标,只要修改预定义的图标即可,方便了管理。在WebGIS系统中定义了很多类型的图标。下图表示用一个圆和一个路径对象定义的图标,其名称为symbol_1,并定义在defs标签内,供图标对象引用:



<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD><PRE><CODE>
&lt;defs&gt;
&lt;gid="symbol_1" type="default" style="&amp;_symbol;"&gt;
&lt;circle cx="0" cy="0" r="10" /&gt;
&lt;path d="M-7.1 7.1,-10 0,-7.1 -7.1,0 -10,7.1 -7.1z" style="fill:#0000ff;fill-opacity:0.6" /&gt;
&lt;/g&gt;

&lt;/defs&gt;
</CODE></PRE></TD></TR></TBODY></TABLE>下图为图标的实例,这两个图标引用上面定义的symbo_1的图标:图标在地图上的实际位置为transform指定的位置分别是(200,100),(200,200)。



<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD><PRE><CODE>
&lt;use id="icon:1" type="A" transform="translate(200,100)" xlink:href="#symbol_1" /&gt;
&lt;use id="icon:2" type="B" transform="translate(200,200)" xlink:href="#symbol_1" /&gt;
</CODE></PRE></TD></TR></TBODY></TABLE>如果要增加图标,只要添加新的引用(use)对象即可。这些对象可以有自己的属性,表示不同的信息点,但其显示的形状是预定义的,如果修改了预定义的形状,这些图标的显示结果同样改变。下图为在WebGIS中定义的几种图标及显示效果(蓝色的为图标)。



<CENTER><IMG alt="" border=0 height=301 src="http://www-900.ibm.com/developerWorks/cn/xml/x-webgis/WebGis.jpg" width=407> <BR></CENTER>



地图属性的定义


SVG图形数据本身只包含用来实现矢量图形显示的信息,如坐标点、变换矩阵、显示样式等信息,不能满足GIS系统的需要。但由于SVG是基于XML格式的,除了使用其内置的属性外,可以对其属性进行任意扩充,以实现自定义的功能。在SVG图形中,对象的属性id是用来标志唯一对象的编号,可以通过SVG文档对象的getElementById()函数来获取指定的对象。WebGIS采用id好作为图形内在的标示,而自定义其他的属性如名称(name),提示信息(tip)等来存储其GIS属性。获取或赋值这些属性的方法是调用getAttribute及setAttribute函数。如在WebGIS中一个路径是这么定义的。


&lt;path id="ROAD:101" Name="解放大道" Tip=" 解放大道(东)" d="&lt;M……"/&gt;


那么通过ID "ROAD:101" 获取路径对象后,就可以获取其属性Name及Tip的信息,执行显示提示信息等功能。


<A name=4>总结</A>


本文对用SVG技术实现基于Web的GIS的关键技术做了简单的介绍,通过对SVG技术的把握和应用,作者成功地开发了WebGIS系统,说明SVG技术完全能胜任某些行业GIS应用的需要,从长远来看,SVG技术代表网络矢量化图形的发展方向,必将在包括 GIS在内的各个方面得到广泛应用。<!-- END HEADER AREA--><!-- START BODY AREA--><!-- END HEADER AREA--><!-- START BODY AREA-->

莫名 发表于 2004-3-31 21:10:00

好文章!

Gauser 发表于 2004-8-9 11:41:00

好东西,参考一下!

backarmy 发表于 2005-8-1 22:53:00

很好,提出一种新思想!
页: [1]
查看完整版本: [GIS]用SVG技术实现基于Web的GIS