eyros (εύρος) ist eine mehrdimensionale Intervalldatenbank.
Die Datenbank basiert auf BKD- und Intervallbäumen.
eyros arbeitet für jede Dimension mit Skalarkoordinaten (x) oder Intervallkoordinaten (min, max). Es gibt zwei Vorgänge: Batch-Schreiben (zum Einfügen und Löschen) und Abfrage nach Begrenzungsrahmen. Alle Features, die den Begrenzungsrahmen schneiden, werden in den Abfrageergebnissen zurückgegeben.
In diesem Beispiel werden 5000 Datensätze eingefügt, die Daten werden auf die Festplatte geschrieben, dann werden Datensätze innerhalb des Begrenzungsrahmens ((-120.0,20.0,10_000),(-100.0,35.0,20_000))
abgefragt und gedruckt.
Der Begrenzungsrahmen hat die 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 ( ( ) )
}
Die Ausgabe dieses Programms hat die 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)
Lizenz Zero Parity 7.0.0 und Apache 2.0 (Beiträge)