摘要:
SVG是由W3C组织开发的基于可扩展标记语言的一种矢量图形描述语言,已经在互联网上得到了较广泛的应用。为了以图形方式直观地显示雨量数据变化,方便工作人员进行雨量数据的查询及分析,设计了本套基于SVG的雨量分析系统。
该自动站雨量分析系统是基于B/S架构,使用ASP.NET来开发的。主要使用了.NET三层架构、XML程序集、矢量图形的动态生成、Web服务等技术,并实现了系统模块管理、雨量数据管理、城市数据管理、雨量数据查询、生成矢量图形格式的图表等功能模块。在系统中主要对矢量图形文档的生成进行了分析和设计,采用DOM模型来操作该图形文档,并封装了基本的图形元素。
该自动站雨量分析系统作了新的尝试,采用基于可扩展标记语言的矢量图形作为图形格式,系统与Web服务技术相结合,使系统的可重用性和开放性得到了很大的提高。
可伸缩矢量图形;可扩展标记语言;.NET三层架构;Web服务

4.1 系统模块结构
系统主要分为系统管理、雨量数据管理、城市信息管理、前台管理等几大模块,其结构关系如图5所示。

4.2 数据库的设计
4.2.1 总体设计
数据库的E-R模型图如图6所示。图6中,用户在具有某些角色之后,才有权限使用系统功能,而不能直接使用,因此设计中将角色与系统功能关联起来,并将用户与系统功能隔离开来;日志的生成是在用户使用系统功能的过程中自动生成的,其中需要保存当前用户的ID和对应的系统功能的ID。

4.2.2 数据库表字段说明
1、城市数据表(City)存储的是地图上所有城市的相关信息,具体见表1所示。
2、每小时降雨量表(RainPerHour)存储的是城市中具体一天24小时的雨量数据,Hour01表示0~1时的雨量数据,依此类推,中间省略部分行,具体见表2所示。
3、模块表(Func)存储的是系统中所有模块的信息,具体见表3所示。
4、日志表(Log)中存储管理员对某一模块进行添加、修改等操作的记录,无论成功与否,系统都会自动记录相应的信息,具体见表4所示。
5、用户表(User)中存储用户登陆系统的ID号、名称和密码等信息,具体见表5所示。
6、用户角色关系表(UserRoleRel)存储用户在系统中属于哪一角色的信息,具体见表6所示。
7、角色表(Role)存储每一个角色的角色名及对它权限的描述,具体见表7所示。
8、角色权限关系表(RoleFuncRel)存储角色对于某一模块是否具有读取、增加、更新、删除等操作的权限,具体见表8所示。
4.3 开发技术及过程
4.3.1 三层架构
三层架构也称三层体系结构,即表现层、业务逻辑层和数据访问层。表现层主要指用户界面,它要求尽可能的简单,使最终用户不需要进行任何培训就能方便地访问信息;第二层就是业务逻辑层,也就是常说的中间件,所有的应用系统、应用逻辑、控制都在这一层,系统的复杂性也主要体现在业务逻辑层;最后的数据访问层存储大量的数据信息和数据逻辑,所有与数据有关的安全、完整性控制、数据的一致性、并发操作等都是在第三层完成。三层架构的层次关系见图7所示。
这些层相互之间独立性好,可以单独开发,单独测试。三层架构另一个优点是它的安全性,客户端只能通过上一层来访问下一层的服务,减少了入口点,把很多危险的系统功能都屏蔽了。表现层位于最上层,离用户最近,用于显示数据和接收用户输入的数据,为用户提供一种交互式操作的界面。通过表现层,用户输入数据、获取数据。表现层同时也提供一定的安全性,确保用户没有机会看到机密的信息。中间的业务逻辑层是表现层和数据访问层的桥梁,它响应表现层的用户请求,负责处理用户输入的信息,或者是将这些信息发送给数据访问层进行保存,或者是调用数据访问层中的函数再次读出这些数据。业务逻辑层也可以包括一些对“商业逻辑”描述的代码在里面。数据访问层定义和维护数据的完整性、安全性,它响应业务逻辑层的请求来访问数据,仅实现对数据的保存和读取操作。访问的数据可以是数据库系统、二进制文件、文本文档或是XML文档等等。本项目中.NET三层架构中各个包之间的关系结构如图8所示。

其中,Model命名空间中的类对应于数据库中的表,为整个架构提供方便的数据表示形式;IDAL和SQLServerDAL对应于数据访问层,IDAL命名空间中定义了一整套用于操作数据库的接口,具体的数据访问操作在SQLServerDAL命名空间中实现;DALFactory命名空间中定义了获取数据访问操作的方法,在BLL命名空间中,就使用这些方法来获取符合IDAL中定义的接口的对象,再用它来对数据库进行操作,显然它们属于业务逻辑层;而表现层对应于前台页面代码,包括获取用户响应和请求,再通过BLL来获取数据并返回给用户。下面给出具体例子说明数据和指令是如何在各层之间流动和传递的。首先,表现层中的某一对象调用业务逻辑层BLL中的Add函数,来向数据库中添加数据:BLL.SVGRAS_City.Add(city);其中city是Model.City类型的参数,BLL.SVGRAS_City.Add为被调用方法的完整路径。此时,数据流向业务逻辑层,指令执行到业务层,如下:public static string Add(SVGRAS.Model.SVGRAS_City model)ISVGRAS_City dal=SVGRAS.DALFactory.SVGRAS_City.Create();业务层接收到表现层传入的参数model,首先进行业务逻辑处理(比如数据完整性,合法性以及其他一些业务处理),然后调用工厂中相应的方法来创建相应的SQLServerDAL对象,以获得访问数据访问层的对象。public static SVGRAS.IDAL.ISVGRAS_City Create()SQLServerDAL.SVGRAS_City obj=new SQLServerDAL.SVGRAS_City();public string Add(SVGRAS.Model.SVGRAS_City model)model.CityID=Common.GetNextIdByTable("SVGRAS_City","CityID","SingleLayer",null,10);model.OrderID=model.CityID;StringBuilder strSql=new StringBuilder();strSql.Append("insert into SVGRAS_City(CityID,FatherCityID,OrderID, CityName,CityDes) values (");strSql.Append("'"+model.CityID+"',");strSql.Append("'"+model.FatherCityID+"',");strSql.Append(""+model.OrderID+",");strSql.Append("'"+model.CityName+"',");strSql.Append("'"+model.CityDes+"')");DbHelperSQL.ExecuteSql(strSql.ToString());在数据访问层,通过调用存储过程的方式,将数据传递到数据库,并执行相应的操作。DbHelperSQL.ExecuteSql()表示封装好的方法,strSql.ToString()放置添加语句。此时,调用DbHelperSQL.ExecuteSql(),执行SQL语句。 public static int ExecuteSql(string SQLString)using (SqlConnection connection = new SqlConnection(connectionString))using (SqlCommand cmd = new SqlCommand(SQLString,connection))int rows=cmd.ExecuteNonQuery();catch(System.Data.SqlClient.SqlException E)throw new Exception(E.Message);
4.3.2 SVG文档的表示
SVG文档的生成使用了.NET XML程序集,它提供了一整套封装了XML操作的类,可以很方便的创建和处理XML文档,它的整体结构符合文档对象模型的定义。将SVG文档用DOM表示,其结构见图9所示。

<?xml version="1.0" standalone="yes"?><svg viewBox="0 0 500 600"> <text x="10" y="20" stroke="red">



