Add attribute text-margin in place of minimum-distance.

This commit is contained in:
Jordan Hollinger 2014-08-20 19:43:36 -04:00
parent 22117c6c64
commit c8c792277d
4 changed files with 24 additions and 18 deletions

View file

@ -425,8 +425,9 @@ void export_text_placement()
.def_readwrite("label_spacing", &text_symbolizer_properties::label_spacing)
.def_readwrite("label_position_tolerance", &text_symbolizer_properties::label_position_tolerance)
.def_readwrite("avoid_edges", &text_symbolizer_properties::avoid_edges)
.def_readwrite("minimum_distance", &text_symbolizer_properties::minimum_distance)
.def_readwrite("text_margin", &text_symbolizer_properties::text_margin)
.def_readwrite("repeat_distance", &text_symbolizer_properties::repeat_distance)
.def_readwrite("minimum_distance", &text_symbolizer_properties::minimum_distance)
.def_readwrite("minimum_padding", &text_symbolizer_properties::minimum_padding)
.def_readwrite("minimum_path_length", &text_symbolizer_properties::minimum_path_length)
.def_readwrite("maximum_angle_char_delta", &text_symbolizer_properties::max_char_angle_delta)

View file

@ -137,6 +137,7 @@ struct text_properties_expressions
symbolizer_base::value_type label_spacing = 0.0;
symbolizer_base::value_type label_position_tolerance = 0.0;
symbolizer_base::value_type avoid_edges = false;
symbolizer_base::value_type text_margin = 0.0;
symbolizer_base::value_type repeat_distance = 0.0;
symbolizer_base::value_type minimum_distance = 0.0;
symbolizer_base::value_type minimum_padding = 0.0;
@ -180,6 +181,7 @@ struct MAPNIK_DECL text_symbolizer_properties
// distance the label can be moved on the line to fit, if 0 the default is used
double label_position_tolerance;
bool avoid_edges;
double text_margin;
double repeat_distance;
double minimum_distance;
double minimum_padding;

View file

@ -313,23 +313,18 @@ double placement_finder::get_spacing(double path_length, double layout_width) co
bool placement_finder::collision(const box2d<double> &box, const value_unicode_string &repeat_key) const
{
if (!detector_.extent().intersects(box)
||
(info_.properties.avoid_edges && !extent_.contains(box))
||
(info_.properties.minimum_padding > 0 &&
!extent_.contains(box + (scale_factor_ * info_.properties.minimum_padding)))
||
(!info_.properties.allow_overlap &&
((repeat_key.length() == 0 && !detector_.has_placement(box, info_.properties.minimum_distance * scale_factor_))
||
(repeat_key.length() > 0 && !detector_.has_placement(box, info_.properties.minimum_distance * scale_factor_,
repeat_key, info_.properties.repeat_distance * scale_factor_))))
)
{
return true;
}
return false;
return !detector_.extent().intersects(box)
||
(info_.properties.avoid_edges && !extent_.contains(box))
||
(info_.properties.minimum_padding > 0 &&
!extent_.contains(box + (scale_factor_ * info_.properties.minimum_padding)))
||
(!info_.properties.allow_overlap &&
((repeat_key.length() == 0 && !detector_.has_placement(box, info_.properties.text_margin * scale_factor_))
||
(repeat_key.length() > 0 && !detector_.has_placement(box, info_.properties.text_margin * scale_factor_,
repeat_key, info_.properties.repeat_distance * scale_factor_))));
}
void placement_finder::set_marker(marker_info_ptr m, box2d<double> box, bool marker_unlocked, pixel_position const& marker_displacement)

View file

@ -44,6 +44,7 @@ text_symbolizer_properties::text_symbolizer_properties()
label_spacing(0.0),
label_position_tolerance(0.0),
avoid_edges(false),
text_margin(0.0),
repeat_distance(0.0),
minimum_distance(0.0),
minimum_padding(0.0),
@ -115,6 +116,7 @@ void text_symbolizer_properties::text_properties_from_xml(xml_node const& node)
set_property_from_xml<label_placement_e>(expressions.label_placement, "placement", node);
set_property_from_xml<value_double>(expressions.label_spacing, "spacing", node);
set_property_from_xml<value_double>(expressions.label_position_tolerance, "label-position-tolerance", node);
set_property_from_xml<value_double>(expressions.text_margin, "text-margin", node);
set_property_from_xml<value_double>(expressions.repeat_distance, "repeat-distance", node);
set_property_from_xml<value_double>(expressions.minimum_distance, "minimum-distance", node);
set_property_from_xml<value_double>(expressions.minimum_padding, "minimum-padding", node);
@ -158,6 +160,10 @@ void text_symbolizer_properties::to_xml(boost::property_tree::ptree &node,
{
serialize_property("spacing", expressions.label_spacing, node);
}
if (!(expressions.text_margin == dfl.expressions.text_margin) || explicit_defaults)
{
serialize_property("text-margin", expressions.text_margin, node);
}
if (!(expressions.repeat_distance == dfl.expressions.repeat_distance) || explicit_defaults)
{
serialize_property("repeat-distance", expressions.repeat_distance, node);
@ -207,6 +213,8 @@ void text_symbolizer_properties::add_expressions(expression_set & output) const
if (is_expression(expressions.label_spacing)) output.insert(util::get<expression_ptr>(expressions.label_spacing));
if (is_expression(expressions.label_position_tolerance)) output.insert(util::get<expression_ptr>(expressions.label_position_tolerance));
if (is_expression(expressions.avoid_edges)) output.insert(util::get<expression_ptr>(expressions.avoid_edges));
if (is_expression(expressions.text_margin)) output.insert(util::get<expression_ptr>(expressions.text_margin));
if (is_expression(expressions.repeat_distance)) output.insert(util::get<expression_ptr>(expressions.repeat_distance));
if (is_expression(expressions.minimum_distance)) output.insert(util::get<expression_ptr>(expressions.minimum_distance));
if (is_expression(expressions.minimum_padding)) output.insert(util::get<expression_ptr>(expressions.minimum_padding));
if (is_expression(expressions.minimum_path_length)) output.insert(util::get<expression_ptr>(expressions.minimum_path_length));