我是靠谱客的博主 狂野萝莉,最近开发中收集的这篇文章主要介绍ArcGIS Engine基础(28)之获取图层中在拓扑关系上自重合要素的两种方法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

第一种方法:

建立拓扑关系进行拓扑分析实现

(1)创建临时文件地理数据库

(2)在文件地理数据库工作空间中创建要素数据级

(3)将要素类FetureClass导入到要素数据集FeatureDataset

(4)根据导入的要素类创建拓扑topology,并添加自重叠的拓扑规则

(5)验证拓扑 Validate

(6)获取错误要素容器IErrorFeatureContainer中的所有错误,输出容器总的所有OriginOIDs and DestinationOIDs 

具体创建代码参照之前文章 https://blog.csdn.net/wokao253615105/article/details/115770198

第二种方法:

(1)循环遍历要素类中所有要素,使用索引查询IIndexQuery2.IntersectedFeatures,获取与当前遍历要素相交的其他要素。不推荐使用ISpatialFilter空间过滤器,使用featureClass.Search(filter,false)直接去获取相交要素,数量大时,效率更低。

(2)查找出的相交要素,要排除要素相接和部分相交的情况,使用IRelationalOperator2.Overlaps获取重合要素。

代码如下:

 /// <summary>
        /// 获取单要素类中自重合的要素
        /// </summary>
        /// <param name="featureClass"></param>
        /// <returns></returns>
        private List<int> GetInternalOverlaps(IFeatureClass featureClass)
        {
            List<int> overlappingOids = new List<int>();
            IFeatureIndex indexer = new FeatureIndexClass();
            try
            {
                indexer.FeatureClass = featureClass;
                indexer.Index(null, ((IGeoDataset)featureClass).Extent);

                IIndexQuery2 indexQuery = (IIndexQuery2)indexer;
                IFeatureCursor cursor = featureClass.Search(null, false);
                try
                {
                    IFeature feature = cursor.NextFeature();
                    while (feature != null)
                    {
                        try
                        {
                            object queriedIds;
                            indexQuery.IntersectedFeatures(feature.Shape, out queriedIds);
                            int[] idArray = queriedIds as int[];
                            if (idArray != null && idArray.Length > 1)
                            {
                                // Intersected features will include, source feature itself, and adjacent, non-overlapping features
                                // We need to check for both.

                                IRelationalOperator2 relationOp = feature.Shape as IRelationalOperator2;
                                for (int i = 0; i < idArray.Length; i++)
                                {
                                    if (idArray[i] == feature.OID)
                                        continue;

                                    if (relationOp.Overlaps(featureClass.GetFeature(idArray[i]).Shape))
                                    {
                                        overlappingOids.Add(feature.OID);
                                        break;
                                    }
                                }
                            }
                        }
                        finally
                        {
                            Marshal.ReleaseComObject(feature);
                        }
                        feature = cursor.NextFeature();
                    }
                }
                finally
                {
                    Marshal.ReleaseComObject(cursor);
                }
            }
            finally
            {
                Marshal.ReleaseComObject(indexer);
            }

            return overlappingOids;
        }

 

最后

以上就是狂野萝莉为你收集整理的ArcGIS Engine基础(28)之获取图层中在拓扑关系上自重合要素的两种方法的全部内容,希望文章能够帮你解决ArcGIS Engine基础(28)之获取图层中在拓扑关系上自重合要素的两种方法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(32)

评论列表共有 0 条评论

立即
投稿
返回
顶部