From 75649b886344e7e75ad0261cc8fa29c827fffb25 Mon Sep 17 00:00:00 2001 From: Dane Springmeyer Date: Tue, 1 Feb 2011 08:16:32 +0000 Subject: [PATCH] add 'interior' point placement option to point_symbolizer - closes #709 --- bindings/python/mapnik/__init__.py | 1 + bindings/python/mapnik_point_symbolizer.cpp | 7 +++++++ include/mapnik/point_symbolizer.hpp | 16 ++++++++++++-- src/agg/process_point_symbolizer.cpp | 5 ++++- src/cairo_renderer.cpp | 6 +++++- src/load_map.cpp | 7 +++++++ src/point_symbolizer.cpp | 22 ++++++++++++++++++++ tests/data/sqlite/qgis_spatiallite.sqlite | Bin 626688 -> 626688 bytes 8 files changed, 60 insertions(+), 4 deletions(-) diff --git a/bindings/python/mapnik/__init__.py b/bindings/python/mapnik/__init__.py index 9ec041ec8..b0ef1dff1 100644 --- a/bindings/python/mapnik/__init__.py +++ b/bindings/python/mapnik/__init__.py @@ -723,6 +723,7 @@ __all__ = [ 'ViewTransform', # enums 'aspect_fix_mode', + 'point_placement', 'label_placement', 'line_cap', 'line_join', diff --git a/bindings/python/mapnik_point_symbolizer.cpp b/bindings/python/mapnik_point_symbolizer.cpp index 86eba7f42..b313844b5 100644 --- a/bindings/python/mapnik_point_symbolizer.cpp +++ b/bindings/python/mapnik_point_symbolizer.cpp @@ -22,12 +22,14 @@ //$Id$ #include +#include "mapnik_enumeration.hpp" #include #include #include #include #include "mapnik_svg.hpp" +using namespace mapnik; using mapnik::point_symbolizer; using mapnik::symbolizer_with_image; using mapnik::path_processor_type; @@ -89,6 +91,11 @@ struct point_symbolizer_pickle_suite : boost::python::pickle_suite void export_point_symbolizer() { using namespace boost::python; + + enumeration_("point_placement") + .value("CENTROID",CENTROID_POINT_PLACEMENT) + .value("INTERIOR",INTERIOR_POINT_PLACEMENT) + ; class_("PointSymbolizer", init<>("Default Point Symbolizer - 4x4 black square")) diff --git a/include/mapnik/point_symbolizer.hpp b/include/mapnik/point_symbolizer.hpp index 086a2b30f..e47ea4fc1 100644 --- a/include/mapnik/point_symbolizer.hpp +++ b/include/mapnik/point_symbolizer.hpp @@ -26,9 +26,18 @@ // mapnik #include - +#include + namespace mapnik -{ +{ + +enum point_placement_enum { + CENTROID_POINT_PLACEMENT, + INTERIOR_POINT_PLACEMENT, + point_placement_enum_MAX +}; + +DEFINE_ENUM( point_placement_e, point_placement_enum ); struct MAPNIK_DECL point_symbolizer : public symbolizer_with_image, public symbolizer_base @@ -38,11 +47,14 @@ struct MAPNIK_DECL point_symbolizer : point_symbolizer(point_symbolizer const& rhs); void set_allow_overlap(bool overlap); bool get_allow_overlap() const; + void set_point_placement(point_placement_e point_p); + point_placement_e get_point_placement() const; void set_ignore_placement(bool ignore_placement); bool get_ignore_placement() const; private: bool overlap_; + point_placement_e point_p_; bool ignore_placement_; }; } diff --git a/src/agg/process_point_symbolizer.cpp b/src/agg/process_point_symbolizer.cpp index 3635749cb..356e31f4c 100644 --- a/src/agg/process_point_symbolizer.cpp +++ b/src/agg/process_point_symbolizer.cpp @@ -64,8 +64,11 @@ void agg_renderer::process(point_symbolizer const& sym, double x; double y; double z=0; + if (sym.get_point_placement() == POINT_PLACEMENT) + geom.label_position(&x, &y); + else + geom.label_interior_position(&x, &y); - geom.label_position(&x,&y); prj_trans.backward(x,y,z); t_.forward(&x,&y); diff --git a/src/cairo_renderer.cpp b/src/cairo_renderer.cpp index ffa408ca3..3ac150add 100644 --- a/src/cairo_renderer.cpp +++ b/src/cairo_renderer.cpp @@ -1033,7 +1033,11 @@ void cairo_renderer_base::process(point_symbolizer const& sym, double y; double z = 0; - geom.label_position(&x, &y); + if (sym.get_point_placement() == POINT_PLACEMENT) + geom.label_position(&x, &y); + else + geom.label_interior_position(&x, &y); + prj_trans.backward(x, y, z); t_.forward(&x, &y); diff --git a/src/load_map.cpp b/src/load_map.cpp index 91608aa4f..a65537458 100644 --- a/src/load_map.cpp +++ b/src/load_map.cpp @@ -786,6 +786,10 @@ void map_parser::parse_point_symbolizer( rule & rule, ptree const & sym ) { symbol.set_ignore_placement( * ignore_placement ); } + point_placement_e placement = + get_attr(sym, "placement", CENTROID_POINT_PLACEMENT); + symbol.set_point_placement( placement ); + if (transform_wkt) { agg::trans_affine tr; @@ -837,6 +841,9 @@ void map_parser::parse_point_symbolizer( rule & rule, ptree const & sym ) { symbol.set_ignore_placement( * ignore_placement ); } + point_placement_e placement = + get_attr(sym, "placement", CENTROID_POINT_PLACEMENT); + symbol.set_point_placement( placement ); parse_metawriter_in_symbolizer(symbol, sym); rule.append(symbol); diff --git a/src/point_symbolizer.cpp b/src/point_symbolizer.cpp index 315a6c2c6..8870275c9 100644 --- a/src/point_symbolizer.cpp +++ b/src/point_symbolizer.cpp @@ -25,6 +25,7 @@ #include #include #include +#include // boost #include // stl @@ -33,20 +34,31 @@ namespace mapnik { +static const char * point_placement_strings[] = { + "centroid", + "interior", + "" +}; + +IMPLEMENT_ENUM( point_placement_e, point_placement_strings ); + point_symbolizer::point_symbolizer() : symbolizer_with_image(path_expression_ptr(new path_expression)), // FIXME symbolizer_base(), overlap_(false), + point_p_(CENTROID_POINT_PLACEMENT), ignore_placement_(false) {} point_symbolizer::point_symbolizer(path_expression_ptr file) : symbolizer_with_image(file), symbolizer_base(), overlap_(false), + point_p_(CENTROID_POINT_PLACEMENT), ignore_placement_(false) {} point_symbolizer::point_symbolizer(point_symbolizer const& rhs) : symbolizer_with_image(rhs), symbolizer_base(rhs), overlap_(rhs.overlap_), + point_p_(rhs.point_p_), ignore_placement_(rhs.ignore_placement_) {} void point_symbolizer::set_allow_overlap(bool overlap) @@ -59,6 +71,16 @@ bool point_symbolizer::get_allow_overlap() const return overlap_; } +void point_symbolizer::set_point_placement(point_placement_e point_p) +{ + point_p_ = point_p; +} + +point_placement_e point_symbolizer::get_point_placement() const +{ + return point_p_; +} + void point_symbolizer::set_ignore_placement(bool ignore_placement) { ignore_placement_ = ignore_placement; diff --git a/tests/data/sqlite/qgis_spatiallite.sqlite b/tests/data/sqlite/qgis_spatiallite.sqlite index c91005d161c094bdf9bc4a10193073d5b6ae4703..7dbdf6988dab320d46390612555044f02e32a003 100644 GIT binary patch delta 585 zcmZozpw_TJZGtqb83O}T%0vZwAVc?&Ok+xG3S(;uQ)>!yYYIzi3TtZ$TWbn?YYNBK z6wV3UjO^RLa&!9mFtSf~iQuf)WINCnX5^IpV7(KY1(VbEp3e*rz<%)0kp_p)s-cJG zrX4)^VCRDEf(D!-%-bY5Sy+~{ByjR@GBcPmFg|1W&oEtZ1CvI5qdPk*gLpGrUTH}c z15iSMfgxq8825x3_6PX>mFeDC6MR5HQ*Ono6gh`KT)Tc4i`yKiVFTL52*jDpPzDE( zwz#l|k=xzq08ACkl(4Lj$|vDL2Q)(d9A@BEKA`g}^>^e``vV&upZrl9TCaLQcb4;m z9a6yu4tO0~6n8?*;oO9)8yC1c!mUMj28@qx;lIWdHdY3~W;Y+GKOW?qcRhAW;J_E| zDj$a94i0OAd7g{b_&PkQxE(g{W0(WTAN8mn;R1TZK~iDmqb_zf43Mg2|WXr7zqRp1q0#$1NsB>1MUOp1LC(4FbU8D bx8h$3A`Aur0p