GEOS
3.6.2
|
00001 /********************************************************************** 00002 * 00003 * GEOS - Geometry Engine Open Source 00004 * http://geos.osgeo.org 00005 * 00006 * Copyright (C) 2011 Sandro Santilli <strk@keybit.net> 00007 * Copyright (C) 2005-2006 Refractions Research Inc. 00008 * Copyright (C) 2001-2002 Vivid Solutions Inc. 00009 * 00010 * This is free software; you can redistribute and/or modify it under 00011 * the terms of the GNU Lesser General Public Licence as published 00012 * by the Free Software Foundation. 00013 * See the COPYING file for more information. 00014 * 00015 ********************************************************************** 00016 * 00017 * Last port: geomgraph/GeometryGraph.java r428 (JTS-1.12+) 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> // for auto_ptr<CoordinateSequence> 00032 #include <geos/geomgraph/PlanarGraph.h> 00033 #include <geos/geom/LineString.h> // for LineStringLT 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 // Forward declarations 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 class Envelope; 00052 } 00053 namespace algorithm { 00054 class LineIntersector; 00055 class BoundaryNodeRule; 00056 } 00057 namespace geomgraph { 00058 class Edge; 00059 class Node; 00060 namespace index { 00061 class SegmentIntersector; 00062 class EdgeSetIntersector; 00063 } 00064 } 00065 } 00066 00067 namespace geos { 00068 namespace geomgraph { // geos.geomgraph 00069 00073 class GEOS_DLL GeometryGraph: public PlanarGraph 00074 { 00075 using PlanarGraph::add; 00076 using PlanarGraph::findEdge; 00077 00078 private: 00079 00080 const geom::Geometry* parentGeom; 00081 00090 //std::map<const geom::LineString*,Edge*,geom::LineStringLT> lineEdgeMap; 00091 std::map<const geom::LineString*, Edge*> lineEdgeMap; 00092 00097 bool useBoundaryDeterminationRule; 00098 00099 const algorithm::BoundaryNodeRule& boundaryNodeRule; 00100 00105 int argIndex; 00106 00108 std::auto_ptr< geom::CoordinateSequence > boundaryPoints; 00109 00110 std::auto_ptr< std::vector<Node*> > boundaryNodes; 00111 00112 bool hasTooFewPointsVar; 00113 00114 geom::Coordinate invalidPoint; 00115 00117 index::EdgeSetIntersector* createEdgeSetIntersector(); 00118 00119 void add(const geom::Geometry *g); 00120 // throw(UnsupportedOperationException); 00121 00122 void addCollection(const geom::GeometryCollection *gc); 00123 00124 void addPoint(const geom::Point *p); 00125 00126 void addPolygonRing(const geom::LinearRing *lr, 00127 int cwLeft, int cwRight); 00128 00129 void addPolygon(const geom::Polygon *p); 00130 00131 void addLineString(const geom::LineString *line); 00132 00133 void insertPoint(int argIndex, const geom::Coordinate& coord, 00134 int onLocation); 00135 00143 void insertBoundaryPoint(int argIndex, const geom::Coordinate& coord); 00144 00145 void addSelfIntersectionNodes(int argIndex); 00146 00154 void addSelfIntersectionNode(int argIndex, 00155 const geom::Coordinate& coord, int loc); 00156 00157 // Declare type as noncopyable 00158 GeometryGraph(const GeometryGraph& other); 00159 GeometryGraph& operator=(const GeometryGraph& rhs); 00160 00161 public: 00162 00163 static bool isInBoundary(int boundaryCount); 00164 00165 static int determineBoundary(int boundaryCount); 00166 00167 static int determineBoundary( 00168 const algorithm::BoundaryNodeRule& boundaryNodeRule, 00169 int boundaryCount); 00170 00171 GeometryGraph(); 00172 00173 GeometryGraph(int newArgIndex, const geom::Geometry *newParentGeom); 00174 00175 GeometryGraph(int newArgIndex, const geom::Geometry *newParentGeom, 00176 const algorithm::BoundaryNodeRule& boundaryNodeRule); 00177 00178 virtual ~GeometryGraph(); 00179 00180 00181 const geom::Geometry* getGeometry(); 00182 00184 std::vector<Node*>* getBoundaryNodes(); 00185 00186 void getBoundaryNodes(std::vector<Node*>&bdyNodes); 00187 00189 geom::CoordinateSequence* getBoundaryPoints(); 00190 00191 Edge* findEdge(const geom::LineString *line); 00192 00193 void computeSplitEdges(std::vector<Edge*> *edgelist); 00194 00195 void addEdge(Edge *e); 00196 00197 void addPoint(geom::Coordinate& pt); 00198 00214 index::SegmentIntersector* computeSelfNodes( 00215 algorithm::LineIntersector *li, 00216 bool computeRingSelfNodes, 00217 const geom::Envelope *env=0) 00218 { 00219 return computeSelfNodes(*li, computeRingSelfNodes, env); 00220 } 00221 00222 index::SegmentIntersector* computeSelfNodes( 00223 algorithm::LineIntersector *li, 00224 bool computeRingSelfNodes, 00225 bool isDoneIfProperInt, 00226 const geom::Envelope *env=0) 00227 { 00228 return computeSelfNodes(*li, computeRingSelfNodes, isDoneIfProperInt, env); 00229 } 00230 00231 // Quick inline calling the function above, the above should probably 00232 // be deprecated. 00233 index::SegmentIntersector* computeSelfNodes( 00234 algorithm::LineIntersector& li, 00235 bool computeRingSelfNodes, const geom::Envelope *env=0); 00236 00237 index::SegmentIntersector* computeSelfNodes( 00238 algorithm::LineIntersector& li, 00239 bool computeRingSelfNodes, bool isDoneIfProperInt, const geom::Envelope *env=0); 00240 00241 index::SegmentIntersector* computeEdgeIntersections(GeometryGraph *g, 00242 algorithm::LineIntersector *li, bool includeProper, 00243 const geom::Envelope *env=0); 00244 00245 std::vector<Edge*> *getEdges(); 00246 00247 bool hasTooFewPoints(); 00248 00249 const geom::Coordinate& getInvalidPoint(); 00250 00251 const algorithm::BoundaryNodeRule& getBoundaryNodeRule() const 00252 { return boundaryNodeRule; } 00253 00254 }; 00255 00256 00257 } // namespace geos.geomgraph 00258 } // namespace geos 00259 00260 #ifdef _MSC_VER 00261 #pragma warning(pop) 00262 #endif 00263 00264 #ifdef GEOS_INLINE 00265 # include "geos/geomgraph/GeometryGraph.inl" 00266 #endif 00267 00268 #endif // ifndef GEOS_GEOMGRAPH_GEOMETRYGRAPH_H