C++ geometry types
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
bench
cmake
include/mapbox
scripts
test
.clang-format
.clang-tidy
.gitignore
.gitmodules
.travis.yml
CMakeLists.txt
LICENSE
Makefile
README.md
codecov.yml

README.md

geometry.hpp

badge

Provides header-only, generic C++ interfaces for geometry types, geometry collections, and features.

  • mapbox::geometry::point
  • mapbox::geometry::multi_point
  • mapbox::geometry::line_string
  • mapbox::geometry::multi_line_string
  • mapbox::geometry::polygon
  • mapbox::geometry::multi_polygon
  • mapbox::geometry::geometry_collection
  • mapbox::feature::feature (experimental)

Design

These types are designed to be easy to parse and serialize to GeoJSON.

They should also be a robust and high performance container for data processing and conversion.

Goals

  • Header-only
  • Fast compile
  • c++11/c++14 compatibility
  • No external dependencies for usage of core types (point, line_string, etc)
  • Minimal dependencies for usage of enclosing geometry type (mapbox::variant)
  • Easily adaptable to boost::geometry

Usage

Using a single type directly (requires no external dependencies):

#include <mapbox/geometry/point.hpp>
#include <iostream>

using mapbox::geometry::point;

int main() {
    point<double> pt(1.0,0.0);
    std::clog << "x: " << pt.x << " y: " << pt.y << "\n";
}

Creating a geometry collection (depends on https://github.com/mapbox/variant):

#include <mapbox/geometry/geometry.hpp>
#include <mapbox/variant.hpp>
#include <iostream>

using mapbox::geometry::geometry_collection;
using mapbox::geometry::geometry;
using mapbox::geometry::point;

using point_type = point<double>;

struct printer
{
    printer() {}

    void operator()(point_type const& pt) const
    {
        std::clog << "x: " << pt.x << " y: " << pt.y << "\n";
    }

    template <typename T>
    void operator()(T const& g) const
    {
        std::clog << "encountered non-point geometry\n";
    }
};

int main() {
    geometry_collection<double> gc;
    gc.emplace_back(point_type(1.0,0.0));
    geometry<double> const& geom = gc.at(0);
    printer visitor;
    mapbox::util::apply_visitor(visitor,geom);
}