GEOS  3.9.1dev
OverlayLabeller.h
Go to the documentation of this file.
1 /**********************************************************************
2  *
3  * GEOS - Geometry Engine Open Source
4  * http://geos.osgeo.org
5  *
6  * Copyright (C) 2020 Paul Ramsey <pramsey@cleverelephant.ca>
7  *
8  * This is free software; you can redistribute and/or modify it under
9  * the terms of the GNU Lesser General Public Licence as published
10  * by the Free Software Foundation.
11  * See the COPYING file for more information.
12  *
13  **********************************************************************/
14 
15 #pragma once
16 
17 #include <geos/export.h>
18 #include <geos/geom/Location.h>
20 
21 #include <vector>
22 #include <deque>
23 
24 // Forward declarations
25 namespace geos {
26 namespace geom {
27 class Coordinate;
28 }
29 namespace operation {
30 namespace overlayng {
31 class OverlayLabel;
32 class OverlayGraph;
33 class OverlayEdge;
34 class InputGeometry;
35 }
36 }
37 }
38 
39 namespace geos { // geos.
40 namespace operation { // geos.operation
41 namespace overlayng { // geos.operation.overlayng
42 
43 
45 
46 private:
47 
48  // Members
51  std::vector<OverlayEdge*>& edges;
52 
56  static OverlayEdge* findPropagationStartEdge(OverlayEdge* nodeEdge, int geomIndex);
57 
83  void labelCollapsedEdges();
84  void labelCollapsedEdge(OverlayEdge* edge, int geomIndex);
85 
91  void labelConnectedLinearEdges();
92  void propagateLinearLocations(int geomIndex);
93  static void propagateLinearLocationAtNode(OverlayEdge* eNode, int geomIndex, bool isInputLine, std::deque<OverlayEdge*>& edgeStack);
94 
100  static std::vector<OverlayEdge*> findLinearEdgesWithLocation(std::vector<OverlayEdge*>& edges, int geomIndex);
101 
116  void labelDisconnectedEdges();
117 
126  void labelDisconnectedEdge(OverlayEdge* edge, int geomIndex);
127 
137  geom::Location locateEdge(int geomIndex, OverlayEdge* edge);
138 
150  geom::Location locateEdgeBothEnds(int geomIndex, OverlayEdge* edge);
151 
157  void labelAreaNodeEdges(std::vector<OverlayEdge*>& nodes);
158 
159 
160 
161 public:
162 
163  OverlayLabeller(OverlayGraph* p_graph, InputGeometry* p_inputGeometry)
164  : graph(p_graph)
165  , inputGeometry(p_inputGeometry)
166  , edges(p_graph->getEdges())
167  {}
168 
172  void computeLabelling();
173 
179  void propagateAreaLocations(OverlayEdge* nodeEdge, int geomIndex);
180 
181  void markResultAreaEdges(int overlayOpCode);
182 
190  void markInResultArea(OverlayEdge* e, int overlayOpCode);
191 
198  void unmarkDuplicateEdgesFromResultArea();
199 
200 
201 };
202 
203 
204 } // namespace geos.operation.overlayng
205 } // namespace geos.operation
206 } // namespace geos
207 
#define GEOS_DLL
Definition: export.h:28
OverlayLabeller(OverlayGraph *p_graph, InputGeometry *p_inputGeometry)
std::vector< OverlayEdge * > & edges
Location
Constants representing the location of a point relative to a geometry.
Definition: Location.h:34
Basic namespace for all GEOS functionalities.