何实现添加一个面要素是判断是否与一个面图层相交(AO)

     最近几天开始学习和基础ArcGIS AO 开发,感觉对一些概念性的东西很不了解,在学习过程中遇到了一些问题。突然想起前几天一同学问了我这样一个问题,如何实现添加一个面要素是判断是否与一个面图层相交。开始的时候我想起了用叠加分析来实现,但是没有亲自实践。刚好学习AO也趁此机会提高一下动手能力。

     用过分析面的相交可能范围包含、被包含、叠加、相接几种情况。如下如所示:

实现代码:

  public bool  GetInterSection(string tableName,IGeometry gemotry,int objid)
        {
            IFeatureWorkspace currentWorkspace = workspace as IFeatureWorkspace;
            IFeatureClass featureclass = currentWorkspace.OpenFeatureClass(tableName);

            //方法1  使用空间查询用求交集 (效率高)
            ISpatialFilter filter = new SpatialFilterClass();
            filter.Geometry = gemotry;
            filter.SpatialRel = ESRI.ArcGIS.Geodatabase.esriSpatialRelEnum.esriSpatialRelIntersects;
            filter.SubFields = "*";

            IFeatureCursor featureCursor = featureclass.Search(filter, false);
            IFeature feature = featureCursor.NextFeature();
            while (feature != null)
            {
                if (feature.OID != objid)
                {
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(featureCursor);
                    return true;
                }
                feature = featureCursor.NextFeature();
            }

            //方法2 利用空间关系运算(比起第一种效率要低)
            //IQueryFilter queryFilter = new QueryFilterClass();
            //queryFilter.SubFields = "*";
            //queryFilter.WhereClause = "OBJECTID IS NOT NULL";
            //IFeatureCursor featureCursor = featureclass.Search(queryFilter, false);
            //IFeature feature = featureCursor.NextFeature();
            //IRelationalOperator relationalOperator = gemotry as IRelationalOperator;
            //System.Text.StringBuilder oids = new System.Text.StringBuilder();
            //while (feature != null)
            //{
            //    if (feature.OID != 200)
            //    {
            //        bool bRelation = relationalOperator.Overlaps(feature.Shape);
            //        if (relationalOperator.Overlaps(feature.Shape) || relationalOperator.Within(feature.Shape) || relationalOperator.Contains(feature.Shape) || relationalOperator.Touches(feature.Shape))
            //        {
            //            //System.Runtime.InteropServices.Marshal.ReleaseComObject(featureCursor);
            //            //return true;
            //            oids.Append(feature.OID);
            //        }
            //    }
            //    feature = featureCursor.NextFeature();
            //}
           
            return false;
        }

posted @ 2012-05-23 14:13  SFLDY  阅读(412)  评论(0编辑  收藏  举报