AE:图形的合并

【注】用到的关键函数见Union函数,主要接口就是ITopologicalOperator4

 

private void StartUnion(object sender, EventArgs e)

{

    ILayer pLyrSelect = null;

    IFeatureClass pFeaClass = null;

    IFeature pFea = null;

    IFeatureCursor pFeaCursor = null;

    //IQueryFilter pFilter = null;

    IWorkspace pWorkspace = null;

    //IDataset pDataset = null;

    IFeatureSelection pFeaSelection = null;

    ISelectionSet pSelectionSet = null;

    ICursor pCursor = null;

 

    List<IFeature> ListFeat = new List<IFeature>();

    ListFeat.Clear();

   

    pLyrSelect = (m_pMapCtrl as IMapControl3).CustomProperty as ILayer;//得到选中的图层

    pFeaSelection = pLyrSelect as IFeatureSelection;

    if (pFeaSelection.SelectionSet.Count <= 0)

    {

        MessageBox.Show("图层没有选择要素,请先选择要合并的要素", "提示");

        return;

    }

    else

    {

        pSelectionSet = pFeaSelection.SelectionSet;

        pSelectionSet.Search(null, false, out pCursor);

        pFeaCursor = pCursor as IFeatureCursor;

        pFea = pFeaCursor.NextFeature();

        while (pFea != null)

        {

            ListFeat.Add(pFea);

            pFea = pFeaCursor.NextFeature();

        }

    }

    IFeature[] pFeaArry = ListFeat.ToArray();

    IGeometry pGeoUnion = Union(pFeaArry);

    pWorkspace = (pFeaClass as IDataset).Workspace;

    IWorkspaceEdit pWorkspaceEdit  = pWorkspace as IWorkspaceEdit;

   

    //开始编辑操作工序

    pWorkspaceEdit .StartEditing(true);

    pWorkspaceEdit .StartEditOperation();

 

    IFeature pFeaNew = null;

    pFeaNew = pFeaClass.CreateFeature();

    if (pFeaNew == null) return;

    pFeaNew.Shape = pGeoUnion;

    //保存数据

    pFeaNew.Store();

 

    //删除原来的合并前对象

    for (int i = ListFeat.Count - 1; i >= 0; i--)

    {

        pFea = ListFeat[i];

        pFea.Delete();

        ListFeat.Remove(pFea);

       

    }

     ListFeat.Clear();

    //结束编辑操作工序

    pWorkspaceEdit .StopEditOperation();

    pWorkspaceEdit .StopEditing(true);

    m_pMapCtrl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, pLyrSelect, pGeoUnion.Envelope);

 

 

}

 

 

public IGeometry Union(IFeature[] FeatureArray)

{

    IGeometry pGeoUnion = null;

    IPointCollection pPtCollArry = null;

    int nPtCount = 0;

    try

    {

        if (FeatureArray.Length > 0)

        {

            pGeoUnion = FeatureArray[0].ShapeCopy;

            IGeometry NextGeo = null;

            ITopologicalOperator4 pTopoUnion = null;

            for (int i = 1; i < FeatureArray.Length; i++)

            {

                pTopoUnion = (ITopologicalOperator4)pGeoUnion;

                pTopoUnion.Simplify();//拓扑处理

                NextGeo = FeatureArray[i].ShapeCopy;

                NextGeo.SnapToSpatialReference();

                ITopologicalOperator4 pTopoNext = (ITopologicalOperator4)NextGeo;

                pTopoNext.IsKnownSimple_2 = false;

                pTopoNext.Simplify();//拓扑处理

                pGeoUnion = pTopoUnion.Union(NextGeo);

            }

 

            pPtCollArry = pGeoUnion as IPointCollection;

            nPtCount = pPtCollArry.PointCount;

        }

    }

    catch (Exception ee)

    {

        pGeoUnion = null;

        System.Diagnostics.Debug.WriteLine(ee.Message);

    }

    return pGeoUnion;

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值