java客户端使用swt开发基于svg的电子地图应用-方案选择

1、目标描述

        目标是实现一个java客户端程序,此程序可以显示svg格式的电子地图,可以放大、缩小、平移,可以在地图上添加自定义标注,可以移动标注进行地图配置,可以双击、右键标注进行自定义的操作。标注可以是一个地区,从而关联另一张地图,实现双击标注进行地图的跳转;标注也可以是一个物体,双击或右键物体可以显示物体的描述信息或执行相应的操作。

        地图的底图支持svg格式的图片,也需要支持jpg、png等格式的图片,地图配置完毕后保存成svg格式,并在其他客户端打开时正常加载和显示之前配置好的地图内容。

2、方案介绍

        首先说明一下为什么要求支持svg格式的图片:

        SVG可缩放矢量图形(Scalable Vector Graphics)是基于可扩展标记语言(XML),用于描述二维矢量图形的一种图形格式。我们通常见到的图片,一般是光栅图。

        图片的数字化。将图片存储为数据有两种方案。其一为位图,也被称为光栅图。即是以自然的光学的眼光将图片看成在平面上密集排布的点的集合。每个点发出的光有独立的频率和强度,反映在视觉上,就是颜色和亮度。这些信息有不同的编码方案,在互联网上最常见的就是RGB。根据需要,编码后的信息可以有不同的位(bit)数——位深。位数越高,颜色越清晰,对比度越高;占用的空间也越大。另一项决定位图的精细度的是其中点的数量。一个位图文件就是所有构成其的点的数据的集合,它的大小自然就等于点数乘以位深。位图格式是一个庞大的家族,包括常见的JPEG/JPG, GIF, TIFF, PNG, BMP。

        第二种方案为矢量图。它用抽象的视角看待图形,记录其中展示的模式而不是各个点的原始数据。它将图片看成各个“对象”的组合,用曲线记录对象的轮廓,用某种颜色的模式描述对象内部的图案(如用梯度描述渐变色)。比如一张留影,被看成各个人物和背景中各种景物的组合。这种更高级的视角,正是人类看世界时在意识里的反映。矢量图格式有CGM, SVG, AI (Adobe Illustrator), CDR (CorelDRAW), PDF, SWF, VML等等。

        好吧,简单点说,就是像svg这种矢量图,如果要表示一个红色的圆,则在图像的xml文件中只要保存圆心、半径和填充颜色的值就可以了,不需要像光栅图一样把每个像素记录下来,所以xml格式的svg图片往往更加小、更适合在网络中传输。

        这里顺便引用下百度到的矢量图片的优势,帮助大家了解:

        矢量图像用点和线来描述物体,所以文件会比较小,同时也能提供高清晰的画面,适合于直接打印或输出。而位图图像的存储单位是图像上每一点的像素值,因此一般的图像文件都很大,会占用大量的网络带宽。SVG是一种矢量图形格式,GIF、JPEG是光栅文件格式。有了两者的概念后,SVG较GIF、JPEG的优势显而易见。

        1.任意放缩。

用户可以任意缩放图像显示,而不会破坏图像的清晰度、细节等。

        2.文本独立。

SVG图像中的文字独立于图像,文字保留可编辑和可搜寻的状态。也不会再有字体的限制,用户系统即使没有安装某一字体,也会看到和他们制作时完全相同的画面。

        3.较小文件。

总体来讲,SVG文件比那些GIF和JPEG格式的文件要小很多,因而下载也很快。

        4.超强显示效果

SVG图像在屏幕上总是边缘清晰,它的清晰度适合任何屏幕分辨率和打印分辨率。

        5.超级颜色控制。

SVG图像提供一个1 600万种颜色的调色板,支持ICC颜色描述文件标准、RGB、线X填充、渐变和蒙版。

        6.交互X和智能化。SVG面临的主要问题一个是如何和已经占有重要市场份额的矢量图形格式Flash竞争的问题,另一个问题就是SVG的本地运行环境下的厂家支持程度。

基于svg有以上种种优点,所以广泛应用于电力行业设备描述图中。这也正是本次的目标必须基于svg格式的原因。

2.1 JFreeSVG

        SVG在web中应用的比较多,但是在java客户端程序中使用并不多见,所以相应的svg库也不多,找了一圈,发现JFreeSVG是其中不错的一个,而且之前还使用过JFreeChart,感觉还不错,他俩应该是一起的。

一个快速、轻量级的java矢量图形库,可简化生成svg格式的图像输出。我在做这个功能的时候是14年3月份吧,当时发现这个库的更新还是比较频繁的,担心它bug比较多,就没有仔细研究。

2.2 Batik

        Batik是一个基于java的工具包,是Apache公司下的一个开源项目。主要功能是为java程序提供操作svg格式文件的方法。

        Batik的最新版本是1.7,2012发布,所以会比JFreeSVG成熟得多,由于提供很多svg图像处理的功能,所以库文件比较庞大,有7M多。

        网络上关于Batik的使用资料都是比较基础的,主要参考资料还是API文档,根据现在收集的资料,在java中编写了一个最简单的解析svg文件的demo。

        Batik工具集提供的JSVGCanvas模块是一个swing 组件,用于显示静态或动态SVG文档。通过JSVGCanvas模块,开发人员可以轻松显示SVG文档(通过URI地址或DOM树)并对其进行操作,例如旋转、缩放、摇动、选择文本或激活超级链接等。由于我们的客户端是使用swt进行界面开发的,所以需要在swt程序中嵌入swing语言开发的界面,通过如下的关键代码可以实现在swt中嵌入swing的界面

1
2
3
4
5
6
7
8
9
10
11
final Composite comp = new Composite( this , SWT.EMBEDDED);
 
final Frame f = SWT_AWT.new_Frame(comp);
 
SwingUtilities.invokeLater( new   Runnable()   {
 
        public   void   run()   {
 
//Swing窗口的创建代码
 
  });


        然后通过在swing的代码中使用JSVGCanvas类进行svg文件的解析,方法很简单

        svgCanvas.setURI(newURI),即可解析相应路径的svg文件。

        最终实现效果图(显示一张svg格式的图片):

wps71C1.tmp

        其他功能,如生成svg文件,嵌入bmp文件、编辑svg文件等,在后续开发过程中再去查资料,本次调研至少证明了使用batik库进行svg文件的处理是可行的,而且也是一个比较成熟方案。





你可能感兴趣的:(java)