/// <summary> /// Identifies each exterior ring as separate part, containing all its interior rings /// </summary> /// <param name="polygon"></param> /// <returns></returns> private static IEnumerable <GeometryPart> GetPolygonExteriorRingParts( [NotNull] IPolygon4 polygon) { // for all interior rings, assign to exterior ring's part // all exterior rings, add them to result if not yet added var partsByExteriorRing = new Dictionary <IRing, GeometryPart>(); var geometryCollection = (IGeometryCollection)polygon; for (var i = 0; i < geometryCollection.GeometryCount; i++) { var ring = (IRing)geometryCollection.Geometry[i]; if (ring.IsExterior) { partsByExteriorRing.Add(ring, new GeometryPart(ring)); } else { IRing exteriorRing = polygon.FindExteriorRing(ring); Assert.NotNull("No exterior ring found for inner ring"); GeometryPart part; if (!partsByExteriorRing.TryGetValue(exteriorRing, out part)) { part = new GeometryPart(exteriorRing); partsByExteriorRing.Add(exteriorRing, part); } part.AddInnerRingGeometry(ring); } } return(partsByExteriorRing.Values); }