GEOS  3.8.0dev
MCIndexSnapRounder.h
1 /**********************************************************************
2  *
3  * GEOS - Geometry Engine Open Source
4  * http://geos.osgeo.org
5  *
6  * Copyright (C) 2006 Refractions Research Inc.
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  * Last port: noding/snapround/MCIndexSnapRounder.java r486 (JTS-1.12+)
16  *
17  **********************************************************************/
18 
19 #ifndef GEOS_NODING_SNAPROUND_MCINDEXSNAPROUNDER_H
20 #define GEOS_NODING_SNAPROUND_MCINDEXSNAPROUNDER_H
21 
22 #include <geos/export.h>
23 
24 #include <geos/noding/Noder.h> // for inheritance
25 #include <geos/noding/NodedSegmentString.h> // for inlines
26 #include <geos/noding/snapround/MCIndexPointSnapper.h> // for inines
27 #include <geos/algorithm/LineIntersector.h> // for composition
28 #include <geos/geom/Coordinate.h> // for use in vector
29 #include <geos/geom/PrecisionModel.h> // for inlines
30 
31 #include <vector>
32 
33 #ifdef _MSC_VER
34 #pragma warning(push)
35 #pragma warning(disable: 4251) // warning C4251: needs to have dll-interface to be used by clients of class
36 #endif
37 
38 // Forward declarations
39 namespace geos {
40 namespace algorithm {
41 class LineIntersector;
42 }
43 namespace noding {
44 class SegmentString;
45 class MCIndexNoder;
46 }
47 }
48 
49 namespace geos {
50 namespace noding { // geos::noding
51 namespace snapround { // geos::noding::snapround
52 
53 
74 class GEOS_DLL MCIndexSnapRounder: public Noder { // implments Noder
75 
76 public:
77 
79  :
80  pm(nPm),
81  scaleFactor(nPm.getScale()),
82  pointSnapper(nullptr)
83  {
84  li.setPrecisionModel(&pm);
85  }
86 
87  std::vector<SegmentString*>*
88  getNodedSubstrings() const override
89  {
90  return NodedSegmentString::getNodedSubstrings(*nodedSegStrings);
91  }
92 
93  void computeNodes(std::vector<SegmentString*>* segStrings) override;
94 
103  void computeVertexSnaps(std::vector<SegmentString*>& edges);
104 
105 private:
106 
108  const geom::PrecisionModel& pm;
109 
111 
112  double scaleFactor;
113 
114  std::vector<SegmentString*>* nodedSegStrings;
115 
116  std::unique_ptr<MCIndexPointSnapper> pointSnapper;
117 
118  void snapRound(MCIndexNoder& noder, std::vector<SegmentString*>* segStrings);
119 
120 
128  void findInteriorIntersections(MCIndexNoder& noder,
129  std::vector<SegmentString*>* segStrings,
130  std::vector<geom::Coordinate>& intersections);
131 
136  void computeIntersectionSnaps(std::vector<geom::Coordinate>& snapPts);
137 
142  void computeVertexSnaps(NodedSegmentString* e);
143 
144  void checkCorrectness(std::vector<SegmentString*>& inputSegmentStrings);
145 
146  // Declare type as noncopyable
147  MCIndexSnapRounder(const MCIndexSnapRounder& other) = delete;
148  MCIndexSnapRounder& operator=(const MCIndexSnapRounder& rhs) = delete;
149 };
150 
151 } // namespace geos::noding::snapround
152 } // namespace geos::noding
153 } // namespace geos
154 
155 #ifdef _MSC_VER
156 #pragma warning(pop)
157 #endif
158 
159 #endif // GEOS_NODING_SNAPROUND_MCINDEXSNAPROUNDER_H
std::vector< SegmentString * > * getNodedSubstrings() const override
Returns a Collection of fully noded SegmentStrings. The SegmentStrings have the same context as their...
Definition: MCIndexSnapRounder.h:88
Represents a list of contiguous line segments, and supports noding the segments.
Definition: NodedSegmentString.h:57
Specifies the precision model of the Coordinate in a Geometry.
Definition: PrecisionModel.h:87
A LineIntersector is an algorithm that can both test whether two line segments intersect and compute ...
Definition: LineIntersector.h:49
Uses Snap Rounding to compute a rounded, fully noded arrangement from a set of SegmentString.
Definition: MCIndexSnapRounder.h:74
Basic namespace for all GEOS functionalities.
Definition: IndexedNestedRingTester.h:25
Computes all intersections between segments in a set of SegmentString.
Definition: Noder.h:49
Nodes a set of SegmentString using a index based on index::chain::MonotoneChain and a index::SpatialI...
Definition: MCIndexNoder.h:63
double getScale() const
Returns the multiplying factor used to obtain a precise coordinate.