private void MoveFeatures(IPoint lastpoint, IPoint firstpoint) { if (m_EngineEditor == null) { return; } //开始一个编辑流程 m_EngineEditor.StartOperation(); if (m_EngineEditLayers == null) { return; } //获取移动的图层 IFeatureLayer pFeatLyr = m_EngineEditLayers.TargetLayer; if (pFeatLyr == null) { return; } //获取选择要素指针 IFeatureCursor pFeatCur = MapManager.GetSelectedFeatures(pFeatLyr); IFeature pFeature = pFeatCur.NextFeature(); while (pFeature != null) { //实现要素的移动 MoveFeature(pFeature, lastpoint, firstpoint); pFeature = pFeatCur.NextFeature(); } //停止编辑流程 m_EngineEditor.StopOperation("MoveTool"); System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatCur); m_activeView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection | esriViewDrawPhase.esriViewGeography, null, null); }
public void OnClick() { try { m_Map = m_hookHelper.FocusMap; m_activeView = m_Map as IActiveView; m_EngineEditor = MapManager.EngineEditor; m_EngineEditLayers = MapManager.EngineEditor as IEngineEditLayers; if (m_EngineEditor == null) { return; } if (m_EngineEditor.EditState != esriEngineEditState.esriEngineStateEditing) { return; } if (m_EngineEditLayers == null) { return; } IFeatureLayer pFeatLyr = m_EngineEditLayers.TargetLayer; if (pFeatLyr == null) { return; } IFeatureClass pFeatCls = pFeatLyr.FeatureClass; if (pFeatCls == null) { return; } IFeatureCursor pFeatCur = MapManager.GetSelectedFeatures(pFeatLyr); if (pFeatCur == null) { MessageBox.Show("请选择要删除的要素!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } m_EngineEditor.StartOperation(); IFeature pFeature = pFeatCur.NextFeature(); if (MessageBox.Show("是否删除所选要素?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes) { while (pFeature != null) { pFeature.Delete(); pFeature = pFeatCur.NextFeature(); } } System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatCur); m_EngineEditor.StopOperation("DelFeatureCommand"); m_activeView.Refresh(); } catch (Exception ex) { //SysLogHelper.WriteOperationLog("要素删除错误", ex.Source, "数据编辑"); } }
public void OnMouseDown(int button, int shift, int x, int y) { try { //转换鼠标点击位置起始点为地图坐标 m_startPt = m_activeView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y); if (m_EngineEditor == null) { return; } if (m_EngineEditor.EditState != esriEngineEditState.esriEngineStateEditing) { return; } if (m_EngineEditLayers == null) { return; } IFeatureLayer pFeatLyr = m_EngineEditLayers.TargetLayer; if (pFeatLyr == null) { return; } //获取要移动几何对象 IFeatureCursor pFeatCur = MapManager.GetSelectedFeatures(pFeatLyr); if (pFeatCur == null) { MessageBox.Show("请选择要移动要素!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } IFeature pFeature = pFeatCur.NextFeature(); //当移动的对象为空时,首先进行对象实例化 if (m_moveGeoFeedBack == null) { m_moveGeoFeedBack = new MoveGeometryFeedbackClass(); } m_moveGeoFeedBack.Display = m_activeView.ScreenDisplay; while (pFeature != null) { m_moveGeoFeedBack.AddGeometry(pFeature.Shape); pFeature = pFeatCur.NextFeature(); } //添加起始点 m_moveGeoFeedBack.Start(m_startPt); System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatCur); } catch (Exception ex) { //SysLogHelper.WriteOperationLog("要素移动错误", ex.Source, "数据编辑"); } }
public void OnClick() { m_Map = m_hookHelper.FocusMap; m_activeView = m_Map as IActiveView; m_EngineEditor = MapManager.EngineEditor; m_EngineEditLayers = MapManager.EngineEditor as IEngineEditLayers; EditVertexClass.m_activeView = m_activeView; EditVertexClass.m_Map = m_Map; EditVertexClass.ClearResource(); if (m_EngineEditor == null) { return; } if (m_EngineEditor.EditState != esriEngineEditState.esriEngineStateEditing) { return; } if (m_EngineEditLayers == null) { return; } IFeatureLayer pFeatLyr = m_EngineEditLayers.TargetLayer; if (pFeatLyr == null) { return; } IFeatureCursor pFeatCur = MapManager.GetSelectedFeatures(pFeatLyr); if (pFeatCur == null) { MessageBox.Show("请选择要删除节点的要素!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } EditVertexClass.ShowAllVertex(pFeatLyr); ((IActiveViewEvents_Event)m_Map).AfterDraw += new IActiveViewEvents_AfterDrawEventHandler(map_AfterDraw); }
public static IFeature GetSelectedFeature(IFeatureLayer pFeatLyr) { IFeature functionReturnValue = null; IFeatureCursor pFeatureCursor = null; IFeature pFeature = null; //获取选中的地物 pFeatureCursor = MapManager.GetSelectedFeatures(pFeatLyr); if (pFeatureCursor == null) { functionReturnValue = null; return(functionReturnValue); } pFeature = pFeatureCursor.NextFeature(); functionReturnValue = pFeature; //释放游标 Marshal.ReleaseComObject(pFeatureCursor); return(functionReturnValue); }
private void EditMouseUp(IPoint pPnt) { IPolygon pPolyResult; IPolyline pPolylineResult; IFeatureCursor pFeatureCursor; IFeature pFeature; IFeatureLayer pFeatLyr = m_EngineEditLayers.TargetLayer; //检查编辑的地物 if (m_editDispFeed != null) { switch (m_pHitElem.Geometry.GeometryType) { case esriGeometryType.esriGeometryLine: case esriGeometryType.esriGeometryPolyline: pPolylineResult = m_polylineMvPtFeed.Stop(); //作有效性检查 if ((pPolylineResult != null)) { //更新元素 m_pHitElem.Geometry = pPolylineResult; //获取选中的地物 pFeatureCursor = MapManager.GetSelectedFeatures(pFeatLyr); if (pFeatureCursor == null) { return; } pFeature = pFeatureCursor.NextFeature(); m_EngineEditor.StartOperation(); //更新要素形状 pFeature.Shape = pPolylineResult; pFeature.Store(); //停止编辑 m_EngineEditor.StopOperation("MoveVertex"); EditVertexClass.ShowAllVertex(pFeatLyr); } break; case esriGeometryType.esriGeometryPolygon: case esriGeometryType.esriGeometryEnvelope: //得到反馈的结果 pPolyResult = m_polyMvPtFeed.Stop(); //作有效性检查 if (pPolyResult != null) { //更新元素 m_pHitElem.Geometry = pPolyResult; //获取选中的地物 pFeatureCursor = MapManager.GetSelectedFeatures(pFeatLyr); if (pFeatureCursor == null) { return; } pFeature = pFeatureCursor.NextFeature(); m_EngineEditor.StartOperation(); //更新要素形状 pFeature.Shape = pPolyResult; pFeature.Store(); //停止编辑 m_EngineEditor.StopOperation("MoveVertex"); if (pFeature.Shape.GeometryType == esriGeometryType.esriGeometryPolygon || pFeature.Shape.GeometryType == esriGeometryType.esriGeometryPolyline) { EditVertexClass.ShowAllVertex(pFeatLyr); } } IFeature pTempParcel; //定义存储多边形要素的局部变量 IPoint pDestPoint; //定义节点移动的目标位置 pDestPoint = pPnt; IZAware pZAware = pDestPoint as IZAware; pZAware.ZAware = true; pDestPoint.Z = 0; //所有包含该节点的多边形都进行操作 for (int i = 0; i <= EditVertexClass.m_featArray.Count - 1; i++) { pTempParcel = EditVertexClass.m_featArray.get_Element(i) as IFeature; //记录节点序号 int pIndex = 0; pIndex = EditVertexClass.GetVertexIndex(m_fromPoint, pTempParcel.Shape); if (!(pIndex == -2)) { ITopologicalOperator pTopoOpt = default(ITopologicalOperator); IPolygon pPolygon = default(IPolygon); IPointCollection pPolygonPointCol = default(IPointCollection); pPolygonPointCol = pTempParcel.ShapeCopy as IPointCollection; pPolygonPointCol.UpdatePoint(pIndex, pDestPoint); pPolygon = pPolygonPointCol as IPolygon; pPolygon.Close(); pTopoOpt = pPolygon as ITopologicalOperator; pTopoOpt.Simplify(); pTempParcel.Shape = pPolygon; pTempParcel.Store(); } } EditVertexClass.m_featArray.RemoveAll(); break; } //释放内存 m_polyMvPtFeed = null; m_polylineMvPtFeed = null; m_editDispFeed = null; m_pHitElem = null; //刷新地图 m_activeView.Refresh(); } }
private void EditMouseDown(IPoint pPnt) { try { IPolygon pGeompoly; IPolyline pGeomPolyline; IHitTest pHtTest; IPoint pPtHit; double pDblHitDis = 0; int pLngPrtIdx = 0; int pLngSegIdx = 0; Boolean pBoolHitRt = false; Boolean pBoolHitTest = false; double pDblSrchDis = 0; pPnt.Z = 0; pPtHit = new PointClass(); pDblSrchDis = m_activeView.Extent.Width / 200; //获取编辑目标图层 IFeatureLayer pFeatLyr = m_EngineEditLayers.TargetLayer; if (pFeatLyr == null) { return; } IFeatureCursor pFeatCur = MapManager.GetSelectedFeatures(pFeatLyr); IFeature pTFeature = pFeatCur.NextFeature(); switch (pTFeature.Shape.GeometryType) { //当为单点、点集时直接返回 case esriGeometryType.esriGeometryPoint: case esriGeometryType.esriGeometryMultipoint: return; //线要素 case esriGeometryType.esriGeometryLine: case esriGeometryType.esriGeometryPolyline: m_pHitElem = new LineElementClass(); break; //面要素 case esriGeometryType.esriGeometryPolygon: case esriGeometryType.esriGeometryEnvelope: m_pHitElem = new PolygonElementClass(); break; } //获取选中要素的几何对象 m_pHitElem.Geometry = pTFeature.Shape; if (m_pHitElem != null) { switch (pTFeature.Shape.GeometryType) { case esriGeometryType.esriGeometryLine: case esriGeometryType.esriGeometryPolyline: pGeomPolyline = m_pHitElem.Geometry as IPolyline; pHtTest = pGeomPolyline as IHitTest; pBoolHitTest = pHtTest.HitTest(pPnt, pDblSrchDis, esriGeometryHitPartType.esriGeometryPartVertex, pPtHit, ref pDblHitDis, ref pLngPrtIdx, ref pLngSegIdx, ref pBoolHitRt); if (pBoolHitTest) { EditVertexClass.pHitPnt = pPtHit; m_editDispFeed = new LineMovePointFeedbackClass(); m_editDispFeed.Display = m_activeView.ScreenDisplay; m_polylineMvPtFeed = m_editDispFeed as ILineMovePointFeedback; m_polylineMvPtFeed.Start(pGeomPolyline, pLngSegIdx, pPnt); } break; case esriGeometryType.esriGeometryPolygon: case esriGeometryType.esriGeometryEnvelope: pGeompoly = m_pHitElem.Geometry as IPolygon; pHtTest = pGeompoly as IHitTest; pBoolHitTest = pHtTest.HitTest(pPnt, pDblSrchDis, esriGeometryHitPartType.esriGeometryPartVertex, pPtHit, ref pDblHitDis, ref pLngPrtIdx, ref pLngSegIdx, ref pBoolHitRt); EditVertexClass.pHitPnt = pPtHit; if (pBoolHitTest) { //定义获取到的与传入点的最近所选地物 IFeature pFeature; //定义测量距离用于捕获离点最近的地物 double pTestDist = 0; //用于求点与地物的距离 IProximityOperator pProximity; IGeometry pGeoM; IFeature pTestFeature; //用于最短距离的比较 double pTempDist = 0; IFeatureCursor pSelected; ITopologicalOperator pTopoOpt; //捕捉到的要移动的节点 IPoint pSnapVertex = default(IPoint); //从所选地物中获得离点最近的那个地物 pFeature = null; //用鼠标点进行运算 pTopoOpt = pPnt as ITopologicalOperator; pTopoOpt.Simplify(); pProximity = pPnt as IProximityOperator; pSelected = MapManager.GetSelectedFeatures(pFeatLyr); pTestFeature = pSelected.NextFeature(); pGeoM = pTestFeature.Shape; pTestDist = pProximity.ReturnDistance(pGeoM); pFeature = pTestFeature; //从所选地物中获得离点最近的那个地物 while (pTestFeature != null) { pTestFeature = pSelected.NextFeature(); if (pTestFeature != null) { pGeoM = pTestFeature.Shape; pTempDist = pProximity.ReturnDistance(pGeoM); if (pTempDist < pTestDist) { pTestDist = pTempDist; pFeature = pTestFeature; } } } //检查pSnapPoint是否是所选地物中的某个图斑的一个节点 double pDblHDis = 0; int pLngVertexIdx = 0; int pLngSIdx = 0; bool pBoolHRt = false; bool pBlnGet = false; double pDblDistMin = 0; pDblDistMin = pTempDist; if (pDblDistMin == 0) { pDblDistMin = 3; } //两倍可以保证一般一次找的到 double pDblSearchRadius = pDblDistMin * 2; IHitTest pHT = default(IHitTest); pHT = pFeature.Shape as IHitTest; //如果pSnapPoint不是pTempParcel的节点 if (EditVertexClass.GetVertexIndex(pPnt, pFeature.Shape) == -2) { pSnapVertex = new Point(); while (!pBlnGet) { pBlnGet = pHT.HitTest(pPnt, pDblSearchRadius, esriGeometryHitPartType.esriGeometryPartVertex, pSnapVertex, ref pDblHDis, ref pLngVertexIdx, ref pLngSIdx, ref pBoolHRt); pDblSearchRadius = pDblSearchRadius + pDblDistMin; } EditVertexClass.pHitPnt = pSnapVertex; //如果pSnapVertex仍然不是pTempParcel的节点 if (EditVertexClass.GetVertexIndex(pSnapVertex, pFeature.Shape) == -2) { MessageBox.Show("所想移动的起点不是所选面的节点", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } m_fromPoint = pSnapVertex; } else { pSnapVertex = pPnt; m_fromPoint = pSnapVertex; } //找到包含所要移动的节点的图形,在该过程里面对m_FeatArray进行了赋值 EditVertexClass.SelectByShapeTop(pFeatLyr, pSnapVertex, esriSpatialRelEnum.esriSpatialRelTouches, false, esriSelectionResultEnum.esriSelectionResultNew); m_editDispFeed = new PolygonMovePointFeedbackClass(); m_editDispFeed.Display = m_activeView.ScreenDisplay; m_polyMvPtFeed = m_editDispFeed as IPolygonMovePointFeedback; m_polyMvPtFeed.Start(pGeompoly, pLngSegIdx, pPnt); } break; } } } catch (Exception ex) { //SysLogHelper.WriteOperationLog("节点移动错误", ex.Source, "数据编辑"); } }
public static void ShowAllVertex(IFeatureLayer pFeatLyr) { m_vertexGeoBag = null; if (pFeatLyr == null) { return; } IFeatureCursor pFeatureCursor = MapManager.GetSelectedFeatures(pFeatLyr); if (pFeatureCursor == null) { return; } IFeature pTFeature = null; //得到要显示节点的地物 pTFeature = pFeatureCursor.NextFeature(); if (pTFeature == null) { return; } //只选中一个地物进行节点移动 m_Map.ClearSelection(); m_Map.SelectFeature(pFeatLyr as ILayer, pTFeature); m_activeView.Refresh(); //如果为点状地物,不显示节点 if (pTFeature.Shape.GeometryType == esriGeometryType.esriGeometryPoint) { return; } IArray pFeatureArray = null; pFeatureArray = new ESRI.ArcGIS.esriSystem.Array(); pFeatureArray.Add(pTFeature); //绘图符号初始化 SymbolInit(); IFeature pFeature = default(IFeature); IPointCollection pPointCol = default(IPointCollection); IPoint pPoint = default(IPoint); int i = 0; int j = 0; m_vertexGeoBag = new GeometryBagClass(); for (i = 0; i <= pFeatureArray.Count - 1; i++) { pFeature = pFeatureArray.get_Element(i) as IFeature; //获取图形边界的点集 pPointCol = pFeature.ShapeCopy as IPointCollection; for (j = 0; j <= pPointCol.PointCount - 1; j++) { pPoint = pPointCol.get_Point(j); if (j == 0 | j == pPointCol.PointCount - 1) { //两个端点的ID设为10 pPoint.ID = 10; } else { //中间点的ID设为100 pPoint.ID = 100; } IColor pColor = null; object obj = Type.Missing; //显示节点 if (pPoint == pHitPnt) { DisplayGraphic(pPoint, pColor, m_selPointSym as ISymbol); } if (j == 0 || j == pPointCol.PointCount - 1) { DisplayGraphic(pPoint, pColor, m_endPointSym as ISymbol); } else { DisplayGraphic(pPoint, pColor, m_vertexSym as ISymbol); } m_vertexGeoBag.AddGeometry(pPoint, ref obj, ref obj); } } Marshal.ReleaseComObject(pFeatureCursor); }