GEOS  3.9.0dev
Polygonizer.h
1 /**********************************************************************
2  *
3  * GEOS - Geometry Engine Open Source
4  * http://geos.osgeo.org
5  *
6  * Copyright (C) 2010 Sandro Santilli <strk@kbt.io>
7  * Copyright (C) 2006 Refractions Research Inc.
8  * Copyright (C) 2001-2002 Vivid Solutions Inc.
9  *
10  * This is free software; you can redistribute and/or modify it under
11  * the terms of the GNU Lesser General Public Licence as published
12  * by the Free Software Foundation.
13  * See the COPYING file for more information.
14  *
15  **********************************************************************
16  *
17  * Last port: operation/polygonize/Polygonizer.java 0b3c7e3eb0d3e
18  *
19  **********************************************************************/
20 
21 #ifndef GEOS_OP_POLYGONIZE_POLYGONIZER_H
22 #define GEOS_OP_POLYGONIZE_POLYGONIZER_H
23 
24 #include <geos/export.h>
25 #include <geos/geom/Polygon.h>
26 #include <geos/geom/GeometryComponentFilter.h> // for LineStringAdder inheritance
27 #include <geos/operation/polygonize/PolygonizeGraph.h>
28 
29 #include <memory>
30 #include <vector>
31 
32 #ifdef _MSC_VER
33 #pragma warning(push)
34 #pragma warning(disable: 4251) // warning C4251: needs to have dll-interface to be used by clients of class
35 #endif
36 
37 // Forward declarations
38 namespace geos {
39 namespace geom {
40 class Geometry;
41 
42 class LineString;
43 
44 class Polygon;
45 }
46 namespace operation {
47 namespace polygonize {
48 class EdgeRing;
49 }
50 }
51 }
52 
53 namespace geos {
54 namespace operation { // geos::operation
55 namespace polygonize { // geos::operation::polygonize
56 
83 class GEOS_DLL Polygonizer {
84 private:
88  class GEOS_DLL LineStringAdder: public geom::GeometryComponentFilter {
89  public:
90  Polygonizer* pol;
91  explicit LineStringAdder(Polygonizer* p);
92  //void filter_rw(geom::Geometry *g);
93  void filter_ro(const geom::Geometry* g) override;
94  };
95 
96  // default factory
97  LineStringAdder lineStringAdder;
98 
104  void add(const geom::LineString* line);
105 
109  void polygonize();
110 
111  static void findValidRings(const std::vector<EdgeRing*>& edgeRingList,
112  std::vector<EdgeRing*>& validEdgeRingList,
113  std::vector<std::unique_ptr<geom::LineString>>& invalidRingList);
114 
115  void findShellsAndHoles(const std::vector<EdgeRing*>& edgeRingList);
116 
117  void findDisjointShells();
118 
119  static void findOuterShells(std::vector<EdgeRing*>& shellList);
120 
121  static std::vector<std::unique_ptr<geom::Polygon>> extractPolygons(std::vector<EdgeRing*> & shellList, bool includeAll);
122 
123  bool extractOnlyPolygonal;
124  bool computed;
125 
126 protected:
127 
128  std::unique_ptr<PolygonizeGraph> graph;
129 
130  // initialize with empty collections, in case nothing is computed
131  std::vector<const geom::LineString*> dangles;
132  std::vector<const geom::LineString*> cutEdges;
133  std::vector<std::unique_ptr<geom::LineString>> invalidRingLines;
134 
135  std::vector<EdgeRing*> holeList;
136  std::vector<EdgeRing*> shellList;
137  std::vector<std::unique_ptr<geom::Polygon>> polyList;
138 
139 public:
140 
147  explicit Polygonizer(bool onlyPolygonal = false);
148 
149  ~Polygonizer() = default;
150 
159  void add(std::vector<geom::Geometry*>* geomList);
160 
169  void add(std::vector<const geom::Geometry*>* geomList);
170 
179  void add(geom::Geometry* g);
180 
189  void add(const geom::Geometry* g);
190 
198  std::vector<std::unique_ptr<geom::Polygon>> getPolygons();
199 
207  const std::vector<const geom::LineString*>& getDangles();
208 
209  bool hasDangles();
210 
218  const std::vector<const geom::LineString*>& getCutEdges();
219 
220  bool hasCutEdges();
221 
230  const std::vector<std::unique_ptr<geom::LineString>>& getInvalidRingLines();
231 
232  bool hasInvalidRingLines();
233 
234  bool allInputsFormPolygons();
235 
236 // This seems to be needed by GCC 2.95.4
237  friend class Polygonizer::LineStringAdder;
238 };
239 
240 } // namespace geos::operation::polygonize
241 } // namespace geos::operation
242 } // namespace geos
243 
244 #ifdef _MSC_VER
245 #pragma warning(pop)
246 #endif
247 
248 #endif // GEOS_OP_POLYGONIZE_POLYGONIZER_H
Polygonizes a set of Geometrys which contain linework that represents the edges of a planar graph...
Definition: Polygonizer.h:83
Basic implementation of Geometry, constructed and destructed by GeometryFactory.
Definition: Geometry.h:188
Definition: LineString.h:68
Basic namespace for all GEOS functionalities.
Definition: IndexedNestedRingTester.h:26
Definition: GeometryComponentFilter.h:43