15 stable releases (3 major)

4.6.0 Oct 11, 2021
4.3.0 Sep 29, 2021
4.2.2 Jun 25, 2021
4.0.0 Feb 20, 2021
1.0.0 Feb 27, 2020

#13 in Database implementations

Download history 4/week @ 2021-06-28 5/week @ 2021-07-05 5/week @ 2021-07-12 13/week @ 2021-07-19 16/week @ 2021-07-26 28/week @ 2021-08-02 22/week @ 2021-08-09 16/week @ 2021-08-16 4/week @ 2021-08-23 4/week @ 2021-09-06 21/week @ 2021-09-13 10/week @ 2021-09-20 27/week @ 2021-09-27 52/week @ 2021-10-04 52/week @ 2021-10-11

72 downloads per month
Used in peermaps-ingest

Custom license

140KB
3.5K SLoC

Rust 3K SLoC // 0.0% comments JavaScript 584 SLoC

eyros

eyros (εύρος) is a multi-dimensional interval database.

The database is based on bkd and interval trees.

eyros operates on scalar (x) or interval (min,max) coordinates for each dimension. There are 2 operations: batched write (for inserting and deleting) and query by bounding box. All features that intersect the bounding box are returned in the query results.

example

This example inserts 5000 records, writes the data to disk, then queries and prints records inside the bounding box ((-120.0,20.0,10_000),(-100.0,35.0,20_000)).

The bounding box is of the form ((min_x,min_y,min_z),(max_x,max_y,max_z)).

use eyros::{Row,Coord};
use rand::random;
use async_std::prelude::*;

type P = (Coord<f32>,Coord<f32>,Coord<u16>);
type V = u64;
type E = Box<dyn std::error::Error+Sync+Send>;

#[async_std::main]
async fn main() -> Result<(),E> {
  let mut db = eyros::open_from_path3(
    &std::path::PathBuf::from("/tmp/eyros.db")
  ).await?;
  let batch: Vec<Row<P,V>> = (0..5_000).map(|i| {
    let xmin = (random::<f32>()*2.0-1.0)*180.0;
    let xmax = xmin + random::<f32>().powf(16.0)*(180.0-xmin);
    let ymin = (random::<f32>()*2.0-1.0)*90.0;
    let ymax = ymin + random::<f32>().powf(16.0)*(90.0-ymin);
    let z = random::<u16>();
    let point = (
      Coord::Interval(xmin,xmax),
      Coord::Interval(ymin,ymax),
      Coord::Scalar(z)
    );
    Row::Insert(point, i)
  }).collect();
  db.batch(&batch).await?;
  db.sync().await?;

  let bbox = ((-120.0,20.0,10_000),(-100.0,35.0,20_000));
  let mut stream = db.query(&bbox).await?;
  while let Some(result) = stream.next().await {
    println!("{:?}", result?);
  }
  Ok(())
}

The output from this program is of the form (coords, value):

$ cargo run --example polygons -q
((Interval(-100.94689, -100.94689), Interval(20.108843, 20.109331), Scalar(16522)), 4580)
((Interval(-111.62768, -110.40406), Interval(-7.519809, 86.154755), Scalar(12384)), 2603)
((Interval(-114.46505, -31.340988), Interval(-57.901405, 20.235504), Scalar(11360)), 1245)
((Interval(-159.97859, 121.304184), Interval(32.35743, 32.35743), Scalar(10164)), 3294)
((Interval(-150.29192, -35.475517), Interval(-39.97779, 29.163605), Scalar(15333)), 2336)
((Interval(-162.45879, -92.46166), Interval(31.187943, 31.187975), Scalar(12221)), 2826)
((Interval(-160.53441, -88.66396), Interval(10.031784, 21.852394), Scalar(11711)), 2366)
((Interval(-132.39021, -98.14838), Interval(-0.06010294, 53.88453), Scalar(10685)), 3441)

license

license zero parity 7.0.0 and apache 2.0 (contributions)

Dependencies

~2.7–5MB
~94K SLoC