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 #ifdef _MSC_VER
00028 #pragma warning(push)
00029 #pragma warning(disable: 4251) // warning C4251: needs to have dll-interface to be used by clients of class
00030 #endif
00031
00032
00033 namespace geos {
00034 namespace geom {
00035 class Geometry;
00036 class Coordinate;
00037 class GeometryFactory;
00038 }
00039 namespace geomgraph {
00040 class EdgeRing;
00041 class Node;
00042 class PlanarGraph;
00043 class DirectedEdge;
00044 }
00045 namespace operation {
00046 namespace overlay {
00047 class MaximalEdgeRing;
00048 class MinimalEdgeRing;
00049 }
00050 }
00051 }
00052
00053 namespace geos {
00054 namespace operation {
00055 namespace overlay {
00056
00062 class GEOS_DLL PolygonBuilder {
00063 public:
00064
00065 PolygonBuilder(const geom::GeometryFactory *newGeometryFactory);
00066
00067 ~PolygonBuilder();
00068
00074 void add(geomgraph::PlanarGraph *graph);
00075
00076
00082 void add(const std::vector<geomgraph::DirectedEdge*> *dirEdges,
00083 const std::vector<geomgraph::Node*> *nodes);
00084
00085
00086 std::vector<geom::Geometry*>* getPolygons();
00087
00092 bool containsPoint(const geom::Coordinate& p);
00093
00094 private:
00095
00096 const geom::GeometryFactory *geometryFactory;
00097
00098 std::vector<geomgraph::EdgeRing*> shellList;
00099
00107 void buildMaximalEdgeRings(
00108 const std::vector<geomgraph::DirectedEdge*> *dirEdges,
00109 std::vector<MaximalEdgeRing*> &maxEdgeRings);
00110
00111
00112 void buildMinimalEdgeRings(
00113 std::vector<MaximalEdgeRing*> &maxEdgeRings,
00114 std::vector<geomgraph::EdgeRing*> &newShellList,
00115 std::vector<geomgraph::EdgeRing*> &freeHoleList,
00116 std::vector<MaximalEdgeRing*> &edgeRings);
00117
00129 geomgraph::EdgeRing* findShell(std::vector<MinimalEdgeRing*>* minEdgeRings);
00130
00142 void placePolygonHoles(geomgraph::EdgeRing *shell,
00143 std::vector<MinimalEdgeRing*> *minEdgeRings);
00144
00152 void sortShellsAndHoles(std::vector<MaximalEdgeRing*> &edgeRings,
00153 std::vector<geomgraph::EdgeRing*> &newShellList,
00154 std::vector<geomgraph::EdgeRing*> &freeHoleList);
00155
00170 void placeFreeHoles(std::vector<geomgraph::EdgeRing*>& newShellList,
00171 std::vector<geomgraph::EdgeRing*>& freeHoleList);
00172
00173
00192 geomgraph::EdgeRing* findEdgeRingContaining(geomgraph::EdgeRing *testEr,
00193 std::vector<geomgraph::EdgeRing*>& newShellList);
00194
00195 std::vector<geom::Geometry*>* computePolygons(
00196 std::vector<geomgraph::EdgeRing*>& newShellList);
00197
00203 };
00204
00205 }
00206 }
00207 }
00208
00209 #ifdef _MSC_VER
00210 #pragma warning(pop)
00211 #endif
00212
00213 #endif // ndef GEOS_OP_OVERLAY_POLYGONBUILDER_H
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228