http://www.cnblogs.com/hll2008/archive/2008/08/18/1269810.html

目的:
1.arcgis server9.2 ADF的Callback机制。
准备工作:
1.用ArcGis Server Manager或者ArcCatalog发布一个叫world的Map Service,并且把这个Service启动起来。
2.找到DeveloperKit\SamplesNET\Server\Web_Applications目录下的Common_CallbackCsharp.zip。

开始: 
1.新建名为Callback的ASP.NET Web应用程序。
2.在Default.aspx页面中加入MapResourceManager控件ID为MapResourceManager1,并且设置MapResourceItem的属性;Map控件ID为Map1,MapResourceManager属性为MapResourceManager1。具体过程可以参考ArcGIS.Server.9.2.DotNet自带例子分析(一、一);在地图控件的4个边分别添加LabelW、LabelN、LabelE、LabelS DIV控件,具体代码如下:

Code
 1<html xmlns="http://www.w3.org/1999/xhtml" >
 2<head runat="server">
 3    <title>无标题页</title>
 4</head>
 5<body>
 6    <form id="form1" runat="server">
 7        <table width="533" border="1" cellspacing="0" cellpadding="0">
 8          <tr>
 9            <td>&nbsp;</td>
10          </tr>
11          <tr>
12            <td><table width="100%" border="0" cellspacing="0" cellpadding="0">
13              <tr>
14                <td>&nbsp;</td>
15                <td align="center"><DIV style="LEFT: 262px; WIDTH: 50px; TOP: 40px" id="LabelN"></DIV></td>
16                <td>&nbsp;</td>
17              </tr>
18              <tr>
19                <td><div style="left: 13px; width: 50px; top: 259px" id="LabelW">
20                </div>
21                </td>
22                <td><esri:Map ID="Map1" runat="server" Height="305px" Width="451px" BorderWidth="2px" MapResourceManager="MapResourceManager1"></esri:Map></td>
23                <td><DIV style="LEFT: 533px; WIDTH: 50px; TOP: 259px" id="LabelE"></DIV></td>
24              </tr>
25              <tr>
26                <td>&nbsp;</td>
27                <td align="center"><div style="left: 262px; width: 50px; top: 436px" id="LabelS">
28                </div>
29                </td>
30                <td>&nbsp;</td>
31              </tr>
32            </table></td>
33          </tr>
34          <tr>
35            <td>&nbsp;</td>
36          </tr>
37        </table>
38        <esri:MapResourceManager ID="MapResourceManager1" runat="server">
39            <ResourceItems>
40                <esri:MapResourceItem Definition="&lt;Definition DataSourceDefinition=&quot;jh-53a435fbc0e8&quot; DataSourceType=&quot;ArcGIS Server Local&quot; Identity=&quot;To set, right-click project and 'Add ArcGIS Identity'&quot; ResourceDefinition=&quot;(default)@world&quot; DataSourceShared=&quot;True&quot; /&gt;"
41                    DisplaySettings="visible=True:transparency=0:mime=True:imgFormat=PNG8:height=100:width=100:dpi=96:color=:transbg=False:displayInToc=True"
42                    Name="MapResourceItem0" />
43            </ResourceItems>
44        </esri:MapResourceManager>
45    </form>
46</body>
47</html>
48

3.接下来做当地图视图范围发生变化时更新4个边的LabelW、LabelN、LabelE、LabelS DIV控件坐标显示,显示的是地图每个边的坐标,给Map1控件添加protected void Map1_ExtentChanged(object sender, ExtentEventArgs args)事件,然后编写相应的代码,具体的代码和说明如下:

 1 protected void Map1_ExtentChanged(object sender, ESRI.ArcGIS.ADF.Web.UI.WebControls.ExtentEventArgs args)
 2        {
 3            //获取地图控件的框
 4            ESRI.ArcGIS.ADF.Web.Geometry.Envelope env = args.NewExtent;
 5            SortedList<string, string> slist = new SortedList<string, string>();
 6            //最北的坐标
 7            slist.Add("n", env.YMax.ToString("N"));
 8            //最东的坐标
 9            slist.Add("e", env.XMax.ToString("N"));
10            //最南的坐标
11            slist.Add("s", env.YMin.ToString("N"));
12            //最西的坐标
13            slist.Add("w", env.XMin.ToString("N"));
14
15            IEnumerator ide = slist.GetEnumerator();
16
17            foreach (KeyValuePair<string, string> key in slist)
18            {
19                object[] o = new object[1];
20                o[0] = key.Value.ToString();
21                //CallbackResult参数说明:控件类型如 div,控件id,内容类型,内容
22                //CallbackResult无刷新的更新页面内容
23                CallbackResult crn = new CallbackResult("div", "Label" + key.Key.ToString(), "innercontent", o);
24                Map1.CallbackResults.Add(crn);
25            }
26        }

4.在页面上添加Toolbar控件ID为Toolbar1,BuddyControls属性为Map1,同时添加ZoomIn、ZoomOut、Pan、FullExt四个Map Navigation按钮,然后添加一个Tool按钮Name属性为CenterAt,ClientAction属性为Point,ServerActionAssembly属性为Callback,ServerActionClass属性为Callback.CustomTool。具体的代码如下:

1<esri:Toolbar ID="Toolbar1" runat="server" BuddyControlType="Map" 
2..                        
3<esri:Tool ClientAction="Point" JavaScriptFile="" Name="CenterAt" ServerActionAssembly="Callback" ServerActionClass="Callback.CustomTool" />
4..
5</esri:Toolbar>

5.新建CustomTool.cs类,实现IMapServerToolAction接口具体的代码和说明如下:

 1namespace Callback
 2{
 3    public class CustomTool : IMapServerToolAction
 4    {
 5        public void ServerAction(ToolEventArgs args)
 6        {
 7            Map map = (Map)args.Control;
 8            PointEventArgs pargs = (PointEventArgs)args;
 9            if (map != null && pargs != null)
10            {
11                //重新定位地图中心
12                map.CenterAt(pargs.ScreenPoint);
13            }
14        }
15    }
16}
17

6.这样重新定位地图中心的功能完成了,而已运行试验一下效果。
7.在Default.aspx页面上添加一个Menu控件ID为Menu1,同时添加2个子项Asia和Africa,具体的代码如下:

 1<asp:Menu ID="Menu1" runat="server" BackColor="#B5C7DE" DynamicHorizontalOffset="2"
 2                        Font-Names="Verdana" Font-Size="0.8em" ForeColor="#284E98" StaticSubMenuIndent="10px">
 3                        <StaticMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" />
 4                        <DynamicHoverStyle BackColor="#284E98" ForeColor="White" />
 5                        <DynamicMenuStyle BackColor="#B5C7DE" />
 6                        <StaticSelectedStyle BackColor="#507CD1" />
 7                        <DynamicSelectedStyle BackColor="#507CD1" />
 8                        <DynamicMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" />
 9                        <Items>
10                            <asp:MenuItem Text="Zoom To" Value="Zoom To">
11                                <asp:MenuItem Text="Asia" Value="Asia" NavigateUrl="javascript: ZoomToLocationClient('Asia');"></asp:MenuItem>
12                                <asp:MenuItem Text="Africa" Value="Africa" NavigateUrl="javascript: ZoomToLocationClient('Africa');"></asp:MenuItem>
13                            </asp:MenuItem>
14                        </Items>
15                        <StaticHoverStyle BackColor="#284E98" ForeColor="White" />
16                    </asp:Menu>

8.实现上面菜单的javascript函数ZoomToLocationClient,在页面的结束处添加代码入下:

 1<form  id="form1" runat="server">
 2.
 3<script language="javascript">
 4        //根据地名定位地图中心
 5        function ZoomToLocationClient(val)
 6        {
 7            //暂空
 8        }
 9
10        </script>  
11</form>

9.Default.aspx切换到代码视图开始编写服务端的代码,实现无刷新必须实现System.Web.UI.ICallbackEventHandler接口,实现 ICallbackEventHandler接口就必须实现GetCallbackResult()和RaiseCallbackEvent(string eventArgument)这2个方法具体的代码和说明入下:

 1namespace Callback
 2{
 3    public partial class _Default : System.Web.UI.Page,System.Web.UI.ICallbackEventHandler
 4    {
 5        //客户端脚本段
 6        public string sCallBackFunctionInvocation;
 7        //返回给客户端的内容
 8        private string mapstring;
 9
10        protected void Page_Load(object sender, EventArgs e)
11        {
12            //GetCallbackEventReference生成客户端脚本
13            sCallBackFunctionInvocation = Page.ClientScript.GetCallbackEventReference(this, "message", "processCallbackResult", "context", "postBackError", true);
14        }
15
16        protected void Map1_ExtentChanged(object sender, ESRI.ArcGIS.ADF.Web.UI.WebControls.ExtentEventArgs args)
17        {
18            //获取地图控件的框
19            ESRI.ArcGIS.ADF.Web.Geometry.Envelope env = args.NewExtent;
20            SortedList<string, string> slist = new SortedList<string, string>();
21            //最北的坐标
22            slist.Add("n", env.YMax.ToString("N"));
23            //最东的坐标
24            slist.Add("e", env.XMax.ToString("N"));
25            //最南的坐标
26            slist.Add("s", env.YMin.ToString("N"));
27            //最西的坐标
28            slist.Add("w", env.XMin.ToString("N"));
29
30            IEnumerator ide = slist.GetEnumerator();
31
32            foreach (KeyValuePair<string, string> key in slist)
33            {
34                object[] o = new object[1];
35                o[0] = key.Value.ToString();
36                //CallbackResult参数说明:控件类型如 div,控件id,内容类型如content, innercontent, javascript,image ,内容
37                //CallbackResult无刷新的更新页面内容
38                CallbackResult crn = new CallbackResult("div", "Label" + key.Key.ToString(), "innercontent", o);
39                Map1.CallbackResults.Add(crn);
40            }
41        }
42
43        ICallbackEventHandler 成员#region ICallbackEventHandler 成员
44
45        //把处理结果返回给客户端
46        public string GetCallbackResult()
47        {
48            return mapstring;
49        }
50
51        //接收客户端的请求,根据请求字符串eventArgument不同做不同的处理
52        public void RaiseCallbackEvent(string eventArgs)
53        {
54          //..        
55}
56
57        #endregion
58    }
59}
60

10.接下来要把服务端生成的脚本段sCallBackFunctionInvocation写入到页面中,Default.aspx切换到html视图在ZoomToLocationClient(val)方法中添加如下代码:

 1//根据地名定位地图中心
 2        function ZoomToLocationClient(val)
 3        {
 4            var message = 'zoomtolocation';
 5            message += ',' + val;
 6            var context = 'Map1';  
 7            //把服务端的生成的脚本段sCallBackFunctionInvocation输出
 8            //输出内容:WebForm_DoCallback('__Page',message,processCallbackResult,context,postBackError,true)
 9            <%=sCallBackFunctionInvocation%>
10        }

11.这样Menu控件通过调用ZoomToLocationClient(val)方法请求服务端进行处理然后把处理结果反馈给客户端,由客户端的processCallbackResult方法进行页面显示的更新,关于这个方法具体的可以参考ArcGIS.Server.9.2.DotNet自带例子分析(一)。
12.接下来在RaiseCallbackEvent(string eventArgs)方法中处理ZoomToLocationClient(val)方法发起的请求,具体代码如下:

 1//接收客户端的请求,根据请求字符串eventArgument不同做不同的处理
 2        public void RaiseCallbackEvent(string eventArgs)
 3        {
 4            if (eventArgs.Contains("zoomtopoint"))//根据坐标定位地图中心
 5            {
 6
 7            }
 8            else if (eventArgs.Contains("zoomtolocation"))//根据名称定位地图中心
 9            {
10                ZoomToLocationServer(eventArgs);
11            }
12        }
13//根据名称定位地图中心
14        public void ZoomToLocationServer(string ea)
15        {
16            //请求字符串分割处理
17            char[] parser_char = { ',' };
18            string[] messages = ea.Split(parser_char);
19            string location = messages[1];
20            double minx = 0;
21            double miny = 0;
22            double maxx = 0;
23            double maxy = 0;
24
25            bool validlocation = false;
26
27            //根据地点名称不同定位到不同的坐标
28            //这里为了方便直接给min和max赋值,在实际的开发中可以更加地点名称进行坐标的查询然后更加查询的坐标进行定位
29            switch (location)
30            {
31                case "Asia":
32                    minx = -125.0;
33                    miny = 30.0;
34                    maxx = -110.0;
35                    maxy = 45.0;
36                    validlocation = true;
37                    break;
38                case "Africa":
39                    minx = -80.0;
40                    miny = 40.0;
41                    maxx = -70.0;
42                    maxy = 45.0;
43                    validlocation = true;
44                    break;
45                default:
46                    break;
47            }
48
49            if (validlocation)
50            {
51                ESRI.ArcGIS.ADF.Web.Geometry.Envelope new_extent = new ESRI.ArcGIS.ADF.Web.Geometry.Envelope(minx, miny, maxx, maxy);
52                //设置当前地图的Extent
53                Map1.Extent = new_extent;
54                //把CallbackResults返回给客户端,让客户端更新地图显示
55                mapstring = Map1.CallbackResults.ToString();
56            }
57            else
58            {
59                mapstring = "";
60            }
61        }

13.这样就完成了根据名称定位地图中心的功能,接下来根据输入的坐标重新定位地图的中心,首先Default.aspx切换到html视图在最后的javascript中在添加一个ZoomToPointClient()方法,具体的代码和说明如下:

 1//根据坐标定位地图中心
 2        function ZoomToPointClient()
 3        {
 4            //获取输入的x值
 5            var x = document.getElementById('TextBoxX').value;
 6            //获取输入的y值
 7            var y = document.getElementById('TextBoxY').value;
 8            //生成请求字符串
 9            var message = 'zoomtopoint';
10            message += ',' + x + ',' + y;
11            var context = 'Map1';  
12            //把服务端的生成的脚本段sCallBackFunctionInvocation输出
13            //输出内容:WebForm_DoCallback('__Page',message,processCallbackResult,context,postBackError,true)         
14            <%=sCallBackFunctionInvocation%>
15        } 

14.在页面上添加2个input输入框,ID分别为TextBoxX和TextBoxY用来输入xy的坐标,在添加一个button来执行上面的ZoomToPointClient()方法。具体代码和说明如下:

1X:<input type="text" id="TextBoxX" style="width: 72px; left: 71px; top: 473px" />
2Y:<input type="text" id="TextBoxY" style="width: 72px; left: 203px;top: 472px" />
3<input type="button" value="Zoom To Point" onclick="ZoomToPointClient();" style="left: 318px; top: 470px; width: 150px" />

15.在服务端的RaiseCallbackEvent方法中添加对这个功能实现的代码,代码和说明如下:

 1 //接收客户端的请求,根据请求字符串eventArgument不同做不同的处理
 2        public void RaiseCallbackEvent(string eventArgs)
 3        {
 4            if (eventArgs.Contains("zoomtopoint"))//根据坐标定位地图中心
 5            {
 6                ZoomToPointServer(eventArgs);
 7            }
 8            else if (eventArgs.Contains("zoomtolocation"))//根据名称定位地图中心
 9            {
10                ZoomToLocationServer(eventArgs);
11            }
12        }
13
14        private void ZoomToPointServer(string eventArgs)
15        {
16            //请求字符串分割处理
17            char[] parser_char = { ',' };
18            string[] messages = eventArgs.Split(parser_char);
19            double map_width_eight = Map1.Extent.Width / 8;
20            double x_center = Double.Parse(messages[1]);
21            double y_center = Double.Parse(messages[2]);
22
23            ESRI.ArcGIS.ADF.Web.Geometry.Envelope env = new ESRI.ArcGIS.ADF.Web.Geometry.Envelope(x_center - map_width_eight, y_center - map_width_eight, x_center + map_width_eight, y_center + map_width_eight);
24            Map1.Extent = env;
25
26            //把CallbackResults返回给客户端,让客户端更新地图显示
27            mapstring = Map1.CallbackResults.ToString();
28        }
29

16.这样就完成了这个练习了,运行查看效果。

转载于:https://www.cnblogs.com/liuyang-1037/archive/2009/08/27/1555297.html

arcgis server for .NET学习转载5相关推荐

  1. ArcGIS Server .Net Web ADF体系结构

    ArcGIS Server .Net Web ADF体系结构 ArcGIS Server .net来创建应用有三个层次, 1 使用manager来创建一个web应用 2 使用 .net模板来创建应用 ...

  2. ArcGIS Server常见问题集锦(转载)

    ArcGIS Server常见问题集锦(转载) 安装部署问题 1 用户名问题    在GIS Server PostInstall过程中会涉及到两个用户,默认情况下一个ArcGISSOM,一个是Arc ...

  3. [转载]ArcGIS SERVER 9.3如何清除REST缓存

    有时候,发布了一个服务后,但是点击服务后,不能显示出来 http://hostname/ArcGIS/rest/services/服务名称/MapServer 这时候,十有八九是因为REST缓存没有清 ...

  4. arcgis server学习(一)

    ArcGIS Server是一个发布企业级GIS应用程序的综合平台,提供了创建和配置GIS应用程序和服务的框架,可以满足各种客户端的各种需求,这是对 ArcGIS Server一个抽象的描述,那么Ar ...

  5. ArcGIS Server 学习

    ArcGIS Server http://help.arcgis.com/zh-cn/arcgisserver/10.0/help/arcgis_server_dotnet_help/#/na/009 ...

  6. ArcGIS Server 简介

    ArcGIS Server ArcGIS Server--企业级GIS服务器 产品概况 关键特征 扩展模块 常见问题 ArcGIS Server--企业级GIS服务器 ArcGIS Server是一个 ...

  7. ArcGIS API for Silverlight 学习笔记(1)

    学习ArGIS API for Silverlight时间不久,希望记录下自己的心得. ArcGIS API for Microsoft Silverlight在今年三月份发布了1.2版本,它的最新版 ...

  8. ArcGIS Server 开发系列(一)--编程框架总览

    ArcGIS Server是一个发布企业级GIS应用程序的综合平台,如果想对ArcGIS Server基础有更多的了解,可以先看看<ArcGIS Server 体系结构>.ESRI(中国) ...

  9. 第一章 ArcGis Server简介

    本人为了学习ArcGis Server9.0,看了E文的 ArcGIS Server Administration and Development Guide,顺便翻译成中文.不妥之处尽请指出. Ar ...

最新文章

  1. CYQ.Data V5 分布式自动化缓存设计介绍(二)
  2. latex精要(1)-安装与helloworld
  3. Python装饰器与面向切面编程
  4. SparkSQL之操作Mysql
  5. 最大似然估计和最大后验概率估计的理解与求解
  6. python38怎么用_Python基础练习实例38(数组操作)
  7. 进程编译连接动态库,需要将动态库改为lib***.so
  8. 菜鸟python爬虫_Python爬虫学习-基础爬取
  9. python中valueerror怎么改_如何修复Python ValueError:错误的元数据?
  10. STM32的学习记录--2.WiFi模块的使用
  11. linux删除文件里夹命令,Linux删除文件(夹)、创建文件(夹)命令是什么
  12. Linux学习笔记021---Centos7 下 MySql too many connections 报错
  13. python打开一个本地目录文件路径
  14. linux内核编译步骤
  15. 《Spring》(十一) ---- 基于注解的依赖注入
  16. 几个北大和南开学霸的公众号,值得学习
  17. 信息论笔记(需要编辑格式)
  18. 软件工程系组织12级学生到工商学院参加比赛
  19. 手摸手深入理解JVM虚拟机--在MacOS系统上编译OpenJDK12并使用CLion调试靠谱教程
  20. Java核心编程总结(九、File文件类),王道训练营Java百度云盘

热门文章

  1. JavaScript内存管理——优化内存占用
  2. r语言 分类变量 虚拟变量_R语言中的变量
  3. linux 运维基础问题_Linux基础能力问题和解答
  4. python中bool函数_bool()函数以及Python中的示例
  5. 使用ThreadLocal绑定连接资源(事务)
  6. php curl form-data,在php curl multipart / form-data请求中发送一个文件和json数据
  7. php字符串连接符、三元运算符
  8. 使用宝塔部署node项目_使用宝塔面板进行项目的自动部署WebHook
  9. ffmpeg简单使用小记
  10. C++ STL 初步介绍01