Skip to content

Commit

Permalink
Now skipping invalid v1 feature geometries rather then throwing
Browse files Browse the repository at this point in the history
  • Loading branch information
flippmoke committed Feb 8, 2016
1 parent 235719d commit 2a6c745
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 14 deletions.
1 change: 1 addition & 0 deletions bench/vtile-decode.cpp
Expand Up @@ -74,6 +74,7 @@ int main(int argc, char** argv)
auto ds = std::make_shared<mapnik::vector_tile_impl::tile_datasource_pbf>(layer,x,y,z);
mapnik::query q(ds->get_tile_extent());
auto fs = ds->features(q);
if (!fs) continue;
while (fs->next()) {
++feature_count;
}
Expand Down
63 changes: 50 additions & 13 deletions src/vector_tile_featureset_pbf.ipp
Expand Up @@ -256,24 +256,61 @@ feature_ptr tile_featureset_pbf<Filter>::next()
{
if (!has_geometry_type)
{
throw std::runtime_error("Vector Tile has a feature that does not define the required geometry type.");
if (version_ == 1)
{
continue;
}
else
{
throw std::runtime_error("Vector Tile has a feature that does not define the required geometry type.");
}
}
mapnik::vector_tile_impl::GeometryPBF<double> geoms(geom_itr, tile_x_,tile_y_,scale_,-1*scale_);
mapnik::geometry::geometry<double> geom = decode_geometry(geoms, geometry_type, version_, filter_.box_);
if (geom.is<mapnik::geometry::geometry_empty>())
if (version_ != 1)
{
continue;
mapnik::vector_tile_impl::GeometryPBF<double> geoms(geom_itr, tile_x_,tile_y_,scale_,-1*scale_);
mapnik::geometry::geometry<double> geom = decode_geometry(geoms, geometry_type, version_, filter_.box_);
if (geom.is<mapnik::geometry::geometry_empty>())
{
continue;
}
#if defined(DEBUG)
mapnik::box2d<double> envelope = mapnik::geometry::envelope(geom);
if (!filter_.pass(envelope))
{
MAPNIK_LOG_ERROR(tile_featureset_pbf) << "tile_featureset_pbf: filter:pass should not get here";
continue;
}
#endif
feature->set_geometry(std::move(geom));
return feature;
}
#if defined(DEBUG)
mapnik::box2d<double> envelope = mapnik::geometry::envelope(geom);
if (!filter_.pass(envelope))
else
{
MAPNIK_LOG_ERROR(tile_featureset_pbf) << "tile_featureset_pbf: filter:pass should not get here";
continue;
try
{
mapnik::vector_tile_impl::GeometryPBF<double> geoms(geom_itr, tile_x_,tile_y_,scale_,-1*scale_);
mapnik::geometry::geometry<double> geom = decode_geometry(geoms, geometry_type, version_, filter_.box_);
if (geom.is<mapnik::geometry::geometry_empty>())
{
continue;
}
#if defined(DEBUG)
mapnik::box2d<double> envelope = mapnik::geometry::envelope(geom);
if (!filter_.pass(envelope))
{
MAPNIK_LOG_ERROR(tile_featureset_pbf) << "tile_featureset_pbf: filter:pass should not get here";
continue;
}
#endif
feature->set_geometry(std::move(geom));
}
catch (std::exception& e)
{
// For v1 any invalid geometry errors lets just skip the feature
continue;
}
return feature;
}
#endif
feature->set_geometry(std::move(geom));
return feature;
}
else if (version_ != 1)
{
Expand Down
2 changes: 1 addition & 1 deletion src/vector_tile_processor.ipp
Expand Up @@ -350,7 +350,7 @@ MAPNIK_VECTOR_INLINE void processor::update_tile(tile & t,
}
}

for (auto & lay_future : future_layers)
for (auto && lay_future : future_layers)
{
if (!lay_future.valid())
{
Expand Down

0 comments on commit 2a6c745

Please sign in to comment.