C# AE 合并要素/合并图形/merger功能

摘要:
功能描述合并功能,准确的说是merge、union。这两者在ArcMap中的差别就是:merger保留相同字段属性;union是可以选择创建新的合并图形还是直接用原始要素合并,合并属性不保留。接口和使用方法1.ITopologicalOperator接口,其下的ConstructUnion属性能够一次放入多个几何(ConstructUnion属性是将放入的所有几何能够被一次性合并,这种方式比反复调用合并更加高效。其参数只能是IEnumGeometry,可以将IGeometryCollection转为IEnumGeometry),然后直接在FeatureClass中创建Feature,ITopologicalOperatoras为IGeometry即可。

功能描述

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

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

接口和使用方法

1.

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

代码如下

usingSystem;
usingSystem.Drawing;
usingSystem.Runtime.InteropServices;
usingESRI.ArcGIS.ADF.BaseClasses;
usingESRI.ArcGIS.ADF.CATIDs;
usingESRI.ArcGIS.Controls;
usingSystem.Windows.Forms;
usingESRI.ArcGIS.Carto;
usingESRI.ArcGIS.Geodatabase;
usingESRI.ArcGIS.Geometry;


namespaceWindowsFormsApplication2
{

    /// <summary>
    ///Summary description for UnionFeatures.
    /// </summary>
    [Guid("af0c15f2-8963-4fa7-b754-0f65e7b3c4bd")]
    [ClassInterface(ClassInterfaceType.None)]
    [ProgId("lyx.UnionFeatures")]
    public sealed classUnionFeatures : BaseTool
    {
        #region COM Registration Function(s)[ComRegisterFunction()]
        [ComVisible(false)]
        static voidRegisterFunction(Type registerType)
        {
            //Required for ArcGIS Component Category Registrar support
ArcGISCategoryRegistration(registerType);

            //
            //TODO: Add any COM registration code here
            //
}

        [ComUnregisterFunction()]
        [ComVisible(false)]
        static voidUnregisterFunction(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 voidArcGISCategoryRegistration(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 voidArcGISCategoryUnregistration(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;
        intp;
        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 = newBitmap(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(objecthook)
        {
            try{
                m_hookHelper = newHookHelperClass();
                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 voidOnClick()
        {
            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);
        }
        privateIEnumFeature 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 isIFeatureLayer))
                return null;
            currentLayer = layer asIFeatureLayer;
            if (currentLayer.FeatureClass.ShapeType ==esriGeometryType.esriGeometryPoint)
            {
                MessageBox.Show("无图层操作!!!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return null;
            }
            IEnumFeature SelectedFeatures = m_map.FeatureSelection asIEnumFeature;
            if (SelectedFeatures == null) return null;
            //判断SelectedFeatures是否为相同的几何类型,且是否与m_engineEditor.TargetLayer几何类型相同
            bool sameGeometryType =JudgeGeometryType(SelectedFeatures);
            if (!sameGeometryType)
            { MessageBox.Show("无图层操作!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return null; }
            returnSelectedFeatures;
        }
        private boolJudgeGeometryType(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 voidUnionFeature(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 asIFeatureClass;
            IGeometryCollection geometries = newGeometryBagClass();
            while (feature != null)
            {
                geometry =feature.ShapeCopy;
                geometries.AddGeometry(geometry, ref missing, refmissing);
                feature =selectedFeatures.Next();
            }
            ITopologicalOperator unionedGeometry = null;
            switch(featureClass.ShapeType)
            {
                caseesriGeometryType.esriGeometryMultipoint:
                    unionedGeometry = new MultipointClass(); break;
                caseesriGeometryType.esriGeometryPolyline:
                    unionedGeometry = new PolylineClass(); break;
                caseesriGeometryType.esriGeometryPolygon:
                    unionedGeometry = new PolygonClass(); break;
                default: break;
            }
            unionedGeometry.ConstructUnion(geometries asIEnumGeometry);
            ITopologicalOperator2 topo = unionedGeometry asITopologicalOperator2;
            topo.IsKnownSimple_2 = false;
            topo.Simplify();
            IFeatureClass targetFeatureClass =currentLayer.FeatureClass;
            IDataset dataset = featureClass asIDataset;
            IWorkspaceEdit workspaceEdit = dataset.Workspace asIWorkspaceEdit;
            if (!(workspaceEdit.IsBeingEdited())) return;
            try{
                workspaceEdit.StartEditOperation();
                IFeature unionedFeature =targetFeatureClass.CreateFeature();
                unionedFeature.Shape = unionedGeometry asIGeometry;
                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, intY)
        {
            //TODO:  Add UnionFeatures.OnMouseDown implementation
}

        public override void OnMouseMove(int Button, int Shift, int X, intY)
        {
            //TODO:  Add UnionFeatures.OnMouseMove implementation
}

        public override void OnMouseUp(int Button, int Shift, int X, intY)
        {
            //TODO:  Add UnionFeatures.OnMouseUp implementation
}
        #endregion}
}

其他略。

免责声明:文章转载自《C# AE 合并要素/合并图形/merger功能》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇将一个数的字节顺序逆置文字浮在图片上方下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

利用Nginx做反向代理搭建ArcGIS 10.1 for Server集群环境

  搭建GIS Server集群环境时,通常不建议在GIS Server之间设置防火墙;而建议在服务器环境的前端设置反向代理来隐藏服务器环境的真实地址及端口,保险起见可将反向代理放入DMZ区(前后都设置防火墙),增加安全性。   ArcGIS 10.1 for Server做出的架构改进使得我们在搭建GIS服务器集群环境时更加容易和省心;Nginx因其高性...

ArcGIS使用Python脚本进行地理处理

文章目录 ArcPy的类 ArcPy的执行 ArcPy权限检查 ArcPy获取空间数据信息 ArcPy中游标,SQL ArcPy操作几何要素 ArcPy操作栅格数据集 Python是ArcGIS内置的脚本处理函数,可进行地图分析,数据处理,制图等功能。脚本与我们熟悉的ModelBuilder或是ArcToolbox功能很类似,但是不同的地方有:...

arcgis api的三种查询实现

1. 引言 FindTask:Search a map service exposed by the ArcGIS Server REST API based on a string value. The search can be conducted on a single field of a single layer, on many fields...

ArcGIS 10 安装程序及破解文件

1、下载 ArcGIS 10 安装程序及破解文件 后面提供电驴的下载地址(可以使用迅雷、QQ旋风等下载工具下载),下载文件是一个光盘镜像文件:‍ArcGIS_Desktop10_122519.iso。 2、进行 ArcGIS 10 的安装 首先确保系统已安装 .NET Framework 3.5 SP1,如果没有安装去微软官网下载安装,地址:.NET Fr...

arcgis 要素服务增删改查

两种方式: 第一种 要素服务的增删改操作,在ArcGIS API for JS中给我们提供了三个类用于要素的增Add,删Delete,改Update 添加draw和要素服务 //用于操作的要素图层,注意我们是操作的宿舍楼图层 var featureLayer = new FeatureLayer("http://lo...

ArcGIS地图文档(mxd)过大的问题

  今天在作图的时候无意发现了一个问题,mxd文档居然有6MB多,原先以为是符号库引起的,就移除了加载的所有符号库,可文件体积并没有发生大的变化。上网搜了一下esri的论坛,才发现这个问题原来是geoprocessing引起的,只要在arcmap中执行过工具,就会把工具执行的结果保存在mxd里,因此才造成了文件大的离谱。      解决方法:点击geopr...