00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef GEOS_OP_CONNECTEDINTERIORTESTER_H
00021 #define GEOS_OP_CONNECTEDINTERIORTESTER_H
00022
00023 #include <geos/export.h>
00024
00025 #include <geos/geom/Coordinate.h>
00026 #include <geos/geom/GeometryFactory.h>
00027
00028 #include <vector>
00029
00030 #ifdef _MSC_VER
00031 #pragma warning(push)
00032 #pragma warning(disable: 4251) // warning C4251: needs to have dll-interface to be used by clients of class
00033 #endif
00034
00035
00036 namespace geos {
00037 namespace geom {
00038
00039 class Geometry;
00040 class CoordinateSequence;
00041 class GeometryFactory;
00042 class LineString;
00043 }
00044 namespace geomgraph {
00045 class GeometryGraph;
00046 class PlanarGraph;
00047 class EdgeRing;
00048 class DirectedEdge;
00049 class EdgeEnd;
00050 }
00051 }
00052
00053 namespace geos {
00054 namespace operation {
00055 namespace valid {
00056
00071 class GEOS_DLL ConnectedInteriorTester {
00072 public:
00073 ConnectedInteriorTester(geomgraph::GeometryGraph &newGeomGraph);
00074 ~ConnectedInteriorTester();
00075 geom::Coordinate& getCoordinate();
00076 bool isInteriorsConnected();
00077 static const geom::Coordinate& findDifferentPoint(
00078 const geom::CoordinateSequence *coord,
00079 const geom::Coordinate& pt);
00080
00081 protected:
00082
00083 void visitLinkedDirectedEdges(geomgraph::DirectedEdge *start);
00084
00085 private:
00086
00087 geom::GeometryFactory::unique_ptr geometryFactory;
00088
00089 geomgraph::GeometryGraph &geomGraph;
00090
00094 geom::Coordinate disconnectedRingcoord;
00095
00097 std::vector<geomgraph::EdgeRing*> maximalEdgeRings;
00098
00099 void setInteriorEdgesInResult(geomgraph::PlanarGraph &graph);
00100
00101
00113 void buildEdgeRings(std::vector<geomgraph::EdgeEnd*> *dirEdges,
00114 std::vector<geomgraph::EdgeRing*>& minEdgeRings);
00115
00120 void visitShellInteriors(const geom::Geometry *g, geomgraph::PlanarGraph &graph);
00121
00122 void visitInteriorRing(const geom::LineString *ring, geomgraph::PlanarGraph &graph);
00123
00134 bool hasUnvisitedShellEdge(std::vector<geomgraph::EdgeRing*> *edgeRings);
00135
00136
00137 ConnectedInteriorTester(const ConnectedInteriorTester& other);
00138 ConnectedInteriorTester& operator=(const ConnectedInteriorTester& rhs);
00139 };
00140
00141 }
00142 }
00143 }
00144
00145 #ifdef _MSC_VER
00146 #pragma warning(pop)
00147 #endif
00148
00149 #endif // GEOS_OP_CONNECTEDINTERIORTESTER_H