zoukankan      html  css  js  c++  java
  • C# AE 合并要素/合并图形/merger功能

    功能描述

    合并功能,准确的说是merge、union。

    这两者在ArcMap中的差别就是:merger保留相同字段属性;union是可以选择创建新的合并图形还是直接用原始要素合并,合并属性不保留。

    接口和使用方法

    1.

    ITopologicalOperator接口,其下的ConstructUnion属性能够一次放入多个几何(ConstructUnion属性是将放入的所有几何能够被一次性合并,这种方式比反复调用合并更加高效。其参数只能是IEnumGeometry(包络几何),可以将IGeometryCollection转为IEnumGeometry),然后直接在FeatureClass中创建Feature,ITopologicalOperator as为IGeometry即可。

    2.

    ITopologicalOperator接口,其下有union方法。

    3.

    IBasicGeoprocessor 接口。其下有

    CancelTracker     The cancel tracker.
    Clip            Clips features.
    Dissolve          Dissolves features.
    Intersect         Intersects features.
    Merge          Merges features.
    SpatialReference     The output spatial reference.
    Union        Creates a union of features.

    4.

    GP接口

    5.其他

    具体代码

    方法1代码:

    转载自网易博客,原地址:http://yaogu.blog.163.com/blog/static/184999066201242692019186/

      private void btnMerge_Click(object sender, EventArgs e)
            {
                    ICommand pUnionFeature = new UnionFeatures(0);
                    pUnionFeature.OnCreate(axMapControl1.Object);
                    axMapControl1.CurrentTool = pUnionFeature as ITool;
             }    

    新建类UnionFeatures.cs

    代码如下

    using System;
    using System.Drawing;
    using System.Runtime.InteropServices;
    using ESRI.ArcGIS.ADF.BaseClasses;
    using ESRI.ArcGIS.ADF.CATIDs;
    using ESRI.ArcGIS.Controls;
    using System.Windows.Forms;
    using ESRI.ArcGIS.Carto;
    using ESRI.ArcGIS.Geodatabase;
    using ESRI.ArcGIS.Geometry;
    
    
    namespace WindowsFormsApplication2
    {
    
        /// <summary>
        /// Summary description for UnionFeatures.
        /// </summary>
        [Guid("af0c15f2-8963-4fa7-b754-0f65e7b3c4bd")]
        [ClassInterface(ClassInterfaceType.None)]
        [ProgId("lyx.UnionFeatures")]
        public sealed class UnionFeatures : BaseTool
        {
            #region COM Registration Function(s)
            [ComRegisterFunction()]
            [ComVisible(false)]
            static void RegisterFunction(Type registerType)
            {
                // Required for ArcGIS Component Category Registrar support
                ArcGISCategoryRegistration(registerType);
    
                //
                // TODO: Add any COM registration code here
                //
            }
    
            [ComUnregisterFunction()]
            [ComVisible(false)]
            static void UnregisterFunction(Type registerType)
            {
                // Required for ArcGIS Component Category Registrar support
                ArcGISCategoryUnregistration(registerType);
    
                //
                // TODO: Add any COM unregistration code here
                //
            }
    
            #region ArcGIS Component Category Registrar generated code
            /// <summary>
            /// Required method for ArcGIS Component Category registration -
            /// Do not modify the contents of this method with the code editor.
            /// </summary>
            private static void ArcGISCategoryRegistration(Type registerType)
            {
                string regKey = string.Format("HKEY_CLASSES_ROOT\CLSID\{{{0}}}", registerType.GUID);
                MxCommands.Register(regKey);
                ControlsCommands.Register(regKey);
            }
            /// <summary>
            /// Required method for ArcGIS Component Category unregistration -
            /// Do not modify the contents of this method with the code editor.
            /// </summary>
            private static void ArcGISCategoryUnregistration(Type registerType)
            {
                string regKey = string.Format("HKEY_CLASSES_ROOT\CLSID\{{{0}}}", registerType.GUID);
                MxCommands.Unregister(regKey);
                ControlsCommands.Unregister(regKey);
            }
    
            #endregion
            #endregion
    
            IHookHelper m_hookHelper = null;
            IActiveView m_activeView = null;
            IMap m_map = null;
            IFeatureLayer currentLayer = null;
            //IEngineEditProperties m_engineEditor = null;
            int p;
            public UnionFeatures(int _p)
            {
                //
                // TODO: Define values for the public properties
                //
                base.m_category = ""; //localizable text 
                base.m_caption = "";  //localizable text 
                base.m_message = "This should work in ArcMap/MapControl/PageLayoutControl";  //localizable text
                base.m_toolTip = "";  //localizable text
                base.m_name = "";   //unique id, non-localizable (e.g. "MyCategory_MyTool")
                //m_engineEditor = new EngineEditorClass();
                p = _p;
                try
                {
                    //
                    // TODO: change resource name if necessary
                    //
                    string bitmapResourceName = GetType().Name + ".bmp";
                    base.m_bitmap = new Bitmap(GetType(), bitmapResourceName);
                    base.m_cursor = new System.Windows.Forms.Cursor(GetType(), GetType().Name + ".cur");
                }
                catch (Exception ex)
                {
                    System.Diagnostics.Trace.WriteLine(ex.Message, "Invalid Bitmap");
                }
            }
    
            #region Overriden Class Methods
    
            /// <summary>
            /// Occurs when this tool is created
            /// </summary>
            /// <param name="hook">Instance of the application</param>
            public override void OnCreate(object hook)
            {
                try
                {
                    m_hookHelper = new HookHelperClass();
                    m_hookHelper.Hook = hook;
                    if (m_hookHelper.ActiveView == null)
                    {
                        m_hookHelper = null;
                    }
                }
                catch
                {
                    m_hookHelper = null;
                }
    
                if (m_hookHelper == null)
                    base.m_enabled = false;
                else
                    base.m_enabled = true;
    
                // TODO:  Add other initialization code
            }
    
            /// <summary>
            /// Occurs when this tool is clicked
            /// </summary>
            public override void OnClick()
            {
                m_activeView = m_hookHelper.ActiveView;
                m_map = m_hookHelper.FocusMap;
    
                ILayer layer = m_map.get_Layer(p);
                if (layer != null)
                { MessageBox.Show(m_map.SelectionCount.ToString(), "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; }
    
                IEnumFeature selectedFeatures = GetSelectedFeatures();
                if (selectedFeatures == null) return;
                UnionFeature(selectedFeatures);
                m_activeView.PartialRefresh(esriViewDrawPhase.esriViewGeography | esriViewDrawPhase.esriViewGeoSelection, null, m_activeView.Extent);
            }
            private IEnumFeature GetSelectedFeatures()
            {
                //if (m_map.SelectionCount < 2)
                //{
                //    MessageBox.Show("无图层操作!!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                //    return null;
                //}
                ILayer layer = m_map.get_Layer(p);
                if (layer == null)
                    return null;
                if (!(layer is IFeatureLayer))
                    return null;
                currentLayer = layer as IFeatureLayer;
                if (currentLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPoint)
                {
                    MessageBox.Show("无图层操作!!!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return null;
                }
                IEnumFeature SelectedFeatures = m_map.FeatureSelection as IEnumFeature;
                if (SelectedFeatures == null) return null;
                //判断SelectedFeatures是否为相同的几何类型,且是否与m_engineEditor.TargetLayer几何类型相同
                bool sameGeometryType = JudgeGeometryType(SelectedFeatures);
                if (!sameGeometryType)
                { MessageBox.Show("无图层操作!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return null; }
                return SelectedFeatures;
            }
            private bool JudgeGeometryType(IEnumFeature SelectedFeatures)
            {
                SelectedFeatures.Reset();
                IFeature feature = SelectedFeatures.Next();
                if (feature == null) return false;
                esriGeometryType geometryType = feature.ShapeCopy.GeometryType;
                while ((feature = SelectedFeatures.Next()) != null)
                {
                    if (geometryType != feature.ShapeCopy.GeometryType)
                    { return false; }
                }
                if (geometryType == currentLayer.FeatureClass.ShapeType)
                    return true;
                return false;
            }
            private void UnionFeature(IEnumFeature selectedFeatures)
            {
                IFeature feature = null;
                IGeometry geometry = null;
                object missing = Type.Missing;
                selectedFeatures.Reset();
                feature = selectedFeatures.Next();
                if (feature == null) return;
                IFeatureClass featureClass = feature.Class as IFeatureClass;
                IGeometryCollection geometries = new GeometryBagClass();
                while (feature != null)
                {
                    geometry = feature.ShapeCopy;
                    geometries.AddGeometry(geometry, ref missing, ref missing);
                    feature = selectedFeatures.Next();
                }
                ITopologicalOperator unionedGeometry = null;
                switch (featureClass.ShapeType)
                {
                    case esriGeometryType.esriGeometryMultipoint:
                        unionedGeometry = new MultipointClass(); break;
                    case esriGeometryType.esriGeometryPolyline:
                        unionedGeometry = new PolylineClass(); break;
                    case esriGeometryType.esriGeometryPolygon:
                        unionedGeometry = new PolygonClass(); break;
                    default: break;
                }
                unionedGeometry.ConstructUnion(geometries as IEnumGeometry);
                ITopologicalOperator2 topo = unionedGeometry as ITopologicalOperator2;
                topo.IsKnownSimple_2 = false;
                topo.Simplify();
                IFeatureClass targetFeatureClass = currentLayer.FeatureClass;
                IDataset dataset = featureClass as IDataset;
                IWorkspaceEdit workspaceEdit = dataset.Workspace as IWorkspaceEdit;
                if (!(workspaceEdit.IsBeingEdited())) return;
                try
                {
                    workspaceEdit.StartEditOperation();
                    IFeature unionedFeature = targetFeatureClass.CreateFeature();
                    unionedFeature.Shape = unionedGeometry as IGeometry;
                    unionedFeature.Store();
                    workspaceEdit.StopEditOperation();
                }
                catch (Exception ex)
                {
                    workspaceEdit.AbortEditOperation();
                    MessageBox.Show("要素合并失败!!" + ex.Message, "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            public override void OnMouseDown(int Button, int Shift, int X, int Y)
            {
                // TODO:  Add UnionFeatures.OnMouseDown implementation
            }
    
            public override void OnMouseMove(int Button, int Shift, int X, int Y)
            {
                // TODO:  Add UnionFeatures.OnMouseMove implementation
            }
    
            public override void OnMouseUp(int Button, int Shift, int X, int Y)
            {
                // TODO:  Add UnionFeatures.OnMouseUp implementation
            }
            #endregion
        }
    }

    其他略。


  • 相关阅读:
    Linq 中 表连接查询
    Html Div 拖拽
    持续集成:TestNG中case之间的关系
    测试技术培训:如何测试磁盘写的速度
    POPTEST 测试开发 免费培训课程报名
    接上文 下面是一段示例代码
    老李分享:android手机测试之适配(1)
    (转)POPTEST创始人李爱然:谢谢,帮助我的朋友!!!!
    性能调优之SQL优化
    大数据测试之Hadoop的基本概念
  • 原文地址:https://www.cnblogs.com/marvelousone/p/7220646.html
Copyright © 2011-2022 走看看