mapnik-geometry - add 'geometry_empty' type to support unintialised geometries

This commit is contained in:
artemp 2015-03-24 10:30:33 +01:00
parent 9aa3542680
commit 163da958f4
13 changed files with 49 additions and 11 deletions

View file

@ -58,11 +58,6 @@ using mapnik::context_type;
using mapnik::context_ptr; using mapnik::context_ptr;
using mapnik::feature_kv_iterator; using mapnik::feature_kv_iterator;
void set_geometry_impl( mapnik::feature_impl & feature, mapnik::new_geometry::geometry const& geom)
{
feature.set_geometry_copy(geom);
}
mapnik::feature_ptr from_geojson_impl(std::string const& json, mapnik::context_ptr const& ctx) mapnik::feature_ptr from_geojson_impl(std::string const& json, mapnik::context_ptr const& ctx)
{ {
mapnik::feature_ptr feature(mapnik::feature_factory::create(ctx,1)); mapnik::feature_ptr feature(mapnik::feature_factory::create(ctx,1));

View file

@ -69,6 +69,7 @@ public:
}; };
enum geometry_t : std::uint8_t { enum geometry_t : std::uint8_t {
Unknown = 0,
Point = 1, Point = 1,
LineString = 2, LineString = 2,
Polygon = 3, Polygon = 3,

View file

@ -105,7 +105,7 @@ public:
: id_(id), : id_(id),
ctx_(ctx), ctx_(ctx),
data_(ctx_->mapping_.size()), data_(ctx_->mapping_.size()),
geom_(mapnik::util::no_init()), geom_(new_geometry::geometry_empty()),
raster_() {} raster_() {}
inline mapnik::value_integer id() const { return id_;} inline mapnik::value_integer id() const { return id_;}

View file

@ -42,7 +42,10 @@ struct geometry_centroid
{ {
return mapnik::util::apply_visitor(*this, geom); return mapnik::util::apply_visitor(*this, geom);
} }
result_type operator() (geometry_empty const&) const
{
return false;
}
result_type operator() (geometry_collection const& collection) const result_type operator() (geometry_collection const& collection) const
{ {
return false; return false;

View file

@ -39,6 +39,11 @@ struct geometry_envelope
return mapnik::util::apply_visitor(*this, geom); return mapnik::util::apply_visitor(*this, geom);
} }
bbox_type operator() (mapnik::new_geometry::geometry_empty const&) const
{
return mapnik::box2d<double>();
}
bbox_type operator() (mapnik::new_geometry::point const& pt) const bbox_type operator() (mapnik::new_geometry::point const& pt) const
{ {
return mapnik::box2d<double>(pt.x, pt.y, pt.x, pt.y); return mapnik::box2d<double>(pt.x, pt.y, pt.x, pt.y);

View file

@ -103,8 +103,9 @@ struct multi_point : line_string {};
struct multi_line_string : std::vector<line_string> {}; struct multi_line_string : std::vector<line_string> {};
struct multi_polygon : std::vector<polygon> {}; struct multi_polygon : std::vector<polygon> {};
struct geometry_collection; struct geometry_collection;
struct geometry_empty {};
using geometry = mapnik::util::variant<point, using geometry = mapnik::util::variant<geometry_empty,
point,
line_string, line_string,
polygon, polygon,
multi_point, multi_point,

View file

@ -40,6 +40,11 @@ struct geometry_is_simple
return mapnik::util::apply_visitor(*this, geom); return mapnik::util::apply_visitor(*this, geom);
} }
result_type operator() (geometry_empty const& ) const
{
return false;
}
result_type operator() (geometry_collection const& collection) const result_type operator() (geometry_collection const& collection) const
{ {
for (auto const& geom : collection) for (auto const& geom : collection)

View file

@ -40,6 +40,11 @@ struct geometry_is_valid
return mapnik::util::apply_visitor(*this, geom); return mapnik::util::apply_visitor(*this, geom);
} }
result_type operator() (geometry_empty const& ) const
{
return false;
}
result_type operator() (geometry_collection const& collection) const result_type operator() (geometry_collection const& collection) const
{ {
for (auto const& geom : collection) for (auto const& geom : collection)

View file

@ -33,8 +33,12 @@ struct geometry_type
{ {
mapnik::new_geometry::geometry_types operator () (mapnik::new_geometry::geometry const& geom) const mapnik::new_geometry::geometry_types operator () (mapnik::new_geometry::geometry const& geom) const
{ {
// check geometry variant is initialised (valid) return mapnik::util::apply_visitor(*this, geom);
return geom.valid() ? mapnik::util::apply_visitor(*this, geom) : mapnik::new_geometry::geometry_types::Unknown; }
mapnik::new_geometry::geometry_types operator() (geometry_empty const& ) const
{
return mapnik::new_geometry::geometry_types::Unknown;
} }
mapnik::new_geometry::geometry_types operator () (mapnik::new_geometry::point const&) const mapnik::new_geometry::geometry_types operator () (mapnik::new_geometry::point const&) const

View file

@ -49,6 +49,11 @@ struct hit_test_visitor
y_(y), y_(y),
tol_(tol) {} tol_(tol) {}
bool operator() (new_geometry::geometry_empty const& ) const
{
return false;
}
bool operator() (new_geometry::point const& geom) const bool operator() (new_geometry::point const& geom) const
{ {
return distance(geom.x, geom.y, x_, y_) <= tol_; return distance(geom.x, geom.y, x_, y_) <= tol_;

View file

@ -37,6 +37,11 @@ namespace detail {
struct datasource_geometry_type struct datasource_geometry_type
{ {
mapnik::datasource::geometry_t operator () (mapnik::new_geometry::geometry_empty const&) const
{
return mapnik::datasource::Unknown;
}
mapnik::datasource::geometry_t operator () (mapnik::new_geometry::point const&) const mapnik::datasource::geometry_t operator () (mapnik::new_geometry::point const&) const
{ {
return mapnik::datasource::Point; return mapnik::datasource::Point;

View file

@ -237,6 +237,11 @@ struct geometry_to_wkb
return util::apply_visitor(*this, geom); return util::apply_visitor(*this, geom);
} }
result_type operator() (new_geometry::geometry_empty const&) const
{
return result_type();
}
result_type operator() (new_geometry::point const& pt) const result_type operator() (new_geometry::point const& pt) const
{ {
return point_wkb(pt, byte_order_); return point_wkb(pt, byte_order_);

View file

@ -38,6 +38,10 @@ struct vertex_processor
{ {
util::apply_visitor(*this, geom); util::apply_visitor(*this, geom);
} }
void operator() (geometry_empty const&)
{
// no-op
}
void operator() (point const& pt) void operator() (point const& pt)
{ {
point_vertex_adapter va(pt); point_vertex_adapter va(pt);