基于ArcIMS的WebGIS系统的原理与开发
来源:岁月联盟
时间:2010-08-30
随着机通讯(包括有线与无线网) 的大容量和高速化, GIS 已成为在网络上的分布式异构系统。WebGIS可实现GIS的分布式处理,在当前的地理信息系统中有着广泛的应用。ArcIMS是ESRI公司的主要产品之一,也是当前WebGIS系统中用的最多的产品。
1 简介
ArcIMS是一款功能强大的发布地图和元数据的产品,通过ArcIMS可以创建地图或者服务描述文件,发布地图、数据和元数据服务,进而创建一个基于服务的网络应用。ArcIMS支持UNIX/Linux、Windows等操作系统,同时支持asp、java、.NET、ColdFusion等多种开发平台,即可以通过图形界面(GUI)创建基于模板的简单应用,也可以通过二次开发构建满足各种需求的复杂应用。2 ArcIMS体系结构
图1 ArcIMS体系结构 基于ArcIMS建立的WebGIS系统由客户端和服务器端两部分组成(如图1所示),ArcIMS自带的客户端包括HTML Viewer和Java Viewer,分别代表胖客户端和瘦客户端,除此之外,ArcExploer、ArcCatalog以及自定义客户端等也可以访问ArcIMS服务。服务器端是ArcIMS的核心,由四部分组成: 1) 空间服务器(Spatial Server):空间服务器是整个服务器端的核心,它处理地图及相关信息的需求,读取空间数据,渲染地图,然后将结果发送给客户。空间服务器对系统资源要求较高,可分布于多台服务器上。 2) 应用服务器(Application Server):应用服务器处理来自用户或管理程序的请求,确定ArcIMS服务运行于哪个空间服务器之上,并且通过虚拟服务器(Virtual Server)提供负载均衡的功能。 3) 连接器(Connector):连接器负责Web服务器和应用服务器之间的通讯,起一个桥梁的作用,Servlet Connector是ArcIMS默认的连接器,也是ArcIMS管理程序所必需的,它直接使用ArcXML与应用服务器通信,除此之外ArcIMS还有四个较高级别的连接器:ColdFusion连接器、ActiveX连接器、Java连接器和.NET Link。 4) 客户端(Viewer):ArcIMS自带两种客户端:HTML Viewer和Java Viewer。HTML Viewer通过大量的Javascript脚本从服务器获取地图的地址(URL),而Java Viewer则使用Java applet,它即支持栅格地图服务(image service),也支持矢量地图格式(feature service),采用矢量格式时,由于是在客户端渲染地图,所以速度较快,而且还可以进行简单的空间分析。3 ArcIMS原理
ArcIMS架构清晰,原理也较简单,基本工作流程为:服务器接受来自客户端的请求,服务器从空间数据源读取数据然后按客户端的相应的要求处理后返回给客户端,对于不同的服务,处理和返回数据的方式不同,但客户端和服务器之间通讯的语言都一样,即ArcXML。因此研究ArcXML对了解ArcIMS原理以及基于ArcIMS的二次开发至关重要。 ArcXML是ESRI针对GIS应用所开发的XML(可扩展标记语言)扩展,它提供了访问所有的ArcIMS功能的能力,ArcIMS的地图配置文件也是ArcXML格式的,一个典型的Arcxml请求的如下所示:<?xml version="1.0" encoding="UTF-8" ?><ARCXML version="1.1">
<REQUEST>
<GET_IMAGE>
<PROPERTIES>
<ENVELOPE minx="-125" miny="25" maxx= "-67" maxy="50" />
</PROPERTIES>
</GET_IMAGE>
</REQUEST>
</ARCXML>
4 基于ArcIMS的WebGIS系统的开发
建立基于ArcIMS的WebGIS系统一般有两种方式,一种是通过工具Designer以图形化界面的方式,用这种方式可以快速的建立一个可运行系统,但是可定制性不强,适合初级用户。另一种方式是利用连接器进行二次开发,由于连接器对ArcXML进行了封装,开发者可以避免与XML之间打交道,降低了开发难度,这种方式相对于第一种方式可定制性强,开发者对系统的可控制性较大。两种开发流程如图2所示:
图2 ArcIMS开发流程
5 利用jython和java连接器进行快速开发
ArcIMS的java连接器提供了最完整和和强大的对象模型,然而通过java开发速度较慢,不利于快速开发或快速原型化。Python是一种简单且强大的动态语言,拥有代码简洁、跨平台等多种优点,Python在java虚拟机(JVM)上的实现称为jython。Jython可很好地与java开发环境集成,通过java连接器和jython可快速的创建或原型化基于ArcIMS的Web站点。 Jython编写的类可以继承java连接器中的类,实例化后可与指定的ArcIMS服务通讯,下面的例子中,在jython交互开发环境里实例化了一个map对象并连接到testservice服务:from com.esri.aims.mtier.io import *from com.esri.aims.mtier.model.map import *class ImsMap(Map): def __init__(self,service): con=ConnectionProxy() con.setConnectionType("tcp") con.setHost("127.0.0.1") con.setPort(5300) con.setService(service) self.con=con def startMap(self): Map.setHeight(self,400) Map.setWidth(self,600) Map.initMap(self,con,750,0,0,0,0) Map.refresh(self) return Map.getMapOutput(self).getURL()>>> map=ImsMap("TestService")>>> map.startMap()'http://localhost/output/git_localhost996014746663.jpg'>>> map.getMapUnits()'feet' 要将jython编写的程序部署到Servlet容器中,首先需要将<jython_HOME>/jython.jar和<ArcIMS_HOME>/Connec tors/Java_Connector目录下的类库复制到web应用程序的/WEB-INF/lib目录下,按如下方式编写web.xml应用程序配置文件:<web-app> <servlet> <servlet-name>pyservlet</servlet-name> <servlet-class>org.python.util.PyServlet</servlet -class> </servlet> <servlet-mapping> <servlet-name>pyservlet</servlet-name> <url-pattern>*.py</url-pattern> </servlet-mapping></web-app> 添加处理HTTP请求的方法后,完整的代码如下:from javax.servlet.http import HttpServletfrom com.esri.aims.mtier.io import *from com.esri.aims.mtier.model.map import *class GetImsMap(HttpServlet): def doGet(self,req,res): out=res.writer res.contentType="text/html" map=ImsMap("sampleService") print>>out, "<html><body>" print>>out, "<img src="+map.startMap() print>>out, "></body></html>"class ImsMap(Map): def __init__(self,service): con=ConnectionProxy() con.setConnectionType("tcp") con.setHost("127.0.0.1") con.setPort(5300) con.setService(service) self.con=con def startMap(self): Map.setHeight(self,400) Map.setWidth(self,600) Map.initMap(self,self.con,750,0,0,0,0) Map.refresh(self) return Map.getMapOutput(self).getURL() 在浏览器中打开地址:,运行效果如图3所示:
图3 程序运行效果