/// <summary>  Converts a MultiPolygon to &lt;MultiPolygon Text&gt; 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);
            }
        }
Example #2
0
        /// <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);
                }
            }
        }
Example #3
0
        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);
        }