Coverage Report

Created: 2026-03-23 07:13

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/rstar-0.12.2/src/rtree.rs
Line
Count
Source
1
use crate::algorithm::bulk_load;
2
use crate::algorithm::iterators::*;
3
use crate::algorithm::nearest_neighbor;
4
use crate::algorithm::nearest_neighbor::NearestNeighborDistance2Iterator;
5
use crate::algorithm::nearest_neighbor::NearestNeighborIterator;
6
use crate::algorithm::removal;
7
use crate::algorithm::selection_functions::*;
8
use crate::envelope::Envelope;
9
use crate::node::ParentNode;
10
use crate::object::{PointDistance, RTreeObject};
11
use crate::params::{verify_parameters, DefaultParams, InsertionStrategy, RTreeParams};
12
use crate::Point;
13
use core::ops::ControlFlow;
14
15
#[cfg(not(test))]
16
use alloc::vec::Vec;
17
18
#[cfg(feature = "serde")]
19
use serde::{Deserialize, Serialize};
20
21
impl<T, Params> Default for RTree<T, Params>
22
where
23
    T: RTreeObject,
24
    Params: RTreeParams,
25
{
26
0
    fn default() -> Self {
27
0
        Self::new_with_params()
28
0
    }
29
}
30
31
/// An n-dimensional r-tree data structure.
32
///
33
/// # R-Trees
34
/// R-Trees are data structures containing multi-dimensional objects like points, rectangles
35
/// or polygons. They are optimized for retrieving the nearest neighbor at any point.
36
///
37
/// R-trees can efficiently find answers to queries like "Find the nearest point of a polygon",
38
/// "Find all police stations within a rectangle" or "Find the 10 nearest restaurants, sorted
39
/// by their distances". Compared to a naive implementation for these scenarios that runs
40
/// in `O(n)` for `n` inserted elements, r-trees reduce this time to `O(log(n))`.
41
///
42
/// However, creating an r-tree is time consuming
43
/// and runs in `O(n * log(n))`. Thus, r-trees are suited best if many queries and only few
44
/// insertions are made. `rstar` also supports [bulk loading](RTree::bulk_load),
45
/// which cuts down the constant factors when creating an r-tree significantly compared to
46
/// sequential insertions.
47
///
48
/// R-trees are also _dynamic_: points can be inserted and removed from an existing tree.
49
///
50
/// ## Partitioning heuristics
51
/// The inserted objects are internally partitioned into several boxes which should have small
52
/// overlap and volume. This is done heuristically. While the originally proposed heuristic focused
53
/// on fast insertion operations, the resulting r-trees were often suboptimally structured. Another
54
/// heuristic, called `R*-tree` (r-star-tree), was proposed to improve the tree structure at the cost of
55
/// longer insertion operations and is currently the crate's only implemented
56
/// [InsertionStrategy].
57
///
58
/// # Usage
59
/// The items inserted into an r-tree must implement the [RTreeObject]
60
/// trait. To support nearest neighbor queries, implement the [PointDistance]
61
/// trait. Some useful geometric primitives that implement the above traits can be found in the
62
/// [crate::primitives] module. Several primitives in the [`geo-types`](https://docs.rs/geo-types/) crate also
63
/// implement these traits.
64
///
65
/// ## Example
66
/// ```
67
/// use rstar::RTree;
68
///
69
/// let mut tree = RTree::new();
70
/// tree.insert([0.1, 0.0f32]);
71
/// tree.insert([0.2, 0.1]);
72
/// tree.insert([0.3, 0.0]);
73
///
74
/// assert_eq!(tree.nearest_neighbor(&[0.4, -0.1]), Some(&[0.3, 0.0]));
75
/// tree.remove(&[0.3, 0.0]);
76
/// assert_eq!(tree.nearest_neighbor(&[0.4, 0.3]), Some(&[0.2, 0.1]));
77
///
78
/// assert_eq!(tree.size(), 2);
79
/// // &RTree implements IntoIterator!
80
/// for point in &tree {
81
///     println!("Tree contains a point {:?}", point);
82
/// }
83
/// ```
84
///
85
/// ## Supported point types
86
/// All types implementing the [Point] trait can be used as underlying point type.
87
/// By default, fixed size arrays can be used as points.
88
///
89
/// # Associating Data with Geometries
90
/// Users wishing to store associated data with geometries can use [crate::primitives::GeomWithData].
91
///
92
/// # Runtime and Performance
93
/// The runtime of query operations (e.g. `nearest neighbor` or `contains`) is usually
94
/// `O(log(n))`, where `n` refers to the number of elements contained in the r-tree.
95
/// A naive sequential algorithm would take `O(n)` time. However, r-trees incur higher
96
/// build up times: inserting an element into an r-tree costs `O(log(n))` time.
97
///
98
/// Most of the selection methods, meaning those with names beginning with `locate_`,
99
/// return iterators which are driven externally and can therefore be combined into
100
/// more complex pipelines using the combinators defined on the [`Iterator`] trait.
101
///
102
/// This flexiblity does come at the cost of temporary heap allocations required
103
/// to keep track of the iteration state. Alternative methods using internal iteration
104
/// are provided to avoid this overhead, their names ending in `_int` or `_int_mut`.
105
///
106
/// They use a callback-based interface to pass the selected objects on to the caller
107
/// thereby being able to use the stack to keep track of the state required for
108
/// traversing the tree.
109
///
110
/// # Bulk loading
111
/// In many scenarios, insertion is only carried out once for many points. In this case,
112
/// [RTree::bulk_load] will be considerably faster. Its total run time
113
/// is still `O(nlog(n))`, i.e. `O(log(n))` per element inserted, but the scaling
114
/// factor is, on average, significantly improved compared with performing single
115
/// insertion n times in a row. **Note the performance caveat
116
/// related to the computation of the envelope**.
117
///
118
/// # Element distribution
119
/// The tree's performance heavily relies on the spatial distribution of its elements.
120
/// Best performance is achieved if:
121
///  * No element is inserted more than once
122
///  * The overlapping area of elements is as small as
123
///    possible.
124
///
125
/// For the edge case that all elements are overlapping (e.g, one and the same element
126
/// is contained `n` times), the performance of most operations usually degrades to `O(n)`.
127
///
128
/// # Type Parameters
129
/// * `T`: The type of objects stored in the r-tree.
130
/// * `Params`: Compile time parameters that change the r-tree's internal layout. Refer to the
131
///   [RTreeParams] trait for more information.
132
///
133
/// # Defining methods generic over r-trees
134
/// If a library defines a method that should be generic over the r-tree type signature, make
135
/// sure to include both type parameters like this:
136
/// ```
137
/// # use rstar::{RTree,RTreeObject, RTreeParams};
138
/// pub fn generic_rtree_function<T, Params>(tree: &mut RTree<T, Params>)
139
/// where
140
///   T: RTreeObject,
141
///   Params: RTreeParams
142
/// {
143
///   // ...
144
/// }
145
/// ```
146
/// Otherwise, any user of `generic_rtree_function` would be forced to use
147
/// a tree with default parameters.
148
///
149
/// # (De)Serialization
150
/// Enable the `serde` feature for [Serde](https://crates.io/crates/serde) support.
151
///
152
/// ## Further reading
153
/// For more information refer to the [wikipedia article](https://en.wikipedia.org/wiki/R-tree).
154
///
155
#[derive(Clone)]
156
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
157
#[cfg_attr(
158
    feature = "serde",
159
    serde(bound(
160
        serialize = "T: Serialize, T::Envelope: Serialize",
161
        deserialize = "T: Deserialize<'de>, T::Envelope: Deserialize<'de>"
162
    ))
163
)]
164
pub struct RTree<T, Params = DefaultParams>
165
where
166
    Params: RTreeParams,
167
    T: RTreeObject,
168
{
169
    root: ParentNode<T>,
170
    size: usize,
171
    _params: ::core::marker::PhantomData<Params>,
172
}
173
174
struct DebugHelper<'a, T, Params>
175
where
176
    T: RTreeObject + ::core::fmt::Debug + 'a,
177
    Params: RTreeParams + 'a,
178
{
179
    rtree: &'a RTree<T, Params>,
180
}
181
182
impl<'a, T, Params> ::core::fmt::Debug for DebugHelper<'a, T, Params>
183
where
184
    T: RTreeObject + ::core::fmt::Debug,
185
    Params: RTreeParams,
186
{
187
0
    fn fmt(&self, formatter: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
188
0
        formatter.debug_set().entries(self.rtree.iter()).finish()
189
0
    }
190
}
191
192
impl<T, Params> ::core::fmt::Debug for RTree<T, Params>
193
where
194
    Params: RTreeParams,
195
    T: RTreeObject + ::core::fmt::Debug,
196
{
197
0
    fn fmt(&self, formatter: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
198
0
        formatter
199
0
            .debug_struct("RTree")
200
0
            .field("size", &self.size)
201
0
            .field("items", &DebugHelper { rtree: self })
202
0
            .finish()
203
0
    }
204
}
205
206
impl<T> RTree<T>
207
where
208
    T: RTreeObject,
209
{
210
    /// Creates a new, empty r-tree.
211
    ///
212
    /// The created r-tree is configured with [default parameters](DefaultParams).
213
0
    pub fn new() -> Self {
214
0
        Self::new_with_params()
215
0
    }
216
217
    /// Creates a new r-tree with some elements already inserted.
218
    ///
219
    /// This method should be the preferred way for creating r-trees. It both
220
    /// runs faster and yields an r-tree with better internal structure that
221
    /// improves query performance.
222
    ///
223
    /// This method implements the overlap minimizing top-down bulk loading algorithm (OMT)
224
    /// as described in [this paper by Lee and Lee (2003)](http://ceur-ws.org/Vol-74/files/FORUM_18.pdf).
225
    ///
226
    /// # Runtime
227
    /// Bulk loading runs in `O(n * log(n))`, where `n` is the number of loaded
228
    /// elements.
229
    ///
230
    /// # Note
231
    /// The envelope of each element will be accessed many times during loading. If that computation
232
    /// is expensive, **consider memoizing it** using [`CachedEnvelope`][crate::primitives::CachedEnvelope].
233
0
    pub fn bulk_load(elements: Vec<T>) -> Self {
234
0
        Self::bulk_load_with_params(elements)
235
0
    }
Unexecuted instantiation: <rstar::rtree::RTree<geo::algorithm::relate::geomgraph::index::segment::Segment<f64>>>::bulk_load
Unexecuted instantiation: <rstar::rtree::RTree<_>>::bulk_load
236
}
237
238
impl<T, Params> RTree<T, Params>
239
where
240
    Params: RTreeParams,
241
    T: RTreeObject,
242
{
243
    /// Creates a new, empty r-tree.
244
    ///
245
    /// The tree's compile time parameters must be specified. Refer to the
246
    /// [RTreeParams] trait for more information and a usage example.
247
0
    pub fn new_with_params() -> Self {
248
0
        verify_parameters::<T, Params>();
249
0
        RTree {
250
0
            root: ParentNode::new_root::<Params>(),
251
0
            size: 0,
252
0
            _params: Default::default(),
253
0
        }
254
0
    }
255
256
    /// Creates a new r-tree with some given elements and configurable parameters.
257
    ///
258
    /// For more information refer to [RTree::bulk_load]
259
    /// and [RTreeParams].
260
0
    pub fn bulk_load_with_params(elements: Vec<T>) -> Self {
261
0
        Self::new_from_bulk_loading(elements, bulk_load::bulk_load_sequential::<_, Params>)
262
0
    }
Unexecuted instantiation: <rstar::rtree::RTree<geo::algorithm::relate::geomgraph::index::segment::Segment<f64>>>::bulk_load_with_params
Unexecuted instantiation: <rstar::rtree::RTree<_, _>>::bulk_load_with_params
263
264
    /// Returns the number of objects in an r-tree.
265
    ///
266
    /// # Example
267
    /// ```
268
    /// use rstar::RTree;
269
    ///
270
    /// let mut tree = RTree::new();
271
    /// assert_eq!(tree.size(), 0);
272
    /// tree.insert([0.0, 1.0, 2.0]);
273
    /// assert_eq!(tree.size(), 1);
274
    /// tree.remove(&[0.0, 1.0, 2.0]);
275
    /// assert_eq!(tree.size(), 0);
276
    /// ```
277
0
    pub fn size(&self) -> usize {
278
0
        self.size
279
0
    }
280
281
0
    pub(crate) fn size_mut(&mut self) -> &mut usize {
282
0
        &mut self.size
283
0
    }
284
285
    /// Returns an iterator over all elements contained in the tree.
286
    ///
287
    /// The order in which the elements are returned is not specified.
288
    ///
289
    /// # Example
290
    /// ```
291
    /// use rstar::RTree;
292
    /// let tree = RTree::bulk_load(vec![(0.0, 0.1), (0.3, 0.2), (0.4, 0.2)]);
293
    /// for point in tree.iter() {
294
    ///     println!("This tree contains point {:?}", point);
295
    /// }
296
    /// ```
297
0
    pub fn iter(&self) -> RTreeIterator<T> {
298
0
        RTreeIterator::new(&self.root, SelectAllFunc)
299
0
    }
300
301
    /// Returns an iterator over all mutable elements contained in the tree.
302
    ///
303
    /// The order in which the elements are returned is not specified.
304
    ///
305
    /// *Note*: It is a logic error to change an inserted item's position or dimensions. This
306
    /// method is primarily meant for own implementations of [RTreeObject]
307
    /// which can contain arbitrary additional data.
308
    /// If the position or location of an inserted object need to change, you will need to [RTree::remove]
309
    /// and reinsert it.
310
    ///
311
0
    pub fn iter_mut(&mut self) -> RTreeIteratorMut<T> {
312
0
        RTreeIteratorMut::new(&mut self.root, SelectAllFunc)
313
0
    }
314
315
    /// Returns all elements contained in an [Envelope].
316
    ///
317
    /// Usually, an envelope is an [axis aligned bounding box](crate::AABB). This
318
    /// method can be used to retrieve all elements that are fully contained within an envelope.
319
    ///
320
    /// # Example
321
    /// ```
322
    /// use rstar::{RTree, AABB};
323
    /// let mut tree = RTree::bulk_load(vec![
324
    ///   [0.0, 0.0],
325
    ///   [0.0, 1.0],
326
    ///   [1.0, 1.0]
327
    /// ]);
328
    /// let half_unit_square = AABB::from_corners([0.0, 0.0], [0.5, 1.0]);
329
    /// let unit_square = AABB::from_corners([0.0, 0.0], [1.0, 1.0]);
330
    /// let elements_in_half_unit_square = tree.locate_in_envelope(&half_unit_square);
331
    /// let elements_in_unit_square = tree.locate_in_envelope(&unit_square);
332
    /// assert_eq!(elements_in_half_unit_square.count(), 2);
333
    /// assert_eq!(elements_in_unit_square.count(), 3);
334
    /// ```
335
0
    pub fn locate_in_envelope(&self, envelope: &T::Envelope) -> LocateInEnvelope<T> {
336
0
        LocateInEnvelope::new(&self.root, SelectInEnvelopeFunction::new(envelope.clone()))
337
0
    }
338
339
    /// Mutable variant of [locate_in_envelope](#method.locate_in_envelope).
340
0
    pub fn locate_in_envelope_mut(&mut self, envelope: &T::Envelope) -> LocateInEnvelopeMut<T> {
341
0
        LocateInEnvelopeMut::new(
342
0
            &mut self.root,
343
0
            SelectInEnvelopeFunction::new(envelope.clone()),
344
        )
345
0
    }
346
347
    /// Variant of [`locate_in_envelope`][Self::locate_in_envelope] using internal iteration.
348
0
    pub fn locate_in_envelope_int<'a, V, B>(
349
0
        &'a self,
350
0
        envelope: &T::Envelope,
351
0
        mut visitor: V,
352
0
    ) -> ControlFlow<B>
353
0
    where
354
0
        V: FnMut(&'a T) -> ControlFlow<B>,
355
    {
356
0
        select_nodes(
357
0
            self.root(),
358
0
            &SelectInEnvelopeFunction::new(envelope.clone()),
359
0
            &mut visitor,
360
        )
361
0
    }
362
363
    /// Mutable variant of [`locate_in_envelope_mut`][Self::locate_in_envelope_mut].
364
0
    pub fn locate_in_envelope_int_mut<'a, V, B>(
365
0
        &'a mut self,
366
0
        envelope: &T::Envelope,
367
0
        mut visitor: V,
368
0
    ) -> ControlFlow<B>
369
0
    where
370
0
        V: FnMut(&'a mut T) -> ControlFlow<B>,
371
    {
372
0
        select_nodes_mut(
373
0
            self.root_mut(),
374
0
            &SelectInEnvelopeFunction::new(envelope.clone()),
375
0
            &mut visitor,
376
        )
377
0
    }
378
379
    /// Returns a draining iterator over all elements contained in the tree.
380
    ///
381
    /// The order in which the elements are returned is not specified.
382
    ///
383
    /// See
384
    /// [drain_with_selection_function](#method.drain_with_selection_function)
385
    /// for more information.
386
0
    pub fn drain(&mut self) -> DrainIterator<T, SelectAllFunc, Params> {
387
0
        self.drain_with_selection_function(SelectAllFunc)
388
0
    }
389
390
    /// Draining variant of [locate_in_envelope](#method.locate_in_envelope).
391
0
    pub fn drain_in_envelope(
392
0
        &mut self,
393
0
        envelope: T::Envelope,
394
0
    ) -> DrainIterator<T, SelectInEnvelopeFunction<T>, Params> {
395
0
        let sel = SelectInEnvelopeFunction::new(envelope);
396
0
        self.drain_with_selection_function(sel)
397
0
    }
398
399
    /// Returns all elements whose envelope intersects a given envelope.
400
    ///
401
    /// Any element fully contained within an envelope is also returned by this method. Two
402
    /// envelopes that "touch" each other (e.g. by sharing only a common corner) are also
403
    /// considered to intersect. Usually, an envelope is an [axis aligned bounding box](crate::AABB).
404
    /// This method will return all elements whose AABB has some common area with
405
    /// a given AABB.
406
    ///
407
    /// # Example
408
    /// ```
409
    /// use rstar::{RTree, AABB};
410
    /// use rstar::primitives::Rectangle;
411
    ///
412
    /// let left_piece = AABB::from_corners([0.0, 0.0], [0.4, 1.0]);
413
    /// let right_piece = AABB::from_corners([0.6, 0.0], [1.0, 1.0]);
414
    /// let middle_piece = AABB::from_corners([0.25, 0.0], [0.75, 1.0]);
415
    ///
416
    /// let mut tree = RTree::<Rectangle<_>>::bulk_load(vec![
417
    ///   left_piece.into(),
418
    ///   right_piece.into(),
419
    ///   middle_piece.into(),
420
    /// ]);
421
    ///
422
    /// let elements_intersecting_left_piece = tree.locate_in_envelope_intersecting(&left_piece);
423
    /// // The left piece should not intersect the right piece!
424
    /// assert_eq!(elements_intersecting_left_piece.count(), 2);
425
    /// let elements_intersecting_middle = tree.locate_in_envelope_intersecting(&middle_piece);
426
    /// // Only the middle piece intersects all pieces within the tree
427
    /// assert_eq!(elements_intersecting_middle.count(), 3);
428
    ///
429
    /// let large_piece = AABB::from_corners([-100., -100.], [100., 100.]);
430
    /// let elements_intersecting_large_piece = tree.locate_in_envelope_intersecting(&large_piece);
431
    /// // Any element that is fully contained should also be returned:
432
    /// assert_eq!(elements_intersecting_large_piece.count(), 3);
433
    /// ```
434
0
    pub fn locate_in_envelope_intersecting(
435
0
        &self,
436
0
        envelope: &T::Envelope,
437
0
    ) -> LocateInEnvelopeIntersecting<T> {
438
0
        LocateInEnvelopeIntersecting::new(
439
0
            &self.root,
440
0
            SelectInEnvelopeFuncIntersecting::new(envelope.clone()),
441
        )
442
0
    }
443
444
    /// Mutable variant of [locate_in_envelope_intersecting](#method.locate_in_envelope_intersecting)
445
0
    pub fn locate_in_envelope_intersecting_mut(
446
0
        &mut self,
447
0
        envelope: &T::Envelope,
448
0
    ) -> LocateInEnvelopeIntersectingMut<T> {
449
0
        LocateInEnvelopeIntersectingMut::new(
450
0
            &mut self.root,
451
0
            SelectInEnvelopeFuncIntersecting::new(envelope.clone()),
452
        )
453
0
    }
454
455
    /// Variant of [`locate_in_envelope_intersecting`][Self::locate_in_envelope_intersecting] using internal iteration.
456
0
    pub fn locate_in_envelope_intersecting_int<'a, V, B>(
457
0
        &'a self,
458
0
        envelope: &T::Envelope,
459
0
        mut visitor: V,
460
0
    ) -> ControlFlow<B>
461
0
    where
462
0
        V: FnMut(&'a T) -> ControlFlow<B>,
463
    {
464
0
        select_nodes(
465
0
            self.root(),
466
0
            &SelectInEnvelopeFuncIntersecting::new(envelope.clone()),
467
0
            &mut visitor,
468
        )
469
0
    }
470
471
    /// Mutable variant of [`locate_in_envelope_intersecting_int`][Self::locate_in_envelope_intersecting_int].
472
0
    pub fn locate_in_envelope_intersecting_int_mut<'a, V, B>(
473
0
        &'a mut self,
474
0
        envelope: &T::Envelope,
475
0
        mut visitor: V,
476
0
    ) -> ControlFlow<B>
477
0
    where
478
0
        V: FnMut(&'a mut T) -> ControlFlow<B>,
479
    {
480
0
        select_nodes_mut(
481
0
            self.root_mut(),
482
0
            &SelectInEnvelopeFuncIntersecting::new(envelope.clone()),
483
0
            &mut visitor,
484
        )
485
0
    }
486
487
    /// Locates elements in the r-tree defined by a selection function.
488
    ///
489
    /// Refer to the documentation of [`SelectionFunction`] for
490
    /// more information.
491
    ///
492
    /// Usually, other `locate` methods should cover most common use cases. This method is only required
493
    /// in more specific situations.
494
0
    pub fn locate_with_selection_function<S: SelectionFunction<T>>(
495
0
        &self,
496
0
        selection_function: S,
497
0
    ) -> SelectionIterator<T, S> {
498
0
        SelectionIterator::new(&self.root, selection_function)
499
0
    }
500
501
    /// Mutable variant of [`locate_with_selection_function`](#method.locate_with_selection_function).
502
0
    pub fn locate_with_selection_function_mut<S: SelectionFunction<T>>(
503
0
        &mut self,
504
0
        selection_function: S,
505
0
    ) -> SelectionIteratorMut<T, S> {
506
0
        SelectionIteratorMut::new(&mut self.root, selection_function)
507
0
    }
508
509
    /// Returns all possible intersecting objects of this and another tree.
510
    ///
511
    /// This will return all objects whose _envelopes_ intersect. No geometric intersection
512
    /// checking is performed.
513
0
    pub fn intersection_candidates_with_other_tree<'a, U>(
514
0
        &'a self,
515
0
        other: &'a RTree<U>,
516
0
    ) -> IntersectionIterator<'a, T, U>
517
0
    where
518
0
        U: RTreeObject<Envelope = T::Envelope>,
519
    {
520
0
        IntersectionIterator::new(self.root(), other.root())
521
0
    }
Unexecuted instantiation: <rstar::rtree::RTree<geo::algorithm::relate::geomgraph::index::segment::Segment<f64>>>::intersection_candidates_with_other_tree::<geo::algorithm::relate::geomgraph::index::segment::Segment<f64>>
Unexecuted instantiation: <rstar::rtree::RTree<_, _>>::intersection_candidates_with_other_tree::<_>
522
523
    /// Returns the tree's root node.
524
    ///
525
    /// Usually, you will not need to call this method. However, for debugging purposes or for
526
    /// advanced algorithms, knowledge about the tree's internal structure may be required.
527
    /// For these cases, this method serves as an entry point.
528
0
    pub fn root(&self) -> &ParentNode<T> {
529
0
        &self.root
530
0
    }
Unexecuted instantiation: <rstar::rtree::RTree<geo::algorithm::relate::geomgraph::index::segment::Segment<f64>>>::root
Unexecuted instantiation: <rstar::rtree::RTree<_, _>>::root
531
532
0
    pub(crate) fn root_mut(&mut self) -> &mut ParentNode<T> {
533
0
        &mut self.root
534
0
    }
535
536
0
    fn new_from_bulk_loading(
537
0
        elements: Vec<T>,
538
0
        root_loader: impl Fn(Vec<T>) -> ParentNode<T>,
539
0
    ) -> Self {
540
0
        verify_parameters::<T, Params>();
541
0
        let size = elements.len();
542
0
        let root = if size == 0 {
543
0
            ParentNode::new_root::<Params>()
544
        } else {
545
0
            root_loader(elements)
546
        };
547
0
        RTree {
548
0
            root,
549
0
            size,
550
0
            _params: Default::default(),
551
0
        }
552
0
    }
Unexecuted instantiation: <rstar::rtree::RTree<geo::algorithm::relate::geomgraph::index::segment::Segment<f64>>>::new_from_bulk_loading::<rstar::algorithm::bulk_load::bulk_load_sequential::bulk_load_sequential<geo::algorithm::relate::geomgraph::index::segment::Segment<f64>, rstar::params::DefaultParams>>
Unexecuted instantiation: <rstar::rtree::RTree<_, _>>::new_from_bulk_loading::<_>
553
554
    /// Removes and returns a single element from the tree. The element to remove is specified
555
    /// by a [`SelectionFunction`].
556
    ///
557
    /// See also: [`RTree::remove`], [`RTree::remove_at_point`]
558
    ///
559
0
    pub fn remove_with_selection_function<F>(&mut self, function: F) -> Option<T>
560
0
    where
561
0
        F: SelectionFunction<T>,
562
    {
563
0
        removal::DrainIterator::new(self, function).take(1).last()
564
0
    }
565
566
    /// Drain elements selected by a [`SelectionFunction`]. Returns an
567
    /// iterator that successively removes selected elements and returns
568
    /// them. This is the most generic drain API, see also:
569
    /// [`RTree::drain_in_envelope_intersecting`],
570
    /// [`RTree::drain_within_distance`].
571
    ///
572
    /// # Remarks
573
    ///
574
    /// This API is similar to `Vec::drain_filter`, but stopping the
575
    /// iteration would stop the removal. However, the returned iterator
576
    /// must be properly dropped. Leaking this iterator leads to a leak
577
    /// amplification, where all the elements in the tree are leaked.
578
0
    pub fn drain_with_selection_function<F>(&mut self, function: F) -> DrainIterator<T, F, Params>
579
0
    where
580
0
        F: SelectionFunction<T>,
581
    {
582
0
        removal::DrainIterator::new(self, function)
583
0
    }
584
585
    /// Drains elements intersecting the `envelope`. Similar to
586
    /// `locate_in_envelope_intersecting`, except the elements are removed
587
    /// and returned via an iterator.
588
0
    pub fn drain_in_envelope_intersecting(
589
0
        &mut self,
590
0
        envelope: T::Envelope,
591
0
    ) -> DrainIterator<T, SelectInEnvelopeFuncIntersecting<T>, Params> {
592
0
        let selection_function = SelectInEnvelopeFuncIntersecting::new(envelope);
593
0
        self.drain_with_selection_function(selection_function)
594
0
    }
595
}
596
597
impl<T, Params> RTree<T, Params>
598
where
599
    Params: RTreeParams,
600
    T: PointDistance,
601
{
602
    /// Returns a single object that covers a given point.
603
    ///
604
    /// Method [contains_point](PointDistance::contains_point)
605
    /// is used to determine if a tree element contains the given point.
606
    ///
607
    /// If multiple elements contain the given point, any of them is returned.
608
0
    pub fn locate_at_point(&self, point: &<T::Envelope as Envelope>::Point) -> Option<&T> {
609
0
        self.locate_all_at_point(point).next()
610
0
    }
611
612
    /// Mutable variant of [RTree::locate_at_point].
613
0
    pub fn locate_at_point_mut(
614
0
        &mut self,
615
0
        point: &<T::Envelope as Envelope>::Point,
616
0
    ) -> Option<&mut T> {
617
0
        self.locate_all_at_point_mut(point).next()
618
0
    }
619
620
    /// Variant of [`locate_at_point`][Self::locate_at_point] using internal iteration.
621
0
    pub fn locate_at_point_int(&self, point: &<T::Envelope as Envelope>::Point) -> Option<&T> {
622
0
        match self.locate_all_at_point_int(point, ControlFlow::Break) {
623
0
            ControlFlow::Break(node) => Some(node),
624
0
            ControlFlow::Continue(()) => None,
625
        }
626
0
    }
627
628
    /// Mutable variant of [`locate_at_point_int`][Self::locate_at_point_int].
629
0
    pub fn locate_at_point_int_mut(
630
0
        &mut self,
631
0
        point: &<T::Envelope as Envelope>::Point,
632
0
    ) -> Option<&mut T> {
633
0
        match self.locate_all_at_point_int_mut(point, ControlFlow::Break) {
634
0
            ControlFlow::Break(node) => Some(node),
635
0
            ControlFlow::Continue(()) => None,
636
        }
637
0
    }
638
639
    /// Locate all elements containing a given point.
640
    ///
641
    /// Method [PointDistance::contains_point] is used
642
    /// to determine if a tree element contains the given point.
643
    /// # Example
644
    /// ```
645
    /// use rstar::RTree;
646
    /// use rstar::primitives::Rectangle;
647
    ///
648
    /// let tree = RTree::bulk_load(vec![
649
    ///   Rectangle::from_corners([0.0, 0.0], [2.0, 2.0]),
650
    ///   Rectangle::from_corners([1.0, 1.0], [3.0, 3.0])
651
    /// ]);
652
    ///
653
    /// assert_eq!(tree.locate_all_at_point(&[1.5, 1.5]).count(), 2);
654
    /// assert_eq!(tree.locate_all_at_point(&[0.0, 0.0]).count(), 1);
655
    /// assert_eq!(tree.locate_all_at_point(&[-1., 0.0]).count(), 0);
656
    /// ```
657
0
    pub fn locate_all_at_point(
658
0
        &self,
659
0
        point: &<T::Envelope as Envelope>::Point,
660
0
    ) -> LocateAllAtPoint<T> {
661
0
        LocateAllAtPoint::new(&self.root, SelectAtPointFunction::new(point.clone()))
662
0
    }
663
664
    /// Mutable variant of [`locate_all_at_point`][Self::locate_all_at_point].
665
0
    pub fn locate_all_at_point_mut(
666
0
        &mut self,
667
0
        point: &<T::Envelope as Envelope>::Point,
668
0
    ) -> LocateAllAtPointMut<T> {
669
0
        LocateAllAtPointMut::new(&mut self.root, SelectAtPointFunction::new(point.clone()))
670
0
    }
671
672
    /// Variant of [`locate_all_at_point`][Self::locate_all_at_point] using internal iteration.
673
0
    pub fn locate_all_at_point_int<'a, V, B>(
674
0
        &'a self,
675
0
        point: &<T::Envelope as Envelope>::Point,
676
0
        mut visitor: V,
677
0
    ) -> ControlFlow<B>
678
0
    where
679
0
        V: FnMut(&'a T) -> ControlFlow<B>,
680
    {
681
0
        select_nodes(
682
0
            &self.root,
683
0
            &SelectAtPointFunction::new(point.clone()),
684
0
            &mut visitor,
685
        )
686
0
    }
687
688
    /// Mutable variant of [`locate_all_at_point_int`][Self::locate_all_at_point_int].
689
0
    pub fn locate_all_at_point_int_mut<'a, V, B>(
690
0
        &'a mut self,
691
0
        point: &<T::Envelope as Envelope>::Point,
692
0
        mut visitor: V,
693
0
    ) -> ControlFlow<B>
694
0
    where
695
0
        V: FnMut(&'a mut T) -> ControlFlow<B>,
696
    {
697
0
        select_nodes_mut(
698
0
            &mut self.root,
699
0
            &SelectAtPointFunction::new(point.clone()),
700
0
            &mut visitor,
701
        )
702
0
    }
703
704
    /// Removes an element containing a given point.
705
    ///
706
    /// The removed element, if any, is returned. If multiple elements cover the given point,
707
    /// only one of them is removed and returned.
708
    ///
709
    /// # Example
710
    /// ```
711
    /// use rstar::RTree;
712
    /// use rstar::primitives::Rectangle;
713
    ///
714
    /// let mut tree = RTree::bulk_load(vec![
715
    ///   Rectangle::from_corners([0.0, 0.0], [2.0, 2.0]),
716
    ///   Rectangle::from_corners([1.0, 1.0], [3.0, 3.0])
717
    /// ]);
718
    ///
719
    /// assert!(tree.remove_at_point(&[1.5, 1.5]).is_some());
720
    /// assert!(tree.remove_at_point(&[1.5, 1.5]).is_some());
721
    /// assert!(tree.remove_at_point(&[1.5, 1.5]).is_none());
722
    ///```
723
0
    pub fn remove_at_point(&mut self, point: &<T::Envelope as Envelope>::Point) -> Option<T> {
724
0
        let removal_function = SelectAtPointFunction::new(point.clone());
725
0
        self.remove_with_selection_function(removal_function)
726
0
    }
727
}
728
729
impl<T, Params> RTree<T, Params>
730
where
731
    Params: RTreeParams,
732
    T: RTreeObject + PartialEq,
733
{
734
    /// Returns `true` if a given element is equal (`==`) to an element in the
735
    /// r-tree.
736
    ///
737
    /// This method will only work correctly if two equal elements also have the
738
    /// same envelope.
739
    ///
740
    /// # Example
741
    /// ```
742
    /// use rstar::RTree;
743
    ///
744
    /// let mut tree = RTree::new();
745
    /// assert!(!tree.contains(&[0.0, 2.0]));
746
    /// tree.insert([0.0, 2.0]);
747
    /// assert!(tree.contains(&[0.0, 2.0]));
748
    /// ```
749
0
    pub fn contains(&self, t: &T) -> bool {
750
0
        self.locate_in_envelope(&t.envelope()).any(|e| e == t)
751
0
    }
752
753
    /// Removes and returns an element of the r-tree equal (`==`) to a given element.
754
    ///
755
    /// If multiple elements equal to the given elements are contained in the tree, only
756
    /// one of them is removed and returned.
757
    ///
758
    /// This method will only work correctly if two equal elements also have the
759
    /// same envelope.
760
    ///
761
    /// # Example
762
    /// ```
763
    /// use rstar::RTree;
764
    ///
765
    /// let mut tree = RTree::new();
766
    /// tree.insert([0.0, 2.0]);
767
    /// // The element can be inserted twice just fine
768
    /// tree.insert([0.0, 2.0]);
769
    /// assert!(tree.remove(&[0.0, 2.0]).is_some());
770
    /// assert!(tree.remove(&[0.0, 2.0]).is_some());
771
    /// assert!(tree.remove(&[0.0, 2.0]).is_none());
772
    /// ```
773
0
    pub fn remove(&mut self, t: &T) -> Option<T> {
774
0
        let removal_function = SelectEqualsFunction::new(t);
775
0
        self.remove_with_selection_function(removal_function)
776
0
    }
777
}
778
779
impl<T, Params> RTree<T, Params>
780
where
781
    Params: RTreeParams,
782
    T: PointDistance,
783
{
784
    /// Returns the nearest neighbor for a given point.
785
    ///
786
    /// The distance is calculated by calling
787
    /// [PointDistance::distance_2]
788
    ///
789
    /// # Example
790
    /// ```
791
    /// use rstar::RTree;
792
    /// let tree = RTree::bulk_load(vec![
793
    ///   [0.0, 0.0],
794
    ///   [0.0, 1.0],
795
    /// ]);
796
    /// assert_eq!(tree.nearest_neighbor(&[-1., 0.0]), Some(&[0.0, 0.0]));
797
    /// assert_eq!(tree.nearest_neighbor(&[0.0, 2.0]), Some(&[0.0, 1.0]));
798
    /// ```
799
0
    pub fn nearest_neighbor(&self, query_point: &<T::Envelope as Envelope>::Point) -> Option<&T> {
800
0
        if self.size > 0 {
801
            // The single-nearest-neighbor retrieval may in rare cases return None due to
802
            // rounding issues. The iterator will still work, though.
803
0
            nearest_neighbor::nearest_neighbor(&self.root, query_point.clone())
804
0
                .or_else(|| self.nearest_neighbor_iter(query_point).next())
805
        } else {
806
0
            None
807
        }
808
0
    }
809
810
    /// Returns the nearest neighbors for a given point.
811
    ///
812
    /// The distance is calculated by calling
813
    /// [PointDistance::distance_2]
814
    ///
815
    /// All returned values will have the exact same distance from the given query point.
816
    /// Returns an empty `Vec` if the tree is empty.
817
    ///
818
    /// # Example
819
    /// ```
820
    /// use rstar::RTree;
821
    /// let tree = RTree::bulk_load(vec![
822
    ///   [0.0, 0.0],
823
    ///   [0.0, 1.0],
824
    ///   [1.0, 0.0],
825
    /// ]);
826
    ///
827
    /// // A single nearest neighbor
828
    /// assert_eq!(tree.nearest_neighbors(&[0.01, 0.01]), &[&[0.0, 0.0]]);
829
    ///
830
    /// // Two nearest neighbors
831
    /// let nearest_two = tree.nearest_neighbors(&[1.0, 1.0]);
832
    /// assert_eq!(nearest_two.len(), 2);
833
    /// assert!(nearest_two.contains(&&[0.0, 1.0]));
834
    /// assert!(nearest_two.contains(&&[1.0, 0.0]));
835
    /// ```
836
0
    pub fn nearest_neighbors(&self, query_point: &<T::Envelope as Envelope>::Point) -> Vec<&T> {
837
0
        nearest_neighbor::nearest_neighbors(&self.root, query_point.clone())
838
0
    }
839
840
    /// Returns all elements of the tree within a certain distance.
841
    ///
842
    /// The elements may be returned in any order. Each returned element
843
    /// will have a squared distance less or equal to the given squared distance.
844
    ///
845
    /// This method makes use of [PointDistance::distance_2_if_less_or_equal].
846
    /// If performance is critical and the distance calculation to the object is fast,
847
    /// overwriting this function may be beneficial.
848
0
    pub fn locate_within_distance(
849
0
        &self,
850
0
        query_point: <T::Envelope as Envelope>::Point,
851
0
        max_squared_radius: <<T::Envelope as Envelope>::Point as Point>::Scalar,
852
0
    ) -> LocateWithinDistanceIterator<T> {
853
0
        let selection_function = SelectWithinDistanceFunction::new(query_point, max_squared_radius);
854
0
        LocateWithinDistanceIterator::new(self.root(), selection_function)
855
0
    }
856
857
    /// Drain all elements of the tree within a certain distance.
858
    ///
859
    /// Similar to [`RTree::locate_within_distance`], but removes and
860
    /// returns the elements via an iterator.
861
0
    pub fn drain_within_distance(
862
0
        &mut self,
863
0
        query_point: <T::Envelope as Envelope>::Point,
864
0
        max_squared_radius: <<T::Envelope as Envelope>::Point as Point>::Scalar,
865
0
    ) -> DrainIterator<T, SelectWithinDistanceFunction<T>, Params> {
866
0
        let selection_function = SelectWithinDistanceFunction::new(query_point, max_squared_radius);
867
0
        self.drain_with_selection_function(selection_function)
868
0
    }
869
870
    /// Returns all elements of the tree sorted by their distance to a given point.
871
    ///
872
    /// # Runtime
873
    /// Every `next()` call runs in `O(log(n))`. Creating the iterator runs in
874
    /// `O(log(n))`.
875
    /// The [r-tree documentation](RTree) contains more information about
876
    /// r-tree performance.
877
    ///
878
    /// # Example
879
    /// ```
880
    /// use rstar::RTree;
881
    /// let tree = RTree::bulk_load(vec![
882
    ///   [0.0, 0.0],
883
    ///   [0.0, 1.0],
884
    /// ]);
885
    ///
886
    /// let nearest_neighbors = tree.nearest_neighbor_iter(&[0.5, 0.0]).collect::<Vec<_>>();
887
    /// assert_eq!(nearest_neighbors, vec![&[0.0, 0.0], &[0.0, 1.0]]);
888
    /// ```
889
0
    pub fn nearest_neighbor_iter(
890
0
        &self,
891
0
        query_point: &<T::Envelope as Envelope>::Point,
892
0
    ) -> NearestNeighborIterator<T> {
893
0
        nearest_neighbor::NearestNeighborIterator::new(&self.root, query_point.clone())
894
0
    }
895
896
    /// Returns `(element, distance^2)` tuples of the tree sorted by their distance to a given point.
897
    ///
898
    /// The distance is calculated by calling
899
    /// [PointDistance::distance_2].
900
    #[deprecated(note = "Please use nearest_neighbor_iter_with_distance_2 instead")]
901
0
    pub fn nearest_neighbor_iter_with_distance(
902
0
        &self,
903
0
        query_point: &<T::Envelope as Envelope>::Point,
904
0
    ) -> NearestNeighborDistance2Iterator<T> {
905
0
        nearest_neighbor::NearestNeighborDistance2Iterator::new(&self.root, query_point.clone())
906
0
    }
907
908
    /// Returns `(element, distance^2)` tuples of the tree sorted by their distance to a given point.
909
    ///
910
    /// The distance is calculated by calling
911
    /// [PointDistance::distance_2].
912
0
    pub fn nearest_neighbor_iter_with_distance_2(
913
0
        &self,
914
0
        query_point: &<T::Envelope as Envelope>::Point,
915
0
    ) -> NearestNeighborDistance2Iterator<T> {
916
0
        nearest_neighbor::NearestNeighborDistance2Iterator::new(&self.root, query_point.clone())
917
0
    }
918
919
    /// Removes the nearest neighbor for a given point and returns it.
920
    ///
921
    /// The distance is calculated by calling
922
    /// [PointDistance::distance_2].
923
    ///
924
    /// # Example
925
    /// ```
926
    /// use rstar::RTree;
927
    /// let mut tree = RTree::bulk_load(vec![
928
    ///   [0.0, 0.0],
929
    ///   [0.0, 1.0],
930
    /// ]);
931
    /// assert_eq!(tree.pop_nearest_neighbor(&[0.0, 0.0]), Some([0.0, 0.0]));
932
    /// assert_eq!(tree.pop_nearest_neighbor(&[0.0, 0.0]), Some([0.0, 1.0]));
933
    /// assert_eq!(tree.pop_nearest_neighbor(&[0.0, 0.0]), None);
934
    /// ```
935
0
    pub fn pop_nearest_neighbor(
936
0
        &mut self,
937
0
        query_point: &<T::Envelope as Envelope>::Point,
938
0
    ) -> Option<T> {
939
0
        if let Some(neighbor) = self.nearest_neighbor(query_point) {
940
0
            let removal_function = SelectByAddressFunction::new(neighbor.envelope(), neighbor);
941
0
            self.remove_with_selection_function(removal_function)
942
        } else {
943
0
            None
944
        }
945
0
    }
946
}
947
948
impl<T, Params> RTree<T, Params>
949
where
950
    T: RTreeObject,
951
    Params: RTreeParams,
952
{
953
    /// Inserts a new element into the r-tree.
954
    ///
955
    /// If the element is already present in the tree, it will now be present twice.
956
    ///
957
    /// # Runtime
958
    /// This method runs in `O(log(n))`.
959
    /// The [r-tree documentation](RTree) contains more information about
960
    /// r-tree performance.
961
0
    pub fn insert(&mut self, t: T) {
962
0
        Params::DefaultInsertionStrategy::insert(self, t);
963
0
        self.size += 1;
964
0
    }
965
}
966
967
impl<T, Params> IntoIterator for RTree<T, Params>
968
where
969
    T: RTreeObject,
970
    Params: RTreeParams,
971
{
972
    type IntoIter = IntoIter<T>;
973
    type Item = T;
974
975
0
    fn into_iter(self) -> Self::IntoIter {
976
0
        IntoIter::new(self.root)
977
0
    }
978
}
979
980
impl<'a, T, Params> IntoIterator for &'a RTree<T, Params>
981
where
982
    T: RTreeObject,
983
    Params: RTreeParams,
984
{
985
    type IntoIter = RTreeIterator<'a, T>;
986
    type Item = &'a T;
987
988
0
    fn into_iter(self) -> Self::IntoIter {
989
0
        self.iter()
990
0
    }
991
}
992
993
impl<'a, T, Params> IntoIterator for &'a mut RTree<T, Params>
994
where
995
    T: RTreeObject,
996
    Params: RTreeParams,
997
{
998
    type IntoIter = RTreeIteratorMut<'a, T>;
999
    type Item = &'a mut T;
1000
1001
0
    fn into_iter(self) -> Self::IntoIter {
1002
0
        self.iter_mut()
1003
0
    }
1004
}
1005
1006
#[cfg(test)]
1007
mod test {
1008
    use super::RTree;
1009
    use crate::algorithm::rstar::RStarInsertionStrategy;
1010
    use crate::params::RTreeParams;
1011
    use crate::test_utilities::{create_random_points, SEED_1};
1012
    use crate::DefaultParams;
1013
1014
    struct TestParams;
1015
    impl RTreeParams for TestParams {
1016
        const MIN_SIZE: usize = 10;
1017
        const MAX_SIZE: usize = 20;
1018
        const REINSERTION_COUNT: usize = 1;
1019
        type DefaultInsertionStrategy = RStarInsertionStrategy;
1020
    }
1021
1022
    #[test]
1023
    fn test_remove_capacity() {
1024
        pub struct WeirdParams;
1025
1026
        impl RTreeParams for WeirdParams {
1027
            const MIN_SIZE: usize = 1;
1028
            const MAX_SIZE: usize = 10;
1029
            const REINSERTION_COUNT: usize = 1;
1030
            type DefaultInsertionStrategy = RStarInsertionStrategy;
1031
        }
1032
1033
        let mut items: Vec<[f32; 2]> = Vec::new();
1034
        for i in 0..2 {
1035
            items.push([i as f32, i as f32]);
1036
        }
1037
        let mut tree: RTree<_, WeirdParams> = RTree::bulk_load_with_params(items);
1038
        assert_eq!(tree.remove(&[1.0, 1.0]).unwrap(), [1.0, 1.0]);
1039
    }
1040
1041
    #[test]
1042
    fn test_create_rtree_with_parameters() {
1043
        let tree: RTree<[f32; 2], TestParams> = RTree::new_with_params();
1044
        assert_eq!(tree.size(), 0);
1045
    }
1046
1047
    #[test]
1048
    fn test_insert_single() {
1049
        let mut tree: RTree<_> = RTree::new();
1050
        tree.insert([0.02f32, 0.4f32]);
1051
        assert_eq!(tree.size(), 1);
1052
        assert!(tree.contains(&[0.02, 0.4]));
1053
        assert!(!tree.contains(&[0.3, 0.2]));
1054
    }
1055
1056
    #[test]
1057
    fn test_insert_many() {
1058
        const NUM_POINTS: usize = 1000;
1059
        let points = create_random_points(NUM_POINTS, SEED_1);
1060
        let mut tree = RTree::new();
1061
        for p in &points {
1062
            tree.insert(*p);
1063
            tree.root.sanity_check::<DefaultParams>(true);
1064
        }
1065
        assert_eq!(tree.size(), NUM_POINTS);
1066
        for p in &points {
1067
            assert!(tree.contains(p));
1068
        }
1069
    }
1070
1071
    #[test]
1072
    fn test_fmt_debug() {
1073
        let tree = RTree::bulk_load(vec![[0, 1], [0, 1]]);
1074
        let debug: String = format!("{:?}", tree);
1075
        assert_eq!(debug, "RTree { size: 2, items: {[0, 1], [0, 1]} }");
1076
    }
1077
1078
    #[test]
1079
    fn test_default() {
1080
        let tree: RTree<[f32; 2]> = Default::default();
1081
        assert_eq!(tree.size(), 0);
1082
    }
1083
1084
    #[cfg(feature = "serde")]
1085
    #[test]
1086
    fn test_serialization() {
1087
        use crate::test_utilities::create_random_integers;
1088
1089
        use serde_json;
1090
        const SIZE: usize = 20;
1091
        let points = create_random_integers::<[i32; 2]>(SIZE, SEED_1);
1092
        let tree = RTree::bulk_load(points.clone());
1093
        let json = serde_json::to_string(&tree).expect("Serializing tree failed");
1094
        let parsed: RTree<[i32; 2]> =
1095
            serde_json::from_str(&json).expect("Deserializing tree failed");
1096
        assert_eq!(parsed.size(), SIZE);
1097
        for point in &points {
1098
            assert!(parsed.contains(point));
1099
        }
1100
    }
1101
1102
    #[test]
1103
    fn test_bulk_load_crash() {
1104
        let bulk_nodes = vec![
1105
            [570.0, 1080.0, 89.0],
1106
            [30.0, 1080.0, 627.0],
1107
            [1916.0, 1080.0, 68.0],
1108
            [274.0, 1080.0, 790.0],
1109
            [476.0, 1080.0, 895.0],
1110
            [1557.0, 1080.0, 250.0],
1111
            [1546.0, 1080.0, 883.0],
1112
            [1512.0, 1080.0, 610.0],
1113
            [1729.0, 1080.0, 358.0],
1114
            [1841.0, 1080.0, 434.0],
1115
            [1752.0, 1080.0, 696.0],
1116
            [1674.0, 1080.0, 705.0],
1117
            [136.0, 1080.0, 22.0],
1118
            [1593.0, 1080.0, 71.0],
1119
            [586.0, 1080.0, 272.0],
1120
            [348.0, 1080.0, 373.0],
1121
            [502.0, 1080.0, 2.0],
1122
            [1488.0, 1080.0, 1072.0],
1123
            [31.0, 1080.0, 526.0],
1124
            [1695.0, 1080.0, 559.0],
1125
            [1663.0, 1080.0, 298.0],
1126
            [316.0, 1080.0, 417.0],
1127
            [1348.0, 1080.0, 731.0],
1128
            [784.0, 1080.0, 126.0],
1129
            [225.0, 1080.0, 847.0],
1130
            [79.0, 1080.0, 819.0],
1131
            [320.0, 1080.0, 504.0],
1132
            [1714.0, 1080.0, 1026.0],
1133
            [264.0, 1080.0, 229.0],
1134
            [108.0, 1080.0, 158.0],
1135
            [1665.0, 1080.0, 604.0],
1136
            [496.0, 1080.0, 231.0],
1137
            [1813.0, 1080.0, 865.0],
1138
            [1200.0, 1080.0, 326.0],
1139
            [1661.0, 1080.0, 818.0],
1140
            [135.0, 1080.0, 229.0],
1141
            [424.0, 1080.0, 1016.0],
1142
            [1708.0, 1080.0, 791.0],
1143
            [1626.0, 1080.0, 682.0],
1144
            [442.0, 1080.0, 895.0],
1145
        ];
1146
1147
        let nodes = vec![
1148
            [1916.0, 1060.0, 68.0],
1149
            [1664.0, 1060.0, 298.0],
1150
            [1594.0, 1060.0, 71.0],
1151
            [225.0, 1060.0, 846.0],
1152
            [1841.0, 1060.0, 434.0],
1153
            [502.0, 1060.0, 2.0],
1154
            [1625.5852, 1060.0122, 682.0],
1155
            [1348.5273, 1060.0029, 731.08124],
1156
            [316.36127, 1060.0298, 418.24515],
1157
            [1729.3253, 1060.0023, 358.50134],
1158
        ];
1159
        let mut tree = RTree::bulk_load(bulk_nodes);
1160
        for node in nodes {
1161
            // Bulk loading will create nodes larger than Params::MAX_SIZE,
1162
            // which is intentional and not harmful.
1163
            tree.insert(node);
1164
            tree.root().sanity_check::<DefaultParams>(false);
1165
        }
1166
    }
1167
}