+ apply Nino Walker's patch text_minimum_padding.diff #547
TODO: consider simplifying text symbolizer options
This commit is contained in:
parent
87eafdba19
commit
0823b83900
8 changed files with 75 additions and 4 deletions
|
@ -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",
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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_;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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() );
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue