GEOS 3.11.1
Quadtree.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: index/quadtree/Quadtree.java rev. 1.16 (JTS-1.10)
16 *
17 **********************************************************************/
18
19#pragma once
20
21#include <geos/export.h>
22#include <geos/geom/Envelope.h>
23#include <geos/index/SpatialIndex.h> // for inheritance
24#include <geos/index/quadtree/Root.h> // for composition
25
26#include <memory>
27#include <vector>
28#include <string>
29
30#ifdef _MSC_VER
31#pragma warning(push)
32#pragma warning(disable: 4251) // warning C4251: needs to have dll-interface to be used by clients of class
33#endif
34
35// Forward declarations
36namespace geos {
37namespace index {
38namespace quadtree {
39// class Root;
40}
41}
42}
43
44namespace geos {
45namespace index { // geos::index
46namespace quadtree { // geos::index::quadtree
47
70class GEOS_DLL Quadtree: public SpatialIndex {
71
72private:
73
74 std::vector<std::unique_ptr<geom::Envelope>> newEnvelopes;
75
76 void collectStats(const geom::Envelope& itemEnv);
77
78 Root root;
79
91 double minExtent;
92
93public:
102 double minExtent);
103
109 :
110 root(),
111 minExtent(1.0)
112 {}
113
114 ~Quadtree() override = default;
115
117 std::size_t depth();
118
120 std::size_t size();
121
122 void insert(const geom::Envelope* itemEnv, void* item) override;
123
141 void query(const geom::Envelope* searchEnv, std::vector<void*>& ret) override;
142
143
160 void
161 query(const geom::Envelope* searchEnv, ItemVisitor& visitor) override
162 {
163 /*
164 * the items that are matched are the items in quads which
165 * overlap the search envelope
166 */
167 root.visit(searchEnv, visitor);
168 }
169
177 bool remove(const geom::Envelope* itemEnv, void* item) override;
178
180 std::vector<void*>* queryAll();
181
182 std::string toString() const;
183
188 Quadtree(const Quadtree&) = delete;
189 Quadtree& operator=(const Quadtree&) = delete;
190
191};
192
193} // namespace geos::index::quadtree
194} // namespace geos::index
195} // namespace geos
196
197#ifdef _MSC_VER
198#pragma warning(pop)
199#endif
200
An Envelope defines a rectangulare region of the 2D coordinate plane.
Definition: Envelope.h:58
A visitor for items in an index.
Definition: ItemVisitor.h:28
Abstract class defines basic insertion and query operations supported by classes implementing spatial...
Definition: SpatialIndex.h:46
A Quadtree is a spatial index structure for efficient querying of 2D rectangles. If other kinds of sp...
Definition: Quadtree.h:70
std::size_t size()
Returns the number of items in the tree.
Quadtree(const Quadtree &)=delete
bool remove(const geom::Envelope *itemEnv, void *item) override
std::size_t depth()
Returns the number of levels in the tree.
void query(const geom::Envelope *searchEnv, ItemVisitor &visitor) override
Queries the tree and visits items which may lie in the given search envelope.
Definition: Quadtree.h:161
static geom::Envelope * ensureExtent(const geom::Envelope *itemEnv, double minExtent)
Ensure that the envelope for the inserted item has non-zero extents.
void insert(const geom::Envelope *itemEnv, void *item) override
Adds a spatial item with an extent specified by the given Envelope to the index.
Quadtree()
Constructs a Quadtree with zero items.
Definition: Quadtree.h:108
void query(const geom::Envelope *searchEnv, std::vector< void * > &ret) override
Queries the tree and returns items which may lie in the given search envelope.
std::vector< void * > * queryAll()
Return a list of all items in the Quadtree.
QuadRoot is the root of a single Quadtree. It is centred at the origin, and does not have a defined e...
Definition: quadtree/Root.h:48
Basic namespace for all GEOS functionalities.
Definition: geos.h:39