/usr/include/geos/operation/overlay/OverlayOp.h is in libgeos-dev 3.2.2-3ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 | /**********************************************************************
* $Id: OverlayOp.h 2557 2009-06-08 09:30:55Z strk $
*
* GEOS - Geometry Engine Open Source
* http://geos.refractions.net
*
* Copyright (C) 2006 Refractions Research Inc.
*
* This is free software; you can redistribute and/or modify it under
* the terms of the GNU Lesser General Public Licence as published
* by the Free Software Foundation.
* See the COPYING file for more information.
*
***********************************************************************
*
* Last port: operation/overlay/OverlayOp.java rev. 1.31 (JTS-1.10)
*
**********************************************************************/
#ifndef GEOS_OP_OVERLAY_OVERLAYOP_H
#define GEOS_OP_OVERLAY_OVERLAYOP_H
#include <geos/export.h>
#include <geos/operation/GeometryGraphOperation.h> // for inheritance
#include <geos/geomgraph/EdgeList.h> // for composition
#include <geos/algorithm/PointLocator.h> // for composition
#include <geos/geomgraph/PlanarGraph.h> // for inline (GeometryGraph->PlanarGraph)
#include <vector>
// Forward declarations
namespace geos {
namespace geom {
class Geometry;
class Coordinate;
class GeometryFactory;
class Polygon;
class LineString;
class Point;
}
namespace geomgraph {
class Label;
class Edge;
class Node;
}
namespace operation {
namespace overlay {
class ElevationMatrix;
}
}
}
namespace geos {
namespace operation { // geos::operation
namespace overlay { // geos::operation::overlay
/// Computes the overlay of two Geometry.
//
/// The overlay can be used to determine any
/// boolean combination of the geometries.
///
class GEOS_DLL OverlayOp: public GeometryGraphOperation {
public:
/// The spatial functions supported by this class.
//
/// These operations implement various boolean combinations of
/// the resultants of the overlay.
///
enum OpCode {
opINTERSECTION=1,
opUNION,
opDIFFERENCE,
opSYMDIFFERENCE
};
static geom::Geometry* overlayOp(const geom::Geometry *geom0,
const geom::Geometry *geom1,
OpCode opCode);
//throw(TopologyException *);
static bool isResultOfOp(geomgraph::Label *label, OpCode opCode);
/// This method will handle arguments of Location.NULL correctly
//
/// @return true if the locations correspond to the opCode
///
static bool isResultOfOp(int loc0, int loc1, OpCode opCode);
/// Construct an OverlayOp with the given Geometry args.
//
/// Ownership of passed args will remain to caller, and
/// the OverlayOp won't change them in any way.
///
OverlayOp(const geom::Geometry *g0, const geom::Geometry *g1);
virtual ~OverlayOp(); // FIXME: virtual ?
geom::Geometry* getResultGeometry(OpCode funcCode);
// throw(TopologyException *);
geomgraph::PlanarGraph& getGraph() { return graph; }
/** \brief
* This method is used to decide if a point node should be included
* in the result or not.
*
* @return true if the coord point is covered by a result Line
* or Area geometry
*/
bool isCoveredByLA(const geom::Coordinate& coord);
/** \brief
* This method is used to decide if an L edge should be included
* in the result or not.
*
* @return true if the coord point is covered by a result Area geometry
*/
bool isCoveredByA(const geom::Coordinate& coord);
/*
* @return true if the coord is located in the interior or boundary of
* a geometry in the list.
*/
protected:
/** \brief
* Insert an edge from one of the noded input graphs.
*
* Checks edges that are inserted to see if an
* identical edge already exists.
* If so, the edge is not inserted, but its label is merged
* with the existing edge.
*/
void insertUniqueEdge(geomgraph::Edge *e);
private:
algorithm::PointLocator ptLocator;
const geom::GeometryFactory *geomFact;
geom::Geometry *resultGeom;
geomgraph::PlanarGraph graph;
geomgraph::EdgeList edgeList;
std::vector<geom::Polygon*> *resultPolyList;
std::vector<geom::LineString*> *resultLineList;
std::vector<geom::Point*> *resultPointList;
void computeOverlay(OpCode opCode); // throw(TopologyException *);
void insertUniqueEdges(std::vector<geomgraph::Edge*> *edges);
/*
* If either of the GeometryLocations for the existing label is
* exactly opposite to the one in the labelToMerge,
* this indicates a dimensional collapse has happened.
* In this case, convert the label for that Geometry to a Line label
*/
//Not needed
//void checkDimensionalCollapse(geomgraph::Label labelToMerge, geomgraph::Label existingLabel);
/** \brief
* Update the labels for edges according to their depths.
*
* For each edge, the depths are first normalized.
* Then, if the depths for the edge are equal,
* this edge must have collapsed into a line edge.
* If the depths are not equal, update the label
* with the locations corresponding to the depths
* (i.e. a depth of 0 corresponds to a Location of EXTERIOR,
* a depth of 1 corresponds to INTERIOR)
*/
void computeLabelsFromDepths();
/** \brief
* If edges which have undergone dimensional collapse are found,
* replace them with a new edge which is a L edge
*/
void replaceCollapsedEdges();
/** \brief
* Copy all nodes from an arg geometry into this graph.
*
* The node label in the arg geometry overrides any previously
* computed label for that argIndex.
* (E.g. a node may be an intersection node with
* a previously computed label of BOUNDARY,
* but in the original arg Geometry it is actually
* in the interior due to the Boundary Determination Rule)
*/
void copyPoints(int argIndex);
/** \brief
* Compute initial labelling for all DirectedEdges at each node.
*
* In this step, DirectedEdges will acquire a complete labelling
* (i.e. one with labels for both Geometries)
* only if they
* are incident on a node which has edges for both Geometries
*/
void computeLabelling(); // throw(TopologyException *);
/**
* For nodes which have edges from only one Geometry incident on them,
* the previous step will have left their dirEdges with no
* labelling for the other Geometry.
* However, the sym dirEdge may have a labelling for the other
* Geometry, so merge the two labels.
*/
void mergeSymLabels();
void updateNodeLabelling();
/**
* Incomplete nodes are nodes whose labels are incomplete.
*
* (e.g. the location for one Geometry is NULL).
* These are either isolated nodes,
* or nodes which have edges from only a single Geometry incident
* on them.
*
* Isolated nodes are found because nodes in one graph which
* don't intersect nodes in the other are not completely
* labelled by the initial process of adding nodes to the nodeList.
* To complete the labelling we need to check for nodes that
* lie in the interior of edges, and in the interior of areas.
*
* When each node labelling is completed, the labelling of the
* incident edges is updated, to complete their labelling as well.
*/
void labelIncompleteNodes();
/** \brief
* Label an isolated node with its relationship to the target geometry.
*/
void labelIncompleteNode(geomgraph::Node *n, int targetIndex);
/** \brief
* Find all edges whose label indicates that they are in the result
* area(s), according to the operation being performed.
*
* Since we want polygon shells to be
* oriented CW, choose dirEdges with the interior of the result
* on the RHS.
* Mark them as being in the result.
* Interior Area edges are the result of dimensional collapses.
* They do not form part of the result area boundary.
*/
void findResultAreaEdges(OpCode opCode);
/**
* If both a dirEdge and its sym are marked as being in the result,
* cancel them out.
*/
void cancelDuplicateResultEdges();
/**
* @return true if the coord is located in the interior or boundary of
* a geometry in the list.
*/
bool isCovered(const geom::Coordinate& coord,
std::vector<geom::Geometry*> *geomList);
/**
* @return true if the coord is located in the interior or boundary of
* a geometry in the list.
*/
bool isCovered(const geom::Coordinate& coord,
std::vector<geom::Polygon*> *geomList);
/**
* @return true if the coord is located in the interior or boundary of
* a geometry in the list.
*/
bool isCovered(const geom::Coordinate& coord,
std::vector<geom::LineString*> *geomList);
/**
* Build a Geometry containing all Geometries in the given vectors.
* Takes element's ownership, vector control is left to caller.
*/
geom::Geometry* computeGeometry(
std::vector<geom::Point*> *nResultPointList,
std::vector<geom::LineString*> *nResultLineList,
std::vector<geom::Polygon*> *nResultPolyList);
/// Caches for memory management
std::vector<geomgraph::Edge *>dupEdges;
/** \brief
* Merge Z values of node with those of the segment or vertex in
* the given Polygon it is on.
*/
int mergeZ(geomgraph::Node *n, const geom::Polygon *poly) const;
/**
* Merge Z values of node with those of the segment or vertex in
* the given LineString it is on.
* @returns 1 if an intersection is found, 0 otherwise.
*/
int mergeZ(geomgraph::Node *n, const geom::LineString *line) const;
/**
* Average Z of input geometries
*/
double avgz[2];
bool avgzcomputed[2];
double getAverageZ(int targetIndex);
static double getAverageZ(const geom::Polygon *poly);
ElevationMatrix *elevationMatrix;
/// Throw TopologyException if an obviously wrong result has
/// been computed.
void checkObviouslyWrongResult(OpCode opCode);
};
/** \brief
* OverlayOp::overlayOp Adapter for use with geom::BinaryOp
*/
struct overlayOp {
OverlayOp::OpCode opCode;
overlayOp(OverlayOp::OpCode code)
:
opCode(code)
{}
geom::Geometry* operator() (const geom::Geometry* g0,
const geom::Geometry* g1)
{
return OverlayOp::overlayOp(g0, g1, opCode);
}
};
} // namespace geos::operation::overlay
} // namespace geos::operation
} // namespace geos
#endif // ndef GEOS_OP_OVERLAY_OVERLAYOP_H
/**********************************************************************
* $Log$
* Revision 1.6 2006/07/05 20:19:29 strk
* added checks for obviously wrong result of difference and intersection ops
*
* Revision 1.5 2006/06/05 15:36:34 strk
* Given OverlayOp funx code enum a name and renamed values to have a lowercase prefix. Drop all of noding headers from installed header set.
*
* Revision 1.4 2006/05/24 15:17:44 strk
* Reduced number of installed headers in geos/operation/ subdir
*
* Revision 1.3 2006/04/14 15:04:36 strk
* fixed missing namespace qualification in overlay::overlayOp
*
* Revision 1.2 2006/04/14 14:35:47 strk
* Added overlayOp() adapter for use in templates expecting binary ops
*
* Revision 1.1 2006/03/17 13:24:59 strk
* 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).
*
**********************************************************************/
|