Recursively pack entries into leaf nodes, then group into internal nodes.
(nodes: &mut Vec<Node>, mut entries: Vec<RTreeEntry>)
| 61 | |
| 62 | /// Recursively pack entries into leaf nodes, then group into internal nodes. |
| 63 | fn str_pack(nodes: &mut Vec<Node>, mut entries: Vec<RTreeEntry>) -> usize { |
| 64 | if entries.len() <= LEAF_CAPACITY { |
| 65 | let mut node = Node::new_leaf(); |
| 66 | if let NodeKind::Leaf { |
| 67 | entries: ref mut leaf, |
| 68 | } = node.kind |
| 69 | { |
| 70 | *leaf = entries; |
| 71 | } |
| 72 | node.recompute_bbox(); |
| 73 | let idx = nodes.len(); |
| 74 | nodes.push(node); |
| 75 | return idx; |
| 76 | } |
| 77 | |
| 78 | let num_leaves = entries.len().div_ceil(LEAF_CAPACITY); |
| 79 | let num_slices = (num_leaves as f64).sqrt().ceil() as usize; |
| 80 | let slice_size = entries.len().div_ceil(num_slices); |
| 81 | |
| 82 | // Sort by longitude (X). |
| 83 | entries.sort_by(|a, b| { |
| 84 | let ca = (a.bbox.min_lng + a.bbox.max_lng) / 2.0; |
| 85 | let cb = (b.bbox.min_lng + b.bbox.max_lng) / 2.0; |
| 86 | ca.partial_cmp(&cb).unwrap_or(std::cmp::Ordering::Equal) |
| 87 | }); |
| 88 | |
| 89 | let mut child_nodes: Vec<usize> = Vec::new(); |
| 90 | |
| 91 | for slice in entries.chunks(slice_size) { |
| 92 | let mut slice_vec: Vec<RTreeEntry> = slice.to_vec(); |
| 93 | // Sort each slice by latitude (Y). |
| 94 | slice_vec.sort_by(|a, b| { |
| 95 | let ca = (a.bbox.min_lat + a.bbox.max_lat) / 2.0; |
| 96 | let cb = (b.bbox.min_lat + b.bbox.max_lat) / 2.0; |
| 97 | ca.partial_cmp(&cb).unwrap_or(std::cmp::Ordering::Equal) |
| 98 | }); |
| 99 | |
| 100 | for chunk in slice_vec.chunks(LEAF_CAPACITY) { |
| 101 | let child_idx = str_pack(nodes, chunk.to_vec()); |
| 102 | child_nodes.push(child_idx); |
| 103 | } |
| 104 | } |
| 105 | |
| 106 | pack_internal(nodes, child_nodes) |
| 107 | } |
| 108 | |
| 109 | /// Recursively group child node indices into internal nodes. |
| 110 | fn pack_internal(nodes: &mut Vec<Node>, child_indices: Vec<usize>) -> usize { |
no test coverage detected