mirror of
https://github.com/mapnik/mapnik.git
synced 2025-12-08 20:13:09 +00:00
Merge pull request #2788 from mapycz/fix-labeling-on-polygons
fix labeling on polygons
This commit is contained in:
commit
2a8086fbcc
@ -208,7 +208,7 @@ vertex_cache::vertex_cache(T & path)
|
||||
current_subpath_->add_segment(new_x, new_y, 0);
|
||||
first = false;
|
||||
}
|
||||
if (agg::is_line_to(cmd))
|
||||
else if (agg::is_line_to(cmd))
|
||||
{
|
||||
if (first)
|
||||
{
|
||||
@ -220,6 +220,14 @@ vertex_cache::vertex_cache(T & path)
|
||||
double segment_length = std::sqrt(dx*dx + dy*dy);
|
||||
current_subpath_->add_segment(new_x, new_y, segment_length);
|
||||
}
|
||||
else if (agg::is_closed(cmd) && !current_subpath_->vector.empty())
|
||||
{
|
||||
segment const & first_segment = current_subpath_->vector[0];
|
||||
double dx = old_x - first_segment.pos.x;
|
||||
double dy = old_y - first_segment.pos.y;
|
||||
double segment_length = std::sqrt(dx*dx + dy*dy);
|
||||
current_subpath_->add_segment(first_segment.pos.x, first_segment.pos.y, segment_length);
|
||||
}
|
||||
old_x = new_x;
|
||||
old_y = new_y;
|
||||
}
|
||||
|
||||
@ -318,6 +318,40 @@ placements_list const& text_symbolizer_helper::get() const
|
||||
return finder_.placements();
|
||||
}
|
||||
|
||||
class apply_line_placement_visitor
|
||||
{
|
||||
public:
|
||||
apply_line_placement_visitor(vertex_converter_type & converter,
|
||||
placement_finder_adapter<placement_finder> const & adapter)
|
||||
: converter_(converter), adapter_(adapter)
|
||||
{
|
||||
}
|
||||
|
||||
bool operator()(geometry::line_string<double> const & geo) const
|
||||
{
|
||||
geometry::line_string_vertex_adapter<double> va(geo);
|
||||
converter_.apply(va, adapter_);
|
||||
return adapter_.status();
|
||||
}
|
||||
|
||||
bool operator()(geometry::polygon<double> const & geo) const
|
||||
{
|
||||
geometry::polygon_vertex_adapter<double> va(geo);
|
||||
converter_.apply(va, adapter_);
|
||||
return adapter_.status();
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
bool operator()(T const & geo) const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
private:
|
||||
vertex_converter_type & converter_;
|
||||
placement_finder_adapter<placement_finder> const & adapter_;
|
||||
};
|
||||
|
||||
bool text_symbolizer_helper::next_line_placement() const
|
||||
{
|
||||
while (!geometries_to_process_.empty())
|
||||
@ -331,17 +365,11 @@ bool text_symbolizer_helper::next_line_placement() const
|
||||
continue; //Reexecute size check
|
||||
}
|
||||
|
||||
if (geo_itr_->is<base_symbolizer_helper::line_string_cref>()) // line_string
|
||||
if (mapnik::util::apply_visitor(apply_line_placement_visitor(converter_, adapter_), *geo_itr_))
|
||||
{
|
||||
auto const& line = util::get<geometry::line_string<double> const>(*geo_itr_);
|
||||
geometry::line_string_vertex_adapter<double> va(line);
|
||||
converter_.apply(va, adapter_);
|
||||
if (adapter_.status())
|
||||
{
|
||||
//Found a placement
|
||||
geo_itr_ = geometries_to_process_.erase(geo_itr_);
|
||||
return true;
|
||||
}
|
||||
//Found a placement
|
||||
geo_itr_ = geometries_to_process_.erase(geo_itr_);
|
||||
return true;
|
||||
}
|
||||
|
||||
// No placement for this geometry. Keep it in geometries_to_process_ for next try.
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user