00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef GEOS_GEOMGRAPH_GEOMETRYGRAPH_H
00023 #define GEOS_GEOMGRAPH_GEOMETRYGRAPH_H
00024
00025 #include <geos/export.h>
00026 #include <map>
00027 #include <vector>
00028 #include <memory>
00029
00030 #include <geos/geom/Coordinate.h>
00031 #include <geos/geom/CoordinateSequence.h>
00032 #include <geos/geomgraph/PlanarGraph.h>
00033 #include <geos/geom/LineString.h>
00034
00035 #include <geos/inline.h>
00036
00037 #ifdef _MSC_VER
00038 #pragma warning(push)
00039 #pragma warning(disable: 4251) // warning C4251: needs to have dll-interface to be used by clients of class
00040 #endif
00041
00042
00043 namespace geos {
00044 namespace geom {
00045 class LineString;
00046 class LinearRing;
00047 class Polygon;
00048 class Geometry;
00049 class GeometryCollection;
00050 class Point;
00051 }
00052 namespace algorithm {
00053 class LineIntersector;
00054 class BoundaryNodeRule;
00055 }
00056 namespace geomgraph {
00057 class Edge;
00058 class Node;
00059 namespace index {
00060 class SegmentIntersector;
00061 class EdgeSetIntersector;
00062 }
00063 }
00064 }
00065
00066 namespace geos {
00067 namespace geomgraph {
00068
00072 class GEOS_DLL GeometryGraph: public PlanarGraph
00073 {
00074 using PlanarGraph::add;
00075 using PlanarGraph::findEdge;
00076
00077 private:
00078
00079 const geom::Geometry* parentGeom;
00080
00089
00090 std::map<const geom::LineString*, Edge*> lineEdgeMap;
00091
00096 bool useBoundaryDeterminationRule;
00097
00098 const algorithm::BoundaryNodeRule& boundaryNodeRule;
00099
00104 int argIndex;
00105
00107 std::auto_ptr< geom::CoordinateSequence > boundaryPoints;
00108
00109 std::auto_ptr< std::vector<Node*> > boundaryNodes;
00110
00111 bool hasTooFewPointsVar;
00112
00113 geom::Coordinate invalidPoint;
00114
00116 index::EdgeSetIntersector* createEdgeSetIntersector();
00117
00118 void add(const geom::Geometry *g);
00119
00120
00121 void addCollection(const geom::GeometryCollection *gc);
00122
00123 void addPoint(const geom::Point *p);
00124
00125 void addPolygonRing(const geom::LinearRing *lr,
00126 int cwLeft, int cwRight);
00127
00128 void addPolygon(const geom::Polygon *p);
00129
00130 void addLineString(const geom::LineString *line);
00131
00132 void insertPoint(int argIndex, const geom::Coordinate& coord,
00133 int onLocation);
00134
00142 void insertBoundaryPoint(int argIndex, const geom::Coordinate& coord);
00143
00144 void addSelfIntersectionNodes(int argIndex);
00145
00153 void addSelfIntersectionNode(int argIndex,
00154 const geom::Coordinate& coord, int loc);
00155
00156
00157 GeometryGraph(const GeometryGraph& other);
00158 GeometryGraph& operator=(const GeometryGraph& rhs);
00159
00160 public:
00161
00162 static bool isInBoundary(int boundaryCount);
00163
00164 static int determineBoundary(int boundaryCount);
00165
00166 static int determineBoundary(
00167 const algorithm::BoundaryNodeRule& boundaryNodeRule,
00168 int boundaryCount);
00169
00170 GeometryGraph();
00171
00172 GeometryGraph(int newArgIndex, const geom::Geometry *newParentGeom);
00173
00174 GeometryGraph(int newArgIndex, const geom::Geometry *newParentGeom,
00175 const algorithm::BoundaryNodeRule& boundaryNodeRule);
00176
00177 virtual ~GeometryGraph();
00178
00179
00180 const geom::Geometry* getGeometry();
00181
00183 std::vector<Node*>* getBoundaryNodes();
00184
00185 void getBoundaryNodes(std::vector<Node*>&bdyNodes);
00186
00188 geom::CoordinateSequence* getBoundaryPoints();
00189
00190 Edge* findEdge(const geom::LineString *line);
00191
00192 void computeSplitEdges(std::vector<Edge*> *edgelist);
00193
00194 void addEdge(Edge *e);
00195
00196 void addPoint(geom::Coordinate& pt);
00197
00213 index::SegmentIntersector* computeSelfNodes(
00214 algorithm::LineIntersector *li,
00215 bool computeRingSelfNodes);
00216
00217
00218
00219 index::SegmentIntersector* computeSelfNodes(
00220 algorithm::LineIntersector& li,
00221 bool computeRingSelfNodes);
00222
00223 index::SegmentIntersector* computeEdgeIntersections(GeometryGraph *g,
00224 algorithm::LineIntersector *li, bool includeProper);
00225
00226 std::vector<Edge*> *getEdges();
00227
00228 bool hasTooFewPoints();
00229
00230 const geom::Coordinate& getInvalidPoint();
00231
00232 const algorithm::BoundaryNodeRule& getBoundaryNodeRule() const
00233 { return boundaryNodeRule; }
00234
00235 };
00236
00237
00238 }
00239 }
00240
00241 #ifdef _MSC_VER
00242 #pragma warning(pop)
00243 #endif
00244
00245 #ifdef GEOS_INLINE
00246 # include "geos/geomgraph/GeometryGraph.inl"
00247 #endif
00248
00249 #endif // ifndef GEOS_GEOMGRAPH_GEOMETRYGRAPH_H