+ apply Nino Walker's patch text_minimum_padding.diff #547

TODO:  consider simplifying text symbolizer options
This commit is contained in:
Artem Pavlenko 2010-11-03 13:18:56 +00:00
parent 87eafdba19
commit 0823b83900
8 changed files with 75 additions and 4 deletions

View file

@ -88,6 +88,7 @@ struct text_symbolizer_pickle_suite : boost::python::pickle_suite
extras.append(t.get_horizontal_alignment());
extras.append(t.get_justify_alignment());
extras.append(t.get_text_opacity());
extras.append(t.get_minimum_padding());
return boost::python::make_tuple(disp,t.get_label_placement(),
t.get_vertical_alignment(),t.get_halo_radius(),t.get_halo_fill(),t.get_text_ratio(),
@ -141,7 +142,6 @@ struct text_symbolizer_pickle_suite : boost::python::pickle_suite
t.set_force_odd_labels(extract<bool>(state[11]));
t.set_max_char_angle_delta(extract<double>(state[12]));
list extras = extract<list>(state[13]);
t.set_wrap_char_from_string(extract<std::string>(extras[0]));
t.set_line_spacing(extract<unsigned>(extras[1]));
@ -151,6 +151,7 @@ struct text_symbolizer_pickle_suite : boost::python::pickle_suite
t.set_horizontal_alignment(extract<horizontal_alignment_e>(extras[5]));
t.set_justify_alignment(extract<justify_alignment_e>(extras[6]));
t.set_text_opacity(extract<double>(extras[7]));
t.set_minimum_padding(extract<double>(extras[8]));
}
};
@ -252,6 +253,9 @@ void export_text_symbolizer()
.add_property("minimum_distance",
&text_symbolizer::get_minimum_distance,
&text_symbolizer::set_minimum_distance)
.add_property("minimum_padding",
&text_symbolizer::get_minimum_padding,
&text_symbolizer::set_minimum_padding)
.add_property("name",&text_symbolizer::get_name,
&text_symbolizer::set_name)
.add_property("opacity",

View file

@ -307,6 +307,8 @@ popplaces_text_symbolizer.label_placement= mapnik2.label_placement.POINT_PLACEME
popplaces_text_symbolizer.halo_fill = mapnik2.Color('white')
popplaces_text_symbolizer.halo_radius = 1
popplaces_text_symbolizer.avoid_edges = True
#popplaces_text_symbolizer.minimum_padding = 30
popplaces_rule.symbols.append(popplaces_text_symbolizer)
popplaces_style.rules.append(popplaces_rule)

View file

@ -71,6 +71,7 @@ struct placement : boost::noncopyable
double minimum_distance;
bool avoid_edges;
bool has_dimensions;
double minimum_padding;
bool allow_overlap;
std::pair<double, double> dimensions;
int text_size;

View file

@ -151,6 +151,8 @@ struct MAPNIK_DECL text_symbolizer : public symbolizer_base
bool get_avoid_edges() const;
void set_minimum_distance(double distance);
double get_minimum_distance() const;
void set_minimum_padding(double distance);
double get_minimum_padding() const;
void set_allow_overlap(bool overlap);
bool get_allow_overlap() const;
void set_text_opacity(double opacity);
@ -187,6 +189,7 @@ private:
position displacement_;
bool avoid_edges_;
double minimum_distance_;
double minimum_padding_;
bool overlap_;
double text_opacity_;
bool wrap_before_;

View file

@ -1230,7 +1230,15 @@ void map_parser::parse_text_symbolizer( rule_type & rule, ptree const & sym )
{
text_symbol.set_minimum_distance(*min_distance);
}
// minimum distance from edge of the map
optional<unsigned> min_padding =
get_opt_attr<unsigned>(sym, "min_padding");
if (min_distance)
{
text_symbol.set_minimum_padding(*min_padding);
}
// do not render labels around edges
optional<boolean> avoid_edges =
get_opt_attr<boolean>(sym, "avoid_edges");
@ -1393,6 +1401,14 @@ void map_parser::parse_shield_symbolizer( rule_type & rule, ptree const & sym )
shield_symbol.set_minimum_distance(*min_distance);
}
// minimum distance from edge of the map
optional<unsigned> min_padding =
get_opt_attr<unsigned>(sym, "min_padding");
if (min_distance)
{
shield_symbol.set_minimum_padding(*min_padding);
}
// spacing between repeated labels on lines
optional<unsigned> spacing = get_opt_attr<unsigned>(sym, "spacing");
if (spacing)

View file

@ -66,6 +66,7 @@ placement::placement(string_info & info_,
force_odd_labels(sym.get_force_odd_labels()),
max_char_angle_delta(sym.get_max_char_angle_delta()),
minimum_distance(scale_factor_ * sym.get_minimum_distance()),
minimum_padding(scale_factor_ * sym.get_minimum_padding()),
avoid_edges(sym.get_avoid_edges()),
has_dimensions(has_dimensions_),
allow_overlap(false),
@ -88,6 +89,7 @@ placement::placement(string_info & info_,
force_odd_labels(sym.get_force_odd_labels()),
max_char_angle_delta(sym.get_max_char_angle_delta()),
minimum_distance(scale_factor_ * sym.get_minimum_distance()),
minimum_padding(scale_factor_ * sym.get_minimum_padding()),
avoid_edges(sym.get_avoid_edges()),
has_dimensions(false),
allow_overlap(sym.get_allow_overlap()),
@ -417,6 +419,19 @@ void placement_finder<DetectorT>::find_point_placement(placement & p,
if (p.avoid_edges && !dimensions_.contains(e))
return;
if (p.minimum_padding > 0)
{
box2d<double> epad(e.minx()-p.minimum_padding,
e.miny()-p.minimum_padding,
e.maxx()+p.minimum_padding,
e.maxy()+p.minimum_padding);
if (!dimensions_.contains(epad))
{
return;
}
}
c_envelopes.push(e); // add character's envelope to temp storage
}
x += cwidth; // move position to next character
@ -843,10 +858,21 @@ bool placement_finder<DetectorT>::test_placement(placement & p, const std::auto_
status = false;
break;
}
if (p.minimum_padding > 0)
{
box2d<double> epad(e.minx()-p.minimum_padding,
e.miny()-p.minimum_padding,
e.maxx()+p.minimum_padding,
e.maxy()+p.minimum_padding);
if (!dimensions_.contains(epad))
{
status = false;
break;
}
}
p.envelopes.push(e);
}
current_placement->rewind();
return status;

View file

@ -469,6 +469,10 @@ private:
{
set_attr( node, "min_distance", sym.get_minimum_distance() );
}
if (sym.get_minimum_padding() != dfl.get_minimum_padding() || explicit_defaults_ )
{
set_attr( node, "min_padding", sym.get_minimum_padding() );
}
if (sym.get_allow_overlap() != dfl.get_allow_overlap() || explicit_defaults_ )
{
set_attr( node, "allow_overlap", sym.get_allow_overlap() );

View file

@ -107,6 +107,7 @@ text_symbolizer::text_symbolizer(expression_ptr name, std::string const& face_na
displacement_(0.0,0.0),
avoid_edges_(false),
minimum_distance_(0.0),
minimum_padding_(0.0),
overlap_(false),
text_opacity_(1.0),
wrap_before_(false),
@ -138,6 +139,7 @@ text_symbolizer::text_symbolizer(expression_ptr name, unsigned size, color const
displacement_(0.0,0.0),
avoid_edges_(false),
minimum_distance_(0.0),
minimum_padding_(0.0),
overlap_(false),
text_opacity_(1.0),
wrap_before_(false),
@ -170,6 +172,7 @@ text_symbolizer::text_symbolizer(text_symbolizer const& rhs)
displacement_(rhs.displacement_),
avoid_edges_(rhs.avoid_edges_),
minimum_distance_(rhs.minimum_distance_),
minimum_padding_(rhs.minimum_padding_),
overlap_(rhs.overlap_),
text_opacity_(rhs.text_opacity_),
wrap_before_(rhs.wrap_before_),
@ -204,6 +207,7 @@ text_symbolizer& text_symbolizer::operator=(text_symbolizer const& other)
displacement_ = other.displacement_;
avoid_edges_ = other.avoid_edges_;
minimum_distance_ = other.minimum_distance_;
minimum_padding_ = other.minimum_padding_;
overlap_ = other.overlap_;
text_opacity_ = other.text_opacity_;
wrap_before_ = other.wrap_before_;
@ -473,6 +477,17 @@ void text_symbolizer::set_minimum_distance(double distance)
minimum_distance_ = distance;
}
double text_symbolizer::get_minimum_padding() const
{
return minimum_padding_;
}
void text_symbolizer::set_minimum_padding(double distance)
{
minimum_padding_ = distance;
}
void text_symbolizer::set_allow_overlap(bool overlap)
{
overlap_ = overlap;