博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ArcEngine编辑功能的实现(二)
阅读量:5989 次
发布时间:2019-06-20

本文共 16897 字,大约阅读时间需要 56 分钟。

这里给出采用混合模式开发编辑工具条的完整代码,但是没有给出界面,相信熟悉ArcGIS操作的朋友一定可以设计出类似的界面。功能还有不少不完善的地方,希望感兴趣的朋友可以帮忙改进!

View Code
1 using System;   2 using System.Collections.Generic;   3 using System.ComponentModel;   4 using System.Data;   5 using System.Drawing;   6 using System.Linq;   7 using System.Text;   8 using System.Windows.Forms;   9 using ESRI.ArcGIS.Controls;  10 using ESRI.ArcGIS.Carto;  11 using ESRI.ArcGIS.esriSystem;  12 using ESRI.ArcGIS.Geodatabase;  13 using System.Collections;  14 using ESRI.ArcGIS.SystemUI;  15 using MapDataViewAndControlLib;  16  17 namespace GEditor  18 {
19 public partial class EditFrm : Form 20 {
21 public EditFrm() 22 {
23 InitializeComponent(); 24 } 25 private IEngineEditor m_EngineEditor = new EngineEditorClass(); 26 private IEngineEditEvents_Event m_EngineEditEvent_Event; 27 private void Form1_Load(object sender, EventArgs e) 28 {
29 axTOCControl1.SetBuddyControl(axMapControl1); 30 axToolbarControl1.SetBuddyControl(axMapControl1); 31    32 //添加与数据相关的工具条,包括打开文档、保存文档、添加数据、放大、缩小、漫游、全显、上一视图 33 axToolbarControl1.AddItem("esriControls.ControlsOpenDocCommand", 0, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly); 34 axToolbarControl1.AddItem("esriControls.ControlsSaveAsDocCommand", 0, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly); 35 axToolbarControl1.AddItem("esriControls.ControlsAddDataCommand", 0, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly); 36 axToolbarControl1.AddItem("esriControls.ControlsMapZoomInTool", 0, -1, true, 0, esriCommandStyles.esriCommandStyleIconOnly); 37 axToolbarControl1.AddItem("esriControls.ControlsMapZoomOutTool", 0, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly); 38 axToolbarControl1.AddItem("esriControls.ControlsMapPanTool", 0, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly); 39 axToolbarControl1.AddItem("esriControls.ControlsMapFullExtentCommand", 0, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly); 40 axToolbarControl1.AddItem("esriControls.ControlsMapZoomToLastExtentBackCommand", 0, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly); 41 axToolbarControl1.AddItem("esriControls.ControlsMapZoomToLastExtentForwardCommand", 0, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly); 42 43 m_Map = axMapControl1.Map; 44 InitializeEditorState(); 45 } 46 private void InitializeEditorState() 47 {
48 tspCurrentTask.Items.Add("新建要素"); 49 tspCurrentTask.Items.Add("修改要素"); 50 51 tspCopy.Enabled = false; 52 tspDelete.Enabled = false; 53 tspPaste.Enabled = false; 54 tspRedo.Enabled = false; 55 tspUndo.Enabled = false; 56 tspSketch.Enabled = false; 57 tspEdit.Enabled = false; 58 tspSaveEdit.Enabled = false; 59 tspStopEdit.Enabled = false; 60 tspSketch.Enabled = false; 61 tspEdit.Enabled = false; 62 tspCurrentLayer.Enabled = false; 63 tspCurrentTask.Enabled = false; 64 65 } 66 IMap m_Map = null; 67 private void tspStartEdit_Click(object sender, EventArgs e) 68 {
69 #region 开始编辑状态 70 if (m_Map.LayerCount==0) 71 {
72 MessageBox.Show("没有图层!"); 73 return; 74 } 75 for (int i = 0; i < m_Map.LayerCount ; i++) 76 {
77 ILayer pLayer = m_Map.get_Layer(i); 78 if (pLayer is IFeatureLayer) 79 {
80 tspCurrentLayer.Items.Add(pLayer.Name); 81 82 } 83 } 84 85 tspStartEdit.Enabled = false; 86 tspSaveEdit.Enabled = true; 87 tspStopEdit.Enabled = true; 88 tspSketch.Enabled = false; 89 tspEdit.Enabled = false; 90 tspCurrentLayer.Enabled = true; 91 tspCurrentTask.Enabled = true; 92 tspCurrentLayer.SelectedIndex = 0; 93 tspCurrentTask.SelectedIndex = 0; 94 if (m_EngineEditor.EditState == esriEngineEditState.esriEngineStateNotEditing) 95 {
96 //Start editing the workspace of the first feature layer found. 97 //设置编辑的WorkSpace和编辑对象图层 98 ILayer currentLayer = m_Map.get_Layer(0); 99 if (currentLayer is IFeatureLayer) 100 {
101 IFeatureLayer featureLayer = currentLayer as IFeatureLayer; 102 IDataset dataset = featureLayer.FeatureClass as IDataset; 103 IWorkspace workspace = dataset.Workspace; 104 m_EngineEditor.StartEditing(workspace, m_Map); 105 m_EngineEditEvent_Event = m_EngineEditor as IEngineEditEvents_Event; 106 m_EngineEditEvent_Event.OnCurrentTaskChanged += new IEngineEditEvents_OnCurrentTaskChangedEventHandler(m_EngineEditEvent_Event_OnCurrentTaskChanged); 107 m_EngineEditEvent_Event.OnSelectionChanged += new IEngineEditEvents_OnSelectionChangedEventHandler(m_EngineEditEvent_Event_OnSelectionChanged); 108 m_EngineEditEvent_Event.OnSketchModified += new IEngineEditEvents_OnSketchModifiedEventHandler(m_EngineEditEvent_Event_OnSketchModified); 109 } 110 111 } 112 113 #endregion 114 } 115 private void tspSaveEdit_Click(object sender, EventArgs e) 116 {
117 pCmd = new ESRI.ArcGIS.Controls.ControlsEditingSaveCommandClass(); 118 pCmd.OnCreate(axMapControl1.Object); 119 axMapControl1.CurrentTool = pCmd as ITool; 120 pCmd.OnClick(); 121 } 122 private void tspStopEdit_Click(object sender, EventArgs e) 123 {
124 if (m_EngineEditor.HasEdits() == false) 125 m_EngineEditor.StopEditing(false); 126 else 127 {
128 if (MessageBox.Show("保存编辑?", "保存选项", MessageBoxButtons.YesNo) 129 == DialogResult.Yes) 130 {
131 m_EngineEditor.StopEditing(true); 132 133 } 134 else 135 {
136 m_EngineEditor.StopEditing(false); 137 138 } 139 } 140 tspStartEdit.Enabled = true; 141 tspCopy.Enabled = false; 142 tspDelete.Enabled = false; 143 tspPaste.Enabled = false; 144 tspRedo.Enabled = false; 145 tspUndo.Enabled = false; 146 tspSketch.Enabled = false; 147 tspEdit.Enabled = false; 148 tspSaveEdit.Enabled = false; 149 tspStopEdit.Enabled = false; 150 tspSketch.Enabled = false; 151 tspEdit.Enabled = false; 152 tspCurrentLayer.SelectedIndex = -1; 153 tspCurrentTask.SelectedIndex = -1; 154 tspCurrentLayer.Enabled = false; 155 tspCurrentTask.Enabled = false; 156 157 } 158 private void tspEdit_Click(object sender, EventArgs e) 159 {
160 pCmd = new ControlsEditingEditToolClass(); 161 pCmd.OnCreate(axMapControl1.Object); 162 axMapControl1.CurrentTool = pCmd as ITool; 163 pCmd.OnClick(); 164 165 166 } 167 168 void m_EngineEditEvent_Event_OnSketchModified() 169 {
170 171 IEngineEditProperties ep = new EngineEditorClass(); 172 ILayer m_pCurrentLayer = ep.TargetLayer; 173 if (m_pCurrentLayer == null) return; 174 IFeatureLayer pFeatureLayer = (IFeatureLayer)m_pCurrentLayer; 175 IDataset pDataset = (IDataset)pFeatureLayer.FeatureClass; 176 if (pDataset == null) return; 177 pWorkspaceEdit = (IWorkspaceEdit)pDataset.Workspace; 178 bool bHasUndos = false; 179 pWorkspaceEdit.HasUndos(ref bHasUndos); 180 if (bHasUndos) 181 tspUndo.Enabled = true; 182 else 183 tspUndo.Enabled = false; 184 185 bool bHasRedos = false; 186 pWorkspaceEdit.HasRedos(ref bHasRedos); 187 if (bHasRedos) 188 tspRedo.Enabled = true; 189 else 190 tspRedo.Enabled = false; 191 } 192 193 void m_EngineEditEvent_Event_OnSelectionChanged() 194 {
195 if (m_EngineEditor.SelectionCount==0) 196 {
197 tspCopy.Enabled = false; 198 tspDelete.Enabled = false; 199 tspPaste.Enabled = false; 200 if (m_EngineEditor.CurrentTask.Name == "Modify Feature") 201 tspSketch.Enabled = false; 202 } 203 else 204 {
205 tspCopy.Enabled = true; 206 tspDelete.Enabled = true; 207 tspPaste.Enabled = true; 208 if (m_EngineEditor.CurrentTask.Name == "Modify Feature") 209 tspSketch.Enabled = true; 210 else if (m_EngineEditor.CurrentTask.Name == "Create New Feature") 211 tspSketch.Enabled = true; 212 } 213 214 } 215 216 void m_EngineEditEvent_Event_OnCurrentTaskChanged() 217 {
218 if (m_EngineEditor.CurrentTask.Name == "Create New Feature") 219 {
220 tspCurrentTask.SelectedIndex = 0; 221 } 222 else if (m_EngineEditor.CurrentTask.Name == "Modify Feature") 223 {
224 tspCurrentTask.SelectedIndex = 1; 225 } 226 227 MessageBox.Show(m_EngineEditor.CurrentTask.Name+m_EngineEditor.TaskCount.ToString()); 228 } 229 230 231 private void tspSketch_Click(object sender, EventArgs e) 232 { 233 pCmd = new ControlsEditingSketchToolClass(); 234 pCmd.OnCreate(axMapControl1.Object); 235 axMapControl1.CurrentTool = pCmd as ITool; 236 pCmd.OnClick(); 237 } 238 private void tspRedo_Click(object sender, EventArgs e) 239 {
240 MapRedoEdit(m_Map); 241 bool bHasUndos = false; 242 pWorkspaceEdit.HasUndos(ref bHasUndos); 243 if (bHasUndos) 244 tspUndo.Enabled = true; 245 else 246 tspUndo.Enabled = false; 247 248 } 249 private void tspUndo_Click(object sender, EventArgs e) 250 {
251 MapUndoEdit(m_Map); 252 bool bHasRedos = false; 253 pWorkspaceEdit.HasRedos(ref bHasRedos); 254 if (bHasRedos) 255 tspRedo.Enabled = true; 256 else 257 tspRedo.Enabled = false; 258 259 } 260 private void tspCurrentTask_SelectedIndexChanged(object sender, EventArgs e) 261 {
262 switch (tspCurrentTask.Text) 263 {
264 case "新建要素": 265 SetCurrentTask(ref m_EngineEditor, "新建要素"); 266 tspSketch.Enabled = true; 267 tspEdit.Enabled = true; 268 269 break; 270 case "修改要素": 271 SetCurrentTask(ref m_EngineEditor, "修改要素"); 272 if (m_EngineEditor.SelectionCount==0) 273 {
274 tspSketch.Enabled = false; 275 tspEdit.Enabled = true; 276 } 277 else 278 {
279 tspSketch.Enabled = true; 280 tspEdit.Enabled = true; 281 } 282 283 break; 284 285 } 286 } 287 private void tspCurrentLayer_SelectedIndexChanged(object sender, EventArgs e) 288 {
289 if (tspCurrentLayer.SelectedIndex!=-1) 290 {
291 IFeatureLayer pCurrentLyr = m_Map.get_Layer(tspCurrentLayer.SelectedIndex) as IFeatureLayer; 292 ((IEngineEditLayers)m_EngineEditor).SetTargetLayer(pCurrentLyr, 0); 293 } 294 295 } 296 /// 297 /// 设置编辑的任务类型 298 /// 299 /// 300 /// 自己命名的任务名称 301 public static void SetCurrentTask(ref IEngineEditor pEngineEditor, string taskName) 302 {
303 304 IEngineEditTask edittask; 305 if (pEngineEditor.EditState == esriEngineEditState.esriEngineStateEditing) 306 {
307 switch (taskName) 308 {
309 case "新建要素": 310 edittask = pEngineEditor.GetTaskByUniqueName("ControlToolsEditing_CreateNewFeatureTask"); 311 if (edittask != null) 312 {
313 pEngineEditor.CurrentTask = edittask; 314 } 315 break; 316 case "修改图形": 317 edittask = pEngineEditor.GetTaskByUniqueName("ReshapePolylineEditTask_Reshape Polyline_CSharp"); 318 if (edittask != null) 319 {
320 pEngineEditor.CurrentTask = edittask; 321 } 322 break; 323 case "修改要素": 324 edittask = pEngineEditor.GetTaskByUniqueName("ControlToolsEditing_ModifyFeatureTask"); 325 if (edittask != null) 326 {
327 pEngineEditor.CurrentTask = edittask; 328 } 329 break; 330 331 } 332 } 333 } 334 /// 335 /// 撒消编辑 336 /// 337 /// IMap 地图对象 338 public void MapUndoEdit(IMap m_pMap) 339 {
340 bool bHasUndos = false; 341 pWorkspaceEdit.HasUndos(ref bHasUndos); 342 if (bHasUndos) 343 pWorkspaceEdit.UndoEditOperation(); 344 IActiveView pActiveView = (IActiveView)m_pMap; 345 pActiveView.Refresh(); 346 347 } 348 IWorkspaceEdit pWorkspaceEdit = null; 349 /// 350 /// 重做 351 /// 352 /// IMap 地图对象 353 public void MapRedoEdit(IMap m_pMap) 354 {
355 bool bHasRedos = false; 356 pWorkspaceEdit.HasRedos(ref bHasRedos); 357 if (bHasRedos) 358 pWorkspaceEdit.RedoEditOperation(); 359 IActiveView pActiveView = (IActiveView)m_pMap; 360 pActiveView.Refresh(); 361 } 362 ICommand pCmd = null; 363 private void tspDelete_Click(object sender, EventArgs e) 364 {
365 pCmd = new ESRI.ArcGIS.Controls.ControlsEditingClearCommandClass(); 366 pCmd.OnCreate(axMapControl1.Object); 367 axMapControl1.CurrentTool = pCmd as ITool; 368 pCmd.OnClick(); 369 370 } 371 372 private void tspCopy_Click(object sender, EventArgs e) 373 {
374 pCmd = new ControlsEditingCopyCommandClass(); 375 pCmd.OnCreate(axMapControl1.Object); 376 axMapControl1.CurrentTool = pCmd as ITool; 377 pCmd.OnClick(); 378 379 } 380 381 private void tspPaste_Click(object sender, EventArgs e) 382 {
383 pCmd = new ControlsEditingPasteCommandClass(); 384 pCmd.OnCreate(axMapControl1.Object); 385 axMapControl1.CurrentTool = pCmd as ITool; 386 pCmd.OnClick(); 387 } 388 389 private void tspEditAttribute_Click(object sender, EventArgs e) 390 {
391 pCmd = new ControlsEditingAttributeCommandClass(); 392 pCmd.OnCreate(axMapControl1.Object); 393 axMapControl1.CurrentTool = pCmd as ITool; 394 pCmd.OnClick(); 395 } 396 397 } 398 }

声明:该程序是本人利用周末时间开发的程序,大家可以用作学习之用。

感谢 博主,文中很多代码都借鉴了你的博文!

转载地址:http://iknlx.baihongyu.com/

你可能感兴趣的文章
TIOBE 2 月排行榜:时隔 3 年,Groovy 重进 TOP 20
查看>>
Distributed Systems-一致性协议背景介绍及Paxos算法的推导
查看>>
Python Logging库HTTPHandler的消息格式化的方法
查看>>
[Unity3d]Unity Mathf 数学运算(C#)
查看>>
企业架构 - 组织角色和技能
查看>>
Python基础教程:Day15-图像和办公文档处理
查看>>
Bytom设计结构解读
查看>>
如何选用人脸识别的门禁和考勤
查看>>
java实现FTP多线程断点续传,上传下载
查看>>
突破瓶颈,对比学习:Eclipse开发环境与VS开发环境的调试对比
查看>>
同步与异步&阻塞与非阻塞-各种解释
查看>>
Android中如何查看内存(上)
查看>>
Jersey2.x框架搭建简单的Restful API
查看>>
Hadoop的实现原理及基本使用方法
查看>>
Qt4.8.6编译mysql驱动-深入了解
查看>>
Oracle中nchar,char,varchar 与nvarchar区别
查看>>
让应用程序单例方式运行
查看>>
js删除数组里的某个元素
查看>>
XP/win7下maven安装详解
查看>>
【MySql】2.mysql约束
查看>>