ArcGIS.Server.9.2.DotNet自带例子分析(六、二)
目的:
1.arcgis server9.2 ADF实现Buffer Select功能。
准备工作:
1.(六、一)的工程,具体见前篇。
开始:
1.在Toolbar1中新建一个Tool,ClientAction属性为"Point" ;Name属性为"BufferSelect" ;ServerActionAssembly属性为SelectTool;ServerActionClass属性为SelectTool.BufferTool;Text属性为"Buffer Point" ;ToolTip属性为"Buffer Point" 。
2.新建BufferTool.cs文件用来实现BufferSelect Tool的功能,BufferSelect实现IMapServerToolAction接口,具体代码和说明如下:
1
void IMapServerToolAction.ServerAction(ToolEventArgs args)
2
{
3
//获取Map控件
4
ESRI.ArcGIS.ADF.Web.UI.WebControls.Map mapctrl = (ESRI.ArcGIS.ADF.Web.UI.WebControls.Map)args.Control;
5
//点参数
6
PointEventArgs pointargs = (PointEventArgs)args;
7
//像素点
8
System.Drawing.Point screenpoint = pointargs.ScreenPoint;
9
//像素坐标转换成地理坐标
10
ESRI.ArcGIS.ADF.Web.Geometry.Point mappoint = ESRI.ArcGIS.ADF.Web.Geometry.Point.ToMapPoint(screenpoint.X, screenpoint.Y, mapctrl.GetTransformationParams(ESRI.ArcGIS.ADF.Web.Geometry.TransformationDirection.ToMap));
11
//从Session["BufferDistance"]中获取冗余值
12
string strbd = (string)mapctrl.Page.Session["BufferDistance"];
13
float bufferdistance;
14
//转成float型
15
if (!Single.TryParse(strbd, out bufferdistance))
16
{
17
bufferdistance = 0.0F;
18
}
19
20
//相互连接的直线或曲线
21
System.Drawing.Drawing2D.GraphicsPath gpath = new System.Drawing.Drawing2D.GraphicsPath();
22
//绘制椭圆
23
gpath.AddEllipse((float)mappoint.X - (bufferdistance / 2), (float)mappoint.Y - (bufferdistance / 2), bufferdistance, bufferdistance);
24
//Flatten的参数
25
System.Drawing.Drawing2D.Matrix translateMatrix = new System.Drawing.Drawing2D.Matrix();
26
translateMatrix.Translate(0, 0);
27
28
//误差值,Flatten的参数
29
float flattening = bufferdistance / 1000;
30
//将gpath曲线转换成相连接的线段序列
31
gpath.Flatten(translateMatrix, flattening);
32
33
//点集合
34
ESRI.ArcGIS.ADF.Web.Geometry.PointCollection pc = new ESRI.ArcGIS.ADF.Web.Geometry.PointCollection();
35
foreach (System.Drawing.PointF dpnt in gpath.PathPoints)
36
{
37
pc.Add(new ESRI.ArcGIS.ADF.Web.Geometry.Point(dpnt.X, dpnt.Y));
38
}
39
40
//环形
41
ESRI.ArcGIS.ADF.Web.Geometry.Ring ring = new ESRI.ArcGIS.ADF.Web.Geometry.Ring();
42
ring.Points = pc;
43
ESRI.ArcGIS.ADF.Web.Geometry.RingCollection rings = new ESRI.ArcGIS.ADF.Web.Geometry.RingCollection();
44
rings.Add(ring);
45
//多边形
46
ESRI.ArcGIS.ADF.Web.Geometry.Polygon mappoly = new ESRI.ArcGIS.ADF.Web.Geometry.Polygon();
47
mappoly.Rings = rings;
48
49
50
IEnumerable gfc = mapctrl.GetFunctionalities();
51
ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource gResource = null;
52
foreach (IGISFunctionality gfunc in gfc)
53
{
54
if (gfunc.Resource.Name == "Buffer")
55
{
56
//获取Buffer
57
gResource = (ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource)gfunc.Resource;
58
}
59
}
60
if (gResource == null)
61
{
62
throw new Exception("Buffer Graphics layer not in MapResourceManager");
63
}
64
65
ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer glayer = null;
66
//查找ElementGraphicsLayer在Buffer中
67
foreach (System.Data.DataTable dt in gResource.Graphics.Tables)
68
{
69
if (dt is ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer)
70
{
71
glayer = (ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer)dt;
72
break;
73
}
74
75
}
76
//如果Buffer中没有ElementGraphicsLayer就新增加一个ElementGraphicsLayer
77
if (glayer == null)
78
{
79
glayer = new ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer();
80
gResource.Graphics.Tables.Add(glayer);
81
}
82
//清除ElementGraphicsLayer中的内容
83
glayer.Clear();
84
85
ESRI.ArcGIS.ADF.Web.Geometry.Geometry geom = (ESRI.ArcGIS.ADF.Web.Geometry.Geometry)mappoly;
86
//设置点显示
87
ESRI.ArcGIS.ADF.Web.Display.Graphics.GraphicElement ge = new ESRI.ArcGIS.ADF.Web.Display.Graphics.GraphicElement(geom, System.Drawing.Color.Green);
88
//设置透明度
89
ge.Symbol.Transparency = 70.0;
90
//添加到Buffer中进行显示
91
glayer.Add(ge);
92
//目标图层名称
93
string targetlayername = (string)mapctrl.Page.Session["TargetLayer"];
94
//Data Layers Resource index为2
95
int resource_index = 2;
96
int layer_index = 0;
97
//获取Data Layers的MapFunctionality
98
ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality mf = (ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality)mapctrl.GetFunctionality(resource_index);
99
ESRI.ArcGIS.ADF.Web.DataSources.IGISResource gisresource = mf.Resource;
100
//是否支持QueryFunctionality
101
bool supported = gisresource.SupportsFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality));
102
if (supported)
103
{
104
//创建QueryFunctionality
105
ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality qfunc = (ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality)gisresource.CreateFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality), null);
106
string[] lids;
107
string[] lnames;
108
//查询图层的id和名称
109
qfunc.GetQueryableLayers(null, out lids, out lnames);
110
111
//获取目标图层的index
112
for (int i = 0; i < lnames.Length; i++)
113
{
114
if (lnames[i] == targetlayername)
115
{
116
layer_index = i;
117
break;
118
}
119
}
120
121
//空间过滤
122
ESRI.ArcGIS.ADF.Web.SpatialFilter spatialfilter = new ESRI.ArcGIS.ADF.Web.SpatialFilter();
123
//是否返回地理元素
124
spatialfilter.ReturnADFGeometries = true;
125
//返回最大记录数
126
spatialfilter.MaxRecords = 1000;
127
spatialfilter.Geometry = mappoly;
128
//查询目标图层并且把结果存入DataTable
129
System.Data.DataTable datatable = qfunc.Query(null, lids[layer_index], spatialfilter);
130
131
ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource selresource = null;
132
//获取Selection
133
foreach (IGISFunctionality gfunc in gfc)
134
{
135
if (gfunc.Resource.Name == "Selection")
136
{
137
selresource = (ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource)gfunc.Resource;
138
}
139
}
140
if (selresource == null)
141
{
142
return;
143
}
144
ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer slayer = null;
145
//获取Selection的ElementGraphicsLayer
146
foreach (System.Data.DataTable dt in selresource.Graphics.Tables)
147
{
148
if (dt is ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer)
149
{
150
slayer = (ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer)dt;
151
break;
152
}
153
}
154
//如果Selection的ElementGraphicsLayer为bull就新建ElementGraphicsLayer
155
if (slayer == null)
156
{
157
slayer = new ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer();
158
selresource.Graphics.Tables.Add(slayer);
159
}
160
//清除Selection的ElementGraphicsLayer的内容
161
slayer.Clear();
162
163
DataRowCollection drs = datatable.Rows;
164
165
int shpind = -1;
166
for (int i = 0; i < datatable.Columns.Count; i++)
167
{
168
if (datatable.Columns[i].DataType == typeof(ESRI.ArcGIS.ADF.Web.Geometry.Geometry))
169
{
170
shpind = i;
171
break;
172
}
173
}
174
175
try
176
{
177
foreach (DataRow dr in drs)
178
{
179
ESRI.ArcGIS.ADF.Web.Geometry.Geometry sgeom = (ESRI.ArcGIS.ADF.Web.Geometry.Geometry)dr[shpind];
180
ESRI.ArcGIS.ADF.Web.Display.Graphics.GraphicElement sge = new ESRI.ArcGIS.ADF.Web.Display.Graphics.GraphicElement(sgeom, System.Drawing.Color.Yellow);
181
//设置透明度
182
sge.Symbol.Transparency = 50.0;
183
//添加到Selection的ElementGraphicsLayer进行显示
184
slayer.Add(sge);
185
}
186
}
187
catch
188
{
189
throw new Exception("No geometry available in datatable");
190
}
191
//获取CheckBox1的值
192
string cbxvalue = (string)mapctrl.Page.Session["CheckBox1Value"];
193
//获取GridView1
194
GridView gdview = (GridView)mapctrl.Page.FindControl("GridView1");
195
object[] oa = new object[1];
196
string showtable = "'hidden'";
197
198
if (bool.Parse(cbxvalue))
199
{
200
//把查询结果作为GridView1数据源进行绑定
201
gdview.DataSource = datatable;
202
gdview.DataBind();
203
204
string returnstring = null;
205
206
using (System.IO.StringWriter sw = new System.IO.StringWriter())
207
{
208
HtmlTextWriter htw = new HtmlTextWriter(sw);
209
gdview.RenderControl(htw);
210
htw.Flush();
211
returnstring = sw.ToString();
212
}
213
214
CallbackResult cr = new CallbackResult("div", "griddiv", "innercontent", returnstring);
215
mapctrl.CallbackResults.Add(cr);
216
217
if (datatable.Rows.Count > 1)
218
showtable = "'visible'";
219
220
}
221
string sa = "var griddiv = document.getElementById('griddiv');";
222
sa += "griddiv.style.visibility = " + showtable + ";";
223
oa[0] = sa;
224
CallbackResult cr1 = new CallbackResult(null, null, "javascript", oa);
225
mapctrl.CallbackResults.Add(cr1);
226
227
if (mapctrl.ImageBlendingMode == ImageBlendingMode.WebTier)
228
{ mapctrl.Refresh(); }
229
else if (mapctrl.ImageBlendingMode == ImageBlendingMode.Browser)
230
{
231
mapctrl.RefreshResource(gResource.Name);
232
mapctrl.RefreshResource(selresource.Name);
233
}
234
235
}
236
}
3.在Default.aspx页面上添加TextBox1,用来buffer值的输入,当值输入完成后把这个值存入到Session["BufferDistance"]中,在Page_Load事件中为这个TextBox1添加onkeyup的脚本方法名为ChangeBufferContext()。
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

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

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

4
TextBox1.Attributes.Add("onkeyup", "ChangeBufferContext()");
5
}
4.接下在编写脚本方法ChangeBufferContext,切换到html视图添加这个方法,代码和说明具体如下:
2

3



4

5

1
function ChangeClient()
2
{
3
var message;
4
5
//目标图层选择
6
if (context == 'DDLContext')
7
{
8
//获取选择值
9
var ddl1value = document.getElementById('DropDownList1').value;
10
message = 'ddl';
11
message += ',' + ddl1value;
12
}
13
14
//是否在表格中显示数据
15
if (context == 'CheckBox')
16
{
17
var checkboxvalue = document.getElementById('CheckBox1').checked;
18
19
message = 'checkbox';
20
message += ',' + checkboxvalue;
21
}
22
23
//buffer值
24
if (context == 'BufferTextBox')
25
{
26
var bufboxvalue = document.getElementById('TextBox1').value;
27
28
message = 'bufbox';
29
message += ',' + bufboxvalue;
30
31
}
32
33
34
//回调方法执行服务端是事情
35
<%=sCallBackFunctionInvocation%>
36
}
37
38
//TextBox1的onkeyup事件
39
function ChangeBufferContext()
40
{
41
context = 'BufferTextBox';
42
ChangeClient();
43
}
5.完成客户的js代码后还需要在服务端的RaiseCallbackEvent方法中对请求进行处理,具体代码和说明如下:
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

1
//接受客户端的请求进行处理
2
public void RaiseCallbackEvent(string eventArgs)
3
{
4
if (eventArgs.Contains("ddl"))
5
{
6
ChangeDropDownListServer(eventArgs);
7
}
8
else if (eventArgs.Contains("checkbox"))
9
{
10
ChangeCheckServer(eventArgs);
11
}
12
else if (eventArgs.Contains("bufbox"))
13
{
14
ChangeBufferDistanceServer(eventArgs);
15
}
16
}
17
18
//保存Buffer值到到Session["BufferDistance"]中
19
public void ChangeBufferDistanceServer(string ea)
20
{
21
char[] parser_char = { ',' };
22
string[] messages = ea.Split(parser_char);
23
string bufbox = messages[1];
24
if (bufbox != string.Empty)
25
{
26
Session["BufferDistance"] = bufbox;
27
}
28
}
6.接下来在添加一个button用来实现ClearSelection功能,具体的html代码如下:
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

1
<input type="button" ID="Button1" Style="left: 575px; value="Clear Selection" onclick="ChangeClearSelection()" />
7.还需要编写ChangeClearSelection脚本方法来实现这个功能,具体代码和说明如下:
1
//清除选择
2
function ChangeClearSelection()
3
{
4
context = "ClearSelectionButton";
5
ChangeClientADF();
6
}
7
8
function ChangeClientADF()
9
{
10
if (context == "ClearSelectionButton"){
11
message = "clearselectionbutton";
12
}
13
<%=sADFCallBackFunctionInvocation%>
14
}
8.同样还需要在服务端的RaiseCallbackEvent方法中对请求进行处理,具体代码和说明如下:
2

3

4

5

6

7

8

9

10

11

12

13

14

1
//接受客户端的请求进行处理
2
public void RaiseCallbackEvent(string eventArgs)
3
{
4
if (eventArgs.Contains("ddl"))
5
{
6
ChangeDropDownListServer(eventArgs);
7
}
8
else if (eventArgs.Contains("checkbox"))
9
{
10
ChangeCheckServer(eventArgs);
11
}
12
else if (eventArgs.Contains("bufbox"))
13
{
14
ChangeBufferDistanceServer(eventArgs);
15
}
16
else if (eventArgs.Contains("clearselectionbutton"))
17
{
18
ChangeClearSelection();
19
}
20
}
21
22
//清除
23
public void ChangeClearSelection()
24
{
25
IEnumerable gfc = Map1.GetFunctionalities();
26
ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource gResource = null;
27
foreach (IGISFunctionality gfunc in gfc)
28
{
29
if (gfunc.Resource is ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource)
30
{
31
gResource = (ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource)gfunc.Resource;
32
gResource.Graphics.Clear();
33
}
34
}
35
36
Map1.Refresh();
37
38
object[] oa = new object[1];
39
string showtable = "'hidden'";
40
string sa = "var griddiv = document.getElementById('griddiv');";
41
sa += "griddiv.style.visibility = " + showtable + ";";
42
oa[0] = sa;
43
oa[0] = sa;
44
CallbackResult cr1 = new CallbackResult(null, null, "javascript", oa);
45
Map1.CallbackResults.Add(cr1);
46
47
returnstring = Map1.CallbackResults.ToString();
48
}
49
9.这样就完成了这个例子,可以运行查看效果。
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

