WEB GIS实习报告(课程设计) - 图文

更新时间:2024-04-25 21:47:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

学 生 实

实习名称:学 号:学生姓名:指导教师:专业班级:院(部):习 报 告

2013年 日

实习成绩评定表

指导老师评语: 成绩: 指导老师: 年 月 日

Web GIS实习报告

一.实验目的

1.了解WebGIS的基本功能以及各种模式构成; 2.使用VS创建并生成.NET Web应用程序; 3.掌握基于ArcServe建立地图发布系统的技能。 4.基于.NET平台进行WebGIS开发。

二.实验要求

1.熟悉WebGIS模式;

2.熟悉用ArcGis Server Manager或者ArcCatalog发布Map Service并预览。 3.熟悉ArcSever的控件及功能; 4.建立客户端的地图发布网页; 5.在IIS中发布并预览。

三.实验软件

1.安装iis服务; 2.安装VS; 3.安装IE浏览器;

4.安装Arcgis desktop和Arcgis Sever;

四.实验内容

1.实验一. Web Mapping Application; 2.实验二.callback; 3.实验三. AddGraphics; 4,实验四. QueryNewWindow

五.实验步骤及实验结果

1.实验一. Web Mapping Application 1)实验步骤:

(1)用ArcGis Server Manager或者ArcCatalog发布一个自定义名字的Map

Service,并且把这个Service启动起来;

(2)新建名为MappingApp的ASP.NET Web应用程序,即普通的Web应用程序; (3)在Default.aspx中放置需要的控件:1个Map、1个Toolbar、1个

MapResourceManager、3个FloatingPanel、1个OverviewMap、1个Toc、1个Navigation;

(4)OverviewMap、Toc、Navigation分别放置在3个FloatingPanel。 (5)设置MapResourceManager1,点击MapResourceItem填出对话框,点击添

加按钮新增一个MapResourceItem0然后点击Definition属性弹出对话框,设置如下,Type:ArcGIS Server Local;Data Source:myssis(我的机器名);Resource:(default)@world(点击按钮选择上面发布好的叫world的Map Service),完成设置。

(6)设置Map1控件的MapResourceManager,在属性栏下拉选中

MapResourceManager1。

(7)设置OverviewMap1的Map属性为Map1,MapResourceManager属性为

MapResourceManager1,OverviewMapResource属性为MapResourceItem0。 (8)设置Toc1的BuddyControl属性为Map1。

(9)设置Navigation1的的Map属性为Map1,可以通过设置DisplayCharacter

属性改变显示的样子。

(10)MapResourceManager控件需要添加ESRI.ArcGIS.ADF.Web.DataSources

引用,在vs右边的资源管理器右键点击\引用\然后添加引用找到ESRI.ArcGIS.ADF.Web.DataSources确定即可。

(11)设置Toolbar1,BuddyControlType属性为Map,ToolbarStyle属性为

ImageOnly, BuddyControl属性为Map1,ToolbarItems属性:在弹出对话框中把Map Navigation下的MapZoomIn、MapZoomOut、MapPan、MapFullExtent都添加,不需要做其他设置。

(12)调试运行,本实验不需要添加代码即可完成了基本的地图功能。

2)实验结果:

2.实验二. Callback 1)实验步骤:

(1)用ArcGis Server Manager或者ArcCatalog发布一个自定义名字的Map

Service,并且把这个Service启动起来;

(2)新建名为callback的ASP.NET Web应用程序,即普通的Web应用程序; (3)Default.aspx页面中加入MapResourceManager控件ID为Map Resource

Manager1,并且设置MapResourceItem的属性;Map控件ID为Map1,MapResourceManager属性为MapResourceManager1。

(4)在地图控件的4个边分别添加LabelW、LabelN、LabelE、LabelS DIV控件; (5)做当地图视图范围发生变化时更新4个边的LabelW、LabelN、LabelE、LabelS

DIV控件坐标显示,显示的是地图每个边的坐标,给Map1控件添加protected void Map1_ExtentChanged(object sender, ExtentEventArgs args)事件,然后编写相应的代码:

protected void Map1_ExtentChanged(object sender, ESRI.ArcGIS.ADF.Web.UI.WebControls.ExtentEventArgs args) 2

{//获取地图控件的框

4 ESRI.ArcGIS.ADF.Web.Geometry.Envelope env = args.NewExtent; SortedList slist = new SortedList();//using System.Collections

6 slist.Add(\, env.YMax.ToString(\));//最北的坐标 7 slist.Add(\, env.XMax.ToString(\));//最东的坐标 9 slist.Add(\, env.YMin.ToString(\)); //最南的坐标 slist.Add(\, env.XMin.ToString(\));//最西的坐标 15 IEnumerator ide = slist.GetEnumerator();

//控件要增加using System.Collections;

17 foreach (KeyValuePair key in slist) 18

{ object[] o = new object[1]; 20 o[0] = key.Value.ToString();

21 //CallbackResult参数说明:控件类型如 div,控件id,内容类型,内容 22 //CallbackResult无刷新的更新页面内容

23 CallbackResult crn = new CallbackResult(\, \ + key.Key.ToString(), \, o);//using ESRI.ArcGIS.ADF.Web.UI.WebControls; 24 Map1.CallbackResults.Add(crn);}}

(6) 在页面上添加Toolbar控件ID为Toolbar1,BuddyControls属性为Map1,

同时添加ZoomIn、ZoomOut、Pan、FullExt四个Map Navigation按钮,然后添加一个Tool按钮Name属性为CenterAt,ClientAction属性为Point,

ServerActionAssembly属性为Callback,ServerActionClass属性为Callback.CustomTool;

(7)新建CustomTool.cs类,实现IMapServerToolAction接口,具体代码如下:

1namespace Callback 2 4 6

{public class CustomTool : IMapServerToolAction { public void ServerAction(ToolEventArgs args) {Map map = (Map)args.Control;

8 PointEventArgs pargs = (PointEventArgs)args; 9 if (map != null && pargs != null) 10

{ map.CenterAt(pargs.ScreenPoint); //重新定位地图中心 }}}}

(8)重新定位地图中心的功能完成了,而已运行试验一下效果。

(9)在Default.aspx页面上添加一个Menu控件ID为Menu1,同时添加2个子

项Asia和Africa,

(10)实现上面菜单的javascript函数ZoomToLocationClient,在页面的结束

处添加代码入下:

(11)Default.aspx切换到代码视图开始编写服务端的代码,实现无刷新必须

实现System.Web.UI.ICallbackEventHandler接口,实现ICallback Event Hand ler接口就必须实现GetCallbackResult()和

RaiseCallbackEvent(string eve ntArgument)这2个方法具体的代码和说明入下:

1namespace Callback

2{ public partial class _Default : System.Web.UI.Page,System.Web.UI.ICallbackEventHandler 4

{ public string sCallBackFunctionInvocation;//客户端脚本段 6 //返回给客户端的内容

8 private string mapstring;

9 protected void Page_Load(object sender, EventArgs e)

11 { //GetCallbackEventReference生成客户端脚本

sCallBackFunctionInvocation = Page.ClientScript.GetCallbackEventReference(this, \, \, \, \ckError\, true); } 15

16 protected void Map1_ExtentChanged(object sender, ESRI.ArcGIS.ADF.Web.UI.WebControls.ExtentEventArgs args) 17

{//获取地图控件的框

19 ESRI.ArcGIS.ADF.Web.Geometry.Envelope env = args.NewExtent; SortedList slist = new SortedList(); slist.Add(\, env.YMax.ToString(\));//最北的坐标

slist.Add(\, env.XMax.ToString(\));//最东的坐标 slist.Add(\, env.YMin.ToString(\)); //最南的坐标 slist.Add(\, env.XMin.ToString(\));//最西的坐标 IEnumerator ide = slist.GetEnumerator();

foreach (KeyValuePair key in slist) 33

{object[] o = new object[1];

35 o[0] = key.Value.ToString(); //CallbackResult参数说明:控件类型如 div,控件id,内容类型如content, innercontent, javascript,image ,内容

37 //CallbackResult无刷新的更新页面内容

38 CallbackResult crn = new CallbackResult(\, \abel\ + key.Key.ToString(), \, o); 39 Map1.CallbackResults.Add(crn);}} 42 #region ICallbackEventHandler 成员

45 //把处理结果返回给客户端

46 public string GetCallbackResult() 47

{return mapstring;//}??? }

50//接收客户端的请求,根据请求字符串eventArgument不同做不同的处理 52 public void RaiseCallbackEvent(string eventArgs) 53

{ //

.. }

57 #endregion}}

(12)把服务端生成的脚本段sCallBackFunctionInvocation写入到页面中,

Default.aspx切换到html视图在ZoomToLocationClient(val)方法中添加如下代码:

function ZoomToLocationClient(val) 3

{ var message = 'zoomtolocation'; 5 message += ',' + val; 6 var context = 'Map1';

7 //把服务端的生成的脚本段sCallBackFunctionInvocation输出 8 //输出内容:WebForm_DoCallback('__Page',message,processCallbackResult,context,postBackError,true) 9 <%=sCallBackFunctionInvocation%>}

(13)在RaiseCallbackEvent(string eventArgs)方法中处理ZoomTo Location

Client(val)方法发起的请求,具体代码如下:

public void RaiseCallbackEvent(string eventArgs) 3

{if (eventArgs.Contains(\))//根据坐标定位地图中心

5 { }

else if (eventArgs.Contains(\))//根据名称定位地图中心 9

{ ZoomToLocationServer(eventArgs); }} 13//根据名称定位地图中心

14 public void ZoomToLocationServer(string ea) 1517

{//请求字符串分割处理

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;

bool validlocation = false;

26//根据地点名称不同定位到不同的坐标 //这里为了方便直接给min和max赋值,在实际的开发中可以更加地点名称进行坐标的查询然后更加查询的坐标进行定位

29 switch (location) 30

{ case \: 32 minx = -125.0; 33 miny = 30.0; 34 maxx = -110.0; 35 maxy = 45.0;

36 validlocation = true; 37 break; 38 case \: 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;} if (validlocation)

50 { ESRI.ArcGIS.ADF.Web.Geometry.Envelope new_exten

t = 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();} 57 else 58

{ mapstring = \;} }

(14)Default.aspx切换到html视图在最后的javascript中在添加一个

ZoomToPointClient()方法,具体的代码和说明如下:

function ZoomToPointClient() 3

{//获取输入的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)在页面上添加2个input输入框,ID分别为TextBoxX和TextBoxY用来

输入xy的坐标,在添加一个button来执行上面的ZoomToPointClient()方法。具体代码和说明如下:

1X:

2Y:

3

(16)在服务端的RaiseCallbackEvent方法中添加对这个功能实现的代码,代

码和说明如下:

2 public void RaiseCallbackEvent(string eventArgs) 3 5 91517

{if (eventArgs.Contains(\))//根据坐标定位地图中心 { ZoomToPointServer(eventArgs);} {ZoomToLocationServer(eventArgs); }} { //请求字符串分割处理

char[] parser_char = { ',' };

8 else if (eventArgs.Contains(\))//根据名称定位地图中心 14 private void ZoomToPointServer(string eventArgs)

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]);

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;

26 //把CallbackResults返回给客户端,让客户端更新地图显示 27 mapstring = Map1.CallbackResults.ToString(); } 29

2)实验结果:

3.实验三. AddGraphics 1)实验步骤:

(1)用ArcGis Server Manager或者ArcCatalog发布一个自定义名字的Map

Service,并且把这个Service启动起来;

(2)新建名为AddGraphics的ASP.NET Web应用程序,即普通的Web应用程序; (3)在页面上放置1个Map、1个Toc、1个MapResourceManager、1个Toolbar

控件,分别设置属性。

(4)在Toolbar1添加一个Tool,Name:AddPointTool;Text:Add Graphic Poi

nt;ClientAction:Point;ServerActionAssembly:AddGraphics;ServerActionClass:AddGraphics.ElementGraphicTool。

(5)新建GraphicPointTools.cs文件,然后在文件中添加ElementGraphicTool

类用来实现AddPointTool的功能,代码和说明如下:

1public class ElementGraphicTool : IMapServerToolAction

2 { void IMapServerToolAction.ServerAction(ToolEventArgs toolEventArgs)

4 { ESRI.ArcGIS.ADF.Web.UI.WebControls.Map adfMap =(ESRI.ArcGIS.ADF.Web.UI.WebControls.Map)toolEventArgs.Control; //获取map控件 PointEventArgs pointEventArgs = (PointEventArgs)toolEventArgs; //转成点

System.Drawing.Point screenPoint = pointEventArgs.ScreenPoint; //屏幕坐标转成地理坐标

13 ESRI.ArcGIS.ADF.Web.Geometry.Point adfPoint =ESRI.ArcGIS.ADF.Web.Geometry.Point.ToMapPoint(screenPoint.X, screenPoint.Y, adfMap.GetTransformationParams(ESRI.ArcGIS.ADF.Web.Geometry.TransformationDirection.ToMap));

ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapFunctionality adfGraphicsMapFunctionality = null; //MapFunctionality

foreach (ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality mapFunctionality in adfMap.GetFunctionalities())

18 {//当Resource为ADFGraphicsResource,ADFGraphicsResource为GraphicsLayer, 保存在内存中用显示临时图层

if (mapFunctionality.Resource.Name == \)

{ adfGraphicsMapFunctionality =(ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapFunctionality)mapFunctionality;

23 break;} }

//当为null的时候调用Utility.ProcessError方法弹出提示框 28 if (adfGraphicsMapFunctionality == null) {

//把Utility.ProcessError处理的CallbackResultCollection结果赋给Map控件 31adfMap.CallbackResults.CopyFrom(Utility.ProcessError(\s functionality not found\));

32 return; }

//从adfGraphicsMapFunctionality获取名为Element Graphics的DataTable 36 ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer elementGraphicsLayer = null;

37 foreach (System.Data.DataTable dataTable in adfGraphicsMapFunctionality.GraphicsDataSet.Tables) 3840

{if (dataTable.TableName == \) {

41 elementGraphicsLayer = (ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer)dataTable;

42 break;} }

//如果名为Element Graphics的DataTable为null,就新建Element Graphics DataTable添加到adfGraphicsMapFunctionality.GraphicsDataSet中,同时刷新Toc1显示

47 if (elementGraphicsLayer == null)

48 { elementGraphicsLayer = new ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer();

50 elementGraphicsLayer.TableName = \; 51 adfGraphicsMapFunctionality.GraphicsDataSet.Tables.Add(elementGraphicsLayer);

//查找Toc1控件

54 Toc adfToc = (Toc)Utility.FindControl(\, adfMap.Page); 55 //刷新Toc1控件 56 adfToc.Refresh();

57 //CallbackResults结果赋给Map控件

58 adfMap.CallbackResults.CopyFrom(adfToc.CallbackResults); } //定义标点样式

ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol simpleMarkerSymbol =new ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol(); 63 simpleMarkerSymbol.Color = System.Drawing.Color.Black; 64 simpleMarkerSymbol.Width = 10; //定义标点选中样式 67 ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol simpleSelectedMarkerSymbol =new ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol();

simpleSelectedMarkerSymbol.Color = System.Drawing.Color.Yellow; 69 simpleSelectedMarkerSymbol.Width = 12;

70 simpleSelectedMarkerSymbol.Type = ESRI.ArcGIS.ADF.Web.Display.Symbol.MarkerSymbolType.Star;

ESRI.ArcGIS.ADF.Web.Display.Graphics.GraphicElement graphicElement =new ESRI.ArcGIS.ADF.Web.Display.Graphics.GraphicElement(adfPoint, simpleMarkerSymbol, simpleSelectedMarkerSymbol);

73 //把标点添加到elementGraphicsLayer

74 elementGraphicsLayer.Add(graphicElement); 75 //刷新显示

76 if (adfMap.ImageBlendingMode == ImageBlendingMode.WebTier) 77

{ //整个地图控件刷新 79 adfMap.Refresh(); } 81 else

82 { //只刷新部分Resource

adfMap.RefreshResource(adfGraphicsMapFunctionality.Resource.Name); 85 }} }

(6)新建Utility.cs文件,然后添加上面的ElementGraphicTool类中用到的ProcessError和FindControl方法,具体代码和说明如下:

1namespace AddGraphics 2 4

{

{ //错误信息处理 3 public class Utility

6 public static ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResultCollection ProcessError(string message) 7

{//alert错误信息

9 string jsAlertException = \ + message + \; 10 //用CallbackResult执行js脚本

11 ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult alertCallbackResult =new ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult(null, null, \, jsAlertException); //设置鼠标的指针显示 14 string jsChangeCursor = \r = map.cursor\;

15 //用CallbackResult执行js脚本

16 ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult cursorCallbackResult =new ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult(null, null, \, jsChangeCursor);

ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResultCollection callbackResultCollection =new ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResultCollection();

19 callbackResultCollection.Add(alertCallbackResult); 20 callbackResultCollection.Add(cursorCallbackResult); //返回CallbackResultCollection

23 return callbackResultCollection;} //查找页面控件

27 public static Control FindControl(string control, Page page) 2830

{if (page == null || control == null) {return null;}

33 Control buddyControl = page.FindControl(control); 34 if (buddyControl == null)

35 {string webPartControl = GetControlUniqueID(control, page.Controls);

37 if (webPartControl != null) 3842

{ buddyControl = page.FindControl(webPartControl);} {buddyControl = page.FindControl(control); 41 else 44 }}

47 return buddyControl;}

public static string GetControlUniqueID(string controlID, ControlCollection controls) 51

{ Control control;

53 string uniqueID = null;

54 for (int i = 0; i < controls.Count; ++i) 5558

{ control = controls[i];

{uniqueID = control.UniqueID; 57 if (control.ID == controlID) 60 break; }

62 if (control.Controls.Count > 0) 63

{

64 uniqueID = GetControlUniqueID(controlID, control.Controls); 65 if (uniqueID != null) 66 break; }} 69 return uniqueID;} 71 }}

(7)在页面上在新增一个Toolbar2,在ToolbarItems中添加一个Tool然后设

置相应的属性

(8)在GraphicPointTools.cs中新增加FeatureGraphicTool类来实现上面的

Tool的功能,具体代码和说明如下:

1public class FeatureGraphicTool : IMapServerToolAction 2

{

3 void IMapServerToolAction.ServerAction(ToolEventArgs toolEventArgs) 4

{//获取map控件

6 ESRI.ArcGIS.ADF.Web.UI.WebControls.Map adfMap = (ESRI.ArcGIS.ADF.Web.UI.WebControls.Map)toolEventArgs.Control; 7 //转成点

8 PointEventArgs pointEventArgs = (PointEventArgs)toolEventArgs;//屏幕点

10 System.Drawing.Point screenPoint = pointEventArgs.ScreenPoint; //屏幕坐标转成地理坐标

13 ESRI.ArcGIS.ADF.Web.Geometry.Point adfPoint = ESRI.ArcGIS.ADF.Web.Geometry.Point.ToMapPoint(screenPoint.X, screenPoint.

Y, adfMap.GetTransformationParams(ESRI.ArcGIS.ADF.Web.Geometry.TransformationDirection.ToMap));

15 ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapFunctionality adfGraphicsMapFunctionality = null; 16 //MapFunctionality

17 foreach (ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality mapFunctionality in adfMap.GetFunctionalities()) 18

{

19 //当Resource为ADFGraphicsResource,ADFGraphicsResource为GraphicsLayer, 保存在内存中用显示临时图层

if (mapFunctionality.Resource.Name == \)

21 {adfGraphicsMapFunctionality = (ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapFunctionality)mapFunctionality; 23 break; }}

//当为null的时候调用Utility.ProcessError方法弹出提示框 28 if (adfGraphicsMapFunctionality == null)

29 { //把Utility.ProcessError处理的CallbackResultCollection结果赋给Map控件

31 adfMap.CallbackResults.CopyFrom(Utility.ProcessError(\)); 32 return; }

35 //FeatureGraphicLayer类似feature layer,能建立属性信息,并能基于属性来符号化。图层只能存储同一图形类型。FeatureGraphicLayer可以支持查询。 36 ESRI.ArcGIS.ADF.Web.Display.Graphics.FeatureGraphicsLayer featureGraphicsLayer = null;

37 //从adfGraphicsMapFunctionality获取名为Feature Graphics的DataTable

38 foreach (System.Data.DataTable dataTable in adfGraphicsMapFunctionality.GraphicsDataSet.Tables) 39 41

{if (dataTable.TableName == \) {

42 featureGraphicsLayer = (ESRI.ArcGIS.ADF.Web.Display.Graphics.FeatureGraphicsLayer)dataTable; 43 break; }}

47 //如果名为Feature Graphics的DataTable为null,就新建Feature Graphics DataTable

48 if (featureGraphicsLayer == null) 49

{

50 //新建DataTable Feature Graphics

51 featureGraphicsLayer = new ESRI.ArcGIS.ADF.Web.Display.Graphics.FeatureGraphicsLayer();

52 featureGraphicsLayer.TableName = \cs\;

53 adfGraphicsMapFunctionality.GraphicsDataSet.Tabl

es.Add(featureGraphicsLayer); 55 //添加字段x

56 System.Data.DataColumn xDataColumn =new System.Data.DataColumn(\, System.Type.GetType(\));

57 featureGraphicsLayer.Columns.Add(xDataColumn); 58 //添加字段y

59 System.Data.DataColumn yDataColumn =new System.Data.DataColumn(\, System.Type.GetType(\));

60 featureGraphicsLayer.Columns.Add(yDataColumn); 61 //添加字段CustomDataColumn

62 System.Data.DataColumn customDataColumn =new System.Data.DataColumn(\,System.Type.GetType(\t32\));

63 featureGraphicsLayer.Columns.Add(customDataColumn); //CustomDataColumn的值等于0时的显示样式

ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue zeroUniqueValue =new ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue(0); 67 ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol zeroSymbol =new ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol(); 68 zeroSymbol.Color = System.Drawing.Color.Red; 69 zeroSymbol.Type = ESRI.ArcGIS.ADF.Web.Display.Symbol.MarkerSymbolType.Circle;

70 zeroSymbol.Width = 12;

71 zeroUniqueValue.Symbol = zeroSymbol; 72 zeroUniqueValue.SymbolLabel = \; //CustomDataColumn的值等于1时的显示样式

75 ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue oneUniqueValue =new ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue(1);

76 ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol oneSymbol =new ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol();

77 oneSymbol.Color = System.Drawing.Color.Blue; 78 oneSymbol.Type = ESRI.ArcGIS.ADF.Web.Display.Symbol.MarkerSymbolType.Circle;

79 oneSymbol.Width = 12;

80 oneUniqueValue.Symbol = oneSymbol; 81 oneUniqueValue.SymbolLabel = \;

84 ESRI.ArcGIS.ADF.Web.Display.Renderer.ValueMapRenderer valueMapRenderer =new ESRI.ArcGIS.ADF.Web.Display.Renderer.ValueMapRenderer();

85 valueMapRenderer.ValueColumnName = \; //默认的显示样式

88 valueMapRenderer.DefaultLabel = \;

89 ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol defaultSymbol =new ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol();

90 defaultSymbol.Color = System.Drawing.Color.Black; 91 defaultSymbol.Type = ESRI.ArcGIS.ADF.Web.Display.Symbol.MarkerSymbolType.Cross;

92 defaultSymbol.Width = 12;

93 valueMapRenderer.DefaultSymbol = defaultSymbol; 95 ESRI.ArcGIS.ADF.Web.Display.Renderer.ValueCollection valueCollection =valueMapRenderer.Values; 96 valueCollection.Add(zeroUniqueValue); 97 valueCollection.Add(oneUniqueValue); //Renderer数据显示样式

100 featureGraphicsLayer.Renderer = valueMapRenderer; //刷新Toc1

103Toc adfToc = (Toc)Utility.FindControl(\, adfMap.Page); 104 adfToc.Refresh();//通知客户端更新显示

106 adfMap.CallbackResults.CopyFrom(adfToc.CallbackResults); // 执行客户端脚本

109 CallbackResult enableCheckBoxCallbackResult =new CallbackResult(null, null, \, string.Format(\tElementById('{0}').disabled = false\, \)); 110 //通知客户端更新显示

111 adfMap.CallbackResults.Add(enableCheckBoxCallbackResult); } 115 System.Data.DataRow newDataRow = featureGraphicsLayer.Add(adfPoint);

116 //随机的给CustomDataColumn赋值,随机的出现上面定义的2个显示样式 117 Random randomizer = new Random();

118 int randomValue = randomizer.Next(0, 2); 119 newDataRow[\] = randomValue; //把x,y存到表里

122 newDataRow[\] = string.Format(\, adfPoint.X); newDataRow[\] = string.Format(\, adfPoint.Y); //刷新地图显示

126 if (adfMap.ImageBlendingMode == ImageBlendingMode.WebTier) { adfMap.Refresh(); }

130 else

{ adfMap.RefreshResource(adfGraphicsMapFunctionality.Resource.Name); }}}

(9)在Toolbar2的ToolbarItems中在添加一个DropDownBox然后设置相应的

属性

(10)在GraphicPointTools.cs中新增加FeatureDropDownColor类来实现上面

的DropDownBox的功能,具体代码和说明如下:

public class FeatureDropDownColor : IMapServerDropDownBoxAction 2 4

{

{//获取地图控件

3 void IServerAction.ServerAction(ToolbarItemInfo toolbarItemInfo) 6 ESRI.ArcGIS.ADF.Web.UI.WebControls.Map adfMap =(ESRI.ArcGIS.ADF.Web.UI.WebControls.Map)toolbarItemInfo.BuddyControls[0]; 7 //获取DropDownBoxColor控件

8 DropDownBox adfDropDownBox =(DropDownBox)toolbarItemInfo.Toolbar.ToolbarItems.Find(\); 9 //获取DropDownBoxColor的选择值

10 string selectedColor = adfDropDownBox.SelectedValue; 11 //MapFunctionality

12 ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapFunctionality adfGraphicsMapFunctionality = null;

13 foreach (ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality mapFunctionality in adfMap.GetFunctionalities()) 14

{if (mapFunctionality.Resource.Name == \) 16 { adfGraphicsMapFunctionality =(ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapFunctionality)mapFunctionality; 18 break; }}

21 //当为null的时候调用Utility.ProcessError方法弹出提示框 22 if (adfGraphicsMapFunctionality == null)

23 {adfMap.CallbackResults.CopyFrom(Utility.ProcessError(\));

25 return;}

//FeatureGraphicLayer类似feature layer,能建立属性信息,并能基于属性来符号化。图层只能存储同一图形类型。FeatureGraphicLayer可以支持查询。

29 ESRI.ArcGIS.ADF.Web.Display.Graphics.FeatureGraphicsLayer featureGraphicsLayer = null;

//从adfGraphicsMapFunctionality获取名为Feature Graphics的DataTable 31 foreach (System.Data.DataTable dataTable in adfGraphicsMapFunctionality.GraphicsDataSet.Tables) 32

{ if (dataTable.TableName == \) 34 { featureGraphicsLayer = (ESRI.ArcGIS.ADF.Web.Display.Graphics.FeatureGraphicsLayer)dataTable; 36 break; }}

40 //如果Feature Graphics的DataTable为null,设置DropDownBoxColor为原始值,同时调用Utility.ProcessError方法弹出提示框 41 if (featureGraphicsLayer == null) 42

{//设置DropDownBoxColor为原始值的脚本

44 string jsResetDropDownList = string.Format(\ent.getElementById('{0}{1}{2}').value = 'Red_Blue'\,toolbarItemInfo.Toolbar.ClientID, adfDropDownBox.Name, adfDropDownBox.Type);

45 //执行上面的脚本

46 CallbackResult resetDropDownListCallbackResult =new CallbackResult(null, null, \, jsResetDropDownList); adfMap.CallbackResults.Add(resetDropDownListCallbackResult); 48 //调用Utility.ProcessError方法弹出提示框

49 adfMap.CallbackResults.CopyFrom(Utility.ProcessError(\)); 50 return; } 52

53 //获取当前的Renderer

54 ESRI.ArcGIS.ADF.Web.Display.Renderer.ValueMapRenderer currentValueMapRenderer =(ESRI.ArcGIS.ADF.Web.Display.Renderer.ValueMapRenderer)featureGraphicsLayer.Renderer; 55 //获取当前的ValueCollection

56 ESRI.ArcGIS.ADF.Web.Display.Renderer.ValueCollection currentValueCollection =currentValueMapRenderer.Values; 57

58 ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue currentZeroUniqueValue =(ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue)currentValueCollection[0];

59 ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue currentOneUniqueValue =(ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue)currentValueCollection[1]; 60

61 ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol currentZeroSymbol =(ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol)currentZeroUniqueValue.Symbol;

62 ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol currentOneSymbol =(ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol)currentOneUniqueValue.Symbol; 63

64 //更加不同的颜色设置不同的显示颜色 65 switch (selectedColor) 66

{

67 case \:

68 currentZeroSymbol.Color = System.Drawing.Color.Red; 69 currentOneSymbol.Color = System.Drawing.Color.Blue; 70 break; 71 case \:

72 currentZeroSymbol.Color = System.Drawing.Color.Yellow; 73 currentOneSymbol.Color = System.Drawing.Color.Green; 74 break;

75 case \:

76 currentZeroSymbol.Color = System.Drawing.Color.Orange;

77 currentOneSymbol.Color = System.Drawing.Color.Purple; 78 break; 79 default: 80 break; } //刷新Toc1显示

84 Toc adfToc = (Toc)Utility.FindControl(\, adfMap.Page);

85 adfToc.Refresh();

86 adfMap.CallbackResults.CopyFrom(adfToc.CallbackResults); 87

88 //刷新地图显示

89 if (adfMap.ImageBlendingMode == ImageBlendingMode.WebTier) 90

{ adfMap.Refresh(); }

93 else

{ adfMap.RefreshResource(adfGraphicsMapFunctionality.Resource.Name); }

97 } }

(11)在Toolbar2的ToolbarItems中在添加一个DropDownBox然后设置相应的属性用来实现变换添加点的显示形状的功能,具体如下:

(12)在GraphicPointTools.cs中新增加FeatureDropDownSymbol类来实现上面的DropDownBoxSymbol的功能,具体代码和说明如下:

1public class FeatureDropDownSymbol : IMapServerDropDownBoxAction 2

{ #region IServerAction Members

void IServerAction.ServerAction(ToolbarItemInfo toolbarItemInfo)

6 { ESRI.ArcGIS.ADF.Web.UI.WebControls.Map adfMap = (ESRI.ArcGIS.ADF.Web.UI.WebControls.Map)toolbarItemInfo.BuddyControls[0];

8 DropDownBox adfDropDownBox = (DropDownBox)toolbarItemInfo.Toolbar.ToolbarItems.Find(\);

9 string selectedSymbol = adfDropDownBox.SelectedValue;

11 ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapFunctionality adfGraphicsMapFunctionality = null;

12 foreach (ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality mapFunctionality

13 in adfMap.GetFunctionalities())

14{if (mapFunctionality.Resource.Name == \) 16

{ adfGraphicsMapFunctionality =

18 (ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapFunctionality)mapFunctionality;

19 break; }} if (adfGraphicsMapFunctionality == null) 24

{ adfMap.CallbackResults.CopyFrom

26 (Utility.ProcessError(\));

27 return;}

30 ESRI.ArcGIS.ADF.Web.Display.Graphics.FeatureGraphicsLayer featureGraphicsLayer = null;

foreach (System.Data.DataTable dataTable in adfGraphicsMapFunctionality.GraphicsDataSet.Tables) 33

{if (dataTable.TableName == \)

35 { featureGraphicsLayer = (ESRI.ArcGIS.ADF.Web.Display.Graphics.FeatureGraphicsLayer)dataTable; 37 break; }} if (featureGraphicsLayer == null)

42 { string jsResetDropDownList = string.Format(\lementById('{0}{1}{2}').value = 'Circle'\,

44 toolbarItemInfo.Toolbar.ClientID, adfDropDownBox.Name, adfDropDownBox.Type);

45 CallbackResult resetDropDownListCallbackResult = 46 new CallbackResult(null, null, \, jsResetDropDownList); 47 adfMap.CallbackResults.Add(resetDropDownListCallbackResult); 49 adfMap.CallbackResults.CopyFrom

50 (Utility.ProcessError(\)); 51 return; } ESRI.ArcGIS.ADF.Web.Display.Renderer.ValueMapRenderer currentValueMapRenderer =

55 (ESRI.ArcGIS.ADF.Web.Display.Renderer.ValueMapRenderer)featureGraphicsLayer.Renderer;

56 ESRI.ArcGIS.ADF.Web.Display.Renderer.ValueCollection currentValueCollection =

57 currentValueMapRenderer.Values;

59 ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue currentZeroUniqueValue =

60 (ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue)currentValueCollection[0];

61 ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue currentOneUniqueValue =

62 (ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue)currentValueCollection[1];

ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol zeroSymbol = (ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol)currentZeroUniqueValue.Symbol; ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol oneSymbol = (ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol)currentOneUniqueValue.Symbol; switch (selectedSymbol) 68

{ case \:

zeroSymbol.Type = ESRI.ArcGIS.ADF.Web.Display.Symbol.MarkerSy

mbolType.Circle;

oneSymbol.Type = ESRI.ArcGIS.ADF.Web.Display.Symbol.MarkerSymbolType.Circle; 72 break;

73 case \:

zeroSymbol.Type = ESRI.ArcGIS.ADF.Web.Display.Symbol.MarkerSymbolType.Star; oneSymbol.Type = ESRI.ArcGIS.ADF.Web.Display.Symbol.MarkerSymbolType.Star; 76 break; 77 case \:

78 zeroSymbol.Type = ESRI.ArcGIS.ADF.Web.Display.Symbol.MarkerSymbolType.Square;

79 oneSymbol.Type = ESRI.ArcGIS.ADF.Web.Display.Symbol.MarkerSymbolType.Square; 80 break; 81 default: 82 break; }

85 Toc adfToc = (Toc)Utility.FindControl(\, adfMap.Page); 86 adfToc.Refresh();

87 adfMap.CallbackResults.CopyFrom(adfToc.CallbackResults); if (adfMap.ImageBlendingMode == ImageBlendingMode.WebTier) 90

{ adfMap.Refresh(); }

91 else

{ adfMap.RefreshResource(adfGraphicsMapFunctionality.Resource.Name); } } #endregion}

2)实验结果:

实验四. QueryNewWindow 1) 实验步骤:

(1)用ArcGis Server Manager或者ArcCatalog发布一个自定义名字的Map

Service,并且把这个Service启动起来;

(2)新建名为QueryNewWindow的ASP.NET Web应用程序,即普通的Web应用

程序;

(3)新建名为QueryNewWindow的ASP.NET Web应用程序, 然后在页面上添加

MapResourceManager1、Button1。设置MapResourceManager1的属性。 (4)Button1添加Button1_Click时间,具体代码和说明如下:

1protected void Button1_Click(object sender, EventArgs e) 2

{

3 //获取MapResourceManager1的Resource集合

4 IEnumerator egrc = MapResourceManager1.GetResources().GetEnumerator();

5 //判定初始化MapResourceManager1

6 if (!MapResourceManager1.Initialized) 7

{

8 MapResourceManager1.Initialize(); 9 }

10 while (egrc.MoveNext()) 11

{

12 //随机数

13 Random random = new Random(); 14 int randout = random.Next(0, 1000); 15

16 //获取Resource

17 IGISResource gisresource = (IGISResource)egrc.Current;

18 //判定初始化Resource

19 if (!gisresource.Initialized) 20

{

21 gisresource.Initialize(); 22 }

23 //判定是否支持QueryFunctionality

24 bool supportquery = gisresource.SupportsFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality)); 25 if (supportquery) 26

{

27 //创建QueryFunctionalit

28 ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctio

nality qfunc;

29 qfunc = (ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality)gisresource.CreateFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality), null); 30

31 //查询图层id和名称 32 string[] lids; 33 string[] lnames;

34 qfunc.GetQueryableLayers(null, out lids, out lnames);

35 //要查询目标图层名称

36 string sourcelayername = \; 37 //获取查询目标图层的index 38 int layer_index = 0;

39 for (int i = 0; i < lnames.Length; i++) 4042

{ {

41 if (lnames[i] == sourcelayername) 43 layer_index = i; 44 break; 45 } 46 }

47 //查询过滤

48 ESRI.ArcGIS.ADF.Web.QueryFilter queryfilter = new ESRI.ArcGIS.ADF.Web.QueryFilter(); 49 //要查询字段名称

50 string fieldlist = \; 51 //查询的字段集

52 ESRI.ArcGIS.ADF.StringCollection strcollection = new ESRI.ArcGIS.ADF.StringCollection(fieldlist, ','); 53 queryfilter.SubFields = strcollection; 54 //查询语句

55 queryfilter.WhereClause = \A%'\;

56 //查询结果存入DataTable

57 System.Data.DataTable qdatatable = qfunc.Query(null, lids[layer_index], queryfilter);

58 qdatatable.Columns[0].ColumnName = \E_ALIAS\;

59 //查询结果DataTable存入Session中 60 Session[\ + randout] = qdatatable; 61 } 62

63 string argval = \ + randout;

64 //弹出新页面显示查询结果

65 Response.Write(\aspx\ + argval + \ + randout.ToString() + \dth=400, height=200, status=no, toolbar=no, menubar=no, location=no, resizable=yes, scrollbars=yes'); \); 66 } 67 }

(5)新建TableDialog.aspx页面用来作为弹出页面显示查询结果,在html里面添加一个

1protected void Page_Load(object sender, EventArgs e) 2

{

3 string id = Request.QueryString[\];

4 DataTable dt = (DataTable)Session[\ + id]; 5 if (dt != null) 6

{

7 System.Web.UI.HtmlControls.HtmlForm htmlform = (System.Web.UI.HtmlControls.HtmlForm)Page.FindControl(\); 8 Control controldiv = htmlform.FindControl(\v\); 9

10 GridView gd = new GridView(); 11 gd.DataSource = dt; 12 gd.DataBind(); 13 gd.Visible = true; 14 gd.BorderWidth = 10;

15 controldiv.Controls.Add(gd); 16 } 17 }

2)实验结果:

本文来源:https://www.bwwdw.com/article/516p.html

Top