LibSpatialIndex.jl is a julia wrapper around the C API of libspatialindex, for spatially indexing kD bounding box data. The Julia library (JLL) package is produced by the script at https://github.com/JuliaPackaging/Yggdrasil/tree/master/L/LibSpatialIndex and the resulting binary artifact is downloaded from https://github.com/JuliaBinaryWrappers/LibSpatialIndex_jll.jl.
A new RTree with 2 dimensions can be created using this package as follows:
import LibSpatialIndex
rtree = LibSpatialIndex.RTree(2)
Items can be inserted using the insert!
method, where:
LibSpatialIndex.insert!(rtree, 1, [0.0, 0.0], [1.0, 1.0])
LibSpatialIndex.insert!(rtree, 2, Extexts.Extent(X=(0.0, 2.0), (0.0, 2.0)))
inserts two items,
- the first with
id
1, associated with the box specified by[xmin=0.0,ymin=0.0]
and[xmax=1.0,ymax=1.0]
. - the second with
id
2, associated with the box specified by[xmin=0.0,ymin=0.0]
and[xmax=2.0,ymax=2.0]
.
Thereafter, you can perform queries on the rtree
using either (i) intersects(rtree, minvalues, maxvalues)
for all items intersecting the box specified by minvalues
and maxvalues
, or (ii)
knn(rtree, minvalues, maxvalues, k)
for the k
nearest items in rtree
to the box
specified by minvalues
and maxvalues
.
So for instance:
LibSpatialIndex.intersects(rtree, [0.0, 0.0], [1.0, 1.0])
LibSpatialIndex.intersects(rtree, Extents.extent(X=(0.0, 1.0), Y=(0.0, 1.0)))
will return the vector [1, 2]
on the rtree
constructed earlier, to indicate that items
with ids 1
and 2
intersects the box specified by [xmin=0.0, ymin=0.0]
and [xmax=1.0, ymax=1.0]
.
Any GeoInterface.jl or Extents.jl compatible object can be used directly instead
of defining the Extent
manually - the extent will either be detected or calculated.
You can also perform queries on any individual GeoInterface.jl compatible point, so:
LibSpatialIndex.intersects(rtree, (1.0, 1.0))
will return the ids [1, 2]
in the rtree
constructed earlier, and:
LibSpatialIndex.intersects(rtree, [2.0, 2.0])
will only return the vector [2]
, because item 1 does not contain the point [2.0, 2.0]
.
For knn
queries:
LibSpatialIndex.knn(rtree, [2.0, 2.0], 1)
returns the vector [2]
because the item with id 2
is closest to the point [2.0, 2.0]
, and
sort(LibSpatialIndex.knn(rtree, [2.0, 2.0], 2))
returns the vector [1, 2]
. If the value of k
exceeds the number of items in the rtree
,
then fewer than k
items will be returned, so:
sort(SI.knn(rtree, [2.0, 2.0], 3))
will return the vector [1, 2]
.