/// <summary> Converts a MultiPolygon to <MultiPolygon Text> format, /// then appends it to the writer. /// /// </summary> /// <param name="multiPolygon"> the MultiPolygon to process /// </param> /// <param name="writer"> the output writer to append to /// </param> private void AppendMultiPolygonText(MultiPolygon multiPolygon, int level, TextWriter writer) { if (multiPolygon.IsEmpty) { writer.Write(WktEmpty); } else { int level2 = level; bool doIndent = false; writer.Write(WktLParan); int nCount = multiPolygon.NumGeometries; for (int i = 0; i < nCount; i++) { if (i > 0) { writer.Write(WktComma); level2 = level + 1; doIndent = true; } AppendPolygonText((Polygon)multiPolygon.GetGeometry(i), level2, doIndent, writer); } writer.Write(WktRParan); } }
/// <summary> /// Mark all the edges for the edgeRings corresponding to the shells /// of the input polygons. /// Only ONE ring gets marked for each shell - if there are others which remain unmarked /// this indicates a disconnected interior. /// </summary> private void VisitShellInteriors(Geometry g, PlanarGraph graph) { GeometryType geomType = g.GeometryType; if (geomType == GeometryType.Polygon) { Polygon p = (Polygon)g; VisitInteriorRing(p.ExteriorRing, graph); } if (geomType == GeometryType.MultiPolygon) { MultiPolygon mp = (MultiPolygon)g; for (int i = 0; i < mp.NumGeometries; i++) { Polygon p = (Polygon)mp.GetGeometry(i); VisitInteriorRing(p.ExteriorRing, graph); } } }
private void CheckValid(MultiPolygon g) { for (int i = 0; i < g.NumGeometries; i++) { Polygon p = (Polygon)g.GetGeometry(i); CheckInvalidCoordinates(p); if (validErr != null) { return; } CheckClosedRings(p); if (validErr != null) { return; } } GeometryGraph graph = new GeometryGraph(0, g); CheckTooFewPoints(graph); if (validErr != null) { return; } CheckConsistentArea(graph); if (validErr != null) { return; } if (!isSelfTouchingRingFormingHoleValid) { CheckNoSelfIntersectingRings(graph); if (validErr != null) { return; } } for (int i = 0; i < g.NumGeometries; i++) { Polygon p = (Polygon)g.GetGeometry(i); CheckHolesInShell(p, graph); if (validErr != null) { return; } } for (int i = 0; i < g.NumGeometries; i++) { Polygon p = (Polygon)g.GetGeometry(i); CheckHolesNotNested(p, graph); if (validErr != null) { return; } } CheckShellsNotNested(g, graph); if (validErr != null) { return; } CheckConnectedInteriors(graph); }