GEOS 3.14.0dev
IsSimpleOp.h
1/**********************************************************************
2 *
3 * GEOS - Geometry Engine Open Source
4 * http://geos.osgeo.org
5 *
6 * Copyright (C) 2001-2002 Vivid Solutions Inc.
7 * Copyright (C) 2009 Sandro Santilli <strk@kbt.io>
8 * Copyright (C) 2005-2006 Refractions Research Inc.
9 * Copyright (C) 2021 Paul Ramsey <pramsey@cleverelephant.ca>
10 *
11 * This is free software; you can redistribute and/or modify it under
12 * the terms of the GNU Lesser General Public Licence as published
13 * by the Free Software Foundation.
14 * See the COPYING file for more information.
15 *
16 **********************************************************************/
17
18#pragma once
19
20#include <memory>
21
22#include <geos/algorithm/LineIntersector.h>
23#include <geos/algorithm/BoundaryNodeRule.h>
24#include <geos/noding/SegmentIntersector.h>
25
26// Forward declarations
27namespace geos {
28namespace noding {
29class SegmentString;
30class BasicSegmentString;
31}
32// namespace algorithm {
33// class BoundaryNodeRule;
34// }
35namespace geom {
36class LineString;
37class LinearRing;
38class MultiLineString;
39class MultiPoint;
40class Geometry;
41class Polygon;
42class GeometryCollection;
43}
44}
45
46
47namespace geos { // geos
48namespace operation { // geos.operation
49namespace valid { // geos.operation.valid
50
94class GEOS_DLL IsSimpleOp {
95
96private:
97
98 const geom::Geometry& inputGeom;
99 bool isClosedEndpointsInInterior = true;
100 bool isFindAllLocations = false;
101 bool isSimpleResult = false;
102 std::vector<geom::CoordinateXY> nonSimplePts;
103 bool computed = false;
104
105 void compute();
106
107 bool computeSimple(const geom::Geometry& geom);
108
109 bool isSimpleMultiPoint(const geom::MultiPoint& mp);
110
119 bool isSimplePolygonal(const geom::Geometry& geom);
120
128 bool isSimpleGeometryCollection(const geom::Geometry& geom);
129
130 bool isSimpleLinearGeometry(const geom::Geometry& geom);
131
132 static std::vector<std::unique_ptr<geos::geom::CoordinateSequence>>
133 removeRepeatedPts(const geom::Geometry& geom);
134
135 static std::vector<std::unique_ptr<noding::SegmentString>>
136 createSegmentStrings(std::vector<std::unique_ptr<geos::geom::CoordinateSequence>>& seqs);
137
138 class NonSimpleIntersectionFinder : public noding::SegmentIntersector
139 {
140
141 private:
142
143 bool isClosedEndpointsInInterior;
144 bool isFindAll = false;
145
146 std::vector<geom::CoordinateXY>& intersectionPts;
148
149 // bool hasInteriorInt;
150 // bool hasInteriorVertexInt;
151 // bool hasEqualSegments;
152 // bool hasInteriorEndpointInt;
153
154 bool findIntersection(
155 noding::SegmentString* ss0, std::size_t segIndex0,
156 noding::SegmentString* ss1, std::size_t segIndex1,
157 const geom::CoordinateXY& p00, const geom::CoordinateXY& p01,
158 const geom::CoordinateXY& p10, const geom::CoordinateXY& p11);
159
169 bool isIntersectionEndpoint(
170 const noding::SegmentString* ss, std::size_t ssIndex,
171 const algorithm::LineIntersector& li, std::size_t liSegmentIndex) const;
172
181 std::size_t intersectionVertexIndex(
182 const algorithm::LineIntersector& li, std::size_t segmentIndex) const;
183
184 public:
185
186 NonSimpleIntersectionFinder(
187 bool p_isClosedEndpointsInInterior,
188 bool p_isFindAll,
189 std::vector<geom::CoordinateXY>& p_intersectionPts)
190 : isClosedEndpointsInInterior(p_isClosedEndpointsInInterior)
191 , isFindAll(p_isFindAll)
192 , intersectionPts(p_intersectionPts)
193 {};
194
200 bool hasIntersection() const;
201
202 void processIntersections(
203 noding::SegmentString* ss0, std::size_t segIndex0,
204 noding::SegmentString* ss1, std::size_t segIndex1) override;
205
206 bool isDone() const override;
207
208 }; // NonSimpleIntersectionFinder
209
210
211public:
212
213 IsSimpleOp(const geom::Geometry* geom)
214 : IsSimpleOp(*geom)
215 {};
216
223 : IsSimpleOp(geom, algorithm::BoundaryNodeRule::getBoundaryRuleMod2())
224 {};
225
232 IsSimpleOp(const geom::Geometry& geom, const algorithm::BoundaryNodeRule& p_boundaryNodeRule)
233 : inputGeom(geom)
234 , isClosedEndpointsInInterior(! p_boundaryNodeRule.isInBoundary(2))
235 , isFindAllLocations(false)
236 , computed(false)
237 {};
238
245 static bool isSimple(const geom::Geometry& geom);
246
247 static bool isSimple(const geom::Geometry* geom) {
248 if (!geom) return false;
249 return isSimple(*geom);
250 }
251
258 geom::CoordinateXY getNonSimpleLocation(const geom::Geometry& geom);
259
266 void setFindAllLocations(bool isFindAll);
267
273 bool isSimple();
274
283 geom::CoordinateXY getNonSimpleLocation();
284
290 const std::vector<geom::CoordinateXY>& getNonSimpleLocations();
291
292
293
294}; // IsSimpleOp
295
296
297} // namespace geos.operation.valid
298} // namespace geos.operation
299} // namespace geos
An interface for rules which determine whether node points which are in boundaries of lineal geometry...
Definition BoundaryNodeRule.h:52
A LineIntersector is an algorithm that can both test whether two line segments intersect and compute ...
Definition LineIntersector.h:53
Basic implementation of Geometry, constructed and destructed by GeometryFactory.
Definition Geometry.h:197
Definition MultiPoint.h:50
Processes possible intersections detected by a Noder.
Definition noding/SegmentIntersector.h:45
An interface for classes which represent a sequence of contiguous line segments.
Definition SegmentString.h:47
Definition IsSimpleOp.h:94
void setFindAllLocations(bool isFindAll)
IsSimpleOp(const geom::Geometry &geom)
Definition IsSimpleOp.h:222
geom::CoordinateXY getNonSimpleLocation()
static bool isSimple(const geom::Geometry &geom)
const std::vector< geom::CoordinateXY > & getNonSimpleLocations()
geom::CoordinateXY getNonSimpleLocation(const geom::Geometry &geom)
IsSimpleOp(const geom::Geometry &geom, const algorithm::BoundaryNodeRule &p_boundaryNodeRule)
Definition IsSimpleOp.h:232
Basic namespace for all GEOS functionalities.
Definition geos.h:39