1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
//! [FlatGeobuf](https://bjornharrtell.github.io/flatgeobuf/) is a performant binary encoding
//! for geographic data based on [flatbuffers](http://google.github.io/flatbuffers/) that
//! can hold a collection of [Simple Features](https://en.wikipedia.org/wiki/Simple_Features)
//! including circular interpolations as defined by SQL-MM Part 3.
//!
//!
//! ## Installation
//!
//! ```ini
//! [dependencies]
//! flatgeobuf = "0.3"
//! ```
//!
//! ## Reading a FlatGeobuf file
//!
//! ```rust
//! use flatgeobuf::*;
//! # use std::fs::File;
//! # use std::io::BufReader;
//!
//! # fn read_fbg() -> std::result::Result<(), std::io::Error> {
//! let mut file = BufReader::new(File::open("countries.fgb")?);
//! let hreader = HeaderReader::read(&mut file)?;
//! let header = hreader.header();
//!
//! let mut freader = FeatureReader::select_bbox(&mut file, &header, 8.8, 47.2, 9.5, 55.3)?;
//! while let Ok(feature) = freader.next(&mut file) {
//!     let props = feature.properties_map(&header);
//!     println!("{}", props["name"]);
//! }
//! # Ok(())
//! # }
//! ```
//!
//! ## Zero-copy feature access
//!
//! ```rust
//! # use flatgeobuf::*;
//! # use std::fs::File;
//! # use std::io::BufReader;
//! # let fgb = File::open("../../test/data/countries.fgb").unwrap();
//! # let mut reader = BufReader::new(fgb);
//! # let hreader = HeaderReader::read(&mut reader).unwrap();
//! # let header = hreader.header();
//! # let mut freader = FeatureReader::select_all(&mut reader, &header).unwrap();
//! # let feature = freader.next(&mut reader).unwrap();
//! let _ = feature.iter_properties(&header, |i, n, v| {
//!     println!("columnidx: {} name: {} value: {:?}", i, n, v);
//!     false // don't abort
//! });
//! ```
//!
//! ## Zero-copy geometry reader
//!
//! Geometries can be accessed by implementing the `GeomReader` trait.
//!
//! ```rust
//! # use flatgeobuf::*;
//! # use std::fs::File;
//! # use std::io::BufReader;
//! struct CoordPrinter;
//!
//! impl GeomReader for CoordPrinter {
//!     fn pointxy(&mut self, x: f64, y: f64, _idx: usize) {
//!         println!("({} {})", x, y);
//!     }
//! }
//!
//! # let fgb = File::open("../../test/data/countries.fgb").unwrap();
//! # let mut reader = BufReader::new(fgb);
//! # let hreader = HeaderReader::read(&mut reader).unwrap();
//! # let header = hreader.header();
//! # let mut freader = FeatureReader::select_all(&mut reader, &header).unwrap();
//! # let feature = freader.next(&mut reader).unwrap();
//! let mut coord_printer = CoordPrinter {};
//! let geometry = feature.geometry().unwrap();
//! geometry.parse(&mut coord_printer, header.geometry_type());
//! ```

#[allow(dead_code, unused_imports, non_snake_case)]
mod feature_generated;
mod geojson;
#[allow(dead_code, unused_imports, non_snake_case)]
mod header_generated;
mod packed_r_tree;
mod reader;

pub use feature_generated::flat_geobuf::*;
pub use geojson::*;
pub use header_generated::flat_geobuf::*;
pub use packed_r_tree::*;
pub use reader::*;

pub const VERSION: u8 = 3;
pub const MAGIC_BYTES: [u8; 8] = [b'f', b'g', b'b', VERSION, b'f', b'g', b'b', 0];