ArcGIS.Server.9.2.DotNet自带例子分析(三、二)
目的:
1.arcgis server9.2 ADF的AddGraphics-FeatureGraphicLayer。
准备工作:
1.(三、一)的工程,具体见前篇。。
开始:
1.在页面上在新增一个Toolbar2,在ToolbarItems中添加一个Tool然后设置相应的属性,具体如下:
1
<ToolbarItems>
2
<esri:Tool ClientAction="Point" JavaScriptFile="" Name="AddFeature" ServerActionAssembly="AddGraphics" ServerActionClass="AddGraphics.FeatureGraphicTool"Text="Add Feature Point" />
3
</ToolbarItems>

2

3

2.在GraphicPointTools.cs中新增加FeatureGraphicTool类来实现上面的Tool的功能,具体代码和说明如下:
1
public class FeatureGraphicTool : IMapServerToolAction
2
{
3
void IMapServerToolAction.ServerAction(ToolEventArgs toolEventArgs)
4
{
5
//获取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;
9
//屏幕点
10
System.Drawing.Point screenPoint = pointEventArgs.ScreenPoint;
11
12
//屏幕坐标转成地理坐标
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));
14
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, 保存在内存中用显示临时图层
20
if (mapFunctionality.Resource.Name == "ADFGraphicsResource")
21
{
22
adfGraphicsMapFunctionality = (ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapFunctionality)mapFunctionality;
23
break;
24
}
25
}
26
27
//当为null的时候调用Utility.ProcessError方法弹出提示框
28
if (adfGraphicsMapFunctionality == null)
29
{
30
//把Utility.ProcessError处理的CallbackResultCollection结果赋给Map控件
31
adfMap.CallbackResults.CopyFrom(Utility.ProcessError("ADF graphics functionality not found"));
32
return;
33
}
34
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
{
40
if (dataTable.TableName == "Feature Graphics")
41
{
42
featureGraphicsLayer = (ESRI.ArcGIS.ADF.Web.Display.Graphics.FeatureGraphicsLayer)dataTable;
43
break;
44
}
45
}
46
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 = "Feature Graphics";
53
adfGraphicsMapFunctionality.GraphicsDataSet.Tables.Add(featureGraphicsLayer);
54
55
//添加字段x
56
System.Data.DataColumn xDataColumn =new System.Data.DataColumn("X", System.Type.GetType("System.Double"));
57
featureGraphicsLayer.Columns.Add(xDataColumn);
58
//添加字段y
59
System.Data.DataColumn yDataColumn =new System.Data.DataColumn("Y", System.Type.GetType("System.Double"));
60
featureGraphicsLayer.Columns.Add(yDataColumn);
61
//添加字段CustomDataColumn
62
System.Data.DataColumn customDataColumn =new System.Data.DataColumn("CustomDataColumn",System.Type.GetType("System.Int32"));
63
featureGraphicsLayer.Columns.Add(customDataColumn);
64
65
//CustomDataColumn的值等于0时的显示样式
66
ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue<int> zeroUniqueValue =new ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue<int>(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 = "0";
73
74
//CustomDataColumn的值等于1时的显示样式
75
ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue<int> oneUniqueValue =new ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue<int>(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 = "1";
82
83
84
ESRI.ArcGIS.ADF.Web.Display.Renderer.ValueMapRenderer<int> valueMapRenderer =new ESRI.ArcGIS.ADF.Web.Display.Renderer.ValueMapRenderer<int>();
85
valueMapRenderer.ValueColumnName = "CustomDataColumn";
86
87
//默认的显示样式
88
valueMapRenderer.DefaultLabel = "Default Value";
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;
94
95
ESRI.ArcGIS.ADF.Web.Display.Renderer.ValueCollection<int> valueCollection =valueMapRenderer.Values;
96
valueCollection.Add(zeroUniqueValue);
97
valueCollection.Add(oneUniqueValue);
98
99
//Renderer数据显示样式
100
featureGraphicsLayer.Renderer = valueMapRenderer;
101
102
//刷新Toc1
103
Toc adfToc = (Toc)Utility.FindControl("Toc1", adfMap.Page);
104
adfToc.Refresh();
105
//通知客户端更新显示
106
adfMap.CallbackResults.CopyFrom(adfToc.CallbackResults);
107
108
// 执行客户端脚本
109
CallbackResult enableCheckBoxCallbackResult =new CallbackResult(null, null, "javascript", string.Format("document.getElementById('{0}').disabled = false", "maptipsCheckBox"));
110
//通知客户端更新显示
111
adfMap.CallbackResults.Add(enableCheckBoxCallbackResult);
112
113
}
114
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["CustomDataColumn"] = randomValue;
120
121
//把x,y存到表里
122
newDataRow["X"] = string.Format("{0:#.##}", adfPoint.X);
123
newDataRow["Y"] = string.Format("{0:#.##}", adfPoint.Y);
124
125
//刷新地图显示
126
if (adfMap.ImageBlendingMode == ImageBlendingMode.WebTier)
127
{
128
adfMap.Refresh();
129
}
130
else
131
{
132
adfMap.RefreshResource(adfGraphicsMapFunctionality.Resource.Name);
133
}
134
135
}
136
}
3.在Toolbar2的ToolbarItems中在添加一个DropDownBox然后设置相应的属性,具体如下:

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

1
<esri:DropDownBox ClientAction="" DropDownListWidth="100" Items="<Items><ListItem Text="Red_Blue" Value="Red_Blue" Selected="True" /><ListItem Text="Yellow_Green" Value="Yellow_Green" Selected="False" /><ListItem Text="Orange_Purple" Value="Orange_Purple" Selected="False" /></Items>"
2
JavaScriptFile="" Label="Colors:" LabelWidth="100" Name="DropDownBoxColor" SelectedIndex="0"
3
ServerActionAssembly="AddGraphics" ServerActionClass="AddGraphics.FeatureDropDownColor" />

2

3

4.在GraphicPointTools.cs中新增加FeatureDropDownColor类来实现上面的DropDownBox的功能,具体代码和说明如下:
1
public class FeatureDropDownColor : IMapServerDropDownBoxAction
2
{
3
void IServerAction.ServerAction(ToolbarItemInfo toolbarItemInfo)
4
{
5
//获取地图控件
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("DropDownBoxColor");
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
{
15
if (mapFunctionality.Resource.Name == "ADFGraphicsResource")
16
{
17
adfGraphicsMapFunctionality =(ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapFunctionality)mapFunctionality;
18
break;
19
}
20
}
21
//当为null的时候调用Utility.ProcessError方法弹出提示框
22
if (adfGraphicsMapFunctionality == null)
23
{
24
adfMap.CallbackResults.CopyFrom(Utility.ProcessError("ADF graphics functionality not found"));
25
return;
26
}
27
28
//FeatureGraphicLayer类似feature layer,能建立属性信息,并能基于属性来符号化。图层只能存储同一图形类型。FeatureGraphicLayer可以支持查询。
29
ESRI.ArcGIS.ADF.Web.Display.Graphics.FeatureGraphicsLayer featureGraphicsLayer = null;
30
//从adfGraphicsMapFunctionality获取名为Feature Graphics的DataTable
31
foreach (System.Data.DataTable dataTable in adfGraphicsMapFunctionality.GraphicsDataSet.Tables)
32
{
33
if (dataTable.TableName == "Feature Graphics")
34
{
35
featureGraphicsLayer = (ESRI.ArcGIS.ADF.Web.Display.Graphics.FeatureGraphicsLayer)dataTable;
36
break;
37
}
38
}
39
40
//如果Feature Graphics的DataTable为null,设置DropDownBoxColor为原始值,同时调用Utility.ProcessError方法弹出提示框
41
if (featureGraphicsLayer == null)
42
{
43
//设置DropDownBoxColor为原始值的脚本
44
string jsResetDropDownList = string.Format("document.getElementById('{0}{1}{2}').value = 'Red_Blue'",toolbarItemInfo.Toolbar.ClientID, adfDropDownBox.Name, adfDropDownBox.Type);
45
//执行上面的脚本
46
CallbackResult resetDropDownListCallbackResult =new CallbackResult(null, null, "javascript", jsResetDropDownList);
47
adfMap.CallbackResults.Add(resetDropDownListCallbackResult);
48
//调用Utility.ProcessError方法弹出提示框
49
adfMap.CallbackResults.CopyFrom(Utility.ProcessError("ADF feature graphics layer not found"));
50
return;
51
}
52
53
//获取当前的Renderer
54
ESRI.ArcGIS.ADF.Web.Display.Renderer.ValueMapRenderer<int> currentValueMapRenderer =(ESRI.ArcGIS.ADF.Web.Display.Renderer.ValueMapRenderer<int>)featureGraphicsLayer.Renderer;
55
//获取当前的ValueCollection
56
ESRI.ArcGIS.ADF.Web.Display.Renderer.ValueCollection<int> currentValueCollection =currentValueMapRenderer.Values;
57
58
ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue<int> currentZeroUniqueValue =(ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue<int>)currentValueCollection[0];
59
ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue<int> currentOneUniqueValue =(ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue<int>)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 "Red_Blue":
68
currentZeroSymbol.Color = System.Drawing.Color.Red;
69
currentOneSymbol.Color = System.Drawing.Color.Blue;
70
break;
71
case "Yellow_Green":
72
currentZeroSymbol.Color = System.Drawing.Color.Yellow;
73
currentOneSymbol.Color = System.Drawing.Color.Green;
74
break;
75
case "Orange_Purple":
76
currentZeroSymbol.Color = System.Drawing.Color.Orange;
77
currentOneSymbol.Color = System.Drawing.Color.Purple;
78
break;
79
default:
80
break;
81
}
82
83
//刷新Toc1显示
84
Toc adfToc = (Toc)Utility.FindControl("Toc1", adfMap.Page);
85
adfToc.Refresh();
86
adfMap.CallbackResults.CopyFrom(adfToc.CallbackResults);
87
88
//刷新地图显示
89
if (adfMap.ImageBlendingMode == ImageBlendingMode.WebTier)
90
{
91
adfMap.Refresh();
92
}
93
else
94
{
95
adfMap.RefreshResource(adfGraphicsMapFunctionality.Resource.Name);
96
}
97
}
98
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

5.这样就完成了添加上的点的颜色变更的功能,然后在Toolbar2的ToolbarItems中在添加一个DropDownBox然后设置相应的属性用来实现变换添加点的显示形状的功能,具体如下:
1
<esri:DropDownBox ClientAction="" DropDownListWidth="100" Items="<Items><ListItem Text="Circle" Value="Circle" Selected="True" /><ListItem Text="Square" Value="Square" Selected="False" /><ListItem Text="Star" Value="Star" Selected="False" /></Items>"
2
JavaScriptFile="" Label="Type:" LabelWidth="100" Name="DropDownBoxSymbol" SelectedIndex="0"
3
ServerActionAssembly="AddGraphics" ServerActionClass="AddGraphics.FeatureDropDownSymbol" />
6.在GraphicPointTools.cs中新增加FeatureDropDownSymbol类来实现上面的DropDownBoxSymbol的功能,具体代码和说明如下:
2

3

1
public class FeatureDropDownSymbol : IMapServerDropDownBoxAction
2
{
3
IServerAction Members
96
97
}
7.这样就完成了添加点的形状变换的功能了。本例子到这里也分析结束了,关于其中的MapTips 的功能好像有问题了这里就暂时不讲了。
2

3

96

97

