ArcEngine多要素合并

对于数据量比较大, 多要素合并,采用一个一个ITopologicalOperator.union的方法,速度太慢;

使用ITopologicalOperator.ConstructUnion方法可以很高效的合并多条要素

ITopologicalOperator.Union

}FKP57UL2(RCZEZ6@CI5XST

/// <summary>
/// 多要素合并 ITopologicalOperator.Union
/// </summary>
/// <param name="pFeatureclass"></param>
/// <returns></returns>
private IPolygon UnionFeature2(IFeatureClass featureClass)
{
if (featureClass == null)
{ return null; }

//Stopwatch watch = new Stopwatch();
//watch.Start();

IPolygon unionPolygon = new PolygonClass();
ITopologicalOperator3 pTopo = null;
IFeatureCursor pFeatureCursor = featureClass.Search(null, false);
IFeature pFeature = pFeatureCursor.NextFeature();
while (pFeature != null)
{
pTopo = pFeature.ShapeCopy as ITopologicalOperator3;
unionPolygon = pTopo.Union(unionPolygon) as IPolygon;

pFeature = pFeatureCursor.NextFeature();
}
if (pFeatureCursor != null)
ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(pFeatureCursor);
//watch.Stop();
//MessageBox.Show(featureClass.FeatureCount(null) + "条要素合并,用时:" + watch.Elapsed.ToString());
return unionPolygon as IPolygon;
}

ITopologicalOperator.ConstructUnion

[WE7{N]@DJ]W7RQCY]H}ZQB

 

        /// <summary>
        ///  多要素合并 
        /// </summary>
        /// <param name="pFeatureclass"></param>
        /// <returns></returns>
        public IGeometry UnionFeature(IFeatureClass inFeatureClass)
        {
            if (inFeatureClass == null)
            { return null; }

            //Stopwatch watch = new Stopwatch();
            //watch.Start();

            //获取空间参考
            IGeometry geometryBag = new GeometryBagClass();
            IGeoDataset geoDataset = inFeatureClass as IGeoDataset;
            geometryBag.SpatialReference = geoDataset.SpatialReference;

            //属性过滤
            ISpatialFilter queryFilter = new SpatialFilterClass();
            queryFilter.SubFields = "Shape";
            IFeatureCursor featureCursor = inFeatureClass.Search(queryFilter, false);

            // 遍历游标
            IGeometryCollection geometryCollection = geometryBag as IGeometryCollection;
            IFeature currentFeature = featureCursor.NextFeature();
            object missing = Type.Missing;
            while (currentFeature != null)
            {
                geometryCollection.AddGeometry(currentFeature.Shape, ref missing, ref missing);
                currentFeature = featureCursor.NextFeature();
            }

            // 合并要素
            ITopologicalOperator unionedPolygon = null;
            if (inFeatureClass.ShapeType == esriGeometryType.esriGeometryPoint)
            {
                unionedPolygon = new Multipoint() as ITopologicalOperator;
                unionedPolygon.ConstructUnion(geometryCollection as IEnumGeometry);
            }
            else if (inFeatureClass.ShapeType == esriGeometryType.esriGeometryPolyline)
            {
                unionedPolygon = new Polyline() as ITopologicalOperator;
                unionedPolygon.ConstructUnion(geometryCollection as IEnumGeometry);
            }
            else
            {
                unionedPolygon = new Polygon() as ITopologicalOperator;
                unionedPolygon.ConstructUnion(geometryCollection as IEnumGeometry);
            }

            // watch.Stop();
            //MessageBox.Show(inFeatureClass.FeatureCount(null)+ "条要素合并,用时:" + watch.Elapsed.ToString());
            return unionedPolygon as IGeometry;

        }

 

posted @ 2018-12-15 23:52  ParanoiaApe  阅读(1374)  评论(0)    收藏  举报