GEOS 3.14.0dev
index/quadtree/Node.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/Node.java rev 1.8 (JTS-1.10)
16 *
17 **********************************************************************/
18
19#pragma once
20
21#include <geos/export.h>
22#include <geos/index/quadtree/NodeBase.h> // for inheritance
23#include <geos/geom/Coordinate.h> // for composition
24#include <geos/geom/Envelope.h> // for inline
25
26#include <string>
27#include <memory>
28
29#ifdef _MSC_VER
30#pragma warning(push)
31#pragma warning(disable: 4251) // warning C4251: needs to have dll-interface to be used by clients of class
32#endif
33
34// Forward declarations
35namespace geos {
36namespace geom {
37//class Coordinate;
38class Envelope;
39}
40}
41
42namespace geos {
43namespace index { // geos::index
44namespace quadtree { // geos::index::quadtree
45
54class GEOS_DLL Node: public NodeBase {
55
56private:
57
59 std::unique_ptr<geom::Envelope> env;
60
61 geom::Coordinate centre;
62
63 int level;
64
71 Node* getSubnode(int index);
72
73 std::unique_ptr<Node> createSubnode(int index);
74
75protected:
76
77 bool
78 isSearchMatch(const geom::Envelope& searchEnv) const override
79 {
80 return env->intersects(searchEnv);
81 }
82
83public:
84
85 // Create a node computing level from given envelope
86 static std::unique_ptr<Node> createNode(const geom::Envelope& env);
87
89 //
93 static std::unique_ptr<Node> createExpanded(std::unique_ptr<Node> node,
94 const geom::Envelope& addEnv);
95
96 Node(std::unique_ptr<geom::Envelope> nenv, int nlevel)
97 :
98 env(std::move(nenv)),
99 centre((env->getMinX() + env->getMaxX()) / 2,
100 (env->getMinY() + env->getMaxY()) / 2),
101 level(nlevel)
102 {
103 }
104
105 ~Node() override {}
106
111 {
112 return env.get();
113 }
114
120 Node* getNode(const geom::Envelope* searchEnv);
121
126 NodeBase* find(const geom::Envelope* searchEnv);
127
128 void insertNode(std::unique_ptr<Node> node);
129
130 std::string toString() const override;
131
132};
133
134} // namespace geos::index::quadtree
135} // namespace geos::index
136} // namespace geos
137
138#ifdef _MSC_VER
139#pragma warning(pop)
140#endif
141
Coordinate is the lightweight class used to store coordinates.
Definition Coordinate.h:217
An Envelope defines a rectangulare region of the 2D coordinate plane.
Definition Envelope.h:59
The base class for nodes in a Quadtree.
Definition quadtree/NodeBase.h:54
Represents a node of a Quadtree.
Definition index/quadtree/Node.h:54
NodeBase * find(const geom::Envelope *searchEnv)
Returns the smallest existing node containing the envelope.
static std::unique_ptr< Node > createExpanded(std::unique_ptr< Node > node, const geom::Envelope &addEnv)
Create a node containing the given node and envelope.
Node * getNode(const geom::Envelope *searchEnv)
Returns the subquad containing the envelope. Creates the subquad if it does not already exist.
geom::Envelope * getEnvelope()
Definition index/quadtree/Node.h:110
Basic namespace for all GEOS functionalities.
Definition geos.h:39