00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef GEOS_OP_OVERLAY_POLYGONBUILDER_H
00020 #define GEOS_OP_OVERLAY_POLYGONBUILDER_H
00021
00022 #include <geos/export.h>
00023
00024 #include <vector>
00025
00026 #ifdef _MSC_VER
00027 #pragma warning(push)
00028 #pragma warning(disable: 4251) // warning C4251: needs to have dll-interface to be used by clients of class
00029 #endif
00030
00031
00032 namespace geos {
00033 namespace geom {
00034 class Geometry;
00035 class Coordinate;
00036 class GeometryFactory;
00037 }
00038 namespace geomgraph {
00039 class EdgeRing;
00040 class Node;
00041 class PlanarGraph;
00042 class DirectedEdge;
00043 }
00044 namespace operation {
00045 namespace overlay {
00046 class MaximalEdgeRing;
00047 class MinimalEdgeRing;
00048 }
00049 }
00050 }
00051
00052 namespace geos {
00053 namespace operation {
00054 namespace overlay {
00055
00061 class GEOS_DLL PolygonBuilder {
00062 public:
00063
00064 PolygonBuilder(const geom::GeometryFactory *newGeometryFactory);
00065
00066 ~PolygonBuilder();
00067
00073 void add(geomgraph::PlanarGraph *graph);
00074
00075
00081 void add(const std::vector<geomgraph::DirectedEdge*> *dirEdges,
00082 const std::vector<geomgraph::Node*> *nodes);
00083
00084
00085 std::vector<geom::Geometry*>* getPolygons();
00086
00091 bool containsPoint(const geom::Coordinate& p);
00092
00093 private:
00094
00095 const geom::GeometryFactory *geometryFactory;
00096
00097 std::vector<geomgraph::EdgeRing*> shellList;
00098
00106 void buildMaximalEdgeRings(
00107 const std::vector<geomgraph::DirectedEdge*> *dirEdges,
00108 std::vector<MaximalEdgeRing*> &maxEdgeRings);
00109
00110
00111 void buildMinimalEdgeRings(
00112 std::vector<MaximalEdgeRing*> &maxEdgeRings,
00113 std::vector<geomgraph::EdgeRing*> &newShellList,
00114 std::vector<geomgraph::EdgeRing*> &freeHoleList,
00115 std::vector<MaximalEdgeRing*> &edgeRings);
00116
00128 geomgraph::EdgeRing* findShell(std::vector<MinimalEdgeRing*>* minEdgeRings);
00129
00141 void placePolygonHoles(geomgraph::EdgeRing *shell,
00142 std::vector<MinimalEdgeRing*> *minEdgeRings);
00143
00151 void sortShellsAndHoles(std::vector<MaximalEdgeRing*> &edgeRings,
00152 std::vector<geomgraph::EdgeRing*> &newShellList,
00153 std::vector<geomgraph::EdgeRing*> &freeHoleList);
00154
00169 void placeFreeHoles(std::vector<geomgraph::EdgeRing*>& newShellList,
00170 std::vector<geomgraph::EdgeRing*>& freeHoleList);
00171
00172
00191 geomgraph::EdgeRing* findEdgeRingContaining(geomgraph::EdgeRing *testEr,
00192 std::vector<geomgraph::EdgeRing*>& newShellList);
00193
00194 std::vector<geom::Geometry*>* computePolygons(
00195 std::vector<geomgraph::EdgeRing*>& newShellList);
00196
00202 };
00203
00204 }
00205 }
00206 }
00207
00208 #ifdef _MSC_VER
00209 #pragma warning(pop)
00210 #endif
00211
00212 #endif // ndef GEOS_OP_OVERLAY_POLYGONBUILDER_H