add support for rendering svg icons with point placement in markers symbolizer (originally markers just supported special line placement) - closes #953 - refs #952
This commit is contained in:
parent
baebf4f1f2
commit
efa1b95cb8
2 changed files with 42 additions and 18 deletions
|
@ -86,6 +86,8 @@ void agg_renderer<T>::process(markers_symbolizer const& sym,
|
||||||
double y1 = bbox.miny();
|
double y1 = bbox.miny();
|
||||||
double x2 = bbox.maxx();
|
double x2 = bbox.maxx();
|
||||||
double y2 = bbox.maxy();
|
double y2 = bbox.maxy();
|
||||||
|
int w = (*mark)->width();
|
||||||
|
int h = (*mark)->height();
|
||||||
|
|
||||||
agg::trans_affine recenter = agg::trans_affine_translation(-0.5*(x1+x2),-0.5*(y1+y2));
|
agg::trans_affine recenter = agg::trans_affine_translation(-0.5*(x1+x2),-0.5*(y1+y2));
|
||||||
tr.transform(&x1,&y1);
|
tr.transform(&x1,&y1);
|
||||||
|
@ -102,26 +104,47 @@ void agg_renderer<T>::process(markers_symbolizer const& sym,
|
||||||
for (unsigned i=0; i<feature.num_geometries(); ++i)
|
for (unsigned i=0; i<feature.num_geometries(); ++i)
|
||||||
{
|
{
|
||||||
geometry_type const& geom = feature.get_geometry(i);
|
geometry_type const& geom = feature.get_geometry(i);
|
||||||
if (geom.num_points() <= 1)
|
// TODO - merge this code with point_symbolizer rendering
|
||||||
|
if (placement_method == MARKER_POINT_PLACEMENT || geom.num_points() <= 1)
|
||||||
{
|
{
|
||||||
std::clog << "### Warning svg markers not supported yet for points within markers_symbolizer\n";
|
double x;
|
||||||
continue;
|
double y;
|
||||||
}
|
double z=0;
|
||||||
|
geom.label_interior_position(&x, &y);
|
||||||
|
prj_trans.backward(x,y,z);
|
||||||
|
t_.forward(&x,&y);
|
||||||
|
extent.re_center(x,y);
|
||||||
|
|
||||||
|
if (sym.get_allow_overlap() ||
|
||||||
|
detector_->has_placement(extent))
|
||||||
|
{
|
||||||
|
|
||||||
|
render_marker(floor(x - 0.5 * w),floor(y - 0.5 * h) ,**mark,tr, sym.get_opacity());
|
||||||
|
|
||||||
|
// TODO - impl this for markers?
|
||||||
|
//if (!sym.get_ignore_placement())
|
||||||
|
// detector_->insert(label_ext);
|
||||||
|
metawriter_with_properties writer = sym.get_metawriter();
|
||||||
|
if (writer.first) writer.first->add_box(extent, feature, t_, writer.second);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
path_type path(t_,geom,prj_trans);
|
||||||
|
markers_placement<path_type, label_collision_detector4> placement(path, extent, *detector_,
|
||||||
|
sym.get_spacing() * scale_factor_,
|
||||||
|
sym.get_max_error(),
|
||||||
|
sym.get_allow_overlap());
|
||||||
|
double x, y, angle;
|
||||||
|
|
||||||
path_type path(t_,geom,prj_trans);
|
while (placement.get_point(&x, &y, &angle))
|
||||||
markers_placement<path_type, label_collision_detector4> placement(path, extent, *detector_,
|
{
|
||||||
sym.get_spacing() * scale_factor_,
|
agg::trans_affine matrix = recenter * tr *agg::trans_affine_rotation(angle) * agg::trans_affine_translation(x, y);
|
||||||
sym.get_max_error(),
|
svg_renderer.render(*ras_ptr, sl, renb, matrix, sym.get_opacity(),bbox);
|
||||||
sym.get_allow_overlap());
|
if (writer.first)
|
||||||
double x, y, angle;
|
//writer.first->add_box(label_ext, feature, t_, writer.second);
|
||||||
|
std::clog << "### Warning metawriter not yet supported for LINE placement\n";
|
||||||
while (placement.get_point(&x, &y, &angle))
|
}
|
||||||
{
|
|
||||||
agg::trans_affine matrix = recenter * tr *agg::trans_affine_rotation(angle) * agg::trans_affine_translation(x, y);
|
|
||||||
svg_renderer.render(*ras_ptr, sl, renb, matrix, sym.get_opacity(),bbox);
|
|
||||||
if (writer.first)
|
|
||||||
//writer.first->add_box(label_ext, feature, t_, writer.second);
|
|
||||||
std::clog << "### Warning metawriter not yet supported for LINE placement\n";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1419,6 +1419,7 @@ void cairo_renderer_base::process(raster_symbolizer const& sym,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO - this is woefully behind the AGG version.
|
||||||
void cairo_renderer_base::process(markers_symbolizer const& sym,
|
void cairo_renderer_base::process(markers_symbolizer const& sym,
|
||||||
Feature const& feature,
|
Feature const& feature,
|
||||||
proj_transform const& prj_trans)
|
proj_transform const& prj_trans)
|
||||||
|
|
Loading…
Reference in a new issue