00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062 #ifndef GEOS_OPOVERLAY_H
00063 #define GEOS_OPOVERLAY_H
00064
00065 #include <memory>
00066 #include <string>
00067 #include <vector>
00068 #include <map>
00069 #include <geos/platform.h>
00070 #include <geos/operation.h>
00071 #include <geos/geomgraph.h>
00072 #include <geos/geosAlgorithm.h>
00073
00074 using namespace std;
00075
00076 namespace geos {
00077
00078
00079
00080
00081
00082 class OverlayOp: public GeometryGraphOperation {
00083 public:
00088 enum {
00089 INTERSECTION=1,
00090 UNION,
00091 DIFFERENCE,
00092 SYMDIFFERENCE
00093 };
00094 static Geometry* overlayOp(const Geometry *geom0, const Geometry *geom1,int opCode);
00095 static bool isResultOfOp(Label *label,int opCode);
00101 static bool isResultOfOp(int loc0,int loc1,int opCode);
00102 OverlayOp(const Geometry *g0, const Geometry *g1);
00103 virtual ~OverlayOp();
00104 Geometry* getResultGeometry(int funcCode);
00105 PlanarGraph* getGraph();
00111 bool isCoveredByLA(const Coordinate& coord);
00117 bool isCoveredByA(const Coordinate& coord);
00122 protected:
00130 void insertUniqueEdge(Edge *e);
00131 private:
00132 PointLocator *ptLocator;
00133 const GeometryFactory *geomFact;
00134 Geometry *resultGeom;
00135 PlanarGraph *graph;
00136 EdgeList *edgeList;
00137 vector<Polygon*> *resultPolyList;
00138 vector<LineString*> *resultLineList;
00139 vector<Point*> *resultPointList;
00140 void computeOverlay(int opCode);
00141 void insertUniqueEdges(vector<Edge*> *edges);
00148
00149
00160 void computeLabelsFromDepths();
00165 void replaceCollapsedEdges();
00175 void copyPoints(int argIndex);
00183 void computeLabelling();
00190 void mergeSymLabels();
00191 void updateNodeLabelling();
00207 void labelIncompleteNodes();
00211 void labelIncompleteNode(Node *n,int targetIndex);
00220 void findResultAreaEdges(int opCode);
00225 void cancelDuplicateResultEdges();
00226 bool isCovered(const Coordinate& coord,vector<Geometry*> *geomList);
00227 bool isCovered(const Coordinate& coord,vector<Polygon*> *geomList);
00228 bool isCovered(const Coordinate& coord,vector<LineString*> *geomList);
00229
00234 Geometry* computeGeometry(vector<Point*> *nResultPointList,
00235 vector<LineString*> *nResultLineList,
00236 vector<Polygon*> *nResultPolyList);
00237 };
00238
00239
00240
00241
00242
00243
00244
00245
00246 class MinimalEdgeRing: public EdgeRing {
00247 public:
00248 MinimalEdgeRing(DirectedEdge *start, const GeometryFactory *geometryFactory,CGAlgorithms *cga);
00249 virtual ~MinimalEdgeRing();
00250 DirectedEdge* getNext(DirectedEdge *de);
00251 void setEdgeRing(DirectedEdge *de,EdgeRing *er);
00252 };
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272 class MaximalEdgeRing: public EdgeRing {
00273 public:
00274 MaximalEdgeRing(DirectedEdge *start, const GeometryFactory *geometryFactory, CGAlgorithms *cga);
00275 virtual ~MaximalEdgeRing();
00276 DirectedEdge* getNext(DirectedEdge *de);
00277 void setEdgeRing(DirectedEdge* de,EdgeRing* er);
00278 vector<MinimalEdgeRing*>* buildMinimalRings();
00279 void linkDirectedEdgesForMinimalEdgeRings();
00280 };
00281
00282
00283
00284
00285 class PointBuilder {
00286 private:
00287 OverlayOp *op;
00288 const GeometryFactory *geometryFactory;
00289 PointLocator *ptLocator;
00290 vector<Node*>* collectNodes(int opCode);
00298 vector<Point*>* simplifyPoints(vector<Node*>* resultNodeList);
00299 public:
00300 PointBuilder(OverlayOp *newOp, const GeometryFactory *newGeometryFactory, PointLocator *newPtLocator);
00304 vector<Point*>* build(int opCode);
00305 };
00306
00307
00308
00309
00310
00311
00312 class LineBuilder {
00313 public:
00314 LineBuilder(OverlayOp *newOp, const GeometryFactory *newGeometryFactory, PointLocator *newPtLocator);
00315 ~LineBuilder();
00319 vector<LineString*>* build(int opCode);
00327 void collectLineEdge(DirectedEdge *de,int opCode,vector<Edge*>* edges);
00338 void collectBoundaryTouchEdge(DirectedEdge *de,int opCode,vector<Edge*>* edges);
00339 private:
00340 OverlayOp *op;
00341 const GeometryFactory *geometryFactory;
00342 PointLocator *ptLocator;
00343 vector<Edge*>* lineEdgesList;
00344 vector<LineString*>* resultLineList;
00345 void findCoveredLineEdges();
00346 void collectLines(int opCode);
00347 void buildLines(int opCode);
00348 void labelIsolatedLines(vector<Edge*> *edgesList);
00352 void labelIsolatedLine(Edge *e,int targetIndex);
00353 };
00354
00355
00356
00357
00358
00359
00360
00361 class PolygonBuilder {
00362 public:
00363 PolygonBuilder(const GeometryFactory *newGeometryFactory, CGAlgorithms *newCga);
00364 ~PolygonBuilder();
00370 void add(PlanarGraph *graph);
00376 void add(vector<DirectedEdge*> *dirEdges,vector<Node*> *nodes);
00377 vector<Geometry*>* getPolygons();
00378 bool containsPoint(Coordinate& p);
00379 private:
00380 const GeometryFactory *geometryFactory;
00381 CGAlgorithms *cga;
00382
00383
00384 vector<EdgeRing*> *shellList;
00388 vector<MaximalEdgeRing*>* buildMaximalEdgeRings(vector<DirectedEdge*> *dirEdges);
00389 vector<MaximalEdgeRing*>* buildMinimalEdgeRings(vector<MaximalEdgeRing*> *maxEdgeRings,
00390 vector<EdgeRing*> *newShellList,
00391 vector<EdgeRing*> *freeHoleList);
00402 EdgeRing* findShell(vector<MinimalEdgeRing*>* minEdgeRings);
00414 void placePolygonHoles(EdgeRing *shell,vector<MinimalEdgeRing*> *minEdgeRings);
00422 void sortShellsAndHoles(vector<MaximalEdgeRing*> *edgeRings,
00423 vector<EdgeRing*> *newShellList,
00424 vector<EdgeRing*> *freeHoleList);
00436 void placeFreeHoles(vector<EdgeRing*>* newShellList, vector<EdgeRing*> *freeHoleList);
00451 EdgeRing* findEdgeRingContaining(EdgeRing *testEr,vector<EdgeRing*> *newShellList);
00452 vector<Geometry*>* computePolygons(vector<EdgeRing*> *newShellList);
00458 };
00459
00460
00461
00462
00463
00464
00465
00466 class OverlayNodeFactory: public NodeFactory {
00467 public:
00468
00469 Node* createNode(Coordinate coord);
00470 };
00471
00472
00473
00474
00475
00476
00477
00478 class EdgeSetNoder {
00479 private:
00480 LineIntersector *li;
00481 vector<Edge*>* inputEdges;
00482 public:
00483 EdgeSetNoder(LineIntersector *newLi);
00484 ~EdgeSetNoder();
00485 void addEdges(vector<Edge*> *edges);
00486 vector<Edge*>* getNodedEdges();
00487 };
00488 }
00489 #endif