使用ashx扩展开发AjaxMap

Posted on 2008-08-28 11:00 黎民 阅读(413) 评论(0)  编辑  收藏 所属分类: GIS原理
AjaxMap是SuperMap IS.NET利用Ajax技术封装的地图控件,充分发挥了Ajax的技术优势。在客户端调用AjaxMap构建的WebGIS发布网站可以使浏览者获得更好的用户体验。即使是读取比较大的GIS数据,在读取数据的过程中,用户所面对的不再是白屏,而是原来的页面,只有当接受到全部数据后才更新相应部分的内容,而这种更新也是瞬间的,用户几乎感觉不到。

由于AjaxMap上述的优点,现在采用AjaxMap来进行开发的用户在不断的增多,对AjaxMap也就提出了更高的要求,但是目前AjaxMap提供的接口有限,通过什么手段来实现AjaxMap的功能呢?那就是.ashx 文件。


  .ashx文件与.aspx文件类似,可以通过它来调用HttpHandler类,它免去了普通.aspx页面的控件解析以及页面处理的过程。.ashx文件适合产生供浏览器处理的、不需要回发处理的数据格式,例如用于生成动态图片、动态文本等内容。使用.ashx可以让您专注于编程而不用管相关的WEB技术。下面的例子就是使用.ashx和Ajax技术来实现获取地图图层名称的功能。


  具体流程是,先通过页面的Xmlhttprequest对象,向layer.ashx发送请求,由这个页面与地图服务器进行交互,获得地图图层名,然后通过返回一个字符串,从后台得到,然后再进行解析,具体过程如图1所示。是不是很像Ajax交互的过程?

下面按照如上思路来具体实现一下。


1、添加ashx文件,编写代码。
  首先来打开AjaxMap的工程,添加一个Generic Handler的新项,名字叫layer.ashx。在工程中添加引用,就是安装目录下SDK里面的所有内容。部分代码如下:
添加命名空间
using System.Web;
using SuperMap.IS.Utility;
using SuperMap.IS.Web;
编写ProcessRequest函数代码,接受前台传递过来的方法名称、地图名称。
public void ProcessRequest(HttpContext context)
{
m_map = TcpMap.Create("localhost", 8800, new Hashtable());
string strMethod = context.Request["method"];
string strMapName = context.Request["mapname"];
string strRequestText = string.Empty;
switch (strMethod)
{
case "getAllLayersName"://将获取图层的过程放到GetLayersName函数当中,方便以后的扩展
strRequestText = GetLayersName(strMapName);
break;
}
context.Response.ContentType = "text/plain";
context.Response.Write(strRequestText);//将获得的图层名称返回
编写GetLayersName函数,获得图层名称
protected string GetLayersName(string mapName)
{
string strTmp = string.Empty;

MapImage mi = m_map.GetDefaultMapImage(mapName, 0, 0);
MapParam mp = m_map.GetCurrentMapParam();
Layer[] layers = mp.Layers;
strTmp = "layersname:";
for (int i = 0; i < layers.Length; i++)
{
strTmp += layers[i].Name + ",";
}
return strTmp;
}
和TcpMap的调用方式是一样的。
2、脚本的代码
定义Xmlhttprequest对象,使用异步调用方式。
var xmlhttprequest=null;
function getAllLayersName()
{
if (null==xmlhttprequest)
{
xmlhttprequest = _GetXmlHttpRequest();//使用AjaxMap中的_GetXmlHttpRequest方法来初始化xmlhttprequest对象。
}
xmlhttprequest.open("get","layer.ashx?method=getAllLayersName&mapname=changchun",false);//向layer.ashx发送参数
xmlhttprequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlhttprequest.onreadystatechange=onCompleteReturn;//定义回调的函数
xmlhttprequest.send(null);
}
编写回调函数的代码
function onCompleteReturn()
{
var readyState=xmlhttprequest.readyState;
if (readyState==4)//判断对象状态,4为完成
{
var status=xmlhttprequest.status;
if(status==200)//信息已经返回开始处理信息
{
var strLayersName= xmlhttprequest.responseText;//得到返回的字符串
if(strLayersName!= null)
{
alert(strLayersName);
}
}
else
{
if(onError)//出错的处理
{
}
}
xmlhttprequest = null;
}
}
  为了节省篇幅,这里就不对返回的值进行解析了。
整个实现过程就是这样,大部分地图功能都可以通过这种方式来实现。请注意,是大部分而不是全部,凡是涉及出图方面的操作都不能使用这种方式来实现,例如:制作专题图等操作。AjaxMap就是通过这种方法来实现的,其中的出图的操作已经被封装好了,没有办法对其进行修改,这也是出图的操作不能实现的原因。


只有注册用户登录后才能发表评论。


网站导航:
 

posts - 57, comments - 3, trackbacks - 0, articles - 1

Copyright © 黎民