ArcGIS.Server.9.2.DotNet自带例子分析(四、一)

目的:
1.arcgis server9.2 ADF的DynamicData,动态的设置Resource

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

开始: 
1.新建名为AddDynamicData的ASP.NET Web应用程序。
2.在页面上添加MapResourceManager1,不做任何设置;添加Map1,MapResourceManager属性为MapResourceManager1;添加Toc1,BuddyControl属性为Map1;添加一个CheckBoxList1,添加2个ListItem分别为ArcGIS Server Local和ArcGIS Server Internet。具体的代码如下:

Code
3.通过勾选页面上的CheckBox来选择不同的MapResource,这里提供了ArcGIS Server Local和ArcGIS Server Internet的选择,没有像样例还提供ArcIMS,因为本来人没有装ArcIMS。至于ArcGIS Server Local和ArcGIS Server Internet的两种方式在前面的几篇中都有用到了,这次通过代码的方式动态的进行设置。
4.接下来页面切换到代码视图,老样子仍旧需要实现ICallbackEventHandler。在Page_Load事件中添加如下代码:
 1//客户端脚本段
 2        private string m_ADFCallbackFunctionString;
 3
 4        public string ADFCallbackFunctionString
 5        {
 6            get
 7            {
 8                return m_ADFCallbackFunctionString;
 9            }

10            set
11            {
12                m_ADFCallbackFunctionString = value;
13            }

14        }

15
16        protected void Page_Load(object sender, EventArgs e)
17        {
18            //给CheckBox添加点击js事件
19            foreach (ListItem checkBox in CheckBoxList1.Items)
20            {
21                checkBox.Attributes.Add("onclick""ChangeCheckContext(this)");
22            }

23            //生成客户端脚本段
24            m_ADFCallbackFunctionString = Page.ClientScript.GetCallbackEventReference(this"message""processCallbackResult""context""postBackError"true);
25        }

26
5.在上面的代码中给CheckBox添加了ChangeCheckContext(this)脚本函数,所以需要在页面中添加这个函数,切换到html视图然后在最后添加如下的js代码:
 1.
 2<script language="javascript" type="text/javascript">    
 3    function ChangeCheckContext(checkbox)
 4    {     
 5        //显示载入中的小图标        
 6        document.getElementById('BusyIndicator').style.visibility = 'visible';
 7        //获取checkbox的显示文
 8        var val = checkbox.nextSibling.innerText;
 9        var ischecked = checkbox.checked;
10        context = "cb";
11        var message = "changeresource,";
12        message += val + ',' + ischecked; 
13        //执行回调请求服务端            
14        <%= ADFCallbackFunctionString%>                   
15     }
               
16    
</script>
17    </form>
6.接下在服务端实现对ChangeCheckContext(this)脚本函数请求处理,主要的GetCallbackResult和RaiseCallbackEvent的两个方法,具体的代码和说明如下:
  1//处理结果返回给客户端
  2        public string GetCallbackResult()
  3        {
  4            return m_CallbackResponse;
  5        }

  6//处理客户端请求
  7        public void RaiseCallbackEvent(string eventArgs)
  8        {
  9            //分割请求字符串
 10            char[] charToParse = ',' };
 11            string[] messages = eventArgs.Split(charToParse);
 12
 13            if (eventArgs.Contains("changeresource"))
 14            {
 15                //SourceType
 16                string dataSourceType = messages[1];
 17                //CheckBox是否选中
 18                bool isChecked = Boolean.Parse(messages[2]);
 19                //根据请求类型不同用不同的Resource
 20                switch (dataSourceType)
 21                {
 22                    case "ArcGIS Server Local":
 23                        m_ResourceName = AGSLocalName;
 24                        break;
 25                    case "ArcGIS Server Internet":
 26                        m_ResourceName = AGSInternetName;
 27                        break;
 28                    default:
 29                        break;
 30                }

 31                //更换Resource
 32                MapResourceChange(isChecked);
 33            }

 34        }

 35//更换Resource
 36        void MapResourceChange(bool isChecked)
 37        {
 38            //获取当前MapResourceManager1的ResourceItems
 39            ESRI.ArcGIS.ADF.Web.UI.WebControls.GISResourceItemCollection<ESRI.ArcGIS.ADF.Web.UI.WebControls.MapResourceItem> mapResourceItemCollection =MapResourceManager1.ResourceItems;
 40            
 41            ESRI.ArcGIS.ADF.Web.UI.WebControls.MapResourceItem mapResourceItem = null;
 42            //获取当前MapResourceManager1的ResourceItems的数
 43            int mapResourceCount = mapResourceItemCollection.Count;
 44            if (!isChecked)
 45            {
 46                //如果未勾选就删除未勾选的ResourceItem
 47                mapResourceItem = mapResourceItemCollection.Find(m_ResourceName);
 48                mapResourceItemCollection.Remove(mapResourceItem);
 49            }

 50            else
 51            {
 52                //实例化ResourceItem
 53                mapResourceItem = new ESRI.ArcGIS.ADF.Web.UI.WebControls.MapResourceItem();
 54                ESRI.ArcGIS.ADF.Web.UI.WebControls.GISResourceItemDefinition definition =new ESRI.ArcGIS.ADF.Web.UI.WebControls.GISResourceItemDefinition();
 55
 56                switch (m_ResourceName)
 57                {
 58                    case (AGSLocalName)://设置本地Resource名称
 59                        //Name
 60                        mapResourceItem.Name = AGSLocalName;
 61                        //Data Source
 62                        definition.DataSourceDefinition = "jh-53a435fbc0e8";
 63                        //Type
 64                        definition.DataSourceType = "ArcGIS Server Local";
 65                        //Resource
 66                        definition.ResourceDefinition = "Layers@usa";
 67                        break;
 68                    case (AGSInternetName)://设置Internet Resource名称
 69                        //Name
 70                        mapResourceItem.Name = AGSInternetName;
 71                        //Data Source
 72                        definition.DataSourceDefinition = "http://jh-53a435fbc0e8/arcgis/services/";
 73                        //Type
 74                        definition.DataSourceType = "ArcGIS Server Internet";
 75                        //Identity
 76                        Identity id = new Identity("Administrator""zsycl1231""");
 77                        definition.Identity = id.ToString();
 78                        //Resource
 79                        definition.ResourceDefinition = "(default)@world";
 80                        break;
 81                }

 82                
 83                definition.DataSourceShared = true;
 84                mapResourceItem.Parent = MapResourceManager1;
 85                mapResourceItem.Definition = definition;
 86
 87                //mapResourceItem的展示设置
 88                ESRI.ArcGIS.ADF.Web.DisplaySettings displaySettings = new ESRI.ArcGIS.ADF.Web.DisplaySettings();
 89                displaySettings.Transparency = 50.0F;
 90                displaySettings.Visible = true;
 91                displaySettings.ImageDescriptor.TransparentColor = System.Drawing.Color.White;
 92                displaySettings.ImageDescriptor.TransparentBackground = true;
 93                mapResourceItem.DisplaySettings = displaySettings;
 94
 95                //把上面的MapResourceItem添加到MapResourceManager1
 96                MapResourceManager1.ResourceItems.Insert(0, mapResourceItem);
 97
 98                //建立MapResource根据MapResourceManager1
 99                ESRI.ArcGIS.ADF.Web.DataSources.IMapResource mapResource =MapResourceManager1.CreateResource(mapResourceItem);
100
101                if (mapResourceCount < 1)
102                {
103                    Map1.PrimaryMapResource = mapResourceItem.Name;
104                    //初始化
105                    Map1.InitializeFunctionalities();
106                    Map1.InitializeTileFunctionalities();
107                }

108                else
109                {
110
111                    // 刷新地图显示
112                    if (Map1.ImageBlendingMode == ESRI.ArcGIS.ADF.Web.UI.WebControls.ImageBlendingMode.WebTier)
113                    {
114                        Map1.Refresh();
115                    }

116                    else
117                    {
118                        Map1.RefreshResource(mapResourceItem.Name);
119                    }

120                }

121            }

122
123            if (mapResourceCount < 1)
124            {
125                Map1.Extent = Map1.Extent.Expand(0.1);
126            }

127            //刷新Toc1
128            Toc1.Refresh();
129            ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult tocCallbackResult = RefreshControlHtml(Toc1);
130            Map1.CallbackResults.Add(tocCallbackResult);
131
132            // Convert the Map's collection of callback results to a string 
133            m_CallbackResponse = Map1.CallbackResults.ToString();
134        }

135
136        private ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult RefreshControlHtml(Control control)
137        {
138            StringWriter stringWriter = new StringWriter();
139            HtmlTextWriter writer = new HtmlTextWriter(stringWriter);
140            control.RenderControl(writer);
141            string htmlContent = stringWriter.ToString();
142            stringWriter.Close();
143            return new ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult(control, "content", htmlContent);
144        }

145
7.这个例子相对比较简单具体实现看代码注释了。运行看效果。
原文地址:https://www.cnblogs.com/hll2008/p/1272264.html