Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time
December 9, 2022 17:49
March 24, 2023 13:10
April 26, 2022 13:56
May 18, 2022 12:46
May 18, 2022 12:46
March 24, 2023 13:20
March 3, 2023 13:10
March 24, 2023 13:20

GeoDesk is a fast and storage-efficient geospatial database for OpenStreetMap data.

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


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


Alternatively, to build the latest version from source:

git clone
cd geodesk
mvn install

If you get weird exceptions during mvn install, you should upgrade Maven to version 3.8.5 or above.

Example Application

import com.geodesk.feature.*;
import com.geodesk.util.*;

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

What's going on here?

  1. We're opening a feature library ...

  2. ... with the file name example.gol (If it doesn't exist, a blank one is created)

  3. ... and a URL from which data tiles will be downloaded.

  4. We iterate through all the features ...

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

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

  7. We print the name of each pub.

  8. 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(Filters.maxMetersFromLonLat(500, myLon, myLat));

Remember, OSM uses British English for its terminology.

Discover the bus routes that traverse a given street:

for(Relation route: street.parentRelations("[route=bus]"))
    System.out.format("- %s from %s to %s",

Count the number of entrances of a building:

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

Related Repositories