public class KdTree extends Object
This implementation supports detecting and snapping points which are closer than a given distance tolerance. If the same point (up to tolerance) is inserted more than once, it is snapped to the existing node. In other words, if a point is inserted which lies within the tolerance of a node already in the index, it is snapped to that node. When an inserted point is snapped to a node then a new node is not created but the count of the existing node is incremented. If more than one node in the tree is within tolerance of an inserted point, the closest and then lowest node is snapped to.
The structure of a KD-Tree depends on the order of insertion of the points. A tree may become unbalanced if the inserted points are coherent (e.g. monotonic in one or both dimensions). A perfectly balanced tree has depth of only log2(N), but an unbalanced tree may be much deeper. This has a serious impact on query efficiency. One solution to this is to randomize the order of points before insertion (e.g. by using Fisher-Yates shuffling).
Constructor and Description |
---|
KdTree()
Creates a new instance of a KdTree with a snapping tolerance of 0.0.
|
KdTree(double tolerance)
Creates a new instance of a KdTree, specifying a snapping distance
tolerance.
|
Modifier and Type | Method and Description |
---|---|
int |
depth()
Computes the depth of the tree.
|
KdNode |
getRoot()
Gets the root node of this tree.
|
KdNode |
insert(Coordinate p)
Inserts a new point in the kd-tree, with no data.
|
KdNode |
insert(Coordinate p,
Object data)
Inserts a new point into the kd-tree.
|
boolean |
isEmpty()
Tests whether the index contains any items.
|
KdNode |
query(Coordinate queryPt)
Searches for a given point in the index and returns its node if found.
|
List |
query(Envelope queryEnv)
Performs a range search of the points in the index.
|
void |
query(Envelope queryEnv,
KdNodeVisitor visitor)
Performs a range search of the points in the index and visits all nodes found.
|
void |
query(Envelope queryEnv,
List result)
Performs a range search of the points in the index.
|
int |
size()
Computes the size (number of items) in the tree.
|
static Coordinate[] |
toCoordinates(Collection kdnodes)
Converts a collection of
KdNode s to an array of Coordinate s. |
static Coordinate[] |
toCoordinates(Collection kdnodes,
boolean includeRepeated)
Converts a collection of
KdNode s
to an array of Coordinate s,
specifying whether repeated nodes should be represented
by multiple coordinates. |
public KdTree()
public KdTree(double tolerance)
tolerance
- the tolerance distance for considering two points equalpublic static Coordinate[] toCoordinates(Collection kdnodes)
KdNode
s to an array of Coordinate
s.kdnodes
- a collection of nodespublic static Coordinate[] toCoordinates(Collection kdnodes, boolean includeRepeated)
KdNode
s
to an array of Coordinate
s,
specifying whether repeated nodes should be represented
by multiple coordinates.kdnodes
- a collection of nodesincludeRepeated
- true if repeated nodes should
be included multiple timespublic KdNode getRoot()
public boolean isEmpty()
public KdNode insert(Coordinate p)
p
- the point to insertpublic KdNode insert(Coordinate p, Object data)
p
- the point to insertdata
- a data item for the pointpublic void query(Envelope queryEnv, KdNodeVisitor visitor)
queryEnv
- the range rectangle to queryvisitor
- a visitor to visit all nodes found by the searchpublic List query(Envelope queryEnv)
queryEnv
- the range rectangle to querypublic void query(Envelope queryEnv, List result)
queryEnv
- the range rectangle to queryresult
- a list to accumulate the result nodes intopublic KdNode query(Coordinate queryPt)
queryPt
- the point to querypublic int depth()
public int size()
Copyright © 2024. All rights reserved.