GEOS  3.9.1dev
g/PolygonBuilder.h
Go to the documentation of this file.
1 /**********************************************************************
2  *
3  * GEOS - Geometry Engine Open Source
4  * http://geos.osgeo.org
5  *
6  * Copyright (C) 2020 Paul Ramsey <pramsey@cleverelephant.ca>
7  *
8  * This is free software; you can redistribute and/or modify it under
9  * the terms of the GNU Lesser General Public Licence as published
10  * by the Free Software Foundation.
11  * See the COPYING file for more information.
12  *
13  **********************************************************************/
14 
15 #pragma once
16 
17 #include <geos/export.h>
18 
19 #include <geos/geom/Polygon.h>
23 
24 #include <vector>
25 
26 
27 // Forward declarations
28 namespace geos {
29 namespace geom {
30 class GeometryFactory;
31 class Geometry;
32 class Polygon;
33 }
34 namespace operation {
35 namespace overlayng {
36 class Edge;
37 }
38 }
39 }
40 
41 namespace geos { // geos.
42 namespace operation { // geos.operation
43 namespace overlayng { // geos.operation.overlayng
44 
46 
47 private:
48 
49  // Members
51  std::vector<OverlayEdgeRing*> shellList;
52  std::vector<OverlayEdgeRing*> freeHoleList;
54 
55  // Storage
56  std::vector<std::unique_ptr<OverlayEdgeRing>> vecOER;
57 
58  std::vector<std::unique_ptr<geom::Polygon>> computePolygons(std::vector<OverlayEdgeRing*> shellList);
59 
60  void buildRings(std::vector<OverlayEdge*>& resultAreaEdges);
61 
62  void linkResultAreaEdgesMax(std::vector<OverlayEdge*>& resultEdges);
63 
67  std::vector<std::unique_ptr<MaximalEdgeRing>>
68  buildMaximalRings(std::vector<OverlayEdge*>& edges);
69 
75  std::vector<OverlayEdgeRing*> storeMinimalRings(std::vector<std::unique_ptr<OverlayEdgeRing>>& minRings);
76 
77  void buildMinimalRings(std::vector<std::unique_ptr<MaximalEdgeRing>>& maxRings);
78 
79  void assignShellsAndHoles(std::vector<OverlayEdgeRing*>& minRings);
80 
90  OverlayEdgeRing* findSingleShell(std::vector<OverlayEdgeRing*>& edgeRings) const;
91 
102  void assignHoles(OverlayEdgeRing* shell, std::vector<OverlayEdgeRing*>& edgeRings);
103 
104 
117  void placeFreeHoles(std::vector<OverlayEdgeRing*> shellList, std::vector<OverlayEdgeRing*> freeHoleList);
118 
119 
120 
121 public:
122 
123  PolygonBuilder(std::vector<OverlayEdge*>& resultAreaEdges, const geom::GeometryFactory* geomFact)
124  : geometryFactory(geomFact)
125  , isEnforcePolygonal(true)
126  {
127  buildRings(resultAreaEdges);
128  }
129 
130  PolygonBuilder(std::vector<OverlayEdge*>& resultAreaEdges, const geom::GeometryFactory* geomFact, bool p_isEnforcePolygonal)
131  : geometryFactory(geomFact)
132  , isEnforcePolygonal(p_isEnforcePolygonal)
133  {
134  buildRings(resultAreaEdges);
135  }
136 
137  PolygonBuilder(const PolygonBuilder&) = delete;
138  PolygonBuilder& operator=(const PolygonBuilder&) = delete;
139 
140  // Methods
141  std::vector<std::unique_ptr<geom::Polygon>> getPolygons();
142  std::vector<OverlayEdgeRing*> getShellRings();
143 
144 
145 };
146 
147 
148 } // namespace geos.operation.overlayng
149 } // namespace geos.operation
150 } // namespace geos
151 
std::vector< OverlayEdgeRing * > freeHoleList
std::vector< std::unique_ptr< OverlayEdgeRing > > vecOER
PolygonBuilder(std::vector< OverlayEdge * > &resultAreaEdges, const geom::GeometryFactory *geomFact, bool p_isEnforcePolygonal)
#define GEOS_DLL
Definition: export.h:28
PolygonBuilder(std::vector< OverlayEdge * > &resultAreaEdges, const geom::GeometryFactory *geomFact)
std::vector< OverlayEdgeRing * > shellList
Supplies a set of utility methods for building Geometry objects from CoordinateSequence or other Geom...
Basic namespace for all GEOS functionalities.
const geom::GeometryFactory * geometryFactory