Skip to content
← Back to projects

Geodesk

Fast and storage-efficient spatial database engine for OpenStreetMap data

Maven Central

GeoDesk is a fast and storage-efficient geospatial database for OpenStreetMap data. Also available for C++ and for Python.

[!IMPORTANT] For Version 2.0, you will need to build GOLs with GOL Tool 2.0.

To read GOLs built with GOL Tool 1.x, use Version 1.1.0 of this toolkit.

#Why GeoDesk?

  • Small storage footprint — GeoDesk's GOL files are only 20% to 50% larger than the original OSM data in PBF format — that's less than a tenth of the storage consumed by a traditional SQL-based database.

  • Fast queries — typically 50 times faster than SQL.

  • Fast to get started — Converting .osm.pbf data to a GOL is 20 times faster than an import into an SQL database. Alternatively, download pre-made data tiles for just the regions you need and automatically assemble them into a GOL.

  • Intuitive API — No need for object-relational mapping; GeoDesk queries return Node, Way and Relation objects. Quickly discover tags, way-nodes and relation members. Get a feature's Geometry, measure its length/area.

  • Proper handling of relations — (Traditional geospatial databases deal with geometric shapes and require workarounds to support this unique and powerful aspect of OSM data.)

  • Seamless integration with the Java Topology Suite (JTS) for advanced geometric operations, such as buffer, union, simplify, convex and concave hulls, Voronoi diagrams, and much more.

  • Modest hardware requirements — If it can run a 64-bit JVM, it'll run GeoDesk.

#Get Started

#Maven

Include this dependency in your project's pom.xml:

<dependency>
    <groupId>com.geodesk</groupId>
    <artifactId>geodesk</artifactId>
    <version>2.1.0</version>
</dependency>

Alternatively, to build the latest version from source:

git clone https://github.com/clarisma/geodesk.git
cd geodesk
mvn install

#Example Application

import com.geodesk.feature.*;
import com.geodesk.geom.*;

public class PubsExample
{
    public static void main(String[] args)
    {
        var library = Features.open("switzerland.gol");  // 1
        
        for(Feature pub: library                         // 2
            .select("na[amenity=pub]")                   // 3
            .in(Box.ofWSEN(8.53,47.36,8.55,47.38)))      // 4
        {
            System.out.println(pub.stringValue("name")); // 5
        }
        
        library.close();                                 // 6
    }
}

What's going on here?

  1. We're opening a feature library (switzerland.gol)

  2. We iterate through all the features ...

  3. ... that are pubs (GeoDesk query languagesimilar to MapCSS)

  4. ... in downtown Zurich (bounding box with West/South/East/North coordinates).

  5. We print the name of each pub.

  6. We close the library.

That's it, you've created your first GeoDesk application!

#More Examples

Find all movie theaters within 500 meters from a given point:

Features movieTheaters = library
    .select("na[amenity=cinema]")
    .maxMetersFromLonLat(500, myLon, myLat);

Remember, OSM uses British English for its terminology.

Discover the bus routes that traverse a given street:

for(Feature route: street.parents("[route=bus]"))
{
    System.out.format("- %s from %s to %s",
        route.stringValue("ref"),
        route.stringValue("from"),
        route.stringValue("To"));
}

Count the number of entrances of a building:

int numberOfEntrances = building.nodes("[entrance]").size();

#Documentation

#Related Repositories

New version available.