zoukankan      html  css  js  c++  java
  • ArcEngine下,实现图形的擦除操作(Erase操作)

    ArcTool工具中,有一个Erase工具。即实现这样的操作:

    用起来非常方便。但是在做ArcEngine开发时,如果用GP来做,总觉的别扭。正好同学要实现一个这样的功能,问我能否作。顺便就做了这一块。研究了一下。ArcEngineITopologicalOperator接口中,没有Erase方法,所以来了一个迂回操作。基本思路如下:

    1、获取要裁切的图层和裁切框。

    2、用裁切框在图层中查找与之相交的要素。

    3、对相交的要素,逐一与裁切框相切,求出相切图形。

    4、用相切的图形与源要素求差,获取外围要素。

    5、获取的外围要素再赋予源要素。实现擦除处理。

    源代码如下:

        public class EraseClass

        {

            ///<summary>

            ///裁切框

            ///</summary>

            private IEnvelope _Envelope;

     

            public IEnvelope pEnvelope

            {

                get { return _Envelope; }

                set { _Envelope = value; }

            }

            ///<summary>

            ///被裁切图层

            ///</summary>

            private IFeatureClass _FeatureClass;

     

            public IFeatureClass pFeatureClass

            {

                get { return _FeatureClass; }

                set { _FeatureClass = value; }

            }

            public EraseClass()

            { }

            public EraseClass(IEnvelope pEnvelope, IFeatureClass pFeatureClass)

            {

                _FeatureClass = pFeatureClass;

                _Envelope = pEnvelope;

            }

            public void EraseOper()

            {

                ISpatialFilter tSF = new SpatialFilterClass();

                tSF.Geometry = _Envelope;

               

                tSF.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;

                //求出与裁切框相交要素

                IFeatureCursor tFeatureCursor = _FeatureClass.Search(tSF, false);

                IFeature tFeature = tFeatureCursor.NextFeature();

                while (tFeature != null)

                {

                    IGeometry tGeo2 = tFeature.ShapeCopy;

                    ITopologicalOperator tTope2 = tGeo2 as ITopologicalOperator;

                    tTope2.Simplify();

                    IGeometry tGeo = tFeature.ShapeCopy;

                    ITopologicalOperator tTope = tGeo as ITopologicalOperator;

                    tTope.Simplify();

                    //Envelope对要素进行裁切

                    tTope.Clip(this._Envelope);

                    IGeometry tGeoClip = (IGeometry)tTope;

                    //用裁切出来的要素,再与其源要素进行求差处理,即得到外围要素

                    IGeometry tGeoDe = tTope2.Difference(tGeoClip);

                    //把外围要素赋予源要素

                    tFeature.Shape = tGeoDe;

                    tFeature.Store();

                    tFeature = tFeatureCursor.NextFeature();

                }

                ReleaseCom(tFeatureCursor);

            }

            private void ReleaseCom(object o)

            {

                if (o != null)

                {

                    while (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0)

                    { }

                }

            }

        }

    作者: cglnet
    本文版权归cglNet和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    HTML 介绍及标签
    MySQL 索引
    子网划分
    网络基础
    python爬虫之12306网站--车站信息查询
    python集合与字典的用法
    python列表与元组的用法
    python条件语句
    python字符串处理以及字符串格式化
    python数据类型分类以及运算类型
  • 原文地址:https://www.cnblogs.com/cglNet/p/2803388.html
Copyright © 2011-2022 走看看