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 Python and for Java.
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 Python 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 Shapely for advanced geometric operations, such as buffer, union, simplify, convex and concave hulls, Voronoi diagrams, and much more.
-
Modest hardware requirements — any 64-bit Windows, Linux or MacOS system will run GeoDesk.
Get Started
Requirements
- CMake 3.14 or later
- C++20 compiler with a Standard Library for Windows, Linux or MacOS
- Java 16 or above (for the GOL Tool)
Build & Install
GeoDesk has no dependencies and can be built with CMake:
git clone https://github.com/clarisma/libgeodesk.git
cd libgeodesk
mkdir build
cd build
cmake ..
cmake --build .
To install (optional):
cmake --install .
Create a GOL
Create a Geographic Object Library based on any .osm.pbf
file, using the
GOL Tool (Requires Java 16+).
For example:
gol build switzerland switzerland-latest.osm.pbf
Example Application
Find all the pubs in Zurich (Switzerland) and print their names:
#include <geodesk.h>
using namespace geodesk;
int main(int argc, char* argv[])
{
// Open switzerland.gol
Features features("switzerland");
// Get the feature that represents the area of the city of Zurich
Feature zurich = features(
"a[boundary=administrative][admin_level=8]"
"[name:en=Zurich]").one();
// Define a set that contains nodes and areas that are pubs
Features pubs = features("na[amenity=pub]");
// Iterate through the pubs that are contained
// in the area of Zurich and print their names
for (Feature pub: pubs.within(zurich)
{
std::cout << pub["name"] << std::endl;
}
}
More Examples
Find all movie theaters within 500 meters from a given point:
Features movieTheaters = features("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 (Relation route: street.parents("[route=bus]"))
{
std::cout << route["ref"]
<< " from " << route["from"]
<< " to " << route["to"] << std::endl;
}
Count the number of entrances of a building:
int numberOfEntrances = building.nodes("[entrance]").count();
Documentation
Related Repositories
- geodesk — GeoDesk for Java
- geodesk-py — GeoDesk for Python
- gol-tool — command-line utility for building, maintaining and querying GOL files
OpenStreetMap is a trademark of the OpenStreetMap Foundation, and is used with their permission. GeoDesk is not endorsed by or affiliated with the OpenStreetMap Foundation.