基于Ajax+Servlet架构的WebGIS服务器设计原理及方法
- WebGIS
- 2007-10-20
- 125热度
- 0评论
GIS服务器(基于.net Remoting)在运行于不同进程中的对象之间建立通信(无论是在同一台计算机上,还是在相距数千公里的计算机上)是常见的开发目标。通过 .NET 远程处理,客户端应用程序可以使用同一台计算机(或其网络中其他任何可用的计算机)上的其他进程中的对象。可以从 Web 应用程序、控制台应用程序、Windows 服务进行通信。因此我们将基于.net Remoting技术实现GIS服务器。
1、WebGIS服务器与WebGIS应用分开
作为GIS提供商,一般只需要提供WebGIS服务器,让二次开发商等GIS爱好者使用WebGIS服务器开发他们自己的WebGIS行业应用。所以要将WebGIS服务器与WebGIS行业应用分开来建设。不然GIS提供商就没有饭吃了,而二次开发商面临的开发难度将非常大,大家都不乐意。用户的ebGIS行业应用都是运行在一定的WebContainer中,比如Tomcat。而咱们的WebGIS服务器一般是不会让它寄居在WebContainer中的,一般是让它单独运行在一个java虚拟机上的,以便我们完全控制。这一点明确了:WebGIS服务器与WebGIS行业应用程序是运行在不同的Java虚拟机上的。
2、沟通WebGIS服务器与WebGIS应用
我们的WebGIS应用必须得向WebGIS服务器请求GIS服务,不然咱们的业务系统还能叫做WebGIS应用吗?怎么做到这一点呢,那就是远程调用(跨虚拟机调用)。在java中通过RMI来实现。估计.NET中也有类似的玩意(没有玩过,俺不知道)
3、MapService
我们让提供地图服务的MapService对象,一直寄居在一个java进程中,等待这其他java进程远程调用它呢,它向虚拟机注册了的,MapService大致完成这样一些功能,比如new出一个地图控件、打开一个ArcGIS的地图文档或者SuperMap的一个工作空间,以及地图控件的各种常见操作,比如放大,缩小平移等、当然它还必须提供一个生成图片的函数比如OutputMap。这个MapService的这些我们期待GIS功能,当然是调用GISObjects来实现的,比如MO、AO、SuperMapObjects等。为了便于管理MapService对象,我们还需要几个辅助的类。其中一个是我们很期待的MapServiceFactory类,它负责提供一个远程调用函数,功能是远程获取MapService对象,还提供一个生成apService对象的功能。
寄居在WebContainer中的WebGIS应用,通过MapServiceFactory对象来远程获得MapService接口。一般来讲,完善的webGIS服务器,会同时提供多个MapService,这就需要另外一个类来管理咱们的MapService服务,我们暂时给它
取名为Server吧,这个Server负责管理一组运行了MapService的java进程包括启动进程,关闭进程,已经各个进程负责信息。为了协调
进程,我们可能还需要群集服务,一般也在这启动吧。
4、MapContainer
一般来讲,呈现给浏览器的,只是一张图片而已(或者一组拼接起来的图),这在咱们GIS里就表现为一幅地图呗,为了便于管理这些
地图,我们为每幅地图建立一个MapContainer。地图由MapService得到,地图的绘制参数可以是ArcGIS的地图文档(XMD)也可以是某个地图
配置文件,像开源webgis服务器MapServer就是一个mapfile。这个MapContainer可以为我们做这么一些事件:为了减少生成地图图片的IO操作,对于同一幅地图同一个地方范围,咱们只需要生成一次就够了,这个MapContainer可以管理咱们已经生成好了的图片。MapContainer再调用
咱们的MapService对象,完成一系列的GIS功能。
5、Servlet与Ajax协同工作
咱们这个Servlet是用户的WebGIS应用程序的一个部分,它寄居在WebContainer中,与MapService处于不同的java虚拟机中,因此需要使用
MapServiceFactory对象来远程获取MapService接口,再进而获取MapContainer,这样,在咱们的Servlet就可以像在本地那样使用GIS功能啦。
Servlet一方面要接受Ajax传过来的参数(采用XML组织),根据这些参数,servlet再调用某个MapContainer,生成合适的一组图块。(为了加快速度,我们学习googlemap,网格化地图),再把浏览器请求的地理范围的图块发到浏览器端。客户端的XMLHttpRequest负责协调这一过程。
先是有一段javascript脚本,针对某个DIV有拉框的橡皮条技术(比如拉框放大、拉框缩小等),根据设置状态,在这个DIV内,鼠标形状的变化(当GIS功能为放大,缩小,平移、量距、面积测算等,鼠标性质均不同),而且要记录下这些UI操作。这些UI操作将产生一个XML字符串。到时候我们就把这个XML字符串让XMLHttpRequest发送给相应的Servlet,同时XMLHttpRequest也预先定义好了一个回调函数,用于处理servlet传回来的结果。
servlet一般会传来这样一些内容:一组图片的URL,以及地图状态的一些参数。这些参数一般也是xml字符串,根据地图状态的参数,我们就可以在回调函数里拼接这些小图块,这些小图块是嵌套在这个DIV里的,这个DIV是个容器。目前网上有很多Ajax包可用。对于b/s系统而言,采用Ajax与servlet组合,用户的UI操作感觉与c/s操作之间的差别会越来越小。其实JSF同样可以完成Servlet与Ajax组合的效果。在以后,我们会慢慢分析怎么用JSF来做咱们自己的WebGIS服务器。
6、结语:
有使用MapObjects等支持java的GISObjects经验的有志之士,可以在这些Objects基础上,开发咱们自己的WebGIS服务器。当然知道了webgis服务器是怎么作出来,对咱们使用别人的webgis服务器,理解起来也就方便多啦。