OverlayOp.h

00001 /**********************************************************************
00002  * $Id: OverlayOp.h 1820 2006-09-06 16:54:23Z mloskot $
00003  *
00004  * GEOS - Geometry Engine Open Source
00005  * http://geos.refractions.net
00006  *
00007  * Copyright (C) 2006 Refractions Research Inc.
00008  *
00009  * This is free software; you can redistribute and/or modify it under
00010  * the terms of the GNU Lesser General Public Licence as published
00011  * by the Free Software Foundation. 
00012  * See the COPYING file for more information.
00013  *
00014  **********************************************************************/
00015 
00016 #ifndef GEOS_OP_OVERLAY_OVERLAYOP_H
00017 #define GEOS_OP_OVERLAY_OVERLAYOP_H
00018 
00019 #include <geos/operation/GeometryGraphOperation.h> // for inheritance
00020 #include <geos/geomgraph/EdgeList.h> // for composition
00021 #include <geos/algorithm/PointLocator.h> // for composition
00022 #include <geos/geomgraph/PlanarGraph.h> // for inline (GeometryGraph->PlanarGraph)
00023 
00024 #include <vector>
00025 
00026 // Forward declarations
00027 namespace geos {
00028         namespace geom {
00029                 class Geometry;
00030                 class Coordinate;
00031                 class GeometryFactory;
00032                 class Polygon;
00033                 class LineString;
00034                 class Point;
00035         }
00036         namespace geomgraph {
00037                 class Label;
00038                 class Edge;
00039                 class Node;
00040         }
00041         namespace operation {
00042                 namespace overlay {
00043                         class ElevationMatrix;
00044                 }
00045         }
00046 }
00047 
00048 namespace geos {
00049 namespace operation { // geos::operation
00050 namespace overlay { // geos::operation::overlay
00051 
00053 //
00057 class OverlayOp: public GeometryGraphOperation {
00058 
00059 public:
00060 
00062         //
00066         enum OpCode {
00067                 opINTERSECTION=1,
00068                 opUNION,
00069                 opDIFFERENCE,
00070                 opSYMDIFFERENCE
00071         };
00072 
00073         static geom::Geometry* overlayOp(const geom::Geometry *geom0,
00074                         const geom::Geometry *geom1,
00075                         OpCode opCode);
00076                 //throw(TopologyException *);
00077 
00078         static bool isResultOfOp(geomgraph::Label *label, OpCode opCode);
00079 
00081         //
00084         static bool isResultOfOp(int loc0, int loc1, OpCode opCode);
00085 
00087         // 
00091         OverlayOp(const geom::Geometry *g0, const geom::Geometry *g1);
00092 
00093         virtual ~OverlayOp(); // FIXME: virtual ?
00094 
00095         geom::Geometry* getResultGeometry(OpCode funcCode);
00096                 // throw(TopologyException *);
00097 
00098         geomgraph::PlanarGraph& getGraph() { return graph; }
00099 
00107         bool isCoveredByLA(const geom::Coordinate& coord);
00108 
00115         bool isCoveredByA(const geom::Coordinate& coord);
00116 
00117         /*
00118          * @return true if the coord is located in the interior or boundary of
00119          * a geometry in the list.
00120          */
00121 
00122 protected:
00123 
00132         void insertUniqueEdge(geomgraph::Edge *e);
00133 
00134 private:
00135 
00136         algorithm::PointLocator ptLocator;
00137 
00138         const geom::GeometryFactory *geomFact;
00139 
00140         geom::Geometry *resultGeom;
00141 
00142         geomgraph::PlanarGraph graph;
00143 
00144         geomgraph::EdgeList edgeList;
00145 
00146         std::vector<geom::Polygon*> *resultPolyList;
00147 
00148         std::vector<geom::LineString*> *resultLineList;
00149 
00150         std::vector<geom::Point*> *resultPointList;
00151 
00152         void computeOverlay(OpCode opCode); // throw(TopologyException *);
00153 
00154         void insertUniqueEdges(std::vector<geomgraph::Edge*> *edges);
00155 
00156         /*
00157          * If either of the GeometryLocations for the existing label is
00158          * exactly opposite to the one in the labelToMerge,
00159          * this indicates a dimensional collapse has happened.
00160          * In this case, convert the label for that Geometry to a Line label
00161          */
00162         //Not needed
00163         //void checkDimensionalCollapse(geomgraph::Label labelToMerge, geomgraph::Label existingLabel);
00164 
00176         void computeLabelsFromDepths();
00177 
00182         void replaceCollapsedEdges();
00183 
00194         void copyPoints(int argIndex);
00195 
00204         void computeLabelling(); // throw(TopologyException *);
00205 
00213         void mergeSymLabels();
00214 
00215         void updateNodeLabelling();
00216 
00234         void labelIncompleteNodes();
00235 
00239         void labelIncompleteNode(geomgraph::Node *n, int targetIndex);
00240 
00252         void findResultAreaEdges(OpCode opCode);
00253 
00258         void cancelDuplicateResultEdges();
00259 
00264         bool isCovered(const geom::Coordinate& coord,
00265                         std::vector<geom::Geometry*> *geomList);
00266 
00271         bool isCovered(const geom::Coordinate& coord,
00272                         std::vector<geom::Polygon*> *geomList);
00273 
00278         bool isCovered(const geom::Coordinate& coord,
00279                         std::vector<geom::LineString*> *geomList);
00280 
00285         geom::Geometry* computeGeometry(
00286                         std::vector<geom::Point*> *nResultPointList,
00287                         std::vector<geom::LineString*> *nResultLineList,
00288                         std::vector<geom::Polygon*> *nResultPolyList);
00289 
00291         std::vector<geomgraph::Edge *>dupEdges;
00292 
00297         int mergeZ(geomgraph::Node *n, const geom::Polygon *poly) const;
00298 
00304         int mergeZ(geomgraph::Node *n, const geom::LineString *line) const;
00305 
00309         double avgz[2];
00310         bool avgzcomputed[2];
00311 
00312         double getAverageZ(int targetIndex);
00313         static double getAverageZ(const geom::Polygon *poly);
00314 
00315         ElevationMatrix *elevationMatrix;
00316 
00319         void checkObviouslyWrongResult(OpCode opCode);
00320 
00321 };
00322 
00326 struct overlayOp {
00327 
00328         OverlayOp::OpCode opCode;
00329 
00330         overlayOp(OverlayOp::OpCode code)
00331                 :
00332                 opCode(code)
00333         {}
00334 
00335         geom::Geometry* operator() (const geom::Geometry* g0,
00336                         const geom::Geometry* g1)
00337         {
00338                 return OverlayOp::overlayOp(g0, g1, opCode);
00339         }
00340 
00341 };
00342 
00343 } // namespace geos::operation::overlay
00344 } // namespace geos::operation
00345 } // namespace geos
00346 
00347 #endif // ndef GEOS_OP_OVERLAY_OVERLAYOP_H
00348 
00349 /**********************************************************************
00350  * $Log$
00351  * Revision 1.6  2006/07/05 20:19:29  strk
00352  * added checks for obviously wrong result of difference and intersection ops
00353  *
00354  * Revision 1.5  2006/06/05 15:36:34  strk
00355  * Given OverlayOp funx code enum a name and renamed values to have a lowercase prefix. Drop all of noding headers from installed header set.
00356  *
00357  * Revision 1.4  2006/05/24 15:17:44  strk
00358  * Reduced number of installed headers in geos/operation/ subdir
00359  *
00360  * Revision 1.3  2006/04/14 15:04:36  strk
00361  * fixed missing namespace qualification in overlay::overlayOp
00362  *
00363  * Revision 1.2  2006/04/14 14:35:47  strk
00364  * Added overlayOp() adapter for use in templates expecting binary ops
00365  *
00366  * Revision 1.1  2006/03/17 13:24:59  strk
00367  * opOverlay.h header splitted. Reduced header inclusions in operation/overlay implementation files. ElevationMatrixFilter code moved from own file to ElevationMatrix.cpp (ideally a class-private).
00368  *
00369  **********************************************************************/
00370 

Generated on Fri Mar 27 04:52:55 2009 for GEOS by  doxygen 1.5.4