注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

快乐小屋

 
 
 

日志

 
 

基于ArcGIS10.0和Oracle10g的空间数据管理平台十七(C#开发)-空间数据编辑(下1)  

2013-06-14 15:27:06|  分类: Oracle |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

    上一篇介绍了空间数据编辑一部分实现,今天继续完成剩余的部分实现。

1.根据选择编辑任务的不同显示不同形状的鼠标,以便指示相应任务方便编辑操作

  1.  1         /// <summary>  
  2.  2 /// 根据选择编辑任务的不同显示不同形状的鼠标,以便指示相应任务方便编辑操作  
  3.  3 /// </summary>  
  4.  4 /// <param name="sender"></param>  
  5.  5 /// <param name="e"></param>  
  6.  6         private void cboTasks_SelectedIndexChanged(object sender, EventArgs e)  
  7.  7         {  
  8.  8             // Restate   
  9.  9             m_MapControl.MousePointer = esriControlsMousePointer.esriPointerDefault;  
  10. 10             m_bEditingFtr = false;  
  11. 11             m_bSketching = false;  
  12.   
  13. 12             m_bSelecting = false;  
  14. 13             m_bMove = false;  
  15. 14   
  16. 15             // Select an operation and mouse pointer depending on the user choice   
  17. 16             switch (cboTasks.SelectedIndex)  
  18. 17             {  
  19. 18                 case 0:  
  20. 19                     // Do Nothing - the tool has already been reset   
  21. 20                     break;  
  22. 21                 case 1:  
  23. 22                     m_MapControl.MousePointer = esriControlsMousePointer.esriPointerCrosshair;  
  24. 23                     m_bEditingFtr = true;  
  25. 24                     break;  
  26. 25                 case 2:  
  27. 26                     m_MapControl.MousePointer = esriControlsMousePointer.esriPointerPencil;  
  28. 27                     m_bSketching = true;  
  29. 28                     break;  
  30. 29                 case 3:  
  31. 30                     m_MapControl.MousePointer = esriControlsMousePointer.esriPointerCrosshair;  
  32. 31                     m_bSelecting = true;  
  33. 32                     break;  
  34. 33                 case 4:  
  35. 34                     m_MapControl.MousePointer = esriControlsMousePointer.esriPointerHand;  
  36. 35                     m_bMove = true;  
  37. 36                     break;  
  38. 37             }   
  39. 38   
  40. 39         }  

2.选择需要的图层并且在地图编辑控件中显示出来

  1. 1         /// <summary>  
  2.  2 /// 选择需要的图层并且在地图编辑控件中显示出来  
  3.  3 /// </summary>  
  4.  4 /// <param name="sender"></param>  
  5.  5 /// <param name="e"></param>  
  6.  6         private void cboLayers_SelectedIndexChanged(object sender, EventArgs e)  
  7.  7         {  
  8.  8             if (m_pMap == null)  
  9.  9             {  
  10. 10                 return;  
  11. 11             }  
  12. 12   
  13. 13             // Clear any existing selection   
  14. 14             m_pMap.ClearSelection();  
  15. 15             IActiveView ipActiveView;  
  16. 16             ipActiveView = (IActiveView)m_pMap;  
  17. 17             ipActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, nullnull);  
  18. 18   
  19. 19             String strLayerName = cboLayers.SelectedItem.ToString();  
  20. 20             axMapControl1.Map.ClearLayers();  
  21. 21             AddLayerToMapCtl(strLayerName, true);  
  22. 22             m_pCurrentLayer = m_pMap.get_Layer(0);  
  23. 23   
  24. 24             SetControlStates();  
  25. 25         }  

3.测试是否击中地图对象或地图对象上的节点

 
  1. 1         /// <summary>  
  2.  2 /// 测试是否击中地图对象或地图对象上的节点  
  3.  3 /// </summary>  
  4.  4 /// <param name="tolerance">查询容差</param>  
  5.  5 /// <param name="pPoint">点击位置</param>  
  6.  6 /// <param name="pFeature">测试对象</param>  
  7.  7 /// <param name="pHitPoint">查询目标点</param>  
  8.  8 /// <param name="hitDist">目标点与点击点距离</param>  
  9.  9 /// <param name="partIndex">节索引</param>  
  10. 10 /// <param name="vertexIndex">点索引</param>  
  11. 11 /// <param name="vertexHit">是否击中点</param>  
  12. 12 /// <returns>是否击中测试对象</returns>  
  13. 13         private bool TestGeometryHit(double tolerance, IPoint pPoint, IFeature pFeature,   
  14. 14             ref IPoint pHitPoint, ref double hitDist, ref int partIndex, ref int vertexIndex,   
  15. 15             ref int vertexOffset, ref bool vertexHit)  
  16. 16         {  
  17. 17             // Function returns true if a feature's shape is hit and further defines   
  18. 18 // if a vertex lies within the tolorance   
  19. 19             bool bRetVal = false;  
  20. 20             IGeometry pGeom = (IGeometry)pFeature.Shape;  
  21. 21   
  22. 22             IHitTest pHitTest = (IHitTest)pGeom;  
  23. 23             pHitPoint = new ESRI.ArcGIS.Geometry.Point();  
  24. 24             bool bTrue = true;  
  25. 25             // First check if a vertex was hit   
  26. 26 // 检查节点是否被击中  
  27. 27             if (pHitTest.HitTest(pPoint, tolerance, esriGeometryHitPartType.esriGeometryPartVertex,   
  28. 28                 pHitPoint, ref hitDist, ref partIndex, ref vertexIndex, ref bTrue))  
  29. 29             {  
  30. 30                 bRetVal = true;  
  31. 31                 vertexHit = true;  
  32. 32             }  
  33. 33             // Secondly check if a boundary was hit   
  34. 34 // 检边界是否被击中  
  35. 35             else if (pHitTest.HitTest(pPoint, tolerance,  esriGeometryHitPartType.esriGeometryPartBoundary,  
  36. 36                 pHitPoint, ref hitDist, ref partIndex, ref vertexIndex, ref bTrue))  
  37. 37             {  
  38. 38                 bRetVal = true;  
  39. 39                 vertexHit = false;  
  40. 40             }  
  41. 41   
  42. 42             // Calculate offset to vertexIndex for multipatch geometries   
  43. 43             if (partIndex > 0)  
  44. 44             {  
  45. 45                 IGeometryCollection pGeomColn = (IGeometryCollection)pGeom;  
  46. 46                 vertexOffset = 0;  
  47. 47                 for (int i = 0; i < partIndex; i++)  
  48. 48                 {  
  49. 49                     IPointCollection pPointColn = (IPointCollection)pGeomColn.get_Geometry(i);  
  50. 50                     vertexOffset = vertexOffset + pPointColn.PointCount;  
  51. 51                 }  
  52. 52             }  
  53. 53   
  54. 54             return bRetVal;  
  55. 55         }  

4.向图层中更新新的地图对象,并使之处于选中状态

 
  1. 1         /// <summary>  
  2.  2 /// 向图层中更新新的地图对象,并使之处于选中状态  
  3.  3 /// </summary>  
  4.  4 /// <param name="pFeature"></param>  
  5.  5 /// <param name="pGeometry"></param>  
  6.  6         private void UpdateFeature(IFeature pFeature, IGeometry pGeometry)  
  7.  7         {  
  8.  8             // Make sure we are actually editing this layer. If not give a warning.   
  9.  9             IDataset pDataset = (IDataset)pFeature.Class;  
  10. 10             IWorkspaceEdit pWorkspaceEdit = (IWorkspaceEdit)pDataset.Workspace;  
  11. 11             if (!pWorkspaceEdit.IsBeingEdited())  
  12. 12             {  
  13. 13                 System.Windows.Forms.MessageBox.Show("This feature is in a layer not in edit mode. \nEdit cannot be made.Start edit and try again.",  
  14. 14                     "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);  
  15. 15             }  
  16. 16   
  17. 17             // If all tests succeed allow feature edits to be saved   
  18. 18             pWorkspaceEdit.StartEditOperation();  
  19. 19             pFeature.Shape = pGeometry;  
  20. 20             pFeature.Store();  
  21. 21             pWorkspaceEdit.StopEditOperation();  
  22. 22         }  

5.屏幕坐标转换为地图坐标

  1.  1         /// <summary>  
  2.  2 /// 屏幕坐标转换为地图坐标  
  3.  3 /// </summary>  
  4.  4 /// <param name="pActiveView">地图</param>  
  5.  5 /// <param name="pixelUnits">屏幕坐标</param>  
  6.  6 /// <returns>地图坐标</returns>  
  7.  7         private double ConvertPixelsToMapUnits(IActiveView pActiveView, double pixelUnits)  
  8.  8         {  
  9.  9             // Uses the ratio of the size of the map in pixels to map units to do the conversion   
  10. 10             IPoint p1 = pActiveView.ScreenDisplay.DisplayTransformation.VisibleBounds.UpperLeft;  
  11. 11             IPoint p2 = pActiveView.ScreenDisplay.DisplayTransformation.VisibleBounds.UpperRight;  
  12. 12             int x1, x2, y1, y2;  
  13. 13             pActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(p1, out x1, out y1);  
  14. 14             pActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(p2, out x2, out y2);  
  15. 15             double pixelExtent = x2 - x1;  
  16. 16             double realWorldDisplayExtent = pActiveView.ScreenDisplay.DisplayTransformation.VisibleBounds.Width;  
  17. 17             double sizeOfOnePixel = realWorldDisplayExtent / pixelExtent;  
  18. 18             return pixelUnits * sizeOfOnePixel;  
  19. 19         }  

6.处理地图控件上的目标按下事件

 
  1. 1         private void axMapControl1_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)  
  2.  2         {  
  3.  3             //首先判断当前用户选择了何种任务,并去完成相应的任务;如果没有选择任何任务,  
  4.  4 //即cboTasks的选项为没有任务时,该事件处理程序用于放大、缩小地图,鼠标左键  
  5.  5 //用于放大,其他键用于缩小  
  6.  6             m_pMap.ClearSelection();//清除地图中已选的要素  
  7.  7               
  8.  8             if (m_bSketching)  
  9.  9             {  
  10. 10                 //新建要素任务处理  
  11. 11                 SketchMouseDown(e.x, e.y);  
  12. 12             }  
  13. 13             else if (m_bSelecting)  
  14. 14             {  
  15. 15                 //选择要素任务处理  
  16. 16                 SelectMouseDown(e.x, e.y);  
  17. 17             }  
  18. 18             else if (m_bEditingFtr)  
  19. 19             {  
  20. 20                 //编辑要素任务处理  
  21. 21                 EditFeature(e.x, e.y);  
  22. 22             }  
  23. 23             else if (m_bMove)  
  24. 24             {  
  25. 25                 //移动要素  
  26. 26                 MoveFeatureMouseDown(e.x, e.y);  
  27. 27             }  
  28. 28             else  
  29. 29             {  
  30. 30                 // Zoom in/out depending on which button was pressed   
  31. 31                 IActiveView pActiveView = (IActiveView)m_pMap;  
  32. 32                 IEnvelope pEnvelope = pActiveView.Extent;  
  33. 33                 ESRI.ArcGIS.Geometry.Point pnt = new ESRI.ArcGIS.Geometry.Point();  
  34. 34                 IPoint iPnt = pnt;  
  35. 35                 iPnt.X = e.mapX;  
  36. 36                 iPnt.Y = e.mapY;  
  37. 37                 pEnvelope.CenterAt(iPnt);  
  38. 38                 if (e.button == 1) // left button   
  39. 39                 {  
  40. 40                     //放大视图  
  41. 41                     pEnvelope.Expand(0.5, 0.5, true);  
  42. 42                 }  
  43. 43                 else  
  44. 44                 {  
  45. 45                     //缩小视图  
  46. 46                     pEnvelope.Expand(2, 2, true);  
  47. 47                 }  
  48. 48                 pActiveView.Extent = pEnvelope;  
  49. 49                 pActiveView.Refresh();  
  50. 50             }   
  51. 51   
  52. 52         }  

7.处理地图控件上的鼠标移动事件

  1.  1         private void axMapControl1_OnMouseMove(object sender, IMapControlEvents2_OnMouseMoveEvent e)  
  2.  2         {  
  3.  3             if (m_bSketching)  
  4.  4             {  
  5.  5                 //新建要素任务处理  
  6.  6                 SketchMouseMove(e.x, e.y);  
  7.  7             }  
  8.  8             else if (m_bEditingFtr)  
  9.  9             {  
  10. 10                 //编辑要素任务处理  
  11. 11                 FtrEditMouseMove(e.x, e.y);  
  12. 12             }  
  13. 13             else if (m_bMove)  
  14. 14             {  
  15. 15                 //移动要素任务处理  
  16. 16                 MoveFeatureMouseMove(e.x, e.y);  
  17. 17             }  
  18. 18   
  19. 19         }  

8.处理地图控件上的鼠标按下事件

  1.  1         private void axMapControl1_OnMouseUp(object sender, IMapControlEvents2_OnMouseUpEvent e)  
  2.  2         {  
  3.  3             if (m_bEditingFtr)  
  4.  4             {  
  5.  5                 //结束编辑任务  
  6.  6                 EndFtrEdit(e.x, e.y);  
  7.  7             }  
  8.  8             else if (m_bMove)  
  9.  9             {  
  10. 10                 //结束移动要素任务  
  11. 11                 MoveFeatureEnd();  
  12. 12             }  
  13. 13   
  14. 14         }  

9.新建对象方法:当前图层为点图层时,每调用一次就新点一个点对象当前图层为线图层或面图层时,第一次调用开始新建对象,并添加当前点,以后每调用一次,即向新对象中添加一个点,调用NewFeatureEnd方法完成对象创建 。

 
  1. 1         /// <summary>  
  2.  2 /// 新建对象方法  
  3.  3 /// 当前图层为点图层时,每调用一次就新点一个点对象  
  4.  4 /// 当前图层为线图层或面图层时,第一次调用开始新建对象,并添加当前点,  
  5.  5 /// 以后每调用一次,即向新对象中添加一个点,调用NewFeatureEnd方法完成对象创建  
  6.  6 /// 在Map.MouseDown事件中调用本方法  
  7.  7 /// </summary>  
  8.  8 /// <param name="x">鼠标X坐标,屏幕坐标</param>  
  9.  9 /// <param name="y">鼠标Y坐标,屏幕坐标</param>  
  10. 10         private void SketchMouseDown(int x, int y)  
  11. 11         {  
  12. 12             // Starts a new sketch or adds a point to an existing one, of a type   
  13. 13 // determined by the current layer selected in the layers combo.   
  14. 14   
  15. 15 // Can only sketch on GeoFeature layers   
  16. 16             if (m_pCurrentLayer == null)  
  17. 17             {  
  18. 18                 return;  
  19. 19             }  
  20. 20             if ((IGeoFeatureLayer)m_pCurrentLayer == null)  
  21. 21             {  
  22. 22                 return;  
  23. 23             }  
  24. 24   
  25. 25             // Get the mouse down point in map coordinates   
  26. 26             IFeatureLayer pFeatureLayer = (IFeatureLayer)m_pCurrentLayer;  
  27. 27             if (pFeatureLayer.FeatureClass == null)  
  28. 28             {  
  29. 29                 return;  
  30. 30             }  
  31. 31             IActiveView pActiveView = (IActiveView)m_pMap;  
  32. 32             IPoint pPoint = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);  
  33. 33   
  34. 34             // if (this is a fresh sketch) create an appropriate feedback object,   
  35. 35 // otherwise extent the existing feedback   
  36. 36 // 如果是新开始创建的对象,则相应的创建一个新的Feedback对象;  
  37. 37 // 否则,向已存在的Feedback对象中加点  
  38. 38             if (!m_bInUse)  
  39. 39             {  
  40. 40                 m_pMap.ClearSelection();  //清除地图选中对象  
  41. 41                 switch (pFeatureLayer.FeatureClass.ShapeType)  
  42. 42                 {  
  43. 43                     case esriGeometryType.esriGeometryPoint:  
  44. 44                         CreateFeature(pPoint);  
  45. 45                         break;  
  46. 46                     case esriGeometryType.esriGeometryMultipoint:  
  47. 47                         m_bInUse = true;  
  48. 48                         m_pFeedback = new NewMultiPointFeedback();  
  49. 49                         INewMultiPointFeedback pMPFeed = (INewMultiPointFeedback)m_pFeedback;  
  50. 50                         m_pPointCollection = new Multipoint();  
  51. 51                         pMPFeed.Start(m_pPointCollection, pPoint);  
  52. 52                         break;  
  53. 53                     case esriGeometryType.esriGeometryPolyline:  
  54. 54                         m_bInUse = true;  
  55. 55                         m_pFeedback = new NewLineFeedback();  
  56. 56                         INewLineFeedback pLineFeed = (INewLineFeedback)m_pFeedback;  
  57. 57                         pLineFeed.Start(pPoint);  
  58. 58                         break;  
  59. 59                     case esriGeometryType.esriGeometryPolygon:  
  60. 60                         m_bInUse = true;  
  61. 61                         m_pFeedback = new NewPolygonFeedback();  
  62. 62                         INewPolygonFeedback pPolyFeed = (INewPolygonFeedback)m_pFeedback;  
  63. 63                         pPolyFeed.Start(pPoint);  
  64. 64                         break;  
  65. 65                 }  
  66. 66                 if (m_pFeedback != null)  
  67. 67                 {  
  68. 68                     m_pFeedback.Display = pActiveView.ScreenDisplay;  
  69. 69                 }  
  70. 70             }  
  71. 71             else  
  72. 72             {  
  73. 73                 if (m_pFeedback is INewMultiPointFeedback)  
  74. 74                 {  
  75. 75                     object Missing = Type.Missing;  
  76. 76                     m_pPointCollection.AddPoint(pPoint, ref Missing, ref Missing);  
  77. 77                 }  
  78. 78                 else if (m_pFeedback is INewLineFeedback)  
  79. 79                 {  
  80. 80                     INewLineFeedback pLineFeed = (INewLineFeedback)m_pFeedback;  
  81. 81                     pLineFeed.AddPoint(pPoint);  
  82. 82                 }  
  83. 83                 else if (m_pFeedback is INewPolygonFeedback)  
  84. 84                 {  
  85. 85                     INewPolygonFeedback pPolyFeed = (INewPolygonFeedback)m_pFeedback;  
  86. 86                     pPolyFeed.AddPoint(pPoint);  
  87. 87                 }  
  88. 88             }  
  89. 89         }  

10.新建对象过程中鼠标移动方法,产生Track效果在Map.MouseMove事件中调用本方法

  1.  1         /// <summary>  
  2.  2 /// 新建对象过程中鼠标移动方法,产生Track效果  
  3.  3 /// 在Map.MouseMove事件中调用本方法  
  4.  4 /// </summary>  
  5.  5 /// <param name="x">鼠标X坐标,屏幕坐标</param>  
  6.  6 /// <param name="y">鼠标Y坐标,屏幕坐标</param>  
  7.  7         private void SketchMouseMove(int x, int y)  
  8.  8         {  
  9.  9             if (!m_bInUse || m_pFeedback == null)  
  10. 10             {  
  11. 11                 return;  
  12. 12             }  
  13. 13   
  14. 14             // Move the feedback envelope and store the current mouse position   
  15. 15             IActiveView pActiveView = (IActiveView)m_pMap;  
  16. 16             m_pFeedback.MoveTo(pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y));  
  17. 17             m_pPoint = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);  
  18. 18         }  

11.完成新建对象,取得绘制的对象,并添加到图层中 建议在Map.DblClick或Map.MouseDown(Button = 2)事件中调用本方法

  1.  1         /// <summary>  
  2.  2 /// 完成新建对象,取得绘制的对象,并添加到图层中  
  3.  3 /// 建议在Map.DblClick或Map.MouseDown(Button = 2)事件中调用本方法  
  4.  4 /// </summary>  
  5.  5         private void EndSketch()  
  6.  6         {  
  7.  7             IGeometry pGeom = null;  
  8.  8             IPointCollection pPointCollection = null;  
  9.  9   
  10. 10             // Create a new feature if possible   
  11. 11             if (m_pFeedback is INewMultiPointFeedback)  
  12. 12             {  
  13. 13                 INewMultiPointFeedback pMPFeed = (INewMultiPointFeedback)m_pFeedback;  
  14. 14                 pMPFeed.Stop();  
  15. 15                 pGeom = (IGeometry)m_pPointCollection;  
  16. 16             }  
  17. 17             else if (m_pFeedback is INewLineFeedback)  
  18. 18             {  
  19. 19                 INewLineFeedback pLineFeed = (INewLineFeedback)m_pFeedback;  
  20. 20                 pLineFeed.AddPoint(m_pPoint);  
  21. 21                 IPolyline pPolyLine = pLineFeed.Stop();  
  22. 22                 pPointCollection = (IPointCollection)pPolyLine;  
  23. 23                 if (pPointCollection.PointCount < 2)  
  24. 24                     MessageBox.Show("至少输入两个节点.""错误的线几何对象", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);  
  25. 25                 else  
  26. 26                     pGeom = (IGeometry)pPointCollection;  
  27. 27             }  
  28. 28             else if (m_pFeedback is INewPolygonFeedback)  
  29. 29             {  
  30. 30                 INewPolygonFeedback pPolyFeed = (INewPolygonFeedback)m_pFeedback;  
  31. 31                 pPolyFeed.AddPoint(m_pPoint);  
  32. 32                 IPolygon pPolygon = pPolyFeed.Stop();  
  33. 33                 if (pPolygon != null)  
  34. 34                     pPointCollection = (IPointCollection)pPolygon;  
  35. 35                 if (pPointCollection.PointCount < 3)  
  36. 36                     MessageBox.Show("至少输入三个节点.""错误的线几何对象", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);  
  37. 37                 else  
  38. 38                     pGeom = (IGeometry)pPointCollection;  
  39. 39             }  
  40. 40             CreateFeature(pGeom);  
  41. 41             m_pFeedback = null;  
  42. 42             m_bInUse = false;  
  43. 43         }  

  评论这张
 
阅读(437)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018