00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef GEOS_OP_OVERLAY_OVERLAYOP_H
00020 #define GEOS_OP_OVERLAY_OVERLAYOP_H
00021
00022 #include <geos/export.h>
00023
00024 #include <geos/operation/GeometryGraphOperation.h>
00025 #include <geos/geomgraph/EdgeList.h>
00026 #include <geos/algorithm/PointLocator.h>
00027 #include <geos/geomgraph/PlanarGraph.h>
00028
00029 #include <vector>
00030
00031 #ifdef _MSC_VER
00032 #pragma warning(push)
00033 #pragma warning(disable: 4251) // warning C4251: needs to have dll-interface to be used by clients of class
00034 #endif
00035
00036
00037 namespace geos {
00038 namespace geom {
00039 class Geometry;
00040 class Coordinate;
00041 class Envelope;
00042 class GeometryFactory;
00043 class Polygon;
00044 class LineString;
00045 class Point;
00046 }
00047 namespace geomgraph {
00048 class Label;
00049 class Edge;
00050 class Node;
00051 }
00052 namespace operation {
00053 namespace overlay {
00054 class ElevationMatrix;
00055 }
00056 }
00057 }
00058
00059 namespace geos {
00060 namespace operation {
00061 namespace overlay {
00062
00064
00068 class GEOS_DLL OverlayOp: public GeometryGraphOperation {
00069
00070 public:
00071
00073
00077 enum OpCode {
00079 opINTERSECTION = 1,
00081 opUNION = 2,
00083 opDIFFERENCE = 3,
00085 opSYMDIFFERENCE = 4
00086 };
00087
00097 static geom::Geometry* overlayOp(const geom::Geometry *geom0,
00098 const geom::Geometry *geom1,
00099 OpCode opCode);
00100
00101
00114 static bool isResultOfOp(const geomgraph::Label& label, OpCode opCode);
00115
00117
00120 static bool isResultOfOp(int loc0, int loc1, OpCode opCode);
00121
00123
00127 OverlayOp(const geom::Geometry *g0, const geom::Geometry *g1);
00128
00129 virtual ~OverlayOp();
00130
00140 geom::Geometry* getResultGeometry(OpCode overlayOpCode);
00141
00142
00148 geomgraph::PlanarGraph& getGraph() { return graph; }
00149
00157 bool isCoveredByLA(const geom::Coordinate& coord);
00158
00165 bool isCoveredByA(const geom::Coordinate& coord);
00166
00167
00168
00169
00170
00171
00172 protected:
00173
00182 void insertUniqueEdge(geomgraph::Edge *e);
00183
00184 private:
00185
00186 algorithm::PointLocator ptLocator;
00187
00188 const geom::GeometryFactory *geomFact;
00189
00190 geom::Geometry *resultGeom;
00191
00192 geomgraph::PlanarGraph graph;
00193
00194 geomgraph::EdgeList edgeList;
00195
00196 std::vector<geom::Polygon*> *resultPolyList;
00197
00198 std::vector<geom::LineString*> *resultLineList;
00199
00200 std::vector<geom::Point*> *resultPointList;
00201
00202 void computeOverlay(OpCode opCode);
00203
00204 void insertUniqueEdges(std::vector<geomgraph::Edge*> *edges, const geom::Envelope *env=0);
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00226 void computeLabelsFromDepths();
00227
00232 void replaceCollapsedEdges();
00233
00244 void copyPoints(int argIndex, const geom::Envelope *env=0);
00245
00254 void computeLabelling();
00255
00263 void mergeSymLabels();
00264
00265 void updateNodeLabelling();
00266
00284 void labelIncompleteNodes();
00285
00289 void labelIncompleteNode(geomgraph::Node *n, int targetIndex);
00290
00302 void findResultAreaEdges(OpCode opCode);
00303
00308 void cancelDuplicateResultEdges();
00309
00314 bool isCovered(const geom::Coordinate& coord,
00315 std::vector<geom::Geometry*> *geomList);
00316
00321 bool isCovered(const geom::Coordinate& coord,
00322 std::vector<geom::Polygon*> *geomList);
00323
00328 bool isCovered(const geom::Coordinate& coord,
00329 std::vector<geom::LineString*> *geomList);
00330
00335 geom::Geometry* computeGeometry(
00336 std::vector<geom::Point*> *nResultPointList,
00337 std::vector<geom::LineString*> *nResultLineList,
00338 std::vector<geom::Polygon*> *nResultPolyList);
00339
00341 std::vector<geomgraph::Edge *>dupEdges;
00342
00347 int mergeZ(geomgraph::Node *n, const geom::Polygon *poly) const;
00348
00354 int mergeZ(geomgraph::Node *n, const geom::LineString *line) const;
00355
00359 double avgz[2];
00360 bool avgzcomputed[2];
00361
00362 double getAverageZ(int targetIndex);
00363 static double getAverageZ(const geom::Polygon *poly);
00364
00365 ElevationMatrix *elevationMatrix;
00366
00369 void checkObviouslyWrongResult(OpCode opCode);
00370
00371 };
00372
00376 struct overlayOp {
00377
00378 OverlayOp::OpCode opCode;
00379
00380 overlayOp(OverlayOp::OpCode code)
00381 :
00382 opCode(code)
00383 {}
00384
00385 geom::Geometry* operator() (const geom::Geometry* g0,
00386 const geom::Geometry* g1)
00387 {
00388 return OverlayOp::overlayOp(g0, g1, opCode);
00389 }
00390
00391 };
00392
00393 }
00394 }
00395 }
00396
00397 #ifdef _MSC_VER
00398 #pragma warning(pop)
00399 #endif
00400
00401 #endif // ndef GEOS_OP_OVERLAY_OVERLAYOP_H