18#include <geos/export.h>
20#include <geos/geom/Coordinate.h>
21#include <geos/operation/valid/PolygonIntersectionAnalyzer.h>
22#include <geos/operation/valid/PolygonRing.h>
23#include <geos/noding/BasicSegmentString.h>
36class GEOS_DLL PolygonTopologyAnalyzer {
37 using CoordinateXY = geos::geom::CoordinateXY;
46 bool isInvertedRingValid =
false;
47 PolygonIntersectionAnalyzer segInt;
48 std::vector<PolygonRing*> polyRings;
49 geom::CoordinateXY disconnectionPt;
54 std::deque<PolygonRing> polyRingStore;
55 std::deque<noding::BasicSegmentString> segStringStore;
57 PolygonRing* createPolygonRing(
const LinearRing* p_ring);
58 PolygonRing* createPolygonRing(
const LinearRing* p_ring,
int p_index, PolygonRing* p_shell);
60 static const CoordinateXY&
61 findNonEqualVertex(
const LinearRing* ring,
const CoordinateXY& p);
80 static bool isIncidentSegmentInRing(
const CoordinateXY* p0,
const CoordinateXY* p1,
81 const CoordinateSequence* ringPts);
83 static const CoordinateXY& findRingVertexPrev(
const CoordinateSequence* ringPts,
84 std::size_t index,
const CoordinateXY& node);
86 static const CoordinateXY& findRingVertexNext(
const CoordinateSequence* ringPts,
87 std::size_t index,
const CoordinateXY& node);
89 static std::size_t ringIndexPrev(
const CoordinateSequence* ringPts, std::size_t index);
91 static std::size_t ringIndexNext(
const CoordinateSequence* ringPts, std::size_t index);
99 static std::size_t intersectingSegIndex(
const CoordinateSequence* ringPts,
const CoordinateXY* pt);
101 std::vector<SegmentString*> createSegmentStrings(
const Geometry* geom,
bool isInvertedRingValid);
103 static std::vector<PolygonRing*> getPolygonRings(
const std::vector<SegmentString*>& segStrings);
105 SegmentString* createSegString(
const LinearRing* ring,
const PolygonRing* polyRing);
108 PolygonTopologyAnalyzer(
const PolygonTopologyAnalyzer& other) =
delete;
109 PolygonTopologyAnalyzer& operator=(
const PolygonTopologyAnalyzer& rhs) =
delete;
114 PolygonTopologyAnalyzer(
const Geometry* geom,
bool p_isInvertedRingValid);
122 static CoordinateXY findSelfIntersection(
const LinearRing* ring);
143 isRingNested(
const LinearRing* test,
144 const LinearRing* target);
146 bool hasInvalidIntersection()
const {
147 return segInt.isInvalid();
150 int getInvalidCode()
const {
151 return segInt.getInvalidCode();
154 const CoordinateXY& getInvalidLocation()
const {
155 return segInt.getInvalidLocation();
166 bool isInteriorDisconnected();
168 const CoordinateXY& getDisconnectionLocation()
const
170 return disconnectionPt;
186 void checkInteriorDisconnectedByHoleCycle();
197 void checkInteriorDisconnectedBySelfTouch();
The internal representation of a list of coordinates inside a Geometry.
Definition CoordinateSequence.h:56
Basic implementation of Geometry, constructed and destructed by GeometryFactory.
Definition Geometry.h:201
Models an OGC SFS LinearRing. A LinearRing is a LineString which is both closed and simple.
Definition LinearRing.h:54
An interface for classes which represent a sequence of contiguous line segments.
Definition SegmentString.h:49
Basic namespace for all GEOS functionalities.
Definition geos.h:38