GEOS  3.13.0dev
SimpleSTRdistance.h
1 /**********************************************************************
2  *
3  * GEOS - Geometry Engine Open Source
4  * http://geos.osgeo.org
5  *
6  * Copyright (C) 2020 Paul Ramsey
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 <cassert>
18 #include <cstddef>
19 #include <geos/export.h>
20 #include <geos/geom/Envelope.h>
21 #include <geos/index/strtree/SimpleSTRtree.h>
22 #include <geos/index/strtree/SimpleSTRnode.h>
23 
24 #include <vector>
25 #include <queue>
26 
27 #ifdef _MSC_VER
28 #pragma warning(push)
29 #pragma warning(disable: 4251) // warning C4251: needs to have dll-interface to be used by clients of class
30 #endif
31 
32 namespace geos {
33 namespace index { // geos::index
34 namespace strtree { // geos::index::strtree
35 
36 
37 
38 
39 
40 class GEOS_DLL SimpleSTRpair {
41 
42 private:
43 
44  SimpleSTRnode* node1;
45  SimpleSTRnode* node2;
46  ItemDistance* itemDistance;
47  double m_distance;
48 
60  double distance();
61 
62 public:
63 
64  SimpleSTRpair(SimpleSTRnode* p_node1, SimpleSTRnode* p_node2, ItemDistance* p_itemDistance)
65  : node1(p_node1)
66  , node2(p_node2)
67  , itemDistance(p_itemDistance)
68  {
69  m_distance = distance();
70  }
71 
72  SimpleSTRnode* getNode(int i) const;
73 
84  double getDistance() const;
85 
91  bool isLeaves() const;
92 
99  double maximumDistance();
100 
101  friend std::ostream& operator<<(std::ostream& os, SimpleSTRpair& pair);
102 
103 
104 };
105 
106 
107 
108 class GEOS_DLL SimpleSTRdistance {
109 
110 
111 public:
112 
113  struct STRpairQueueCompare {
114  bool
115  operator()(const SimpleSTRpair* a, const SimpleSTRpair* b)
116  {
117  return a->getDistance() > b->getDistance();
118  }
119  };
120 
121  typedef std::priority_queue<SimpleSTRpair*,
122  std::vector<SimpleSTRpair*>,
123  STRpairQueueCompare> STRpairQueue;
124 
125 
126  /* Initialize class */
127  SimpleSTRdistance(SimpleSTRnode* root1, SimpleSTRnode* root2, ItemDistance* p_itemDistance);
128 
129  /* Turn over the calculation */
130  std::pair<const void*, const void*> nearestNeighbour();
131  bool isWithinDistance(double maxDistance);
132 
133 
134 private:
135 
136  std::deque<SimpleSTRpair> pairStore;
137  SimpleSTRpair* initPair;
138  ItemDistance* itemDistance;
139 
140  /* Utility method to store allocated pairs */
141  SimpleSTRpair* createPair(SimpleSTRnode* p_node1, SimpleSTRnode* p_node2, ItemDistance* p_itemDistance);
142 
143  std::pair<const void*, const void*> nearestNeighbour(SimpleSTRpair* p_initPair);
144  std::pair<const void*, const void*> nearestNeighbour(SimpleSTRpair* p_initPair, double maxDistance);
145 
146  bool isWithinDistance(SimpleSTRpair* p_initPair, double maxDistance);
147 
148  void expandToQueue(SimpleSTRpair* pair, STRpairQueue&, double minDistance);
149  void expand(SimpleSTRnode* nodeComposite, SimpleSTRnode* nodeOther,
150  bool isFlipped, STRpairQueue& priQ, double minDistance);
151 
152 
153 };
154 
155 
156 
157 
158 
159 } // namespace geos::index::strtree
160 } // namespace geos::index
161 } // namespace geos
162 
163 #ifdef _MSC_VER
164 #pragma warning(pop)
165 #endif
166 
Basic namespace for all GEOS functionalities.
Definition: Angle.h:25