ArcEngine多要素合并
对于数据量比较大, 多要素合并,采用一个一个ITopologicalOperator.union的方法,速度太慢;
使用ITopologicalOperator.ConstructUnion方法可以很高效的合并多条要素
ITopologicalOperator.Union
/// <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
/// <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; }