#serialization #osm #openstreetmap #flatdata


OpenStreetMap (OSM) data format providing an efficient random data access through memory mapped files

1 unstable release

0.1.0 Oct 18, 2020

#844 in Encoding

Used in osmflatc





Flat OpenStreetMap (OSM) data format providing an efficient random data access through memory mapped files.

The data format is described and implemented in flatdata. The schema describes the fundamental OSM data structures: nodes, ways, relations and tags as simple non-nested data structures. The relations between these are expressed through indexes.


Besides the library for working with osmflat archives, the crate osmflatc contains an OSM pbf format to osmflat data compiler.

To compile OSM data from pbf to osmflat use:

cargo run --release -- input.osm.pbf output.osm.flatdata

The output is a flatdata which is a directory consisting of several files. The schema is also part of the archive. It is checked every time the archive is opened. This guarantees that the compiler which was used to produce the archive fits to the schema used for reading it. The archive data is not compressed.

Using data

You can use any flatdata supported language for reading an osmflat archive. For reading the data in Rust, we provide the osmflat crate.

First, add this to your Cargo.toml:

osmflat = "0.1.0"

Now, you can open an osmflat archive as any other flatdata archive and read its data:

use osmflat::{FileResourceStorage, Osm};

fn main() {
    let storage = FileResourceStorage::new("path/to/archive.osm.flatdata");
    let archive = Osm::open(storage).unwrap();

    for node in archive.nodes().iter() {
        println!("{:?}", node);


Check the osmflat/examples directory. Feel free to add another example, if you have an idea what to do with the amazing OSM data in few lines of code. 😁

The above map was rendered by osmflat/examples/roads2png.rs in ~ 170 loc from the osmflat archive based on the latest Berlin OSM data.


The files src/proto/fileformat.proto and src/proto/osmformat.proto are copies from the OSM-binary project and are under the LGPLv3 license.


Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this document by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.