Awesome
<img src="https://docs.geodesk.com/img/github-header.png">GeoDesk is a fast and storage-efficient geospatial database for OpenStreetMap data. Also available for C++ and for Python.
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
andRelation
objects. Quickly discover tags, way-nodes and relation members. Get a feature'sGeometry
, 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>0.2.1</version>
</dependency>
Alternatively, to build the latest version from source:
git clone https://github.com/clarisma/geodesk.git
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
"https://data.geodesk.com/switzerland"); // 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?
-
We're opening a feature library ...
-
... with the file name
example.gol
(If it doesn't exist, a blank one is created) -
... and a URL from which data tiles will be downloaded.
-
We iterate through all the features ...
-
... that are pubs (GeoDesk query language — similar to MapCSS)
-
... in downtown Zurich (bounding box with West/South/East/North coordinates).
-
We print the name of each pub.
-
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
- gol-tool — command-line utility for building, maintaining and querying GOL files
- geodesk-examples — example applications
- geodesk-tests — integration tests
- libgeodesk — GeoDesk for C++
- geodesk-py — GeoDesk for Python