http://www.gissky.net- GIS空间站

我要投稿 投稿指南 RSS订阅 网站资讯通告:
搜索: 您现在的位置: GIS空间站 >> 技术专栏 >> ArcGIS >> ArcIMS >> 正文

使用AJAX开发ArcIMS

作者:浩淼的天…    文章来源:http://www.hmgis.cn/    点击数:    更新时间:2007-11-7
摘要:ArcIMS的原理在于,我们所做的任何地图操作,都是客户端client向连接器发送一个ArcXML格式请求,Connector接收到请求后,将其解析转发给地图服务器,地图服务器将产生的结果,无论是feature还是image格式的响应,也通过ArcXML格式数据反馈给Connector,连接器再将这个结果作为响应发送给client。

最近接到一个制作ArcIMS网站的任务,要求我在最短的时间内搞出一个元数据发布系统的架子出来,除了一般的功能地图功能外,最核心的是两个,即点选和框选图幅,并能通过一个良好的方法现实这些被选择的图幅的信息,以方便用户购买地图。

我个人对ArcIMS开发不是精通,但是谈得上熟悉的只有HTML/Javascript和ASP两种开发模式。我需要做到的功能其实在ArcIMS的例子中修修补补就可以办到了,但是我个人感觉这个方法不好。首先是HTML/Javascript的开发方法,结构太复杂,尤其是对AXL响应的解析,不用XMLDocument来做,却搞个字符串截取查找的方式;ASP还马马虎虎,不过写ASP页面也实在是太笨拙。即便如此,我还是选择使用ASP的方式写了一个网站原型,花了3天工夫,满以为就这样对付过去算了,但在ESRI.com查资料的时候,却发现了一些新的信息——frameless ArcIMS website

无框架的IMS站点设计确实是我第一次见到,这里介绍两个站点:SucessGIS提供的无框架例子http://www.successgis.com/CodeSamples.htm;第二个是不知道是哪家公司或个人的东西http://12.148.203.44/arcims/ 。这里面都有例子可以下载供研究。

所谓无框架的IMS站点,是相对有框架的例子来的,在标准的HTML/Javascript开发中,是使用了一个大的Framework的,其中负责发送ArcXML请求的页面包含在这个框架中,不过是高度为0,大家看不到。在看了这些例子后,我突然想到IMS的本质,ArcIMS是一个地图服务器,它能够提供基于图片和要素的地图服务,由于我们是通过web服务器与之通讯的,在地图服务器与web服务器之间,必须安装一个“通道”,这个通道称为connector(连接器)。连接器的有多种类型,这取决于我们使用什么样的开发方式,如果是ASP开发,必须安装ActiveX连接器,如果是JSP,则是java连接器。标准的ArcIMS是使用servlet连接器。使用连接器的ArcIMS是一个标准的三层结构,即客户端——连接器——地图服务器。

ArcIMS的原理在于,我们所做的任何地图操作,都是客户端client向连接器发送一个ArcXML格式请求,Connector接收到请求后,将其解析转发给地图服务器,地图服务器将产生的结果,无论是feature还是image格式的响应,也通过ArcXML格式数据反馈给Connector,连接器再将这个结果作为响应发送给client。

在标准的HTML/Javascript格式client中,ESRI使用Frame模式的隐藏表单Form来发送请求和接收响应,对于这个请求/响应循环的实现,其实我们还可以通过另一种模式,即AJAX,来实现。AJAX是一种异步Javascript+XML技术,它允许页面内的部分页面通过刷新与服务器进行交互,在AJAX之前,我们对页面的任何请求都是完全刷新的,任何细小的改动都意味着我们必须到服务器上取回页面的全部内容,在使用了AJAX以后,我们可以毫无察觉地改变页面中的内容,而不会感觉到页面正在刷新。也就是说,AJAX允许需要改变的地方“私下”改变,而不用影响全局。

AJAX包括五个部分:
1.基于标准的表示技术,使用XHTML和CSS实现内容与内容格式分离
2.动态显示和交互技术,使用Document Object Model操纵页面对象
3.数据互换与操作技术,使用XML和XSLT
4.使用XMLHttpRequest对象用于异步获取数据
5.使用JavaScript将以上四点结合起来。

AJAX的核心在于XMLHttpRequest对象XHR,它向一个连接器发送请求并获得响应的代码如下:

首先是xhr对象的产生:
http=function getHTTPObject() {
    var xmlhttp;
    if (window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
    // branch for IE/Windows ActiveX version
    } else if (window.ActiveXObject) {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    return xmlhttp;
}

http.open("POST", url, true);
http.onreadystatechange = parseLayers;//IMS服务信息将由parseLayers解析
http.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
http.send(axl);

这个XHR使用了post类型的请求方式,我们一般使用的是get和post两种,其中get只能传输4K的数据,且其数据是携带在url后传输的,显然不能满足我们的需要,故而使用post这种无限制的方式。在使用post方式时,需要写下这么个语句:
http.setRequestHeader('Content-Type','application/x-www-form-urlencoded')
但不知道为什么,在开发时,不带上这句也没有任何问题。

这个url是http://nbjbt/servlet/com.esri.esrimap.Esrimap?ServiceName=" + service + "&Form=False&ClientVersion=4.0一类的写法。而axl则是我们需要发送的ArcXML请求。发送请求以后,我们使用parseLayers函数接收AXL格式的响应,其代码如下:

//该函数用于解析指定IMS服务的信息,系统从中提取图层信息
function parseLayers(){
  if (http.readyState == 4) {
   if (http.status == 200) {
      var result = http.responseText;
      //alert(result);
      //调用aimsLayers2.js中的函数getLayers解析图层信息
      getLayers(result);
      //初始化地图
      getInitialMap();
   } else alert("Error retreiving data");     
  }
 }

[1] [2] 下一页

Tags:ArcIMS,AJAX  
责任编辑:gissky
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 中国地图