欢迎您来到GIS动力

加入收藏 免费注册 用户登陆 帮助中心
首页 新闻动态 技术专栏 银杏树下 学习考研 软件下载 求职招聘 许愿瓶 节日祝福 用户中心 精彩推荐 资源搜索 地图
专栏导航: AO开发 | SO开发 | ArcGIS桌面 | 超图桌面 | 开发语言 | 数据库 | WebGIS | 银杏文学 | 研究生考题 | FreeMap 谈天说地
   您现在位于: 首页技术专栏SuperMap应用与开发超图IS → 正文
使用ashx扩展开发AjaxMap
07-11-06 10:03:41 作者:雪舞凌波 出处: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就是通过这种方法来实现的,其中的出图的操作已经被封装好了,没有办法对其进行修改,这也是出图的操作不能实现的原因。


(本文已被浏览 次)
发布人:admin
推荐给好友:发送给好友
上篇新闻:
下篇新闻:
相关评论
发表我的评论
  • 尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法;
  • 本站有权保留或删除您发表的任何评论内容;
  •   相关文章  

    关于我们 友情链接 ┋ 与我在线 ┋ 管理 ┋ TOP
    网站当前版本:GisPower CMS V3.0
    『GIS 动力』- http://www.gispower.org/
    联系我们:webmaster#gispower.org
    Copyright (c) 2003-2007 GisPOwer.Org. All Rights Reserved.

                   滇ICP备05006901号