00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef GEOS_OP_OVERLAY_POLYGONBUILDER_H
00021 #define GEOS_OP_OVERLAY_POLYGONBUILDER_H
00022
00023 #include <geos/export.h>
00024
00025 #include <vector>
00026
00027
00028 namespace geos {
00029 namespace geom {
00030 class Geometry;
00031 class Coordinate;
00032 class GeometryFactory;
00033 }
00034 namespace geomgraph {
00035 class EdgeRing;
00036 class Node;
00037 class PlanarGraph;
00038 class DirectedEdge;
00039 }
00040 namespace operation {
00041 namespace overlay {
00042 class MaximalEdgeRing;
00043 class MinimalEdgeRing;
00044 }
00045 }
00046 }
00047
00048 namespace geos {
00049 namespace operation {
00050 namespace overlay {
00051
00057 class GEOS_DLL PolygonBuilder {
00058 public:
00059
00060 PolygonBuilder(const geom::GeometryFactory *newGeometryFactory);
00061
00062 ~PolygonBuilder();
00063
00069 void add(geomgraph::PlanarGraph *graph);
00070
00071
00077 void add(const std::vector<geomgraph::DirectedEdge*> *dirEdges,
00078 const std::vector<geomgraph::Node*> *nodes);
00079
00080
00081 std::vector<geom::Geometry*>* getPolygons();
00082
00087 bool containsPoint(const geom::Coordinate& p);
00088
00089 private:
00090
00091 const geom::GeometryFactory *geometryFactory;
00092
00093 std::vector<geomgraph::EdgeRing*> shellList;
00094
00101 std::vector<MaximalEdgeRing*>* buildMaximalEdgeRings(
00102 const std::vector<geomgraph::DirectedEdge*> *dirEdges);
00103
00104
00105 std::vector<MaximalEdgeRing*>* buildMinimalEdgeRings(
00106 std::vector<MaximalEdgeRing*> *maxEdgeRings,
00107 std::vector<geomgraph::EdgeRing*> *newShellList,
00108 std::vector<geomgraph::EdgeRing*> *freeHoleList);
00120 geomgraph::EdgeRing* findShell(std::vector<MinimalEdgeRing*>* minEdgeRings);
00121
00133 void placePolygonHoles(geomgraph::EdgeRing *shell,
00134 std::vector<MinimalEdgeRing*> *minEdgeRings);
00135
00143 void sortShellsAndHoles(std::vector<MaximalEdgeRing*> *edgeRings,
00144 std::vector<geomgraph::EdgeRing*> *newShellList,
00145 std::vector<geomgraph::EdgeRing*> *freeHoleList);
00146
00161 void placeFreeHoles(std::vector<geomgraph::EdgeRing*>& newShellList,
00162 std::vector<geomgraph::EdgeRing*>& freeHoleList);
00163
00164
00183 geomgraph::EdgeRing* findEdgeRingContaining(geomgraph::EdgeRing *testEr,
00184 std::vector<geomgraph::EdgeRing*>& newShellList);
00185
00186 std::vector<geom::Geometry*>* computePolygons(
00187 std::vector<geomgraph::EdgeRing*>& newShellList);
00188
00194 };
00195
00196
00197
00198 }
00199 }
00200 }
00201
00202 #endif // ndef GEOS_OP_OVERLAY_POLYGONBUILDER_H
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217