GEOS  3.9.1
DistanceOp.h
1 /**********************************************************************
2  *
3  * GEOS - Geometry Engine Open Source
4  * http://geos.osgeo.org
5  *
6  * Copyright (C) 2011 Sandro Santilli <strk@kbt.io>
7  * Copyright (C) 2006 Refractions Research Inc.
8  *
9  * This is free software; you can redistribute and/or modify it under
10  * the terms of the GNU Lesser General Public Licence as published
11  * by the Free Software Foundation.
12  * See the COPYING file for more information.
13  *
14  **********************************************************************
15  *
16  * Last port: operation/distance/DistanceOp.java r335 (JTS-1.12-)
17  *
18  **********************************************************************/
19 
20 #ifndef GEOS_OP_DISTANCE_DISTANCEOP_H
21 #define GEOS_OP_DISTANCE_DISTANCEOP_H
22 
23 #include <geos/export.h>
24 
25 #include <geos/algorithm/PointLocator.h> // for composition
26 #include <geos/operation/distance/GeometryLocation.h>
27 #include <geos/geom/CoordinateSequence.h>
28 
29 #include <array>
30 #include <vector>
31 #include <memory>
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 geom {
41 class Coordinate;
42 class Polygon;
43 class LineString;
44 class Point;
45 class Geometry;
46 }
47 }
48 
49 
50 namespace geos {
51 namespace operation { // geos::operation
52 namespace distance { // geos::operation::distance
53 
74 class GEOS_DLL DistanceOp {
75 public:
86  static double distance(const geom::Geometry& g0,
87  const geom::Geometry& g1);
88 
90  static double distance(const geom::Geometry* g0,
91  const geom::Geometry* g1);
92 
103  static bool isWithinDistance(const geom::Geometry& g0,
104  const geom::Geometry& g1,
105  double distance);
106 
119  static std::unique_ptr<geom::CoordinateSequence> nearestPoints(
120  const geom::Geometry* g0,
121  const geom::Geometry* g1);
122 
124  DistanceOp(const geom::Geometry* g0, const geom::Geometry* g1);
125 
134  DistanceOp(const geom::Geometry& g0, const geom::Geometry& g1);
135 
147  double terminateDistance);
148 
149  ~DistanceOp() = default;
150 
156  double distance();
157 
166  std::unique_ptr<geom::CoordinateSequence> nearestPoints();
167 
168 private:
169 
170  // input
171  std::array<geom::Geometry const*, 2> geom;
172  double terminateDistance;
173 
174  // working
175  algorithm::PointLocator ptLocator;
176  std::array<std::unique_ptr<GeometryLocation>, 2> minDistanceLocation;
177  double minDistance;
178  bool computed = false;
179 
180  void updateMinDistance(std::array<std::unique_ptr<GeometryLocation>, 2> & locGeom, bool flip);
181 
182  void computeMinDistance();
183 
184  void computeContainmentDistance();
185 
186  void computeInside(std::vector<std::unique_ptr<GeometryLocation>> & locs,
187  const std::vector<const geom::Polygon*>& polys,
188  std::array<std::unique_ptr<GeometryLocation>, 2> & locPtPoly);
189 
190 
195  void computeFacetDistance();
196 
197  void computeMinDistanceLines(
198  const std::vector<const geom::LineString*>& lines0,
199  const std::vector<const geom::LineString*>& lines1,
200  std::array<std::unique_ptr<GeometryLocation>, 2> & locGeom);
201 
202  void computeMinDistancePoints(
203  const std::vector<const geom::Point*>& points0,
204  const std::vector<const geom::Point*>& points1,
205  std::array<std::unique_ptr<GeometryLocation>, 2> & locGeom);
206 
207  void computeMinDistanceLinesPoints(
208  const std::vector<const geom::LineString*>& lines0,
209  const std::vector<const geom::Point*>& points1,
210  std::array<std::unique_ptr<GeometryLocation>, 2> & locGeom);
211 
212  void computeMinDistance(const geom::LineString* line0,
213  const geom::LineString* line1,
214  std::array<std::unique_ptr<GeometryLocation>, 2> & locGeom);
215 
216  void computeMinDistance(const geom::LineString* line,
217  const geom::Point* pt,
218  std::array<std::unique_ptr<GeometryLocation>, 2> & locGeom);
219 };
220 
221 
222 } // namespace geos::operation::distance
223 } // namespace geos::operation
224 } // namespace geos
225 
226 #ifdef _MSC_VER
227 #pragma warning(pop)
228 #endif
229 
230 #endif // GEOS_OP_DISTANCE_DISTANCEOP_H
231 
Computes the topological relationship (Location) of a single point to a Geometry.
Definition: PointLocator.h:57
Basic implementation of Geometry, constructed and destructed by GeometryFactory.
Definition: Geometry.h:188
Definition: LineString.h:68
Definition: Point.h:66
Find two points on two geom::Geometrys which lie within a given distance, or else are the nearest poi...
Definition: DistanceOp.h:74
std::unique_ptr< geom::CoordinateSequence > nearestPoints()
static std::unique_ptr< geom::CoordinateSequence > nearestPoints(const geom::Geometry *g0, const geom::Geometry *g1)
static double distance(const geom::Geometry *g0, const geom::Geometry *g1)
static bool isWithinDistance(const geom::Geometry &g0, const geom::Geometry &g1, double distance)
Test whether two geometries lie within a given distance of each other.
DistanceOp(const geom::Geometry &g0, const geom::Geometry &g1)
Constructs a DistanceOp that computes the distance and nearest points between the two specified geome...
DistanceOp(const geom::Geometry &g0, const geom::Geometry &g1, double terminateDistance)
Constructs a DistanceOp that computes the distance and nearest points between the two specified geome...
static double distance(const geom::Geometry &g0, const geom::Geometry &g1)
Compute the distance between the nearest points of two geometries.
DistanceOp(const geom::Geometry *g0, const geom::Geometry *g1)
Basic namespace for all GEOS functionalities.
Definition: IndexedNestedRingTester.h:26