arcgis server for .NET学习转载5
http://www.cnblogs.com/hll2008/archive/2008/08/18/1269810.html
目的:
1.arcgis server9.2 ADF的Callback機(jī)制。
準(zhǔn)備工作:
1.用ArcGis Server Manager或者ArcCatalog發(fā)布一個(gè)叫world的Map Service,并且把這個(gè)Service啟動(dòng)起來。
2.找到DeveloperKit\SamplesNET\Server\Web_Applications目錄下的Common_CallbackCsharp.zip。
開始:?
1.新建名為Callback的ASP.NET Web應(yīng)用程序。
2.在Default.aspx頁面中加入MapResourceManager控件ID為MapResourceManager1,并且設(shè)置MapResourceItem的屬性;Map控件ID為Map1,MapResourceManager屬性為MapResourceManager1。具體過程可以參考ArcGIS.Server.9.2.DotNet自帶例子分析(一、一);在地圖控件的4個(gè)邊分別添加LabelW、LabelN、LabelE、LabelS DIV控件,具體代碼如下:
?1<html?xmlns="http://www.w3.org/1999/xhtml"?>
?2<head?runat="server">
?3????<title>無標(biāo)題頁</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> </td>
10??????????</tr>
11??????????<tr>
12????????????<td><table?width="100%"?border="0"?cellspacing="0"?cellpadding="0">
13??????????????<tr>
14????????????????<td> </td>
15????????????????<td?align="center"><DIV?style="LEFT:?262px;?WIDTH:?50px;?TOP:?40px"?id="LabelN"></DIV></td>
16????????????????<td> </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> </td>
27????????????????<td?align="center"><div?style="left:?262px;?width:?50px;?top:?436px"?id="LabelS">
28????????????????</div>
29????????????????</td>
30????????????????<td> </td>
31??????????????</tr>
32????????????</table></td>
33??????????</tr>
34??????????<tr>
35????????????<td> </td>
36??????????</tr>
37????????</table>
38????????<esri:MapResourceManager?ID="MapResourceManager1"?runat="server">
39????????????<ResourceItems>
40????????????????<esri:MapResourceItem?Definition="<Definition?DataSourceDefinition="jh-53a435fbc0e8"?DataSourceType="ArcGIS?Server?Local"?Identity="To?set,?right-click?project?and?'Add?ArcGIS?Identity'"?ResourceDefinition="(default)@world"?DataSourceShared="True"?/>"
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>
483.接下來做當(dāng)?shù)貓D視圖范圍發(fā)生變化時(shí)更新4個(gè)邊的LabelW、LabelN、LabelE、LabelS DIV控件坐標(biāo)顯示,顯示的是地圖每個(gè)邊的坐標(biāo),給Map1控件添加protected void Map1_ExtentChanged(object sender, ExtentEventArgs args)事件,然后編寫相應(yīng)的代碼,具體的代碼和說明如下:
?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????????????//最北的坐標(biāo)
?7????????????slist.Add("n",?env.YMax.ToString("N"));
?8????????????//最東的坐標(biāo)
?9????????????slist.Add("e",?env.XMax.ToString("N"));
10????????????//最南的坐標(biāo)
11????????????slist.Add("s",?env.YMin.ToString("N"));
12????????????//最西的坐標(biāo)
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參數(shù)說明:控件類型如?div,控件id,內(nèi)容類型,內(nèi)容
22????????????????//CallbackResult無刷新的更新頁面內(nèi)容
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,同時(shí)添加ZoomIn、ZoomOut、Pan、FullExt四個(gè)Map Navigation按鈕,然后添加一個(gè)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類,實(shí)現(xiàn)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}
176.這樣重新定位地圖中心的功能完成了,而已運(yùn)行試驗(yàn)一下效果。
7.在Default.aspx頁面上添加一個(gè)Menu控件ID為Menu1,同時(shí)添加2個(gè)子項(xiàng)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.實(shí)現(xiàn)上面菜單的javascript函數(shù)ZoomToLocationClient,在頁面的結(jié)束處添加代碼入下:
?1<form??id="form1"?runat="server">
?2.
?3<script?language="javascript">
?4????????//根據(jù)地名定位地圖中心
?5????????function?ZoomToLocationClient(val)
?6????????{
?7????????????//暫空
?8????????}
?9
10????????</script>??
11</form>9.Default.aspx切換到代碼視圖開始編寫服務(wù)端的代碼,實(shí)現(xiàn)無刷新必須實(shí)現(xiàn)System.Web.UI.ICallbackEventHandler接口,實(shí)現(xiàn) ICallbackEventHandler接口就必須實(shí)現(xiàn)GetCallbackResult()和RaiseCallbackEvent(string eventArgument)這2個(gè)方法具體的代碼和說明入下:
?1namespace?Callback
?2{
?3????public?partial?class?_Default?:?System.Web.UI.Page,System.Web.UI.ICallbackEventHandler
?4????{
?5????????//客戶端腳本段
?6????????public?string?sCallBackFunctionInvocation;
?7????????//返回給客戶端的內(nèi)容
?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????????????//最北的坐標(biāo)
22????????????slist.Add("n",?env.YMax.ToString("N"));
23????????????//最東的坐標(biāo)
24????????????slist.Add("e",?env.XMax.ToString("N"));
25????????????//最南的坐標(biāo)
26????????????slist.Add("s",?env.YMin.ToString("N"));
27????????????//最西的坐標(biāo)
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參數(shù)說明:控件類型如?div,控件id,內(nèi)容類型如content,?innercontent,?javascript,image?,內(nèi)容
37????????????????//CallbackResult無刷新的更新頁面內(nèi)容
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????????//把處理結(jié)果返回給客戶端
46????????public?string?GetCallbackResult()
47????????{
48????????????return?mapstring;
49????????}
50
51????????//接收客戶端的請(qǐng)求,根據(jù)請(qǐng)求字符串eventArgument不同做不同的處理
52????????public?void?RaiseCallbackEvent(string?eventArgs)
53????????{
54??????????//..????????
55}
56
57????????#endregion
58????}
59}
6010.接下來要把服務(wù)端生成的腳本段sCallBackFunctionInvocation寫入到頁面中,Default.aspx切換到html視圖在ZoomToLocationClient(val)方法中添加如下代碼:
?1//根據(jù)地名定位地圖中心
?2????????function?ZoomToLocationClient(val)
?3????????{
?4????????????var?message?=?'zoomtolocation';
?5????????????message?+=?','?+?val;
?6????????????var?context?=?'Map1';??
?7????????????//把服務(wù)端的生成的腳本段sCallBackFunctionInvocation輸出
?8????????????//輸出內(nèi)容:WebForm_DoCallback('__Page',message,processCallbackResult,context,postBackError,true)
?9????????????<%=sCallBackFunctionInvocation%>
10????????}11.這樣Menu控件通過調(diào)用ZoomToLocationClient(val)方法請(qǐng)求服務(wù)端進(jìn)行處理然后把處理結(jié)果反饋給客戶端,由客戶端的processCallbackResult方法進(jìn)行頁面顯示的更新,關(guān)于這個(gè)方法具體的可以參考ArcGIS.Server.9.2.DotNet自帶例子分析(一)。
12.接下來在RaiseCallbackEvent(string eventArgs)方法中處理ZoomToLocationClient(val)方法發(fā)起的請(qǐng)求,具體代碼如下:
?1//接收客戶端的請(qǐng)求,根據(jù)請(qǐng)求字符串eventArgument不同做不同的處理
?2????????public?void?RaiseCallbackEvent(string?eventArgs)
?3????????{
?4????????????if?(eventArgs.Contains("zoomtopoint"))//根據(jù)坐標(biāo)定位地圖中心
?5????????????{
?6
?7????????????}
?8????????????else?if?(eventArgs.Contains("zoomtolocation"))//根據(jù)名稱定位地圖中心
?9????????????{
10????????????????ZoomToLocationServer(eventArgs);
11????????????}
12????????}
13//根據(jù)名稱定位地圖中心
14????????public?void?ZoomToLocationServer(string?ea)
15????????{
16????????????//請(qǐng)求字符串分割處理
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????????????//根據(jù)地點(diǎn)名稱不同定位到不同的坐標(biāo)
28????????????//這里為了方便直接給min和max賦值,在實(shí)際的開發(fā)中可以更加地點(diǎn)名稱進(jìn)行坐標(biāo)的查詢?nèi)缓蟾硬樵兊淖鴺?biāo)進(jìn)行定位
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????????????????//設(shè)置當(dāng)前地圖的Extent
53????????????????Map1.Extent?=?new_extent;
54????????????????//把CallbackResults返回給客戶端,讓客戶端更新地圖顯示
55????????????????mapstring?=?Map1.CallbackResults.ToString();
56????????????}
57????????????else
58????????????{
59????????????????mapstring?=?"";
60????????????}
61????????}13.這樣就完成了根據(jù)名稱定位地圖中心的功能,接下來根據(jù)輸入的坐標(biāo)重新定位地圖的中心,首先Default.aspx切換到html視圖在最后的javascript中在添加一個(gè)ZoomToPointClient()方法,具體的代碼和說明如下:
?1//根據(jù)坐標(biāo)定位地圖中心
?2????????function?ZoomToPointClient()
?3????????{
?4????????????//獲取輸入的x值
?5????????????var?x?=?document.getElementById('TextBoxX').value;
?6????????????//獲取輸入的y值
?7????????????var?y?=?document.getElementById('TextBoxY').value;
?8????????????//生成請(qǐng)求字符串
?9????????????var?message?=?'zoomtopoint';
10????????????message?+=?','?+?x?+?','?+?y;
11????????????var?context?=?'Map1';??
12????????????//把服務(wù)端的生成的腳本段sCallBackFunctionInvocation輸出
13????????????//輸出內(nèi)容:WebForm_DoCallback('__Page',message,processCallbackResult,context,postBackError,true)?????????
14????????????<%=sCallBackFunctionInvocation%>
15????????}?14.在頁面上添加2個(gè)input輸入框,ID分別為TextBoxX和TextBoxY用來輸入xy的坐標(biāo),在添加一個(gè)button來執(zhí)行上面的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.在服務(wù)端的RaiseCallbackEvent方法中添加對(duì)這個(gè)功能實(shí)現(xiàn)的代碼,代碼和說明如下:
?1?//接收客戶端的請(qǐng)求,根據(jù)請(qǐng)求字符串eventArgument不同做不同的處理
?2????????public?void?RaiseCallbackEvent(string?eventArgs)
?3????????{
?4????????????if?(eventArgs.Contains("zoomtopoint"))//根據(jù)坐標(biāo)定位地圖中心
?5????????????{
?6????????????????ZoomToPointServer(eventArgs);
?7????????????}
?8????????????else?if?(eventArgs.Contains("zoomtolocation"))//根據(jù)名稱定位地圖中心
?9????????????{
10????????????????ZoomToLocationServer(eventArgs);
11????????????}
12????????}
13
14????????private?void?ZoomToPointServer(string?eventArgs)
15????????{
16????????????//請(qǐng)求字符串分割處理
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????????}
2916.這樣就完成了這個(gè)練習(xí)了,運(yùn)行查看效果。
轉(zhuǎn)載于:https://www.cnblogs.com/liuyang-1037/archive/2009/08/27/1555297.html
總結(jié)
以上是生活随笔為你收集整理的arcgis server for .NET学习转载5的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Top1】Tudou.com首页网页设
- 下一篇: [摘抄]软件设计模式的几个原则