GEOS
3.4.2
|
00001 /********************************************************************** 00002 * 00003 * GEOS - Geometry Engine Open Source 00004 * http://geos.osgeo.org 00005 * 00006 * Copyright (C) 2006 Refractions Research Inc. 00007 * 00008 * This is free software; you can redistribute and/or modify it under 00009 * the terms of the GNU Lesser General Public Licence as published 00010 * by the Free Software Foundation. 00011 * See the COPYING file for more information. 00012 * 00013 *********************************************************************** 00014 * 00015 * Last port: operation/overlay/OverlayOp.java r567 (JTS-1.12+) 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> // for inheritance 00025 #include <geos/geomgraph/EdgeList.h> // for composition 00026 #include <geos/algorithm/PointLocator.h> // for composition 00027 #include <geos/geomgraph/PlanarGraph.h> // for inline (GeometryGraph->PlanarGraph) 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 // Forward declarations 00037 namespace geos { 00038 namespace geom { 00039 class Geometry; 00040 class Coordinate; 00041 class GeometryFactory; 00042 class Polygon; 00043 class LineString; 00044 class Point; 00045 } 00046 namespace geomgraph { 00047 class Label; 00048 class Edge; 00049 class Node; 00050 } 00051 namespace operation { 00052 namespace overlay { 00053 class ElevationMatrix; 00054 } 00055 } 00056 } 00057 00058 namespace geos { 00059 namespace operation { // geos::operation 00060 namespace overlay { // geos::operation::overlay 00061 00063 // 00067 class GEOS_DLL OverlayOp: public GeometryGraphOperation { 00068 00069 public: 00070 00072 // 00076 enum OpCode { 00078 opINTERSECTION = 1, 00080 opUNION = 2, 00082 opDIFFERENCE = 3, 00084 opSYMDIFFERENCE = 4 00085 }; 00086 00096 static geom::Geometry* overlayOp(const geom::Geometry *geom0, 00097 const geom::Geometry *geom1, 00098 OpCode opCode); 00099 //throw(TopologyException *); 00100 00113 static bool isResultOfOp(const geomgraph::Label& label, OpCode opCode); 00114 00116 // 00119 static bool isResultOfOp(int loc0, int loc1, OpCode opCode); 00120 00122 // 00126 OverlayOp(const geom::Geometry *g0, const geom::Geometry *g1); 00127 00128 virtual ~OverlayOp(); // FIXME: virtual ? 00129 00139 geom::Geometry* getResultGeometry(OpCode overlayOpCode); 00140 // throw(TopologyException *); 00141 00147 geomgraph::PlanarGraph& getGraph() { return graph; } 00148 00156 bool isCoveredByLA(const geom::Coordinate& coord); 00157 00164 bool isCoveredByA(const geom::Coordinate& coord); 00165 00166 /* 00167 * @return true if the coord is located in the interior or boundary of 00168 * a geometry in the list. 00169 */ 00170 00171 protected: 00172 00181 void insertUniqueEdge(geomgraph::Edge *e); 00182 00183 private: 00184 00185 algorithm::PointLocator ptLocator; 00186 00187 const geom::GeometryFactory *geomFact; 00188 00189 geom::Geometry *resultGeom; 00190 00191 geomgraph::PlanarGraph graph; 00192 00193 geomgraph::EdgeList edgeList; 00194 00195 std::vector<geom::Polygon*> *resultPolyList; 00196 00197 std::vector<geom::LineString*> *resultLineList; 00198 00199 std::vector<geom::Point*> *resultPointList; 00200 00201 void computeOverlay(OpCode opCode); // throw(TopologyException *); 00202 00203 void insertUniqueEdges(std::vector<geomgraph::Edge*> *edges); 00204 00205 /* 00206 * If either of the GeometryLocations for the existing label is 00207 * exactly opposite to the one in the labelToMerge, 00208 * this indicates a dimensional collapse has happened. 00209 * In this case, convert the label for that Geometry to a Line label 00210 */ 00211 //Not needed 00212 //void checkDimensionalCollapse(geomgraph::Label labelToMerge, geomgraph::Label existingLabel); 00213 00225 void computeLabelsFromDepths(); 00226 00231 void replaceCollapsedEdges(); 00232 00243 void copyPoints(int argIndex); 00244 00253 void computeLabelling(); // throw(TopologyException *); 00254 00262 void mergeSymLabels(); 00263 00264 void updateNodeLabelling(); 00265 00283 void labelIncompleteNodes(); 00284 00288 void labelIncompleteNode(geomgraph::Node *n, int targetIndex); 00289 00301 void findResultAreaEdges(OpCode opCode); 00302 00307 void cancelDuplicateResultEdges(); 00308 00313 bool isCovered(const geom::Coordinate& coord, 00314 std::vector<geom::Geometry*> *geomList); 00315 00320 bool isCovered(const geom::Coordinate& coord, 00321 std::vector<geom::Polygon*> *geomList); 00322 00327 bool isCovered(const geom::Coordinate& coord, 00328 std::vector<geom::LineString*> *geomList); 00329 00334 geom::Geometry* computeGeometry( 00335 std::vector<geom::Point*> *nResultPointList, 00336 std::vector<geom::LineString*> *nResultLineList, 00337 std::vector<geom::Polygon*> *nResultPolyList); 00338 00340 std::vector<geomgraph::Edge *>dupEdges; 00341 00346 int mergeZ(geomgraph::Node *n, const geom::Polygon *poly) const; 00347 00353 int mergeZ(geomgraph::Node *n, const geom::LineString *line) const; 00354 00358 double avgz[2]; 00359 bool avgzcomputed[2]; 00360 00361 double getAverageZ(int targetIndex); 00362 static double getAverageZ(const geom::Polygon *poly); 00363 00364 ElevationMatrix *elevationMatrix; 00365 00368 void checkObviouslyWrongResult(OpCode opCode); 00369 00370 }; 00371 00375 struct overlayOp { 00376 00377 OverlayOp::OpCode opCode; 00378 00379 overlayOp(OverlayOp::OpCode code) 00380 : 00381 opCode(code) 00382 {} 00383 00384 geom::Geometry* operator() (const geom::Geometry* g0, 00385 const geom::Geometry* g1) 00386 { 00387 return OverlayOp::overlayOp(g0, g1, opCode); 00388 } 00389 00390 }; 00391 00392 } // namespace geos::operation::overlay 00393 } // namespace geos::operation 00394 } // namespace geos 00395 00396 #ifdef _MSC_VER 00397 #pragma warning(pop) 00398 #endif 00399 00400 #endif // ndef GEOS_OP_OVERLAY_OVERLAYOP_H