PROBLEM
When exploding a multipart polygon using ArcObjects, the inner polygon (donut or island) is eliminated from the sketch. This article describes how to retain the geometry of inner polygons.
IMap map = ArcMap.Document.FocusMap;
ILayer layer = map.Layer[0];
IFeatureLayer featureLayer = layer as FeatureLayer;
IFeatureClass featureClass = featureLayer.FeatureClass;
IFeature feature = featureClass.GetFeature(0); // Feature with holes in it
IGeometry geometry = feature.Shape;
IArea areaPolygon = geometry as IArea;
double areaPolygon_value = areaPolygon.Area;
System.Diagnostics.Debug.WriteLine(" ORIGINAL MULTIPART POLYGON ");
System.Diagnostics.Debug.WriteLine("areaPolygon_value = " + areaPolygon_value);
IPolygon4 polygon4 = geometry as IPolygon4;
IGeometryBag geometryBag = polygon4.ExteriorRingBag;
IGeometryCollection geometryCollection_Outer = geometryBag as IGeometryCollection;
for (int i = 0; i < geometryCollection_Outer.GeometryCount; i++) // For each EXTERIOR ring, compute area of INTERIOR rings inside that exterior ring
{
geometry_OuterRing_Array[i] = geometryCollection_Outer.Geometry[i]; // get the exterior ring
// Create a new geometry collection for each outer ring, and add to it the outer ring, and all the inner rings it contains
Polygon polygon_OUTER_and_INNER_rings = new Polygon();
IGeometryCollection geometryCollection_OUTER_and_INNER_rings = polygon_OUTER_and_INNER_rings as IGeometryCollection;
geometryCollection_OUTER_and_INNER_rings.AddGeometry(geometry_OuterRing_Array[i]);
System.Diagnostics.Debug.WriteLine("---------- EXTERIOR RING[" + i + "] ------------------");
IGeometryBag geometryBag_Inner = polygon4.get_InteriorRingBag(geometry_OuterRing_Array[i] as IRing); // get interior rings
IGeometryCollection geometryCollection_Inner = geometryBag_Inner as IGeometryCollection;
int interiorRingCount = polygon4.get_InteriorRingCount(geometry_OuterRing_Array[i] as IRing);
System.Diagnostics.Debug.WriteLine("interiorRingCount = " + interiorRingCount);
int interiorRingCount2 = geometryCollection_Inner.GeometryCount; // this is a check to make sure the two counts are equal
System.Diagnostics.Debug.WriteLine("interiorRingCount2 = " + interiorRingCount2);
IGeometry geometry_InnerRing = null;
for (int j = 0; j < geometryCollection_Inner.GeometryCount; j++) // Compute Area of interior rings
{
geometry_InnerRing = geometryCollection_Inner.Geometry[j];
IArea area_InnerRing = geometry_InnerRing as IArea;
double area_InnerRing_Value = area_InnerRing.Area;
System.Diagnostics.Debug.WriteLine("area_InnerRing_Value[" + j + "] = " + area_InnerRing_Value);
geometryCollection_OUTER_and_INNER_rings.AddGeometry(geometry_InnerRing);
}
// construct a polygon
IGeometry geometry_Polygon_OUTER_and_INNER_rings = geometryCollection_OUTER_and_INNER_rings as IGeometry;
polygon_OUTER_and_INNER_rings = geometry_Polygon_OUTER_and_INNER_rings as Polygon;
IArea area_Polygon_OUTER_and_INNER_rings = polygon_OUTER_and_INNER_rings as IArea;
double AREA_VALUE_Polygon_OUTER_and_INNER_rings = area_Polygon_OUTER_and_INNER_rings.Area;
System.Diagnostics.Debug.WriteLine(" MULTIPART FEATURE [" + i + "] ");
System.Diagnostics.Debug.WriteLine("AREA_VALUE_Polygon_OUTER_and_INNER_rings[" + i + "] = " + AREA_VALUE_Polygon_OUTER_and_INNER_rings);
TotalAreaOfMultiPartFeature += AREA_VALUE_Polygon_OUTER_and_INNER_rings;
}
Article ID: 000015810
Get help from ArcGIS experts
Start chatting now