Silverlight API调用AO实现缓冲区压覆面积统计

2012-06-29 07:26李恒民李娜曾庆飞张照杰
城市勘测 2012年4期
关键词:字符串缓冲区调用

李恒民,李娜,曾庆飞,张照杰

(山东正元地理信息工程有限责任公司,山东济南 250101)

1 绪论

Silverlight API实现富客户端展示的时候,缓冲区分析往往倾向于调用封装Query方法来实现缓冲区查询,计算并返回缓冲区内影响到的所有地物,对于缓冲区内地物进行统计的计算并不多见,在客户端也没有较好的方法实现。对于设计拓扑计算和交叉面积计算的统计,客户端不好实现,而Silverlight通过Webservice调用AO的方式,能够轻松解决这些问题,故此处使用WebService方式,采用HTTP协议传送数据,在服务器端实现拓扑计算,并在客户端调用Webservice服务,实现缓冲区压覆面积统计。

2 Silverlight API Buffer基本原理

Buffer操作创建多边形图形,这些多边形通过在输入图形周围计算指定距离的缓冲区得到。该操作以BufferParameters对象作为输入,该对象包括了用于进行缓冲的图形,指定的距离和单位,操作和输出图形所用的空间参考,以及是否在结果中联合重复的图形[1]。ArcGIS Server API for Silverlight实现缓冲区分析,需要用到geometry service,这是ArcGIS Server 9.3中提供的一种服务,提供对几何图形的操作,比如buffering,simplifying,计算面积/长度,或投影,特别适合于使用Silverlight API建立的应用程序。geometry service只对于管理员和开发者可见,连接到服务器的用户并不能看见geometry service,默认情况下不能使用,必须为自己的应用程序手动创建它。

要创建geometry service,必须用“Geometry”命名,每个服务器上只能有一个geometry service;但可以允许该服务的多个实例,Geometry services总是池化的,可以和其他服务一样停止,启动和删除[2]。

对使用geometry service,首先需要对这个服务进行调用:

其中括号内的地址为Geometry服务的URL,是ArcGIS的Rest服务,所以,其中的 rest不可少,localhost为本地服务,网络服务需要书写机器名或IP地址,如地址书写为:”http://ZYGIS/ArcGIS/rest/services/Geometry/GeometryServer”。

缓冲区分析的参数需要在程序中进行设定:

其中,BufferSpatialReference和OutSpatialReference为空间参考,须与主地图的空间参考相一致,此处程序中采用主地图的空间参考mainMap.SpatialReference;Features为待缓冲的图形,一般为用户输入的点线面。如下代码是缓冲区分析完成事件:

这样缓冲区分析得到的图形即可输出到名为"AnalysisLayer"的GraphicsLayer图层上。

3 图形参数传递

AO本身是COM组件,.NET是利用 COMInterop技术与其打交道的,显然Silverlight的客户端环境不能实现,需要与服务器端进行通信。Silverlight与服务器端通信,最常用的是WebClient类,稍复杂的还有Http-WebRequest类,而传统的 ASP.NET WebService与WCF则为远程调用AO提供了可能[3]。

Silverlight前台工程所使用的动态库包括ESRI.ArcGIS.Client;缓冲区分析生成的图形类型为ESRI.ArcGIS.Client.Graphic,但 Silverlight 后台工程所使用的动态库为:ESRI.ArcGIS.Geometry;在后台调用 AO进行多边形交叉面积计算,需要用到的图形类型为ESRI.ArcGIS.Geometry.IGeometry,故需要将前台的图形进行相应的转换后,由参数传给后台。

3.1 前台Graphic转换成字符串

取graphic的图形 graphic.Geometry,将其转化为坐标字符串,缓冲区生成的图形为Polygon,故使用下列转换方法进行转化:

3.2 后台字符串转换为IGeometry

系统自定义的Geometry类型,继承自IGeometry,并定义其构成字符串string WKT{get;set;}以及设定字符串的方法bool SetWkt(string WKT);此处只列出参数的设定:

根据自定义Geometry与IGeometry的关系,定义转换函数 ToGeometry,将前台传来的字符串转换为IGeometry,完成Graphic参数的传递。

4 Silverlight API调用AO实现面积统计

通过Web服务可以共享数据,还可以调用其他应用程序生成的数据,而不用考虑其他应用程序如何生成这些数据。Web服务需要一系列的协议来实现,如:HTTP协议SMTP、FTP;简单对象访问协议SOAP。Web服务的运作还需要Web服务描述语言WSDL和统一描述发现集成协议UDDI的支持。建立Web服务实质就是在支持SOAP通信的类中建立一个或多个方法[4]。

4.1 建立WebService

在WEB工程中建立WebService如下,在其中调用公共类中定义的方法,并设定返回数据:

4.2 公共类计算方法

缓冲区压覆的地物面积的计算基本思想:

(1)打开数据,对所分析图层进行查询,将所有主属性字段得到

(2)对所有主属性字段进行循环,找到所有与缓冲区相交的图形,并利用空间分析,求出多边形相交部分,并求出相交面积。

首先,需要定义IGeometry为拓扑操作ITopologicalOperator,并对其进行Simplify操作:

为后面的拓扑计算做准备。

其次,定义存放数据的SortedList,并定义空间查询

当pFeature符合条件时,进行空间拓扑计算:

使用pTop.Intersect求出相交部分,并定义 IArea以获取相交面积

4.3 Webservice的调用

在Silverlight工程中添加服务引用,在地址栏,输入新建的WebService服务的地址,http://localhost/QZServices/WebService/MapService.asmx,并定义服务名称,重新生成并更新引用后,将能够在客户端调用此方法。

分析完成事件中,将统计结果填充到dataGrid:

图1 缓冲区压覆面积统计结果

任意缓冲区的压覆面积统计结果如图1所示。在图形中输入任意图形,即自动产生缓冲区,并将缓冲区压覆范围中相关图层的压覆面积按照主属性统计出来,统计面积使用单位为默认平方米,也可以将平方米转换为亩等用户使用方便的单位,将结果以表格形式列出,并将总量累计统计。

5 结语

文中实现了Silverlight API对AO的简单调用,并实现了缓冲区压覆地物的面积统计,为客户端调用AO计算方法提供了实例,但只是简单的实例计算,对于复杂的统计计算并未进行深入研究,希望在未来的工作中进行进一步研究。

[1]Robert W.Sebesta.Web程序设计(2010版)[M].北京:清华大学出版社,2010.

[2]黄东.ArcGIS API for Silverlight应用开发教程[R].ESRI中国(北京)有限公司培训材料,2011.

[3]http://bbs.esrichina -bj.cn/ESRI/thread -48129 -1 -1.html

[4]http://bbs.esrichina - bj.cn/ESRI/viewthread.php?tid=73505

猜你喜欢
字符串缓冲区调用
基于文本挖掘的语词典研究
核电项目物项调用管理的应用研究
LabWindows/CVI下基于ActiveX技术的Excel调用
基于网络聚类与自适应概率的数据库缓冲区替换*
基于系统调用的恶意软件检测技术研究
一类装配支线缓冲区配置的两阶段求解方法研究
关键链技术缓冲区的确定方法研究
初涉缓冲区
一种新的基于对称性的字符串相似性处理算法
高效的top-k相似字符串查询算法