internal static SharpMap.Geometries.MultiPolygon ToSharpMapMultiPolygon(GisSharpBlog.NetTopologySuite.Geometries.MultiPolygon multiPolygon) { SharpMap.Geometries.MultiPolygon collection = new SharpMap.Geometries.MultiPolygon(); foreach (GisSharpBlog.NetTopologySuite.Geometries.Polygon polygon in multiPolygon.Geometries) { collection.Polygons.Add(ToSharpMapPolygon(polygon)); } return(collection); }
public static GeoAPI.Geometries.IMultiPolygon ConvertTo(ESRI.ArcGIS.Geometry.IPolygon4 polygon) { GisSharpBlog.NetTopologySuite.Geometries.MultiPolygon output = null; List <GeoAPI.Geometries.IPolygon> list = new List <GeoAPI.Geometries.IPolygon>(); //IPolygon4.ExteriorRingBag should be used instead of IPolygon.QueryExteriorRings, //which does not work in .NET because of C-Style Arrays IGeometryBag exteriorRings = polygon.ExteriorRingBag; //For each exterior rings find the number of interior rings associated with it and print it IEnumGeometry exteriorRingsEnum = exteriorRings as IEnumGeometry; exteriorRingsEnum.Reset(); IRing currentExteriorRing = exteriorRingsEnum.Next() as IRing; while (currentExteriorRing != null) { GeoAPI.Geometries.ILinearRing shell = ConvertTo(currentExteriorRing); List <GeoAPI.Geometries.ILinearRing> holes = null; //IPolygon4.get_InteriorRingBag should be used instead of IPolygon.QueryInteriorRings, //which does not work in .NET because of C-Style Arrays IGeometryBag interiorRings = polygon.get_InteriorRingBag(currentExteriorRing); IGeometryCollection interiorRingCollection = interiorRings as IGeometryCollection; if (interiorRingCollection != null && interiorRingCollection.GeometryCount > 0) { holes = new List <GeoAPI.Geometries.ILinearRing>(); int interiorRingsTotal = interiorRingCollection.GeometryCount; for (int interiorRingIndex = 0; interiorRingIndex < interiorRingsTotal; interiorRingIndex++) { IRing currentInteriorRing = interiorRingCollection.get_Geometry(interiorRingIndex) as IRing; if (currentInteriorRing != null) { holes.Add(ConvertTo(currentInteriorRing)); } } ////Note we do nothing with the interiorRings, but you can use them the same way as the IGeometryBag exteriorRings //IRing currentInteriorRing = exteriorRingsEnum.Next() as IRing; //while (currentInteriorRing != null) //{ // holes.Add(ConvertTo(currentInteriorRing)); // currentInteriorRing = exteriorRingsEnum.Next() as IRing; //} } GeoAPI.Geometries.IPolygon entry; if (holes != null && holes.Count > 0) { entry = new GisSharpBlog.NetTopologySuite.Geometries.Polygon(shell, holes.ToArray()); } else { entry = new GisSharpBlog.NetTopologySuite.Geometries.Polygon(shell, null); } list.Add(entry); currentExteriorRing = exteriorRingsEnum.Next() as IRing; } if (list != null && list.Count > 0) { output = new GisSharpBlog.NetTopologySuite.Geometries.MultiPolygon(list.ToArray()); } return(output); }