mapbox / mapnik-vector-tile

Mapnik implemention of Mapbox Vector Tile specification
BSD 3-Clause "New" or "Revised" License
553 stars 117 forks source link

Invalid polygons - do we care? #207

Closed artemp closed 7 years ago

artemp commented 8 years ago
void operator() (mapnik::geometry::polygon<std::int64_t> & geom)
    {
        mapnik::geometry::polygon<std::int64_t> simplified;
        if (geom.exterior_ring.size() <= 4)
        {
            simplified.exterior_ring = geom.exterior_ring;
        }
        else
        {
            douglas_peucker<std::int64_t>(geom.exterior_ring, std::back_inserter(simplified.exterior_ring), simplify_distance_);
        }
        for (auto const & g : geom.interior_rings)
        {
            if (g.size() <= 4)
            {
                simplified.interior_rings.push_back(g);
            }
            else
            {
                mapnik::geometry::linear_ring<std::int64_t> simplified_ring;
                douglas_peucker<std::int64_t>(g, std::back_inserter(simplified_ring), simplify_distance_);
                simplified.interior_rings.push_back(simplified_ring);
            }
        }
        next_(simplified);
    }

If geom.exterior_ring.size() <= 4 (exterior ring is invalid) but interior rings are valid we end up with potentially problematic geometry. Shouldn't we filtering these guys here?

flippmoke commented 8 years ago

@artemp much of this cleared up later on prior to clipping, if anything the size tests really aren't needed

artemp commented 8 years ago

@flippmoke - hmm.. so you're potentially simplifying some rings only to throw it away later ? Doesn't sound smart, why not checking before sending to simplifier?