shape.input/agg - add polygon3 support

This commit is contained in:
artemp 2015-02-18 18:12:47 +01:00
parent 133f7d04ef
commit b49b8042c1
4 changed files with 46 additions and 44 deletions

View file

@ -57,21 +57,27 @@ void render_polygon_symbolizer(polygon_symbolizer const &sym,
converter.template set<affine_transform_tag>();
if (simplify_tolerance > 0.0) converter.template set<simplify_tag>(); // optional simplify converter
if (smooth > 0.0) converter.template set<smooth_tag>(); // optional smooth converter
// FIXME
/*
for (geometry_type const& geom : feature.paths())
mapnik::new_geometry::geometry const& geometry = feature.get_geometry();
if (geometry.is<mapnik::new_geometry::polygon3>())
{
if (geom.size() > 2)
auto const& poly = mapnik::util::get<mapnik::new_geometry::polygon3>(geometry);
mapnik::new_geometry::polygon_vertex_adapter_3 va(poly);
converter.apply(va);
}
else if (geometry.is<mapnik::new_geometry::multi_polygon>())
{
auto const& multi_polygon = mapnik::util::get<mapnik::new_geometry::multi_polygon>(geometry);
for (auto const& poly : multi_polygon)
{
vertex_adapter va(geom);
mapnik::new_geometry::polygon_vertex_adapter_3 va(poly);
converter.apply(va);
}
}
*/
color const& fill = get<mapnik::color, keys::fill>(sym, feature, common.vars_);
fill_func(fill, opacity);
}
} // namespace mapnik
#endif /* MAPNIK_RENDERER_COMMON_PROCESS_POLYGON_SYMBOLIZER_HPP */
#endif // MAPNIK_RENDERER_COMMON_PROCESS_POLYGON_SYMBOLIZER_HPP

View file

@ -129,7 +129,7 @@ feature_ptr shape_featureset<filterT>::next()
{
shape_io::read_bbox(record, feature_bbox_);
if (!filter_.pass(feature_bbox_)) continue;
//shape_io::read_polygon(record, feature->paths());
feature->set_geometry(shape_io::read_polygon(record));
break;
}
default :

View file

@ -147,8 +147,7 @@ feature_ptr shape_index_featureset<filterT>::next()
{
shape_io::read_bbox(record, feature_bbox_);
if (!filter_.pass(feature_bbox_)) continue;
// FIXME
//shape_io::read_polygon(record,feature->paths());
feature->set_geometry(shape_io::read_polygon(record));
break;
}
default :

View file

@ -146,44 +146,32 @@ mapnik::new_geometry::geometry shape_io::read_polyline(shape_file::record_type &
}
template <typename T>
bool is_clockwise(T const& points, int start, int end)
bool is_clockwise(T const& ring)
{
int num_points = end - start;
double area = 0.0;
std::size_t num_points = ring.size();
for (int i = 0; i < num_points; ++i)
{
auto const& p0 = points[start + i];
auto const& p1 = points[start + (i + 1) % num_points];
area += std::get<0>(p0) * std::get<1>(p1) - std::get<1>(p0) * std::get<0>(p1);
auto const& p0 = ring[i];
auto const& p1 = ring[(i + 1) % num_points];
area += p0.x * p1.y - p0.y * p1.x;
}
return ( area < 0.0) ? true : false;
}
mapnik::new_geometry::geometry shape_io::read_polygon(shape_file::record_type & record)
{
// FIXME
return std::move(mapnik::new_geometry::geometry(mapnik::new_geometry::polygon3()));
#if 0
int num_parts = record.read_ndr_integer();
int num_points = record.read_ndr_integer();
std::vector<int> parts(num_parts);
using points_cont = std::vector<std::tuple<double,double> >;
points_cont points;
points.reserve(num_points);
std::vector<int> parts(num_parts);
for (int i = 0; i < num_parts; ++i)
{
parts[i] = record.read_ndr_integer();
}
for (int k = 0; k < num_points; ++k)
{
double x = record.read_double();
double y = record.read_double();
points.emplace_back(x,y);
}
mapnik::new_geometry::multi_polygon multi_poly;
mapnik::new_geometry::polygon3 poly;
for (int k = 0; k < num_parts; ++k)
{
@ -191,24 +179,33 @@ mapnik::new_geometry::geometry shape_io::read_polygon(shape_file::record_type &
int end;
if (k == num_parts - 1) end = num_points;
else end = parts[k + 1];
auto const& pt = points[start];
double x = std::get<0>(pt);
double y = std::get<1>(pt);
if ( k > 0 && is_clockwise(points, start, end))
mapnik::new_geometry::linear_ring ring;
ring.reserve(end - start);
for (int j = start; j < end; ++j)
{
geom.push_back(poly.release());
poly.reset(new geometry_type(mapnik::geometry_type::types::Polygon));
double x = record.read_double();
double y = record.read_double();
ring.emplace_back(x, y);
}
poly->move_to(x, y);
for (int j = start + 1; j < end; ++j)
if (k == 0)
{
auto const& pt = points[j];
x = std::get<0>(pt);
y = std::get<1>(pt);
poly->line_to(x, y);
poly.set_exterior_ring(std::move(ring));
}
else if (is_clockwise(ring))
{
multi_poly.emplace_back(std::move(poly));
poly.interior_rings.clear();
poly.set_exterior_ring(std::move(ring));
}
else
{
poly.add_hole(std::move(ring));
}
poly->close_path();
}
geom.push_back(poly.release());
#endif
if (multi_poly.size() > 0)
{
std::cerr << "multi_polygon" << std::endl;
return std::move(mapnik::new_geometry::geometry(std::move(multi_poly)));
}
return std::move(mapnik::new_geometry::geometry(std::move(poly)));
}