bool text_symbolizer_helper<FaceManagerT, DetectorT>::next_point_placement() { while (!points_.empty()) { if (point_itr_ == points_.end()) { //Just processed the last point. Try next placement. if (!next_placement()) return false; //No more placements //Start again from begin of list point_itr_ = points_.begin(); continue; //Reexecute size check } finder_->clear_placements(); finder_->find_point_placement(point_itr_->first, point_itr_->second, angle_); if (!finder_->get_results().empty()) { //Found a placement point_itr_ = points_.erase(point_itr_); if (writer_.first) writer_.first->add_text( finder_->get_results(), finder_->get_extents(), feature_, t_, writer_.second); finder_->update_detector(); return true; } //No placement for this point. Keep it in points_ for next try. point_itr_++; } return false; }
text_symbolizer_helper<FaceManagerT, DetectorT>::text_symbolizer_helper(text_symbolizer const& sym, feature_impl const& feature, proj_transform const& prj_trans, unsigned width, unsigned height, double scale_factor, CoordTransform const& t, FaceManagerT &font_manager, DetectorT &detector, box2d<double> const& query_extent) : sym_(sym), feature_(feature), prj_trans_(prj_trans), t_(t), font_manager_(font_manager), detector_(detector), dims_(0, 0, width, height), query_extent_(query_extent), text_(font_manager, scale_factor), angle_(0.0), placement_valid_(false), points_on_line_(false), finder_(0) { initialize_geometries(); if (!geometries_to_process_.size()) return; placement_ = sym_.get_placement_options()->get_placement_info(scale_factor); next_placement(); initialize_points(); }
bool shield_symbolizer_helper<FaceManagerT, DetectorT>::next_point_placement() { position const& shield_pos = sym_.get_shield_displacement(); while (!points_.empty()) { if (point_itr_ == points_.end()) { //Just processed the last point. Try next placement. if (!next_placement()) return false; //No more placements //Start again from begin of list point_itr_ = points_.begin(); continue; //Reexecute size check } position const& text_disp = placement_->properties.displacement; double label_x = point_itr_->first + shield_pos.first; double label_y = point_itr_->second + shield_pos.second; finder_->clear_placements(); finder_->find_point_placement(label_x, label_y, angle_); if (finder_->get_results().empty()) { //No placement for this point. Keep it in points_ for next try. point_itr_++; continue; } //Found a label placement but not necessarily also a marker placement // check to see if image overlaps anything too, there is only ever 1 placement found for points and verticies if (!sym_.get_unlock_image()) { // center image at text center position // remove displacement from image label placements_type const& p = finder_->get_results(); double lx = p[0].center.x - text_disp.first; double ly = p[0].center.y - text_disp.second; marker_x_ = lx - 0.5 * marker_w_; marker_y_ = ly - 0.5 * marker_h_; marker_ext_.re_center(lx, ly); } else { // center image at reference location marker_x_ = label_x - 0.5 * marker_w_; marker_y_ = label_y - 0.5 * marker_h_; marker_ext_.re_center(label_x, label_y); } if (placement_->properties.allow_overlap || detector_.has_placement(marker_ext_)) { detector_.insert(marker_ext_); finder_->update_detector(); point_itr_ = points_.erase(point_itr_); return true; } //No placement found. Try again point_itr_++; } return false; }
bool text_symbolizer_helper<FaceManagerT, DetectorT>::next_line_placement_clipped() { while (!geometries_to_process_.empty()) { if (geo_itr_ == geometries_to_process_.end()) { //Just processed the last geometry. Try next placement. if (!next_placement()) return false; //No more placements //Start again from begin of list geo_itr_ = geometries_to_process_.begin(); continue; //Reexecute size check } typedef agg::conv_clip_polyline<geometry_type> clipped_geometry_type; typedef coord_transform<CoordTransform,clipped_geometry_type> path_type; clipped_geometry_type clipped(**geo_itr_); clipped.clip_box(query_extent_.minx(),query_extent_.miny(),query_extent_.maxx(),query_extent_.maxy()); path_type path(t_, clipped, prj_trans_); finder_->clear_placements(); if (points_on_line_) { finder_->find_point_placements(path); } else { finder_->find_line_placements(path); } if (!finder_->get_results().empty()) { //Found a placement if (points_on_line_) { finder_->update_detector(); } geo_itr_ = geometries_to_process_.erase(geo_itr_); if (writer_.first) writer_.first->add_text( finder_->get_results(), finder_->get_extents(), feature_, t_, writer_.second); return true; } //No placement for this geometry. Keep it in geometries_to_process_ for next try. geo_itr_++; } return false; }
bool text_symbolizer_helper<FaceManagerT, DetectorT>::next_line_placement() { while (!geometries_to_process_.empty()) { if (geo_itr_ == geometries_to_process_.end()) { //Just processed the last geometry. Try next placement. if (!next_placement()) return false; //No more placements //Start again from begin of list geo_itr_ = geometries_to_process_.begin(); continue; //Reexecute size check } typedef coord_transform<CoordTransform,geometry_type> path_type; path_type path(t_, **geo_itr_, prj_trans_); finder_->clear_placements(); if (points_on_line_) { finder_->find_point_placements(path); } else { finder_->find_line_placements(path); } if (!finder_->get_results().empty()) { //Found a placement if (points_on_line_) { finder_->update_detector(); } geo_itr_ = geometries_to_process_.erase(geo_itr_); return true; } //No placement for this geometry. Keep it in geometries_to_process_ for next try. geo_itr_++; } return false; }