ArcEngine判断要素(feature)是否为multipart feature(多部件)及分解(炸开)代码

本文详细介绍了一种在ArcGIS中处理多部件要素的方法,包括判断要素是否为多部件、将多部件要素拆分为单个独立要素的过程。通过具体代码示例,展示了如何使用Arcengine进行多部件要素的检测与分解。

一、Arcengine多部件处理

        /// <summary>
        /// 多部件处理
        /// </summary>
        /// <param name="pGeometry">任一要素</param>
        /// <param name="listGeometry">多部件打散的列表</param>
        /// <returns>是否为多部件</returns>
        public static bool IsMuiltPart(IGeometry pGeometry, out List<IGeometry> listGeometry)
        {
            listGeometry = new List<IGeometry>();
            IGeometryCollection pGeoColl = pGeometry as IGeometryCollection;
            if (pGeoColl == null)
            {
                return false;
            }
            if (pGeoColl.GeometryCount <= 1)
            {
                return false;
            }
 
            IPolygon pGeoPolygon = pGeometry as IPolygon;
            int iRCnt = pGeoPolygon.ExteriorRingCount;
            if (iRCnt > 1)
            {
                IGeometryBag pExRings = (pGeometry as IPolygon4).ConnectedComponentBag;
                IGeometryCollection geoColl = pExRings as IGeometryCollection;
                for (int i = 0; i < iRCnt; i++)
                {
                    if (pGeometry.GeometryType == esriGeometryType.esriGeometryPolygon)
                    {
                        IGeometry newGeom = geoColl.Geometry[i];
                        newGeom.SpatialReference = pGeometry.SpatialReference;
                        IGeometryCollection newGeoColl = new PolygonClass();
                        newGeoColl.AddGeometryCollection(newGeom as IGeometryCollection);
                        IGeometry pGeoNew2 = newGeoColl as IGeometry;
                        if (pGeoNew2 == null || pGeoNew2.IsEmpty) continue;
                        listGeometry.Add(pGeoNew2);
                    }                    
                }
            }
            return true;
        }

 二、检验多部件、炸开处理

#region 校验合法性
            ArrayList pFeatureArray = null;
            pFeatureArray = Application.Editor.FeatureSelection();
            int count=pFeatureArray.Count;
            if (count<1)
            {
                MessageBox.Show("最少必须选择1个要素才能进行要素分解!", "提示");
                return;
            }
#endregion   
try
            {
                //启动编辑操作
                Application.Editor.StartOperation();
                #region 对选中的要素进行多部件测试及分解
                int multipartcount = 0;
                for (int i = 0; i < count; i++)
                {
                    IFeature pFeature = pFeatureArray as IFeature;
                    if (pFeature.ShapeCopy.IsEmpty) continue;
                    IGeometry pGeometry = pFeature.ShapeCopy;
                    IGeometryCollection pGeocoll = pGeometry as IGeometryCollection;
                    int geomcount = pGeocoll.GeometryCount;
                    if (geomcount > 1)
                    {
                        multipartcount++;
                        for (int k = 1; k < geomcount; k++)
                        {
                            IFeature newFeaturte = (pFeature.Class as IFeatureClass).CreateFeature();
                            IFeatureEdit pFeatureEdit = pFeature as IFeatureEdit;
                            pFeatureEdit.SplitAttributes(newFeaturte);
                            IGeometry newGeom = pGeocoll.get_Geometry(k);
                            if (pFeature.ShapeCopy.GeometryType == esriGeometryType.esriGeometryPolygon)
                                newGeom=GeometryHelper.ConstructPolygon(newGeom);
                            else
                                newGeom = GeometryHelper.ConstructPolyline(newGeom);
                            newGeom.SpatialReference = pFeature.ShapeCopy.SpatialReference;
                            newFeaturte.Shape = newGeom;
                            newFeaturte.Store();
                        }
 
                        IGeometry newGeom2 = pGeocoll.get_Geometry(0);
                        if (pFeature.ShapeCopy.GeometryType == esriGeometryType.esriGeometryPolygon)
                            newGeom2 = GeometryHelper.ConstructPolygon(newGeom2);
                        else
                            newGeom2 = GeometryHelper.ConstructPolyline(newGeom2);
                        newGeom2.SpatialReference = pFeature.ShapeCopy.SpatialReference;
                        pFeature.Shape = newGeom2;
                        pFeature.Store();
                        Application.Editor.StopOperation("分解多部件要素");
                    }
                    else
                    {
                        continue;
                    }
                }
                if (multipartcount == 0)
                {
                    MessageBox.Show("未选择多部件要素!", "分解要素");
                    return;
                }
                
                
                #endregion
            }
            catch (Exception ex)
            {
                Application.Editor.AbortOperation();
                MessageHelper.WriteLog("分解多部件要素", ex);
            }
            finally
            {
                Application.ActiveView.Refresh();
                FlashFeatures();
            }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

QQ359677345

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值