ArcEngine统计与指定范围相交的要素面积之和

背景

统计与一个面相交的多边形面积之和,传统的方法是查询到所有相交要素,进行面积累加。这种方式在以接口方式提供服务时,就会出现性能方面的问题。实测9个500m*500m的范围,统计面积之和时,比较糟糕的状况下,时间竟然长达近60秒!这是不可忍受的。经排查,主要慢在查询得到要素游标后的while循环上,尤其是进行拓扑相关处理,非常耗时。转念一想,不妨采用统计的接口试试。发现效果非常理想。旧方法需要近20秒才能完成的工作,新接口只需要几百毫秒。以下是代码。

        private static double CalculatePercentage(double x, double y, double radius, ESRI.ArcGIS.Geodatabase.IFeatureClass targetFeatureClass)
        {
            if (targetFeatureClass.ShapeType != esriGeometryType.esriGeometryPolygon)
            {
                return 0;
            }
            List<GeoJSON.Net.Geometry.Point> lsPoint = new List<GeoJSON.Net.Geometry.Point> { new GeoJSON.Net.Geometry.Point(new GeoJSON.Net.Geometry.Position { X = x, Y = y }) };
            ESRI.ArcGIS.Geometry.IPolygon pPolygon = GeometryFactory.CreateEsriRectangle(lsPoint, true, radius);
            double dRectArea = (pPolygon as IArea).Area;
            double dEntityArea = 0;
            string sAreaFieldName = targetFeatureClass.FindField("Shape_Area") == -1 ? "Shape.Area" : "Shape_Area";
            ISpatialFilter pSpatialFilter = FilterFactory.CreateSpatialFilter(pPolygon, esriSpatialRelEnum.esriSpatialRelIntersects);
            pSpatialFilter.SubFields = sAreaFieldName;
            ICursor pCursor = (targetFeatureClass as ITable).Search(pSpatialFilter, true);
            IDataStatistics pDataStat = new DataStatisticsClass() { Cursor = pCursor, Field = sAreaFieldName };
            dEntityArea = pDataStat.Statistics.Sum;
            return dEntityArea * 100 / dRectArea;
        }

关键的地方就是那个IDataStatistics接口的调用。在研究过程中也发现,ArcGIS还有一个工具,可以实现相交导表,工具名称为Tabulate Intersection。可以调用GP工具实现它。

转载自:https://blog.csdn.net/a_dev/article/details/79657687

You may also like...