00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef GEOS_OP_OVERLAY_POLYGONBUILDER_H
00017 #define GEOS_OP_OVERLAY_POLYGONBUILDER_H
00018
00019 #include <vector>
00020
00021
00022 namespace geos {
00023 namespace geom {
00024 class Geometry;
00025 class Coordinate;
00026 class GeometryFactory;
00027 }
00028 namespace geomgraph {
00029 class EdgeRing;
00030 class Node;
00031 class PlanarGraph;
00032 class DirectedEdge;
00033 }
00034 namespace operation {
00035 namespace overlay {
00036 class MaximalEdgeRing;
00037 class MinimalEdgeRing;
00038 }
00039 }
00040 }
00041
00042 namespace geos {
00043 namespace operation {
00044 namespace overlay {
00045
00051 class PolygonBuilder {
00052 public:
00053
00054
00055 PolygonBuilder(const geom::GeometryFactory *newGeometryFactory);
00056
00057 ~PolygonBuilder();
00058
00064 void add(geomgraph::PlanarGraph *graph);
00065
00071 void add(const std::vector<geomgraph::DirectedEdge*> *dirEdges,
00072 const std::vector<geomgraph::Node*> *nodes);
00073
00074
00075 std::vector<geom::Geometry*>* getPolygons();
00076
00081 bool containsPoint(const geom::Coordinate& p);
00082
00083 private:
00084
00085 const geom::GeometryFactory *geometryFactory;
00086
00087 std::vector<geomgraph::EdgeRing*> shellList;
00088
00092 std::vector<MaximalEdgeRing*>* buildMaximalEdgeRings(
00093 const std::vector<geomgraph::DirectedEdge*> *dirEdges);
00094
00095 std::vector<MaximalEdgeRing*>* buildMinimalEdgeRings(
00096 std::vector<MaximalEdgeRing*> *maxEdgeRings,
00097 std::vector<geomgraph::EdgeRing*> *newShellList,
00098 std::vector<geomgraph::EdgeRing*> *freeHoleList);
00110 geomgraph::EdgeRing* findShell(std::vector<MinimalEdgeRing*>* minEdgeRings);
00111
00123 void placePolygonHoles(geomgraph::EdgeRing *shell,
00124 std::vector<MinimalEdgeRing*> *minEdgeRings);
00125
00133 void sortShellsAndHoles(std::vector<MaximalEdgeRing*> *edgeRings,
00134 std::vector<geomgraph::EdgeRing*> *newShellList,
00135 std::vector<geomgraph::EdgeRing*> *freeHoleList);
00136
00149 void placeFreeHoles(std::vector<geomgraph::EdgeRing*>& newShellList,
00150 std::vector<geomgraph::EdgeRing*>& freeHoleList);
00151
00170 geomgraph::EdgeRing* findEdgeRingContaining(geomgraph::EdgeRing *testEr,
00171 std::vector<geomgraph::EdgeRing*>& newShellList);
00172
00173 std::vector<geom::Geometry*>* computePolygons(
00174 std::vector<geomgraph::EdgeRing*>& newShellList);
00175
00181 };
00182
00183
00184
00185 }
00186 }
00187 }
00188
00189 #endif // ndef GEOS_OP_OVERLAY_POLYGONBUILDER_H
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204