示例#1
0
        /// <summary>
        /// Performs the polygonization, if it has not already been carried out.
        /// </summary>
        private void Polygonize()
        {
            // check if already computed
            if (_polyList != null)
            {
                return;
            }

            _polyList = new List <IGeometry>();

            // if no geometries were supplied it's possible that graph is null
            if (_graph == null)
            {
                return;
            }

            _dangles  = _graph.DeleteDangles();
            _cutEdges = _graph.DeleteCutEdges();
            var edgeRingList = _graph.GetEdgeRings();

            var validEdgeRingList = new List <EdgeRing>();

            _invalidRingLines = new List <IGeometry>();
            FindValidRings(edgeRingList, validEdgeRingList, _invalidRingLines);

            FindShellsAndHoles(validEdgeRingList);
            AssignHolesToShells(_holeList, _shellList);

            _polyList = new List <IGeometry>();
            foreach (EdgeRing er in _shellList)
            {
                _polyList.Add(er.Polygon);
            }
        }
示例#2
0
        /// <summary>
        /// Performs the polygonization, if it has not already been carried out.
        /// </summary>
        private void Polygonize()
        {
            // check if already computed
            if (_polyList != null)
            {
                return;
            }

            _polyList = new List <IGeometry>();

            // if no geometries were supplied it's possible that graph is null
            if (_graph == null)
            {
                return;
            }

            _dangles  = _graph.DeleteDangles();
            _cutEdges = _graph.DeleteCutEdges();
            var edgeRingList = _graph.GetEdgeRings();

            IList <EdgeRing> validEdgeRingList = new List <EdgeRing>();

            _invalidRingLines = new List <IGeometry>();
            if (IsCheckingRingsValid)
            {
                FindValidRings(edgeRingList, validEdgeRingList, _invalidRingLines);
            }
            else
            {
                validEdgeRingList = edgeRingList;
            }

            FindShellsAndHoles(validEdgeRingList);
            AssignHolesToShells(_holeList, _shellList);
            // order the shells to make any subsequent processing deterministic
            _shellList.Sort(new EdgeRing.EnvelopeComparator());

            var includeAll = true;

            if (_extractOnlyPolygonal)
            {
                FindDisjointShells(_shellList);
                includeAll = false;
            }
            _polyList = ExtractPolygons(_shellList, includeAll);
        }