红色的冰Oo 2023-04-04 10:00 采纳率: 57.1%
浏览 64
已结题

C#ArcEngine二次开发如何实现Arcmap中编辑器里面的部分功能

C#ArcEngine二次开发如何实现Arcmap中编辑器里面的部分功能
增加、删除面等功能已经实现,我需要类似Arcmap中的“整形要素工具”来协助我修改面要素
感谢

  • 写回答

7条回答 默认 最新

  • 阿里嘎多学长 2023-04-06 09:20
    关注

    以下内容部分参考ChatGPT模型:
    首先,要实现类似ArcMap中的“整形要素工具”,您需要使用ArcObjects的编辑器对象来实现。具体来说,您需要创建一个新的编辑工具类,该类将继承自ESRI.ArcGIS.Desktop.AddIns.Tool类,并实现IEditTask接口。

    在您的编辑工具类中,您需要实现OnMouseDown和OnMouseMove事件处理程序以捕获鼠标单击和移动事件。然后,您可以使用IEditor对象来获取当前编辑会话中的活动编辑图层,并使用IEditTask接口中的EditSketch对象来获取当前正在编辑的要素的几何图形。

    接下来,您可以使用IEditTask接口提供的一些方法和属性来执行您的编辑操作。例如,您可以使用EditSketch对象中的AddVertex方法向当前正在编辑的要素添加新的顶点,使用MovePoint方法移动现有顶点,使用Cut方法将要素分割为两个要素等等。

    最后,您需要在您的编辑工具类中实现OnDoubleClick事件处理程序以完成编辑操作,并将编辑结果保存到编辑会话中。

    以下是一个简单的示例,演示如何使用编辑器对象实现“整形要素工具”:

    using ESRI.ArcGIS.ArcMapUI;
    using ESRI.ArcGIS.Carto;
    using ESRI.ArcGIS.Editor;
    using ESRI.ArcGIS.Geometry;
    using ESRI.ArcGIS.Desktop.AddIns;
    
    namespace EditTools
    {
        public class ReshapeTool : Tool, IEditTask
        {
            private IEditor m_editor;
            private IEditSketch m_editSketch;
            private IFeature m_editFeature;
    
            public ReshapeTool()
            {
                m_editor = ArcMap.Editor;
            }
    
            protected override void OnMouseDown(MouseEventArgs arg)
            {
                // Get the active edit layer
                IFeatureLayer editLayer = m_editor.EditLayer as IFeatureLayer;
    
                if (editLayer == null)
                    return;
    
                // Get the clicked point in map coordinates
                IPoint clickedPoint = ArcMap.Document.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(arg.X, arg.Y);
    
                // Get the nearest feature to the clicked point
                m_editFeature = GetNearestFeature(editLayer, clickedPoint);
    
                if (m_editFeature == null)
                    return;
    
                // Start editing the feature
                m_editor.StartOperation();
    
                // Get the edit sketch for the feature
                m_editSketch = m_editor as IEditSketch;
                m_editSketch.Geometry = m_editFeature.ShapeCopy;
                m_editSketch.RefreshSketch();
    
                // Capture mouse move events to reshape the feature
                this.Cursor = Cursors.Cross;
                this.Enabled = true;
            }
    
            protected override void OnMouseMove(MouseEventArgs arg)
            {
                if (m_editSketch == null)
                    return;
    
                // Get the current mouse position in map coordinates
                IPoint currentPoint = ArcMap.Document.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(arg.X, arg.Y);
    
                // Reshape the feature based on the current mouse position
                m_editSketch.MovePoint(m_editSketch.PointCount - 1, currentPoint);
                m_editSketch.RefreshSketch();
            }
    
            protected override void OnDoubleClick()
            {
                if (m_editSketch == null)
                    return;
    
                // Finish editing the feature
                m_editor.StopOperation("Reshape Feature");
                m_editor.Map.SelectFeature(m_editor.EditLayer, m_editFeature);
    
                // Clear the edit sketch
                m_editSketch.Geometry = null;
                m_editSketch.RefreshSketch();
    
                // Reset the cursor and tool state
                this.Cursor = Cursors.Default;
                this.Enabled = false;
            }
    
            #region IEditTask Members
    
            public void Activate()
            {
                // Nothing to do
            }
    
            public void Deactivate()
            {
                // Nothing to do
            }
    
            public void Delete()
            {
                // Nothing to do
            }
    
            public void FinishSketch()
            {
                // Nothing to do
            }
    
            public void RefreshSketch()
            {
                // Nothing to do
            }
    
            public void StartSketch(IGeometry geometry)
            {
                // Nothing to do
            }
    
            public void UpdateSketch(IGeometry geometry)
            {
                // Nothing to do
            }
    
            #endregion
    
            private IFeature GetNearestFeature(IFeatureLayer layer, IPoint point)
            {
                // Get a search envelope around the clicked point
                IEnvelope searchEnvelope = point.Envelope;
                searchEnvelope.Expand(0.1, 0.1, false);
    
                // Create a spatial filter to search for features within the search envelope
                ISpatialFilter spatialFilter = new SpatialFilterClass();
                spatialFilter.Geometry = searchEnvelope;
                spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
    
                // Search for features within the search envelope
                IFeatureCursor featureCursor = layer.Search(spatialFilter, false);
                IFeature feature = featureCursor.NextFeature();
    
                // Get the nearest feature to the clicked point
                double minDistance = double.MaxValue;
                IFeature nearestFeature = null;
    
                while (feature != null)
                {
                    double distance = point.DistanceTo(feature.ShapeCopy as IPoint);
    
                    if (distance < minDistance)
                    {
                        minDistance = distance;
                        nearestFeature = feature;
                    }
    
                    feature = featureCursor.NextFeature();
                }
    
                return nearestFeature;
            }
        }
    }
    

    在这个示例中,我们创建了一个名为“ReshapeTool”的编辑工具类,它允许用户在单击要素时捕获要素,并在鼠标移动时重新形状要素。要实现这个功能,我们使用了IEditor、IEditTask和IEditSketch等编辑器对象,以及一些编辑操作,如AddVertex、MovePoint和Cut等。我们还使用了GetNearestFeature方法来查找最接近鼠标单击点的要素。

    注意,这只是一个简单的示例,您可能需要根据您的具体需求进行一些修改和定制。但是,这个示例应该可以帮助您了解如何使用ArcObjects编辑器对象来实现类似ArcMap中的“整形要素工具”。
    如果我的建议对您有帮助、请点击采纳、祝您生活愉快

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

问题事件

  • 系统已结题 4月19日
  • 已采纳回答 4月11日
  • 创建了问题 4月4日

悬赏问题

  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装
  • ¥40 复杂的限制性的商函数处理